c语言课程设计

从键盘输入38个学生的基本数据,包括学号,姓名,性别以及3门课程的单科成绩。
(1) 计算每个学生3门课程的总分和平均成绩;
(2) 找出每门课程中成绩最好和成绩最差的学生,并输出这些学生的基本数据;
(3) 3门课程总成绩按由高分到低分的顺序排序,输出排序后的学生的基本数据
语言环境TC2.0

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"process.h"

/*单链表结构*/
typedef struct LNote {
char num[15];
char name[10];
int score;
struct LNote *next;
}LNote,*List;

/*初始化*/
List Start()
{
List L;
L=(List)malloc(sizeof(LNote));
L->next=NULL;
return L;
}

/*插入并排序*/
void Insert(List L,char num[],char name[],int score)
{
List pre,p,s;
p=L;
s=(List)malloc(sizeof(LNote));
strcpy(s->num,num);
strcpy(s->name,name);
s->score=score;
do {
pre=p;
p=p->next;
} while(p!=NULL&&s->score<p->score);
s->next=pre->next;
pre->next=s;
printf("\n\t\t\t\t插入成功");
}

/*删除*/
void Delete(List L,char num[])
{
List pre,p;
p=L;
if(p->next==NULL) {
printf("\n\t\t\t\t记录为空");
goto end;
}
while(p!=NULL&&strcmp(p->num,num)!=0) {
pre=p;
p=p->next;
}
if(p==NULL) {
printf("\n\t\t\t\t没有该学生的数据");
goto end;
}
if(strcmp(p->num,num)==0) {
pre->next=p->next;
free(p);
printf("\n\t\t\t\t删除成功");
}
end:
printf("\n");
}

/*遍历*/
void Traverse(List L)
{
List p;
p=L->next;
if(p==NULL)
printf("\n\t\t\t\t没有记录");
else {
printf("\n\t\t学号\t\t姓名\t成绩\n");
while(p!=NULL) {
printf("\t\t%-15s%-10s%-5d\n",p->num,p->name,p->score);
p=p->next;
}
}
}

/*查找*/
void Find(List L,char num[])
{
List p;
p=L;
while(p!=NULL&&strcmp(p->num,num)!=0)
p=p->next;
if(p==NULL)
printf("\t\t\t\t没有找到");
else {
printf("\n\t\t学号\t\t姓名\t成绩\n");
printf("\t\t%-15s%-10s%-5d",p->num,p->name,p->score);
}
}

/*保存*/
void Save(List L)
{
FILE *fp;
List p;
p=L->next;
if((fp=fopen("学生管理.txt","w"))==NULL) {
printf("文件打开失败\n");
exit(1);
}
while(p!=NULL) {
fprintf(fp,"%-15s%-10s%-4d\n",p->num,p->name,p->score);
p=p->next;
}
printf("\n\t\t\t\t保存成功");
}

/*统计*/
void Tegether(List L)
{
List p,q;
float a=0,b=0,c=0,length=0;
q=L->next;
while(q!=NULL) {
length++;
q=q->next;
}
if(length==0)
printf("\n\t\t\t\t记录为空\n");
else {
p=L->next;
while(p!=NULL) {
if(p->score>=80&&p->score<=100)
a++;
if(p->score>=60&&p->score<80)
b++;
if(p->score>=0&&p->score<60)
c++;
p=p->next;
}
printf("\n\t优秀%.0f人数\t及格%.0f人\t\t不及格%.0f人\n",a,b,c);
printf("\t优秀率%-3.2f\t及格率%-3.2f\t不及格率%-3.2f",a/length,b/length,c/length);
}
}

/*读取文件*/
void Read(List L)
{
FILE *fp;
char num[15];
char name[10];
int score;
List s,pre;
if((fp=fopen("学生管理.txt","r+"))==NULL)
printf("文件打开失败");
printf("%s\t\t%s\t%s\n","学号","姓名","成绩");
pre=L;
while(!feof(fp)) {
fscanf(fp,"%s%s%d\n",num,name,&score);
printf("%-15s%-10s%-4d\n",num,name,score);

s=(List)malloc(sizeof(LNote));
strcpy(s->num,num);
strcpy(s->name,name);
s->score=score;

pre->next=s;
pre=s;
}
s->next=NULL;
if(fclose(fp))
printf("文件关闭失败");
}

int scan()
{
int d,c=2;
printf("\t\t\t\t%c 1.初始化 %c\n\n",c,c);
printf("\t\t\t\t%c 2.输入数据 %c\n\n",c,c);
printf("\t\t\t\t%c 3.删除数据 %c\n\n",c,c);
printf("\t\t\t\t%c 4.遍历 %c\n\n",c,c);
printf("\t\t\t\t%c 5.保存为数据文件 %c\n\n",c,c);
printf("\t\t\t\t%c 6.查找 %c\n\n",c,c);
printf("\t\t\t\t%c 7.统计 %c\n\n",c,c);
printf("\t\t\t\t%c 8.读取数据文件 %c\n\n",c,c);
printf("\t\t\t\t%c 9.退出 %c\n\n",c,c);
do {
printf("\t\t\t\t 输入操作:");
scanf("%d",&d);
if(d<=0||d>9)
printf("\n\t\t\t\t无此操作\n\n");
} while(d<0||d>9);
return d;
}

main()
{
int quit=0,score;
char name[10],num[15];
List L;
L=Start();
printf("\t\t\t\t***** 欢迎使用 *****\n\n");
while(!quit) {
switch(scan()) {
case 1:
Start();
printf("\n\n");
break;
case 2:
printf("\n\t\t\t\t学号:");
scanf("%s",num);
printf("\n\t\t\t\t姓名:");
scanf("%s",name);
printf("\n\t\t\t\t分数:");
scanf("%d",&score);
Insert(L,num,name,score);
printf("\n\n");
break;
case 3:
printf("\n\t\t\t\t输入学号:");
scanf("%s",num);
Delete(L,num);
printf("\n");
break;
case 4:
Traverse(L);
printf("\n\n");
break;
case 5:
Save(L);
printf("\n\n");
break;
case 6:
printf("\n\t\t\t\t输入学号:");
scanf("%s",num);
Find(L,num);
printf("\n\n");
break;
case 7:
Tegether(L);
printf("\n\n");
break;
case 8:
Read(L);
printf("\n\n");
break;
case 9:
quit=1;
break;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-27
#include <stdio.h>
#include <string.h>
#include <process.h>
#define MAX_SIZE 38
typedef struct INFO
{ char id[10];
char name[21];
char sex[3];
int course1;
int course2;
int course3;
int score;
float ave;
} INFO;
INFO info[MAX_SIZE];
void compute()
{
int i;
for (i = 0; i < MAX_SIZE; i++)
{ info[i].score = info[i].course1 + info[i].course2 + info[i].course3;
info[i].ave = (float)info[i].score / 3;
}
}
void find()
{ int i, max[3], min[3];
max[0] = min[0] = 0;
max[1] = min[1] = 0;
max[2] = min[2] = 0;
for (i = 0; i < MAX_SIZE; i++)
{ /*课程1*/
if (info[i].course1 > info[max[0]].course1) max[0] = i;
if (info[i].course1 < info[min[0]].course1) min[0] = i;
/*课程2*/
if (info[i].course2 > info[max[1]].course2) max[1] = i;
if (info[i].course2 < info[min[1]].course2) min[1] = i;
/*课程3*/
if (info[i].course3 > info[max[2]].course3) max[2] = i;
if (info[i].course3 < info[min[2]].course3) min[2] = i;
}
printf("\n课程1成绩最好的学生的信息:\n");
printf("编号 姓名 性别 课程1 课程2 课程3 总分 平均分\n");
printf("%s %s %s %d %d %d %d %.2f\n", info[max[0]].id, info[max[0]].name, info[max[0]].sex, info[max[0]].course1, info[max[0]].course2, info[max[0]].course3, info[max[0]].score, info[max[0]].ave);
printf("\n课程1成绩最差的学生的信息:\n");
printf("编号 姓名 性别 课程1 课程2 课程3 总分 平均分\n");
printf("%s %s %s %d %d %d %d %.2f\n", info[min[0]].id, info[min[0]].name, info[min[0]].sex, info[min[0]].course1, info[min[0]].course2, info[min[0]].course3, info[min[0]].score, info[min[0]].ave);
printf("\n课程2成绩最好的学生的信息:\n");
printf("编号 姓名 性别 课程1 课程2 课程3 总分 平均分\n");
printf("%s %s %s %d %d %d %d %.2f\n", info[max[1]].id, info[max[1]].name, info[max[1]].sex, info[max[1]].course1, info[max[1]].course2, info[max[1]].course3, info[max[1]].score, info[max[1]].ave);
printf("\n课程2成绩最差的学生的信息:\n");
printf("编号 姓名 性别 课程1 课程2 课程3 总分 平均分\n");
printf("%s %s %s %d %d %d %d %.2f\n", info[min[1]].id, info[min[1]].name, info[min[1]].sex, info[min[1]].course1, info[min[1]].course2, info[min[1]].course3, info[min[1]].score, info[min[1]].ave);
printf("\n课程3成绩最好的学生的信息:\n");
printf("编号 姓名 性别 课程1 课程2 课程3 总分 平均分\n");
printf("%s %s %s %d %d %d %d %.2f\n", info[max[2]].id, info[max[2]].name, info[max[2]].sex, info[max[2]].course1, info[max[2]].course2, info[max[2]].course3, info[max[2]].score, info[max[2]].ave);
printf("\n课程3成绩最差的学生的信息:\n");
printf("编号 姓名 性别 课程1 课程2 课程3 总分 平均分\n");
printf("%s %s %s %d %d %d %d %.2f\n", info[min[2]].id, info[min[2]].name, info[min[2]].sex, info[min[2]].course1, info[min[2]].course2, info[min[2]].course3, info[min[2]].score, info[min[2]].ave);}
void sort()
{
int i, j;
INFO temp;
for (i = 0; i < MAX_SIZE; i++)
{
for (j = i; j < MAX_SIZE; j++)
{
if (info[i].score < info[j].score)
{
temp = info[i];
info[i] = info[j];
info[j] = temp;
}
}
}
printf("\n\n编号 姓名 性别 课程1 课程2 课程3 总分 平均分\n");
for (i = 0; i < MAX_SIZE; i++)
{
printf("%s %s %s %d %d %d %d %.2f\n", info[i].id, info[i].name, info[i].sex, info[i].course1, info[i].course2, info[i].course3, info[i].score, info[i].ave);
}
}

int main(int argc, char* argv[])
{
int i, flag = 0, cnt = 0;
char id[10];
while(cnt < MAX_SIZE)
{
flag = 0;
printf("请输入第%d个学生的编号:", cnt+1);
scanf("%s", id);
for (i = 0; i < cnt; i++)
{
if (strcmp(info[i].id, id) == 0)
{
printf("已存在在编号的学生\n");
flag = 1;
break;
}
}
if (flag == 1) continue;
printf("请输入第%d个学生的名字:", cnt+1);
scanf("%s", info[cnt].name);
printf("请输入第%d个学生的性别:", cnt+1);
scanf("%s", info[cnt].sex);
printf("请输入第%d个学生的课程1的成绩:", cnt+1);
scanf("%d", &info[cnt].course1);
printf("请输入第%d个学生的课程2的成绩:", cnt+1);
scanf("%d", &info[cnt].course2);
printf("请输入第%d个学生的课程3的成绩:", cnt+1);
scanf("%d", &info[cnt].course3);
cnt++;
}
compute();
find();
sort();
system("pause");
return 0;
}
相似回答