2015-11-06 42 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语句。因为长度应该是数组的长度。 –