2014-04-19 119 views
-3

我有點煩惱。我找不到可以從結構中排序數據的任何解決方案。看,這是我的代碼。我會解釋發生了什麼,什麼我想要做的事:按字母順序排列結構數據

(我有,如果你發現任何奇怪的話通知我的代碼從我的母語英語,所以翻譯......)

我試圖對這種國家結構進行分類。但我的錯誤是,我唯一要分類的是國名的名單..所以數據會搞砸。你能幫我一個好的算法嗎?

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

int n; 

struct Countries{ 
    char country_code[20]; 
    char country_name[20]; 
    float country_area; 
    int country_people; 
    float global_income; 
}*countries; 

void menu(); 
void read(); 
void display(); 
void sort(); 
void exit(); 

int main(){ 
    printf("Enter no of countries: "); scanf("%d", &n); 
    countries = malloc(n * sizeof(*countries)); 
    menu(); 
} 

void menu(){ 
    int op; 
    printf("[1] Read;\n[2] Display;\n[3] Sort;\n[4] Exit.\n"); 
    printf(">> "); scanf("%d", &op); fflush(stdin); 
    switch(op){ 
     case 1: 
      read(); 
      break; 
     case 2: 
      display(); 
      break; 
     case 3: 
      sort(); 
      break; 
     case 4: 
      exit(); 
      break; 
     default: 
      break; 
    } 
} 

void read(){ 
    printf("\n\n\n______READ______n\n\n"); 
    int i; 

    for(i=0; i<n; i++){ 
     printf("Country code #%d: ", i+1); gets(countries[i].country_code); fflush(stdin); 
     printf("Country name: "); gets(countries[i].country_name); fflush(stdin); 
     printf("Area: "); scanf("%f", &countries[i].country_area); fflush(stdin); 
     printf("No of people: "); scanf("%d", &countries[i].country_people); fflush(stdin); 
     printf("Global Income: "); scanf("%f", &countries[i].global_income); fflush(stdin); 
     printf("\n\n\n"); 
    } 
    menu(); 
} 
void display(){ 
    printf("\n\n\n______DISPLAY______n\n\n"); 
    int i; 

    for(i=0; i<n; i++){ 
     printf("Country code #%d: ", i+1); puts(countries[i].country_code); 
     printf("Country name: "); puts(countries[i].country_name); 
     printf("Area: "); printf("%.2f", countries[i].country_area); 
     printf("\nNo of people: "); printf("%d", countries[i].country_people); 
     printf("\nGlobal Income: "); printf("%.2f", countries[i].global_income); 
     printf("\n\n\n"); 
    } 
} 

void sort(){ 
    int i, j; 
    char temp[20]; 
    /* countries sorted in alphabetical order */ 
    for(i=0; i<n; i++){ 
     for(j=i+1; j<n; j++){ 
      if(strcmp(countries[i].country_name, countries[j].country_name)>0){ 
       strcpy(temp,countries[i].country_name); 
       strcpy(countries[i].country_name, countries[j].country_name); 
       strcpy(countries[j].country_name, temp); 
      } 
     } 
    } 

    for(i=0; i<n; i++){ 
     printf("\n\nCountry: "); puts(countries[i].country_name); 

     printf("Population density: "); 
     printf("%.2f", ((float)countries[i].country_people)/((float)countries[i].country_area)); 

     printf("\nIncome per people: "); 
     printf("%.2f", ((float)countries[i].country_people)/((float)countries[i].global_income)); 
    } 
} 

void exit(){ 
    free(countries); 
    getch(); 
} 
+0

所以當你換了結構的其他要素國家數據同樣的事情做。或者簡單地複製整個結構。 –

回答

-1

在你的排序功能,複製所有的結構,而不是僅僅名稱

void sort(){ 
    struct Countries temp; 

  if(strcmp(countries[i].country_name, countries[j].country_name)>0){ 
       //strcpy(temp, countries[i]); 
       //strcpy(countries[i], countries[j]); 
       //strcpy(countries[j], temp); 
       temp = countries[i]; 
       countries[i] = countries[j]; 
       countries[j] = temp; 
      } 
+0

愚蠢的我。謝謝! –

+0

在結構上的strcpy? – this

+0

我正在尋找一種算法。 ideea很好,但是..我應該使用什麼函數來代替strcpy? (這是字符串:D) –