代码已发,在附件,邮件名“代码”,附件Untitled2.c
如果有疑问欢迎追问。
代码如下:
#include
#include
#include
#include
#define min(A,B) (A
#define max(A,B) (A
typedef struct Student
{
long long int id;
char name[11];
int score[4];
double avg;
struct Student* next;
} Student;
void print(Student* stu)
{
printf("学号:%10lld 姓名:%10s 成绩:语文:%3d 数学:%3d 英语:%3d 计算机:%3d 平均分:%3.2lf\n",
stu->id,stu->name,stu->score[0],stu->score[1],stu->score[2],stu->score[3],stu->avg);
}
int main(void)
{
Student* head = 0;
int stucount=0;//数量
while(1)
{
printf("输入操作号:1:录入学生 2:浏览 3:查询 4:修改 5:排序 6:统计\n");
int quest;
scanf("%d",&quest);
scanf("%*[^\n]");
if(quest==1)
{
printf("录入学生:\n") ;
while(1)
{
printf("请输入学生学号(-1退出录入):\n");
long long int id;
scanf("%lld", &id);
if(id==-1)break;
Student* newStudent = (Student*)malloc(sizeof(Student));
newStudent->id=id;
printf("请输入学生名字:\n");
scanf("%10s", newStudent->name);
scanf("%*[^\n]");
printf("请输入学生语文成绩:\n");
scanf("%d",&(newStudent->score[0]));
printf("请输入学生数学成绩:\n");
scanf("%d",&(newStudent->score[1]));
printf("请输入学生英语成绩:\n");
scanf("%d",&(newStudent->score[2]));
printf("请输入学生计算机成绩:\n");
scanf("%d",&(newStudent->score[3]));
int sum=0;
for(int i=0; i<4; ++i)sum+=newStudent->score[i];
newStudent->avg = sum/4.0;
printf("学生已录入!平均分为:%lf\n",newStudent->avg);
//插入链表首,这样最新添加的显示在最上面,容易看见效果
newStudent->next=head;
head=newStudent;
++stucount;
}
}
else if(quest==2)
{
if(head==0)
printf("没有学生!\n");
else
{
printf("开始浏览学生:\n");
int st=0,en=min(st+10,stucount);
while(1)
{
printf("浏览学生:%d个到%d个学生\n",st+1,en);
Student* stu = head;
for(int i=0; i
{
stu=stu->next;
}
for(int i=st; i
{
print(stu);
stu=stu->next;
}
printf("输入操作号:1 向后翻页;2 向前翻页;-1 退出\n");
int squest;
scanf("%d",&squest);
scanf("%*[^\n]");
if(squest==1)
{
if(en!=stucount) st=en;
}
else if(squest==2)
{
st=max(0,st-10);
}
else if(squest==-1)break;
en=min(st+10,stucount);
}
}
}
else if(quest==3)
{
printf("开始查询学生信息:\n");
while(1)
{
printf("通过什么查询?1:学生id 2:学生名字 3:学生语文成绩 4:学生数学成绩 5:学生英语成绩 6:学生计算机成绩 7:平均分 -1 退出\n");
int squery,squery2;
scanf("%d", &squery);
if(squery==-1)break;
Student temp;
Student* newStudent = &temp;
if(squery==1)
{
printf("请输入学生id:\n");
scanf("%lld", &(newStudent->id));
}
else if(squery==2)
{
printf("请输入学生名字:\n");
scanf("%10s", newStudent->name);
scanf("%*[^\n]");
}
else if(squery==3)
{
printf("请输入学生语文成绩:\n");
scanf("%d",&(newStudent->score[0]));
}
else if(squery==4)
{
printf("请输入学生数学成绩:\n");
scanf("%d",&(newStudent->score[1]));
}
else if(squery==5)
{
printf("请输入学生英语成绩:\n");
scanf("%d",&(newStudent->score[2]));
}
else if(squery==6)
{
printf("请输入学生计算机成绩:\n");
scanf("%d",&(newStudent->score[3]));
}
else if(squery==7)
{
printf("请输入学生平均分:\n");
scanf("%lf",&(newStudent->avg));
}
if(squery>=3 && squery<=7)
{
printf("显示比此分数高还是低的学生?1:低 2:高\n");
scanf("%d",&squery2);
}
Student* stu = head;
int flag=0;
while(stu!=0)
{
if(squery==1)
{
if(newStudent->id==stu->id)
{
print(stu);
flag=1;
}
}
else if(squery==2)
{
if(strcmp(newStudent->name,stu->name)==0)
{
print(stu);
flag=1;
}
}
else if(squery==7)
{
if((newStudent->avg!=stu->avg) && ((newStudent->avg>stu->avg) ^ (squery2==2)))
{
print(stu);
flag=1;
}
}
else if(squery>2 && squery<7)
{
if((newStudent->score[squery-3]!=stu->score[squery-3]) && ((newStudent->score[squery-3]>stu->score[squery-3]) ^ (squery2==2)))
{
print(stu);
flag=1;
}
}
stu=stu->next;
}
if(flag==0)
{
printf("没有查到学生!\n");
continue;
}
}
}
else if(quest==4)
{
printf("开始修改学生信息:\n");
while(1)
{
printf("请输入学生学号(-1退出修改):\n");
long long int id;
scanf("%lld", &id);
if(id==-1)break;
Student* newStudent = head;
Student* lststu = 0;
while(newStudent!=0 && newStudent->id!=id)
{
lststu=newStudent;
newStudent=newStudent->next;
}
if(newStudent==0)
{
printf("没有查到学生!\n");
continue;
}
printf("请输入操作号:1:修改学生名字 2:修改学生语文成绩 3:修改学生数学成绩 4:修改学生英语成绩 5:修改学生计算机成绩 6:删除学生\n");
int squery;
scanf("%d", &squery);
if(squery==1)
{
printf("请输入学生名字:\n");
scanf("%10s", newStudent->name);
scanf("%*[^\n]");
}
else if(squery==2)
{
printf("请输入学生语文成绩:\n");
scanf("%d",&(newStudent->score[0]));
}
else if(squery==3)
{
printf("请输入学生数学成绩:\n");
scanf("%d",&(newStudent->score[1]));
}
else if(squery==4)
{
printf("请输入学生英语成绩:\n");
scanf("%d",&(newStudent->score[2]));
}
else if(squery==5)
{
printf("请输入学生计算机成绩:\n");
scanf("%d",&(newStudent->score[3]));
}
else if(squery==6)
{
stucount--;
if(lststu!=0)
lststu -> next = newStudent -> next;
else
head = newStudent -> next;
printf("已删除学生!\n");
}
if(squery!=6)
{
int sum=0;
for(int i=0; i<4; ++i)sum+=newStudent->score[i];
newStudent->avg = sum/4.0;
printf("学生已修改!他的平均分为:%lf\n",newStudent->avg);
}
}
}
else if(quest==5)
{
if(head==0)
printf("没有学生!\n");
else
{
printf("对学生按什么排序?:1:学生号 2:名字 3:语文成绩 4:数学成绩 5:修改学生英语成绩 5:计算机成绩 6:平均分\n");
int squery;
scanf("%d", &squery);
printf("升序还是降序? 1:升序 2:降序\n");
int squery2;
scanf("%d", &squery2);
int flag=1;
Student* stu = head;
Student* lststu = 0;
while(flag==1)
{
flag=0;
while(stu->next!=0)
{
int swflag=0;
if(squery==0)
{
if((stu->next->id > stu->id) ^ (squery2==1))swflag=1;
}
else if(squery==1)
{
if((strcmp(stu->next->name,stu->name)>0) ^ (squery2==1))swflag=1;
}
else if(squery==6)
{
if((stu->next->avg > stu->avg) ^ (squery2==1))swflag=1;
}
if(swflag==1)
{
flag=1;
if(lststu==0) head=stu->next;
else lststu->next=stu->next;
Student* temp = stu->next->next;
stu->next->next=stu;
stu->next=temp;
}
lststu=stu;
stu=stu->next;
}
}
printf("已排序!\n");
}
}
else if(quest==6)
{
double totscore[4]= {0};
double sum=0;
Student* stu=head;
while(stu!=0)
{
for(int i=0; i<4; ++i)
{
totscore[i]+=stu->score[i];
sum+=stu->avg;
}
}
for(int i=0; i<4; ++i) totscore[i]=totscore[i]/4.0;
sum=sum/4.0;
printf("统计:学生人数:%d 语文平均分:%lf 数学平均分:%lf 英语平均分:%lf 计算机平均分:%lf 总平均分:%lf\n",stucount,totscore[0],totscore[1],totscore[2],totscore[3],sum);
}
else if(quest==-1)
break;
}
return 0;
}