重新发刚才的问题,请大佬看一下,感激不尽
程序代码:#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++运行不了,请问是为什么呢?






