Forum: PC-Programmierung wie sortiere ich ein Strukt array


von asdfqwertz (Gast)


Lesenswert?

Wie Sortiere ich ein Struct array???
mein programm:
1
#include<stdio.h>
2
#include<stdlib.h>
3
#include<string.h>
4
5
struct Kartei{
6
  char vorname[20];
7
  char nachname[20];
8
  char telefonnummer[15];
9
};
10
11
typedef struct Kartei card;
12
13
#define MAX 20
14
#define VERS ('a' / 2)
15
16
int main(){
17
  
18
  card kartei[MAX];
19
  int i = 0, j = 0;
20
  int s = 1;
21
  int k = 0;
22
  int kanz = 0;
23
  char vorname[20], nachname[20], tel[15];
24
  
25
  for(i = 0; i < MAX; i++){
26
    strcpy(kartei[i].vorname, "");
27
    strcpy(kartei[i].nachname, "");
28
    strcpy(kartei[i].telefonnummer, "");
29
  }
30
  
31
  FILE *fp;
32
33
  fp = fopen("kartei.kar", "r");
34
    
35
  fscanf(fp, "%d ", &kanz);
36
  
37
  for(j=0; j<kanz; j++) {
38
    fscanf(fp, "%s %s %s ", &vorname, &nachname, &tel);
39
  
40
    for(i=0;vorname[i]!='\0';i++){
41
      kartei[j].vorname[i]=vorname[i]-VERS;
42
    }
43
    
44
    for(i=0;nachname[i]!='\0';i++){
45
      kartei[j].nachname[i]=nachname[i]-VERS;
46
    }
47
    
48
    for(i=0;tel[i]!='\0';i++){
49
      kartei[j].telefonnummer[i]=tel[i]-VERS;
50
    }
51
  }
52
  
53
  fclose(fp);
54
  
55
  do{
56
    if(kanz == 0){
57
      printf("Noch Kein Eintrag!\n\nVorname: ");
58
      scanf("%s", &vorname);
59
      printf("Nachname: ");
60
      scanf("%s", &nachname);
61
      printf("Telefonnummer: ");
62
      scanf("%s", &tel);
63
      strcpy(kartei[kanz].vorname, vorname);
64
      strcpy(kartei[kanz].nachname, nachname);
65
      strcpy(kartei[kanz].telefonnummer, tel);
66
      kanz++;
67
    }
68
    else{
69
      printf("---Eintrag %d von %d---\n\n", k+1 , kanz);
70
      printf("Vorname: %s\nNachname: %s\nTelefonnummer: %s\n", kartei[k].vorname, kartei[k].nachname, kartei[k].telefonnummer);
71
      
72
      if( s != 5 && s != 6){
73
        printf("\n--------MENUE--------\n");
74
        printf("1. N\x84");printf("chster Eintrag\n");
75
        printf("2. Vorheriger Eintrag\n");
76
        printf("3. Neuer Eintrag\n");
77
        printf("4. Eintrag L\x94schen\n");
78
        printf("5. Eintrag Bearbeiten\n");
79
        printf("6. Sortieren\n");
80
        printf("7. Speichern\n");
81
        printf("0. Speichern und Beenden\nEingabe: ");
82
        do{
83
          scanf("%d", &s);
84
          if(s<0||s>7){
85
            printf("Nicht Vorhanden!\nEingabe: ");
86
          }
87
        }while(s<0||s>7);
88
        if(s==5)s=99;
89
        if(s==6)s=98;
90
      }
91
      switch(s){
92
        case 1:
93
          k++;
94
          if(k>=kanz){
95
            k=0;
96
          }
97
          break;
98
        case 2:
99
          k--;
100
          if(k<0){
101
            k=kanz-1;
102
          }
103
          break;
104
        case 3:
105
          printf("\nVorname: ");
106
          scanf("%s", &vorname);
107
          printf("Nachtame: ");
108
          scanf("%s", &nachname);
109
          printf("Telefonnummer: ");
110
          scanf("%s", &tel);
111
          strcpy(kartei[kanz].vorname, vorname);
112
          strcpy(kartei[kanz].nachname, nachname);
113
          strcpy(kartei[kanz].telefonnummer, tel);
114
          kanz++;
115
          k=kanz-1;
116
          break;
117
        case 4:
118
          kanz--;
119
          for(i = k; i < kanz; i++){
120
            strcpy(kartei[i].vorname, kartei[i+1].vorname);
121
            strcpy(kartei[i].nachname, kartei[i+1].nachname);
122
            strcpy(kartei[i].telefonnummer, kartei[i+1].telefonnummer);
123
          }
124
          k=0;
125
          break;
126
        case 99:
127
          s = 5;
128
          break;  
129
        case 5:
130
          printf("\n-----BEARBEITUNG-----\n");
131
          printf("1. Vorname \x84ndern\n");
132
          printf("2. Nachname \x84ndern\n");
133
          printf("3. Telefonnummer \x84ndern\n");
134
          printf("0. Fertig\nEingabe: ");
135
          scanf("%d", &s);
136
          s = s + 100;
137
          switch(s){
138
            case 100:
139
              s = 1;
140
              break;
141
            case 101:
142
              printf("neuer Vorname: ");
143
              scanf("%s", &vorname);
144
              strcpy(kartei[k].vorname, vorname);
145
              s=5;
146
              break;
147
            case 102:
148
              printf("neuer Nachname: ");
149
              scanf("%s", &nachname);
150
              strcpy(kartei[k].nachname, nachname);
151
              s=5;
152
              break;
153
            case 103:
154
              printf("neue Telefonnummer: ");
155
              scanf("%s", &tel);
156
              strcpy(kartei[k].telefonnummer, tel);
157
              s=5;
158
              break;
159
            default:
160
              s=5;
161
              break;
162
          }
163
          break;
164
        case 98:
165
          s = 6;
166
          break;
167
        case 6:
168
        //Wie sortiert man ein Struct???
169
          break;
170
        case 7:
171
        case 0:
172
          fp = fopen("kartei.kar", "w");
173
          
174
          for(j=0; j<kanz; j++) {
175
            for(i=0;i<strlen(kartei[j].vorname)+1;i++){
176
              vorname[i]=kartei[j].vorname[i]+VERS;
177
            }
178
            
179
            for(i=0;i<strlen(kartei[j].nachname)+1;i++){
180
              nachname[i]=kartei[j].nachname[i]+VERS;
181
            }
182
            
183
            for(i=0;i<strlen(kartei[j].telefonnummer)+1;i++){
184
              tel[i]=kartei[j].telefonnummer[i]+VERS;
185
            }
186
          }
187
          
188
          fprintf(fp, "%d ", kanz);
189
          for(i=0; i<kanz; i++) {
190
            fprintf(fp, "%s %s %s ", vorname, nachname, tel);
191
          }
192
          
193
          printf("Kartei wurde gespeichert.\n");
194
          
195
          fclose(fp);
196
          
197
          break;
198
        default:
199
          break;
200
      }
201
      
202
    }
203
    system("cls");    
204
  }
205
  while(s != 0);
206
  return 0;
207
}

: Bearbeitet durch User
von Typo (Gast)


Lesenswert?

Bitte stelle die Frage gezielt auf ein Detailproblem.

Sortierverfahren allgemein findest Du mit diesem Stichwort im Netz.
Die besonderen Aspekte der Sortierung nach mehreren Kriterien findest Du 
auch dort.

von Tilo R. (joey5337) Benutzerseite


Lesenswert?

Ein Array mit Structs sortiert sich genauso wie jedes andere Array.

Ich vermute, deine Frage zielt auf die Performance. Beim Sortieren 
werden ja oft Elemente getauscht und wenn die Elemente größer sind wird 
das natürlich auch entsprechend teurer.

Hierfür bietet sich eine der folgenden Lösungen an:

1. Anstelle der Arrayelemente sortierst du ein int-Array, das vorher mit 
0..n-1 initialisiert wurde und Indices in das tatsächlich zu sortierende 
Array enthält. Am Ende musst du alle Elemente nur noch einmal 
umkopieren.

2. speichere in deinem Array keine Structs sondern Zeiger auf structs. 
Die lassen sich billig sortieren. (Das ist die Variante die mehr nach C 
riecht)

von Dirk B. (dirkb2)


Lesenswert?

Teile die Aufgabe in Funktionen auf.
Initialisieren, LAden, Eingeben, Sortieren, Ausgeben,...
Alles einzelne Funktionen.

Bei
1
fscanf(fp, "%s %s %s ", &vorname, &nachname, &tel);
 sind die Adressoperatoren falsch, da es sich schon um Arrays handelt.

Was soll eigentlich VERS machen?
Ist dir klar, dass du derzeit jede '0' in eine '\0' wandelst und somit 
strlen nicht mehr funktioniert?

von Amateur (Gast)


Lesenswert?

Normalerweise sind die Einträge in einem Array gleich groß.
Also kannst Du diese auch als "Dingsbums" bezeichnen.
Ein solches Dingsbums hat also eine feste Größe.
Ob das eine Struktur, ein char [xy] oder ein Bild ist, ist egal.

Wichtig sind nur zwei Punkte:
1. Es muss genügend Speicher für die temporäre Zwischenspeicherung,
   eines Eintrages, frei sein.
2. Es muss "sortierfähig" sein. Also irgendein Kriterium nach dem
   alle Einträge sortiert werden können.

Willst Du jetzt zwei Einträge miteinander tauschen, so schnappst Du Dir 
einen, speicherst diesen in einem temporären Bereich. Nun kopierst Du 
den zweiten Eintrag in den Speicherbereich des ersten Eintrages und 
anschließend kopierst Du den Inhalt des temporären Speichers in den des 
ursprünglich zweiten Eintrages.
Üblicherweise wird hierbei mit der Funktion move und der Größenangabe 
size_of_entry gearbeitet. move ist es völlig egal, wie viel und was Du 
kopierst.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Erst einmal solltest du die vielen Fehler in deinem bisherigen Code
beheben, damit die bereits vorhandenen Funktionen korrekt funktionieren.

Das Array kannst du dann bspw. mit der Bibliotheksfunktion qsort
sortieren lassen. Hier steht, wie:

  http://man7.org/linux/man-pages/man3/qsort.3.html

von Karl H. (kbuchegg)


Lesenswert?

Dirk B. schrieb:

> Was soll eigentlich VERS machen?

Das soll wohl sowas, wie eine einfache Datei-Verschlüsselung sein.
Also ein Detail, dass keiner braucht und nur Fehler verursacht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.