Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Array sortieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.11.2003, 18:14 Uhr
~Sandy
Gast


Hallo, ich bin Anfänger und habe zwei Probleme:
Erstmal muß ich ein Array alphabetisch sortieren. Ich habe dazu in einem Tutorial was mit "Bubble sort" gefunden und es so probiert, aber irgendwie klappt es nicht. Ich habe auch keinen anderen Weg gefunden. Hier ist der Code:


C++:
#include <iostream.h>
#include <string.h>
void get_list();
int main(){
get_list();
return 0;
}
char buf[80];
char *list[8];
char *p;
void get_list()
{
    int i;
    p = buf;
    for (i= 0;i<8;i++)
    {
        list[i] = p;
        cout <<"Enter a name.\n";
        cin.getline(list[i], sizeof(list[i]));
        p = p + strlen(list[i]) + 1;
    }
//Hier mein vergeblicher Versuch, das Array list alphabetisch zu sortieren:
char *temp;
for(i=0;i<7;i++)
    {
        for(int j=0;j<7;j++)
        {
            if(list[j] > list[j+1])
            {
                temp = list[j];
                list[j] = list[j+1];
                list[j+1] = temp;
            }
        }
    }
for(i=0;i<8;i++)
cout << list[i] << endl;
}



Mein zweites Problem ist, ein Programm zu schreiben, das einen String als Eingabe nimmt, und dann den ersten mit dem letzten Buchstaben austauscht, den zweiten mit dem vorletzten, usw. Es soll aber nicht einfach nur das eingegebene Wort rückwärts ausgeben. So wie ich das Programm gemacht habe, klappt es nur für eine vorher festgelegte Anzahl von Buchstaben. Hier ist der Code der nur für z.B. ein Wort mit 5 Buchstaben funktioniert. Ich habe vergeblich versucht, eine For-Schleife zu machen, die je nach Länge des Strings jeweils die Buchstaben austauscht, aber das hat überhaupt nicht geklappt.


C++:
#include <iostream.h>
#include <string.h>
void change(char*, char*, char*, char*);
char word[20], new_word;
int main()
{
  int length, i;
char a, b, c, d, e;
cout << "Please enter a word.\n";
cin.getline(word, 20);
length = strlen(word);
i = length/2;
c = word[i];
a = word[0];
i = length -1;
e = word[i];
  b = word[1];
i = length -2;
d = word[i];
cout <<"Before function change: "<<a<<b<<c<<d<<e<<endl;
change(&a, &e, &b, &d);
cout <<"After function change: " <<a<<b<<c<<d<<e<< endl;
return 0;
}
void change(char *a, char *e, char *b, char*d)
{
    int temp;
    temp = *a;
    *a = *e;
    *e = temp;
    
    temp = *b;
    *b = *d;
    *d = temp;
}



Ich wäre für jede Idee oder Hinweis sehr dankbar! Und habt bitte Nachsicht mit mir, ich bin echt Anfänger und suche nach einer möglichst einfachen Lösung. (Kompliziertere Sachen checke ich noch nicht so recht.)
Vielen Dank im voraus!!!

Sandy

Dieser Post wurde am 08.11.2003 um 20:12 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.11.2003, 20:28 Uhr
~cmos
Gast


Hi,
bei deinem ersten Problem hab ich net ganz durchgeblickt
was du überhaupt willst.
char *list[8] geht glaube schonmal gar nicht.
Das Programm soll sicherlich 10 Namen a 8 Zeichen aufnehmen (?)
Habe das mal so angenommen und hier ist mal was.
Sicherlich werden jetzt einige Profis meckern.
Du Kannst hier 5 Namen a 7 Zeichen (+\0) eingeben.
Sortiert wird nach dem ersten Buchstaben.
Die struct deshalb, falls noch nachname usw hinzukommt ist es
einfacher zu sortieren, finde ich jedenfalls

C++:
#include <iostream>
#include <string>
using namespace std;

void ausgabe();
struct namen
{
    char name[8]; // letze \0
}str_namen[5];


int main()
{
    
    char tmp[8];
    
    for(int c=0;c<5;c++)
    {
        cout << "Name: ";
        cin >> str_namen[c].name;
    }
    ausgabe();

    
    // Sortieren
    
    for(int a=1;a<5;a++)
    {
        for(int i=0;i<5;i++)
        {
            if(str_namen[i].name[0]>str_namen[a].name[0])
            {
                strcpy(tmp,str_namen[i].name);
                strcpy(str_namen[i].name,str_namen[a].name);
                strcpy(str_namen[a].name,tmp);

            }
            
        }
    }
    cout << "Sortiert\n";
    cout << "--------\n";
    ausgabe();
    return 0;
}

void ausgabe()
{
    for(int i=0;i<5;i++)
    {
        cout << str_namen[i].name<<endl;
        
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.11.2003, 20:44 Uhr
0xdeadbeef
Gott
(Operator)


Dafür gibt es in der STL schon vordefinierte Funktionen:

C++:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector> //besseres Array
#include <iterator>

int main() {
  std::vector<std::string> foo(5);
  foo[0] = "Haus";
  foo[1] = "Baum";
  foo[2] = "Wald";
  foo[3] = "Testosteron";
  foo[4] = "Donaudampfschifffahrt";

  std::sort(foo.begin(), foo.end());
  std::copy(foo.begin(), foo.end(), std::ostream_iterator<std::string>(std::cout, " ")); //gibt den vector aus
  std::cout << std::endl;

  //////////////////////

  std::string bar = "abcdefgh";

  std::reverse(bar.begin(), bar.end());
  std::cout << bar << std::endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.11.2003, 20:54 Uhr
~cmos
Gast


gut zu wissen,
gerade bei solchen wörtern die donaudampfschifffahrt

Ciao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.11.2003, 22:00 Uhr
0xdeadbeef
Gott
(Operator)


Dummerweise gibt es kein std::bogosort
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.11.2003, 22:02 Uhr
~Sandy
Gast


Vielen Dank erstmal!!!
Leider klappt es immernoch nicht. Die erste Hälfte vom Programm ist leider vorgegeben (bis einschließlich der Zeile p = p + strlen(list[ i ]) + 1. Ich soll nur an das bestehende Programm eine Funktion anhängen, die die Einträge vom Array "list" alphabetisch sortiert. Sorry, das habe ich vorhin nicht dazugesagt. Ich habe jetzt die ganze Zeit versucht, die obigen Vorschläge in das Programm zu kriegen, aber das funktioniert nicht. Hat vielleicht irgendjemand eine Idee, wie das mit meinem obigen Programm funktionieren könnte? Das wäre echt furchtbar nett.
Danke
Sandy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.11.2003, 22:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


poste mal nochmal das was vorgeben ist ohne den spass den du bisher dazugeschrieben hast
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.11.2003, 22:16 Uhr
~Sandy
Gast


Danke für die Antwort.
Hier ist das Programm-Segment, das vorgegeben ist:

C++:
#include <iostream.h>
#include <string.h>
char buf[80];
char *list[8];
char *p;
void get_list()
{
    int i;
    p = buf;
    for (i= 0;i<8;i++)
    {
        list[ i ] = p;
        cout <<"Enter a name.\n";
        cin.getline(list[ i ], sizeof(list[ i ]));
        p = p + strlen(list[ i ]) + 1;
    }
}


--edit 0xdeadbeef: Ist denn das so schwer, um den Code cpp-tags zu setzen?

Dieser Post wurde am 08.11.2003 um 22:21 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.11.2003, 22:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hm
ungetestet würde ich mal sagen so:

C++:
int i,j,n=8;
for(j=0;j<n-1;++j)
  for(i=j+1;i<n;++i)
   if(strcmp(list[i],list[j])<0){char *temp=list[i];list[i]=list[j];list[j]=temp;}



spiegeln sollte hoffentlich so gehen

C++:
void word_spiegeln(char* w){for(int i=0;i<strlen(w)/2;++i){char temp=w[i];w[i]=w[strlen(w)-1-i]);w[strlen(w)-1-i])=temp;}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 08.11.2003 um 22:25 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.11.2003, 22:24 Uhr
0xdeadbeef
Gott
(Operator)


Wie wärs mit

C++:
std::sort(list, list + 8 /*Länge von list*/);


übrigens wundert es mich, dass du für die Elemente von list keinen Speicher anforderst. Bist du sicher, dass die Deklaration von list nicht eigentlich

C++:
char list[100][8];


oder so sein sollte?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.11.2003 um 22:24 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: