重新发刚才的问题,请大佬看一下,感激不尽
程序代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> //班级数量 #define ClassNumber 4 //课程数量 #define CourseNumber 5 //一个班级的学生数量 #define StudentNumber 45 //菜单 #define menu "1、随机生成全部学生的成绩\n" \ "2、计算全部学生的平均成绩\n" \ "3、非递增冒泡排序\n" \ "4、非递增选择排序\n" \ "5、显示所有班级的成绩表\n" \ "6、创建非递增单链表\n" \ "7、显示单链表的值\n" \ "0、退出\n请选择一个菜单:" //表示一个学生的成绩信息 typedef struct tagScore { //学号 char id[16]; //姓名 char name[32]; //5门课程的成绩 int scores[5]; //平均成绩 float ave; struct tagScore *next; }Score; //表示一个班级 typedef struct { //班级名 char classname[32]; //本班所有同学的成绩 Score scorearray[StudentNumber]; }Class; //表示一个年级 typedef struct { //年级名 char gradename[32]; //4个班级 Class a,b,c,d; }Grade; typedef enum { //未执行过任何命令时的状态 Ready=-1, //命令1执行完后的状态 cmd1over, //命令2执行完后的状态 cmd2over, cmd3or4over, cmd6over, }State; //唯一的一个有4个班级的年级变量 Grade agrade; //执行一个命令前所处的状态 State s=Ready; //单链表的头结点, //为了便于插入,这里创建的是带头结点的单链表 Score head; //辅助用的班级指针数组 Class *clsptarr[4]={&agrade.a,&agrade.b, &agrade.c,&agrade.d}; //随机生成全部学生的成绩 void randgeneratescore() { //学号前缀 const char IdPrefix[]="1609200"; //最小分数、最大分数 const int Min=0,Max=100; //n为学号的起始编号 int i,j,k,n=1,t=Max-Min+1; char temp[8]; srand(time(NULL)); printf("请输入年级名:"); scanf("%s",agrade.gradename); printf("请输入年级\"%s\"的4个班级名:",agrade.gradename); for(i=0;i<ClassNumber;i++) { scanf("%s",(*(clsptarr[i])).classname); } puts("正在随机生成全部学生的成绩,请等待。。。"); for(i=0;i<ClassNumber;i++) { for(j=0;j<StudentNumber;j++) { //为学生的姓名赋值, //学生姓名的格式类似于class1name1 sprintf((*(clsptarr[i])).scorearray[j].name, "class%d_name%d", i+1,j+1); // //printf("name=%s\n",(*(clsptarr[i])).scorearray[j].name); //为学生的学号赋值, //学号为IdPrefix前缀加一个3位的唯一编号 sprintf(temp,"%.*d",3,n++); strcpy((*(clsptarr[i])).scorearray[j].id,IdPrefix); strcat((*(clsptarr[i])).scorearray[j].id,temp); // //printf("id=%s\n",(*(clsptarr[i])).scorearray[j].id); //为某一个学生的5门课程的成绩赋值(随机) for(k=0;k<CourseNumber;k++) { (*(clsptarr[i])).scorearray[j].scores[k]=rand()%t+Min; } } } s=cmd1over; puts("随机生成全部学生的成绩,已完成"); } //计算全部学生的平均成绩 void calavescore() { float sum; int i,j,k; for(i=0;i<ClassNumber;i++) { for(j=0;j<StudentNumber;j++) { sum=0; for(k=0;k<CourseNumber;k++) { sum+=(*(clsptarr[i])).scorearray[j].scores[k]; } (*(clsptarr[i])).scorearray[j].ave=sum/CourseNumber; // //printf("ave=%.1f\n",(*(clsptarr[i])).scorearray[j].ave); } } puts("命令已完成"); s=cmd2over; } //实现冒泡排序算法 void bubbl(Class *c) { int i,swap=1,sorted=0; Score tempsc; while(swap) { swap=0; for(i=0;i<StudentNumber-1-sorted;i++) { if((*c).scorearray[i].ave<(*c).scorearray[i+1].ave) { tempsc=(*c).scorearray[i]; (*c).scorearray[i]=(*c).scorearray[i+1]; (*c).scorearray[i+1]=tempsc; } swap=1; } sorted++; } } //非递增冒泡排序 void bubblesort() { int i; for(i=0;i<ClassNumber;i++) bubbl(clsptarr[i]); s=cmd3or4over; puts("命令已完成"); } //实现选择排序算法 void select(Class *c) { int max,i,j; Score tempsc; for(i=0;i<StudentNumber-1;i++) { max=i; for(j=i+1;j<StudentNumber;j++) { if((*c).scorearray[j].ave>(*c).scorearray[max].ave) max=j; } if(max!=i) { tempsc=(*c).scorearray[i]; (*c).scorearray[i]=(*c).scorearray[max]; (*c).scorearray[max]=tempsc; } } } //非递增选择排序 void selectsort() { int i; for(i=0;i<ClassNumber;i++) select(clsptarr[i]); s=cmd3or4over; puts("命令已完成"); } //显示所有班级的成绩表 void showallclassscore() { int i,j; printf("\t\t\t年级\"%s\"各个班级的成绩表\n",agrade.gradename); for(i=0;i<ClassNumber;i++) { printf("%s班:\n",(*(clsptarr[i])).classname); printf("%-12s%-15s%-8s%-8s%-8s%-8s%-8s%s\n", "学号", "姓名", "课程1", "课程2", "课程3", "课程4", "课程5", "平均分" ); for(j=0;j<StudentNumber;j++) { printf("%-12s%-15s%-8d%-8d%-8d%-8d%-8d", (*(clsptarr[i])).scorearray[j].id, (*(clsptarr[i])).scorearray[j].name, (*(clsptarr[i])).scorearray[j].scores[0], (*(clsptarr[i])).scorearray[j].scores[1], (*(clsptarr[i])).scorearray[j].scores[2], (*(clsptarr[i])).scorearray[j].scores[3], (*(clsptarr[i])).scorearray[j].scores[4] ); //未求出平均成绩前,将平均成绩显示为0.0, //否则,显示平均成绩 printf("%.1f\n", (s>=cmd2over ? (*(clsptarr[i])).scorearray[j].ave : 0.0) ); } } } //创建非递增单链表 void createlink() { int i,j; Score *q,*p,*cur; //先将第1个班级的所有学生的成绩链接起来 for(i=0;i<StudentNumber-1;i++) { (*(clsptarr[0])).scorearray[i].next=&((*(clsptarr[0])).scorearray[i+1]); } //令第1个班级最后一个学生的成绩的next指针为NULL (*(clsptarr[0])).scorearray[StudentNumber-1].next=NULL; //令头结点的next指针指向第1个班级的第1个学生的成绩 head.next=&(*(clsptarr[0])).scorearray[0]; //链接其它3个班级的所有学生的成绩 for(i=1;i<ClassNumber;i++) { for(j=0;j<StudentNumber;j++) { //开始时,p指向单链表的第一个结点 p=head.next; //开始时,q指向头结点(q始终指向p指向结点的前驱结点) q=&head; //cur指向当前要插入单链表的结点 cur=&(*(clsptarr[i])).scorearray[j]; while(p&&(*cur).ave<(*p).ave) { q=p; p=(*p).next; } //插到p所指结点的前面 (*cur).next=p; (*q).next=cur; } } s=cmd6over; puts("命令已完成"); } //显示单链表的值 void showlink() { Score *p=head.next; if(!p) puts("链表为空"); else { puts("\t\t\t\t链表的值如下:"); printf("%-12s%-15s%-8s%-8s%-8s%-8s%-8s%s\n", "学号", "姓名", "课程1", "课程2", "课程3", "课程4", "课程5", "平均分" ); while(p) { printf("%-12s%-15s%-8d%-8d%-8d%-8d%-8d%.1f", (*p).id, (*p).name, (*p).scores[0], (*p).scores[1], (*p).scores[2], (*p).scores[3], (*p).scores[4], (*p).ave ); p=(*p).next; printf("%s",p ? " ->\n" : "\n"); } } } //处理菜单 void processmenu(int m) { switch(m) { case 1: randgeneratescore(); break; case 2: if(s<cmd1over) puts("请先执行命令1\n"); else calavescore(); break; case 3: if(s<cmd2over) puts("请先执行命令2\n"); else bubblesort(); break; case 4: if(s<cmd2over) puts("请先执行命令2\n"); else selectsort(); break; case 5: if(s<cmd1over) puts("请先执行命令1\n"); else showallclassscore(); break; case 6: if(s<cmd3or4over) puts("请先执行命令3或命令4\n"); else createlink(); break; case 7: if(s<cmd6over) puts("请先执行命令6\n"); else showlink(); break; case 0: exit(0); break; default: puts("无法处理的菜单命令"); break; } printf("\n"); } int main() { int m; while(1) { printf("%s",menu); scanf("%d",&m); processmenu(m); } return 0; }
用vc++运行不了,请问是为什么呢?