鱼C论坛

 找回密码
 立即注册
查看: 3329|回复: 14

结构体数组的初始化没用

[复制链接]
发表于 2016-1-15 20:57:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <string>  
/*定义学生结构体*/  
  
struct Student  
  
{  
  
     char ID[20];  
  
     char Name[20];  
  
     float Mark1;  
  
     float Mark2;  
  
     float Mark3;  
  
     float Average;  
  
};
  
  
/*声明学生数组及学生数量*/  

struct Student students[1000] = {{"101","ruige",100,100,100,100}
                                ,{"102","yuanyuan",99,99,99,99}
                                                                ,{"103","chenxiang",98,98,98,98}};   

int num = 3;

........部分代码省略

/*按平均值排序*/  
  
void Student_SortByAverage()  
  
{  
  
     int i,j;  
  
     struct Student tmp;  
  
     for (i=0;i<num;i++)  
  
     {  
  
         for (j=1;j<num-i;j++)  
  
         {  
  
              if (students[j-1].Average<students[j].Average)  
  
              {  
  
                   tmp=students[j-1];  
  
                   students[j-1]=students[j];  
  
                   students[j]=tmp;  
  
              }  
  
         }  
  
     }  
  
}



/*显示学生信息*/  
  
void Student_Display()  
  
{  
  
     int i;  
  
     printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");  
  
     printf("-------------------------------------------------------------\n");  
  
     for (i=0;i<num;i++)  
  
     {  
  
         printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,  
  
              students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average);  
  
     }  
  
}  
......部分代码省略

/*主程序*/  
  
int main()  
  
{  
  
     int choice;  
  
     IO_ReadInfo();  
  
     while(1)  
  
     {  
  
         /*主菜单*/  
  
         printf("\n------ 学生成绩管理系统------\n");  
  
         printf("1. 增加学生记录\n");  
  
         printf("2. 修改学生记录\n");  
  
         printf("3. 删除学生记录\n");  
  
         printf("4. 按姓名查询学生记录\n");  
  
         printf("5. 按平均成绩排序\n");  
  
         printf("6. 退出\n");  
  
         printf("请选择(1-6):");  
  
         scanf("%d",&choice);  
  
         getchar();  
  
         switch(choice)  
  
         {  
  
         case 1:  
  
              Student_Insert();  
  
              break;  
  
         case 2:  
  
              Student_Modify();  
  
              break;  
  
         case 3:  
  
              Student_Delete();  
  
              break;  
  
         case 4:  
  
              Student_Select();  
  
              break;  
  
         case 5:  
  
              Student_SortByAverage();  
  
              Student_Display();  
  
              break;  
  
         case 6:  
  
              exit(0);  
  
              break;  
  
         }  
  
         IO_WriteInfo();  
  
     }  
   return 0;
}  


好吧代码其实是我搬的,原来的代码没有初始化数组。我自己把它初始化了,但是成绩排序没东西。我调试进函数发现num一直为零。
是因为我初始化的步骤有问题还是我哪里错了,接触C不太久很多东西不懂,麻烦懂得大神帮我解答一下。

这是运行结果

这是运行结果

这是调试的

这是调试的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-15 21:03:18 | 显示全部楼层
我想挺久的  也没想出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-15 21:22:46 | 显示全部楼层
建议把代码全贴上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-15 21:23:07 | 显示全部楼层
那么问题来了 楼主的初始化好像可以,不过你为什么不再往下单步?这条语句还没有执行呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-15 21:26:24 | 显示全部楼层
那么问题又来了 tmp你可以展开看看是否成功,忘记看了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 21:31:52 | 显示全部楼层
黑龍 发表于 2016-1-15 21:23
那么问题来了 楼主的初始化好像可以,不过你为什么不再往下单步?这条语句还没有执行呢

因为num为零继续单步就跳出了   跳进viod Student_Display()函数  num还是为零  跳出  然后就变成图1的样子了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 21:32:29 | 显示全部楼层
人造人 发表于 2016-1-15 21:22
建议把代码全贴上来

代码太长了  怕大家看的累  所以没有全部弄上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 21:35:05 | 显示全部楼层
黑龍 发表于 2016-1-15 21:26
那么问题又来了 tmp你可以展开看看是否成功,忘记看了

tmp展开?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 21:36:55 | 显示全部楼层
#include <stdio.h>
#include <string>  
/*定义学生结构体*/  
  
struct Student  
  
{  
  
     char ID[20];  
  
     char Name[20];  
  
     float Mark1;  
  
     float Mark2;  
  
     float Mark3;  
  
     float Average;  
  
};
  
  
/*声明学生数组及学生数量*/  

struct Student students[1000] = {{"101","ruige",100,100,100,100}
                                ,{"102","yuanyuan",99,99,99,99}
                                                                ,{"103","chenxiang",98,98,98,98}};   

int num = 3;



/*求平均值*/  
  
float Avg(struct Student stu)  
  
{  
  
     return (stu.Mark1+stu.Mark2+stu.Mark3)/3;  
  
}  



/*通过学号返回数组下标*/  
  
int Student_SearchByIndex(char id[])  
  
{  
  
     int i;  
  
     for (i=0;i<num;i++)  
  
     {  
  
         if (strcmp(students[i].ID,id)==0)  
  
         {  
  
              return i;  
  
         }  
  
     }  
  
     return -1;  
  
}


/*通过姓名返回数组下标*/  
  
int Student_SearchByName(char name[])  
  
{  
  
     int i;  
  
     for (i=0;i<num;i++)  
  
     {  
  
         if (strcmp(students[i].Name,name)==0)  
  
         {  
  
              return i;  
  
         }  
  
     }  
  
     return -1;  
  
}




  
/*显示单条学生记录*/  
  
void Student_DisplaySingle(int index)  
  
{  
  
     printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");  
  
     printf("-------------------------------------------------------------\n");  
  
     printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name,  
  
              students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index].Average);  
  
}  
  
   
  
/*插入学生信息*/  
  
void Student_Insert()  
  
{  
  
     while(1)  
  
     {  
  
         printf("请输入学号:");  
  
         scanf("%s",&students[num].ID);  
  
         getchar();  
  
   
  
         printf("请输入姓名:");  
  
         scanf("%s",&students[num].Name);  
  
         getchar();  
  
   
  
         printf("请输入成绩:");  
  
         scanf("%f",&students[num].Mark1);  
  
         getchar();  
  
   
  
         printf("请输入成绩:");  
  
         scanf("%f",&students[num].Mark2);  
  
         getchar();  
  
   
  
         printf("请输入成绩:");  
  
         scanf("%f",&students[num].Mark3);  
  
         getchar();  
  
   
  
         students[num].Average=Avg(students[num]);  
  
         num++;  
  
   
  
         printf("是否继续?(y/n)");  
  
         if (getchar()=='n')  
  
         {  
  
              break;  
  
         }  
  
     }  
  
   
  
}



/*修改学生信息*/  
  
void Student_Modify()  
  
{  
  
     //float mark1,mark2,mark3;  
  
     while(1)  
  
     {  
  
         char id[20];  
  
         int index;  
  
         printf("请输入要修改的学生的学号:");  
  
         scanf("%s",&id);  
  
         getchar();  
  
         index=Student_SearchByIndex(id);  
  
         if (index==-1)  
  
         {  
  
              printf("学生不存在!\n");  
  
         }  
  
         else  
  
         {  
  
              printf("你要修改的学生信息为:\n");  
  
              Student_DisplaySingle(index);  
  
              printf("-- 请输入新值--\n");  
  
  
              printf("请输入学号:");  
  
              scanf("%s",&students[index].ID);  
  
              getchar();  
  
  
              printf("请输入姓名:");  
  
              scanf("%s",&students[index].Name);  
  
              getchar();  
  
  
              printf("请输入成绩:");  
  
              scanf("%f",&students[index].Mark1);  
  
              getchar();  
  
  
              printf("请输入成绩:");  
  
              scanf("%f",&students[index].Mark2);  
  
              getchar();  
  
  
              printf("请输入成绩:");  
  
              scanf("%f",&students[index].Mark3);  
  
              getchar();  
  
  
              students[index].Average=Avg(students[index]);  
  
         }  
  
         printf("是否继续?(y/n)");  
  
         if (getchar()=='n')  
  
         {  
  
              break;  
  
         }  
  
     }  
  
}



/*删除学生信息*/  
  
void Student_Delete()  
  
{  
  
     int i;  
  
     while(1)  
  
     {  
  
         char id[20];  
  
         int index;  
  
         printf("请输入要删除的学生的学号:");  
  
         scanf("%s",&id);  
  
         getchar();  
  
         index=Student_SearchByIndex(id);  
  
         if (index==-1)  
  
         {  
  
              printf("学生不存在!\n");  
  
         }  
  
         else  
  
         {  
  
              printf("你要删除的学生信息为:\n");  
  
              Student_DisplaySingle(index);  
  
              printf("是否真的要删除?(y/n)");  
  
              if (getchar()=='y')  
  
              {  
  
                   for (i=index;i<num-1;i++)  
  
                   {  
  
                       students[i]=students[i+1];//把后边的对象都向前移动  
  
                   }  
  
                   num--;  
  
              }  
  
              getchar();  
  
         }  
  
         printf("是否继续?(y/n)");  
  
         if (getchar()=='n')  
  
         {  
  
              break;  
  
         }  
  
     }  
  
}



/*按姓名查询*/  
  
void Student_Select()  
  
{  
  
     while(1)  
  
     {  
  
         char name[20];  
  
         int index;  
  
         printf("请输入要查询的学生的姓名:");  
  
         scanf("%s",&name);  
  
         getchar();  
  
         index=Student_SearchByName(name);  
  
         if (index==-1)  
  
         {  
  
              printf("学生不存在!\n");  
  
         }  
  
         else  
  
         {  
  
              printf("你要查询的学生信息为:\n");  
  
              Student_DisplaySingle(index);  
  
         }  
  
         printf("是否继续?(y/n)");  
  
         if (getchar()=='n')  
  
         {  
  
              break;  
  
         }  
  
     }  
  
}  



/*按平均值排序*/  
  
void Student_SortByAverage()  
  
{  
  
     int i,j;  
  
     struct Student tmp;  
  
     for (i=0;i<num;i++)  
  
     {  
  
         for (j=1;j<num-i;j++)  
  
         {  
  
              if (students[j-1].Average<students[j].Average)  
  
              {  
  
                   tmp=students[j-1];  
  
                   students[j-1]=students[j];  
  
                   students[j]=tmp;  
  
              }  
  
         }  
  
     }  
  
}



/*显示学生信息*/  
  
void Student_Display()  
  
{  
  
     int i;  
  
     printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩");  
  
     printf("-------------------------------------------------------------\n");  
  
     for (i=0;i<num;i++)  
  
     {  
  
         printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,  
  
              students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average);  
  
     }  
  
}  



/*将学生信息从文件读出*/  
  
void IO_ReadInfo()  
  
{  
  
     FILE *fp;  
  
     int i;  
  
     if ((fp=fopen("Database.txt","rb"))==NULL)  
  
     {  
  
         printf("不能打开文件!\n");  
  
         return;  
  
     }  
  
     if (fread(&num,sizeof(int),1,fp)!=1)  
  
     {  
  
         num=-1;  
  
     }  
  
     else  
  
     {  
  
         for(i=0;i<num;i++)  
  
         {  
  
              fread(&students[i],sizeof(struct Student),1,fp);  
  
         }  
  
     }  
  
     fclose(fp);  
  
}




/*将学生信息写入文件*/  
  
void IO_WriteInfo()  
  
{  
  
     FILE *fp;  
  
     int i;  
  
     if ((fp=fopen("Database.txt","wb"))==NULL)  
  
     {  
  
         printf("不能打开文件!\n");  
  
         return;  
  
     }  
  
     if (fwrite(&num,sizeof(int),1,fp)!=1)  
  
     {  
  
         printf("写入文件错误!\n");  
  
     }  
  
     for (i=0;i<num;i++)  
  
     {  
  
         if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)  
  
         {  
  
              printf("写入文件错误!\n");  
  
         }  
  
     }      
  
     fclose(fp);  
  
}




/*主程序*/  
  
int main()  
  
{  
  
     int choice;  
  
     IO_ReadInfo();  
  
     while(1)  
  
     {  
  
         /*主菜单*/  
  
         printf("\n------ 学生成绩管理系统------\n");  
  
         printf("1. 增加学生记录\n");  
  
         printf("2. 修改学生记录\n");  
  
         printf("3. 删除学生记录\n");  
  
         printf("4. 按姓名查询学生记录\n");  
  
         printf("5. 按平均成绩排序\n");  
  
         printf("6. 退出\n");  
  
         printf("请选择(1-6):");  
  
         scanf("%d",&choice);  
  
         getchar();  
  
         switch(choice)  
  
         {  
  
         case 1:  
  
              Student_Insert();  
  
              break;  
  
         case 2:  
  
              Student_Modify();  
  
              break;  
  
         case 3:  
  
              Student_Delete();  
  
              break;  
  
         case 4:  
  
              Student_Select();  
  
              break;  
  
         case 5:  
  
              Student_SortByAverage();  
  
              Student_Display();  
  
              break;  
  
         case 6:  
  
              exit(0);  
  
              break;  
  
         }  
  
         IO_WriteInfo();  
  
     }  
   return 0;
}  

这是程序的全部代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-15 21:37:16 | 显示全部楼层
forbear 发表于 2016-1-15 21:32
代码太长了  怕大家看的累  所以没有全部弄上来

那怎么帮你调试啊
不能直接上传源文件吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 21:41:59 | 显示全部楼层
人造人 发表于 2016-1-15 21:37
那怎么帮你调试啊
不能直接上传源文件吗

.......怪我  怪我   我传下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 21:44:29 | 显示全部楼层
人造人 发表于 2016-1-15 21:37
那怎么帮你调试啊
不能直接上传源文件吗

源文件貌似不能传  但是代码我发了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-15 21:58:04 | 显示全部楼层
forbear 发表于 2016-1-15 21:44
源文件貌似不能传  但是代码我发了

为什么我只找到了num=-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-15 21:58:26 | 显示全部楼层
你的排序有问题!!!
已成功运行
#include <stdio.h>
#include <string>  
/*定义学生结构体*/
struct Student
{
        char ID[20];
        char Name[20];
        float Mark1;
        float Mark2;
        float Mark3;
        float Average;
};

struct Student students[10] = { { "101","ruige",100,100,100,100 }
        ,{ "102","yuanyuan",99,99,99,99 }
,{ "103","chenxiang",98,98,98,98 } };
int num = 3;

/*按平均值排序*/
void Student_SortByAverage()

{

        int i, j;

        struct Student tmp;

        for (i = 0; i<num; i++)

        {
                for (j = 1; j<num - i; j++)
                {
                        if (students[i].Average<students[j].Average)
                        {
                                tmp = students[j];
                                students[j] = students[i];
                                students[i] = tmp;
                        }
                }
        }
}

void Student_Display()

{
        int i;
        printf("%10s%10s%8s%8s%8s%10s\n", "学号", "姓名", "成绩", "成绩", "成绩", "平均成绩");
        printf("-------------------------------------------------------------\n");
        for (i = 0; i<num; i++)
        {
                printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n", students[i].ID, students[i].Name,
                        students[i].Mark1, students[i].Mark2, students[i].Mark3, students[i].Average);
        }
}
int main()
{
        Student_SortByAverage();
        Student_Display();
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-15 22:06:36 | 显示全部楼层
麦田管理中心 发表于 2016-1-15 21:58
你的排序有问题!!!
已成功运行

非常  非常  非常的感谢    感觉自己学的还是太浅了   我只会简单的单步调试   所以我一直都对着程序没太多办法   也没想到会是这里的问题  真的谢谢解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 18:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表