2015-11-06 49 views
1

我試圖在C中創建一個程序,它允許我存儲一些關於學生的信息。這個想法是創建一個新的數據類型,然後用它來創建一些函數來操縱數據。特別是在某一時刻,我必須找到一個組中最古老的學生,然後使用其他功能打印出詳細信息。我所做的這個功能應該可以找到組中的最大年齡不起作用。誰能找到這個錯誤?特別是那些不起作用的功能,我認爲是calcmax和find。有一些錯誤,但是當我在main調用calcmax並嘗試打印結果時,會出現一些隨機數字,就是這樣。我認爲其中一個循環中的邏輯存在問題,但我無法找到它。非常感謝。typedef,在兩個函數中找不到錯誤

typedef struct{ 
char f[MAXIM]; 
char s[MAXIM]; 
char id[MAXIM]; 
char dep[MAXIM]; 
char g; 
int age; 
}student_t; 

student_t mkstud(char first[],char sec[], char idn [],char de[], char sex, int eta){ 
student_t person; 
strcpy(person.f,first); 
strcpy(person.s,sec); 
strcpy(person.id,idn); 
strcpy(person.dep,de); 
person.g = sex; 
person.g = eta; 
return person; 
} 

student_t scstud(){ 
char first[MAXIM],sec[MAXIM],idn[MAXIM],de[MAXIM]; 
char sex; 
int eta; 
student_t person; 
printf("name "); 
scanf("%s",first); 
printf("surname "); 
scanf("%s",sec); 
printf("id "); 
scanf("%s", idn); 
printf("depart "); 
scanf("%s",de); 
printf("sex "); 
scanf(" %c",&sex); 
printf("age "); 
scanf(" %d", &eta); 
person= mkstud(first,sec,idn,de,sex,eta); 
return person; 
} 


int calcmax(student_t *class, int length){ 
int diff,i; 
int max[MAXIM]; 
diff=class[0].age-class[1].age; 
if(diff>=0){ 
    max[0]=class[0].age; 
} 
else if(diff<0){ 
    max[0]=class[1].age; 
} 
max[1]=max[0]; 
for (i=0;i<length;i++){ 
    if (max[i]>=class[i+1].age){ 
     max[i+1]=max[i]; 
    } 
    else if(max[i]<class[i+1].age){ 
     max[i+1]=class[i+1].age; 
    } 

} 
    return max[length]; 
} 
void printdetails(student_t std){ 
printf("name: %s",std.f); 
printf("surname: %s",std.s); 
printf("ID: %s",std.id); 
printf("department: %s",std.dep); 
printf("gender: %c",std.g); 
printf("age: %d",std.age); 
} 

/*void find(student_t *class, int length){ 
int std,i; 
std = calcmax(class, length); 
for(i=0;i<=length-1;i++){ 
    if (std==class[i].age) { 
     printdetails(class[i]); 
    } 

} 
}*/ 
int main(void){ 
int i,j; 
student_t class[6]; 
class[0]= mkstud("John","Bishop","s1234","inf", 'm',18); 
class[1]=mkstud("Lady","Cook","s2345","Eng",'f',21); 
class[2]=mkstud("James","Jackson","s3456","Eng",'m',17); 
for(i=4;i<=6;i++){ 
    printf(" student %d \n", i); 
    class[i-1]=scstud(); 
} 
j=calcmax(class, 6); 
printf("%d", j); 


/*find(class, 3);*/ 
return EXIT_SUCCESS;} 
+0

計算'類[0]','類[1]'和'類[2]'的最大值,當你明白了什麼是最大的結果?將問題分解下來,以便更容易找到錯誤。在最大計算函數中使用'printf'來「看」它正在做什麼,或者通過調試器來執行它。 – DigitalNinja

回答

0

問題,我看到:

  1. 小錯誤mkstud。您正在爲結構的g成員分配性別和年齡。

    person.g = sex; 
    person.g = eta; 
    

    這應該是:

    person.g = sex; 
    person.age = eta; 
    
  2. 您還沒有calcmax初始化數組max

  3. 您在calcmax中的邏輯有缺陷。如果您在正確的位置添加printf語句,您將會看到max[length]分配了不正確的值。

    int calcmax(student_t *class, int length){ 
        int diff,i; 
        int max[MAXIM] = {0}; 
        diff=class[0].age-class[1].age; 
        if(diff>=0){ 
         max[0]=class[0].age; 
        } 
        else if(diff<0){ 
         max[0]=class[1].age; 
        } 
        max[1]=max[0]; 
    
        // ADDED 
        printf("max[0]: %d\n", max[0]); 
        printf("max[1]: %d\n", max[1]); 
    
        for (i=0;i<length;i++){ 
         if (max[i]>=class[i+1].age){ 
         max[i+1]=max[i]; 
    
         // ADDED 
         printf("max[%d]: %d\n", i+1, max[i+1]); 
         } 
         else if(max[i]<class[i+1].age){ 
         max[i+1]=class[i+1].age; 
    
         // ADDED 
         printf("max[%d]: %d\n", i+1, max[i+1]); 
         } 
        } 
    
        // ADDED 
        printf("max[%d]: %d\n", length, max[length]); 
        return max[length]; 
    } 
    

    您可以嘗試修復相當複雜的功能,但它可以被簡化。

    int calcmax(student_t *class, int length){ 
    
        if (length <= 0) 
        { 
         return -1; 
        } 
    
        int max = class[0].age; 
        for (int i = 1; i < length; ++i) 
        { 
         if (max < class[i].age) 
         { 
         max = class[i].age; 
         } 
        } 
        return max; 
    } 
    
+0

嗨,我有幾個問題:返回-1做什麼?其次,如果max> class [i],編譯器在你的循環中做了什麼?它只是重複循環?因爲基本上我爲什麼最大化一個數組的唯一原因是,如果它比class [i]大,我希望能夠將它賦值給它以前的值。如果你的循環重複,沒有第二個if語句,那麼我甚至不需要使用max作爲數組 –

+0

@MicheleGalli,'return -1;'只是返回'-1'到'0'。至於循環,如果我的簡化版本沒有意義,我建議您應該花一些時間來學習該語言的基礎知識,使用教科書或在線教程。 –

+0

我的確在最後簡化了函數,它和你寫的函數基本相同,但我沒有把第一個if語句。因爲長度應該是數組的長度。 –