2016-05-12 11 views
3

Ich versuche eine Struktur alphabetisch nach Nachnamen zu sortieren. Ich habe den Großteil meines Codes richtig funktioniert, aber ich konnte es nicht alphabetisch sortieren. Ich habe versucht, eine Swapper-Methode zu verwenden, bei der Sie einen Temp-Halter haben, die Temp mit der [s] tauschen und die [s] gegen die [s + 1] tauschen, aber ich konnte nicht richtig tauschen. Ich habe versucht, eine Funktion zu erstellen und die Struktur auf die Funktion zu übertragen, aber das konnte ich auch nicht richtig ausführen. Ich bin neu in C und meine Syntax ist nicht so toll. Ich bin anständig geworden, wenn ich Arrays voller Zahlen sortiert habe, aber ich konnte keine Beispiele für Sortierstrukturen finden. Jede Hilfe würde sehr geschätzt werden. Hier ist mein Code so weit:Alphabetisch strukturierte Listen nach Nachnamen in C

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct student{ 
char f_name[20]; 
char l_name[20]; 
char temp[20]; 
int id_num; 
float test1; 
float test2; 
float test3; 
}s[10]; 

int main(void) 
{ 
char grade; 
float average; 
int i, j, b; 

for(i=0;i<10;i++) 
{ 
printf("Enter first name(ZZ to quit): "); 
scanf("%s", &s[i].f_name); 
if(strcmp(s[i].f_name, "ZZ")==0) 
    break; 
else 
{ 
printf("Enter students last name: "); 
scanf("%s", &s[i].l_name); 
printf("Enter Student ID: "); 
scanf("%d", s[i].id_num); 
printf("Enter 3 test scores: "); 
scanf("%f %f %f", &s[i].test1, &s[i].test2, &s[i].test3); 
    b++; 
    } 
} 

i--; 
printf("Student\t\tStudent Id\tFinal Grade\n"); 
for(i;i>=0;i--) 
{ 
average = (s[i].test1 + s[i].test2 + s[i].test3)/3; 
if(average >= 90) 
    grade = 'A'; 
else if(average >=80 || < 90) 
    grade = 'B'; 
else if(average >= 70 || < 80) 
    grade = 'C'; 
else if(average >= 60 || < 70) 
    grade = 'D'; 
else 
    grade = 'F'; 

printf("%s, %s\t%d\t\t%.2f \t%c\n", s[i].l_name, s[i].f_name, s[i].id_num, average, grade); 
} 
return 0; 
} 

Antwort

1

Da Sie neu in C, eingefügt I-Code in Ihre eigene Code Sortierung und machte ein paar kleine, aber notwendige Korrekturen.

Ihr Code ist nicht zu lang, also habe ich das komplette Programm mit Kommentaren eingefügt, die den hinzugefügten Code erklären.

Dies ist nicht eine optimale oder effiziente Lösung, aber ich wollte Ihren eigenen Code arbeiten, ohne es viel zu ändern, so dass Sie die Lösung verstehen und ohne viele neue Konzepte, die Sie möglicherweise nicht verstehen.

Wie Sie mehr erfahren, und wenn Sie zu C++ weitergehen, finden Sie, dass gibt es viel elegantere und effizientere Möglichkeiten, dieses Problem zu lösen (vor allem mit C++ und seine Sortieralgorithmen).

Ich auch nach dem Vornamen sortiert, wenn die Nachnamen gleich sind, und enthalten auskommentierten harten Code, so dass Sie es schneller testen können, wie ich hoffe, dass Sie weiterhin Ihren Code selbst refaktorieren und verbessern werden.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct student{ 
    char f_name[20]; 
    char l_name[20]; 
    char temp[20]; 
    int id_num; 
    float test1; 
    float test2; 
    float test3; 
}s[10]; 

int main(void) 
{ 
    char grade; 
    float average; 
    int i, j = 0, b = 0; //CORRECTION 

    ////hard code for testing. UNCOMMENT, THEN COMMENT OUT INPUT 'FOR LOOP' FOR HARD CODE TESTING 
    //strcpy(s[4].f_name, "Rob"); 
    //strcpy(s[4].l_name, "Zenf"); 
    //s[4].id_num = 5; 
    //s[4].test1 = 60, s[4].test2 = 65, s[4].test3 = 70; 

    //strcpy(s[3].f_name, "Red"); 
    //strcpy(s[3].l_name, "Zenf"); 
    //s[3].id_num = 4; 
    //s[3].test1 = 80, s[3].test2 = 70, s[3].test3 = 75; 

    //strcpy(s[2].f_name, "Adam"); 
    //strcpy(s[2].l_name, "Ant"); 
    //s[2].id_num = 3; 
    //s[2].test1 = 100, s[2].test2 = 100, s[2].test3 = 100; 

    //strcpy(s[1].f_name, "Zac"); 
    //strcpy(s[1].l_name, "Miller"); 
    //s[1].id_num = 2; 
    //s[1].test1 = 60, s[1].test2 = 50, s[1].test3 = 40; 

    //strcpy(s[0].f_name, "Ed"); 
    //strcpy(s[0].l_name, "George"); 
    //s[0].id_num = 1; 
    //s[0].test1 = 90, s[0].test2 = 80, s[0].test3 = 70; 


    //i = 5; // 1 more than index number of last hard-coded student 

    ////end hard code 

    //COMMENT OUT THIS 'FOR LOOP' FOR HARD CODE TESTING 
    for (i = 0; i<10; i++) 
    { 
     printf("Enter first name(ZZ to quit): "); 
     scanf("%s", &s[i].f_name); 
     if (strcmp(s[i].f_name, "ZZ") == 0) 
      break; 
     else 
     { 
      printf("Enter students last name: "); 
      scanf("%s", &s[i].l_name); 
      printf("Enter Student ID: "); 
      scanf("%d", &s[i].id_num); //CORRECTION 
      printf("Enter 3 test scores: "); 
      scanf("%f %f %f", &s[i].test1, &s[i].test2, &s[i].test3); 
      b++; 
     } 
    } 

    i--; 

    //BEGINNING OF INSERTED SORT CODE. SHOULD BE REFACTORED INTO A FUNCTION 

    int least; 

    //Nested for loops. For every Student (except the first; this 
    //algorithm sorts in reverse alphabetical order, because 
    //your output 'for loop' prints in descending order), will 
    //compare with every remaining student name in second (nested) 
    //for loop, and swap with student name that comes first 
    //alphabetically in the second for loop, if any. 
    for (int counter = i; counter > 0; --counter) { 

     least = counter; 

     for (int k = counter - 1; k > -1; --k) { 

      // Compare last names. If same, compare first name 
      if ( (strcmp(s[k].l_name, s[least].l_name) < 0) || 
       ((strcmp(s[k].l_name, s[least].l_name) == 0) && 
       (strcmp(s[k].f_name, s[least].f_name) < 0)) ) 

       least = k; 
     } 

     // Very manual swap of values. 
     // Swaps take this format: temp = a; a = b; b = temp; 
     char temp_f_name[20]; strcpy(temp_f_name, s[least].f_name); 
     char temp_l_name[20]; strcpy(temp_l_name, s[least].l_name); 
     char temp_temp[20]; strcpy(temp_temp, s[least].temp); 
     int temp_id_num = s[least].id_num; 
     float temp_test1 = s[least].test1; 
     float temp_test2 = s[least].test2; 
     float temp_test3 = s[least].test3; 

     strcpy(s[least].f_name, s[counter].f_name); 
     strcpy(s[least].l_name, s[counter].l_name); 
     strcpy(s[least].temp, s[counter].temp); 
     s[least].id_num = s[counter].id_num; 
     s[least].test1 = s[counter].test1; 
     s[least].test2 = s[counter].test2; 
     s[least].test3 = s[counter].test3; 

     strcpy(s[counter].f_name, temp_f_name); 
     strcpy(s[counter].l_name, temp_l_name); 
     strcpy(s[counter].temp, temp_temp); 
     s[counter].id_num = temp_id_num; 
     s[counter].test1 = temp_test1; 
     s[counter].test2 = temp_test2; 
     s[counter].test3 = temp_test3; 

    } //END OF INSERTED SORT CODE 


    printf("Student\t\tStudent Id\tFinal Grade\n"); 
    for (i; i >= 0; i--) 
    { 
     average = (s[i].test1 + s[i].test2 + s[i].test3)/3; 
     if (average >= 90) 
      grade = 'A'; 
     else if (average >= 80 && average < 90) //CORRECTION. Use && not ||. Needed "average" again 
      grade = 'B'; 
     else if (average >= 70 && average < 80) //CORRECTION 
      grade = 'C'; 
     else if (average >= 60 && average < 70) //CORRECTION 
      grade = 'D'; 
     else 
      grade = 'F'; 

     printf("%s, %s\t%d\t\t%.2f \t%c\n", s[i].l_name, s[i].f_name, s[i].id_num, average, grade); 
    } 
    return 0; 
}