资源描述
计算机科学学院计算机科学与应用系C程序设计报告
成 绩 管 理 系 统 设 计
学生姓名:* *
学 号:1004681082
班 级:计 科102
指导老师:* *
报告日期:2011--02--16
1.题目与要求
1)问题提出
本人计划编写一个学生信息管理系统,主要用来管理学生基本信息及成绩信息。
2)本系统涉及的知识点
单链表、结构体、函数、循环、指针、选择
3)功能要求
(1)建立学生信息,每个学生的信息包括:学号、姓名、成绩。
(2)求出每个学生的总分和平均分。
(3)查找:根据学号、姓名、成绩、总分、平均分中任一项查询该生的基本信息。
(4)排序:根据学号或总分将学生的信息按照一定的顺序进行排序。
(5)根据需要修改学生的基本信息。
(6)根据实际情况删除某生的信息。
(7)根据实际情况插入某生的信息。
(8)输出。
2.功能设计
1)算法设计
(1)利用switch语句设计如图所示的主菜单。
请输入选项编号
1——查 找
2——排 序
3——学生信息的修改
4——链表的删除
5——链表的插入
6——链表的输出
7——退 出
图1 学生信息管理系统主菜单
(2)选择1后,调用查找函数search,进入查找函数后利用switch语句实现如图所示的查找子菜单。该菜单中每个选项调用一个函数(除选项10外)。
查找菜单
请输入选项编号
1——按学号查找
2——按姓名查找
3——按C语言分数查找
4——按高数分数查找
5——按英语分数查找
6——按总分查找
7——按平均分查找
8——总分前三名
9——不及格者
10——班级成绩情况
11——退出
图2 查找子菜单
(3)选项2后, 调用排序函数arrange,进入查找函数后利用switch语句实现如图所示的查找子菜单。该菜单中每个每个选项调用一个函数(除3外)。
排序菜单
输入选项编号
1——按学号排序
2——按总分排序
3——退 出
图3 排序子菜单
(4)选择3后,调用修改函数correct,修改某个学生的信息。
(5)选择4后,调用删除函数del,根据需要删除某个学生的信息。
(6)选择5后,调用插入函数insert,根据需要插入某个学生的信息。
(7)选择6后,调用输出函数output,将每个学生的信息全部输出。
(8)选择7后,退出学生信息管理系统。
(9)根据所选菜单编号编写相应代码。
(a)函数welcome:欢迎用户使用。
(b)函数about: 简要介绍本程序。
(c)函数create:创建单链表,采用循环输入的方式输入学生的基本信息。
(d)函数SnoSearch:根据学号查找,输出该生的基本信息。
(e)函数NameSearch:根据姓名查找,输出该生的基本信息。
(f)函数CYuYanSearch:根据C语言成绩成绩查找,输出该生的基本信息。
(g)函数GaoShuSearch:根据高数成绩查找,输出该生的基本信息。
(h)函数YingYuSearch:根据英语成绩查找,输出该生的基本信息。
(i)函数ZongFenSearch:根据总分查找,输出该生的基本信息。
(j)函数AverageSearch:根据平均分查找,输出该生的基本信息。
(k)函数QSMSearch:查看班级前三名学生信息情况。
(l)函数BuJiGeSearch:查看班级不及格学生信息情况。
成绩菜单
输入选项编号
1——C语言不及格者
2——高数不及格者
3——英语不及格者
4——不及格者
5——全不及格者
6——退出
图4 成绩子菜单
(m)函数ClassScore:查看班级成绩平均分整体情况。
(n)函数SnoArrange:按照学号将学生信息进行排序。
(o)函数ZongFenArrange:按照总分将学生信息进行排序。
(n)函数over:感谢用户使用。
2)画模块图
按学号查找
显示欢迎界 面
按姓名查找
显示程序介 绍
按C语言不及格者查 找
按成绩查找
输 入
成 绩
按高数不及格者查 找
按总分查找
查 找
排 序
主
模块
按平均分查 找
修改学生信 息
按英语不及格者查 找
按前三名查 找
删除学生信 息
按不及格查 找
插入学生信 息
按不及格者查 找
按学号排序
输出学生信 息
按全不及格者查 找
按总分排序
显示结束界 面
图5 成绩管理系统模块图
3)画部分模块的流程图
开始
输入学生信息
pnew->score=pnew->score1+pnew->score2+pnew->score3;
pnew->avg=pnew->score/3
pnew->score=pnew->score1+pnew->score2+pnew->score3;
pnew->avg=pnew->score/3
输入学生信息
结束
p->next=NULL
Y
N
a==pnew->sno
图6 creat函数流程图
开始
输入a
t++
t==num+1
Y
N
a==p->sno
p=p->next
N
Y
输出学生信息
结束
图7 SnoSearch函数流程图
开始
输入b
t=0;flag=0;p=head;
t++
N
Y
t==num+1
k==0
Y
flag==0
N
Y
N
结束
flag=1
输出学生信息
p=p->next
图8 NameSearch函数流程图
开始
s=0;r=0;w=0;t=0
m=0;n=0;p=head;
N
Y
s!=num
p=head;s=0
s++
N
Y
s!=num
t<p->score
N
s++
Y
t=p->score
t==p->score
N
p=p->next
Y
输出学生信息
p=head
p=p->next
……
结束
图9 QSMSearch函数流程图
开始
p=head
输入b
N
a==1
N
Y
a>1&&a<num
n=1
a==num
Y
n=2
head=head->next
N
Y
n=3
i=0
j=0
N
i!=a-2
N
j!=a-2
Y
Y
p=p->next
p=p->next
i++
j++
p->next=NULL
p->next=p->next->next
num=num-1
结束
图10 del函数流程图
3.程序代码设计
1.main函数:
(1)函数原型:void main()
(2)功能:分别调用 welcome函数、about函数、create函数、search函数、del函数、insert函数、output函数和over函数。
(3)变量及类型:
int m,n; //switch选择变量
(4)说明:main函数中用到system("cls"),其作用是清除屏幕上的文字。
2.welcome函数:
(1)函数原型:void welcome()
(2)功能:显示欢迎用户使用界面。
(3)说明:getchar()函数用于使屏幕停止,按下Enter键后再执行下面程序。
3.about函数:
(1)函数原型:void about()
(2)功能:简要介绍本程序。
(3)说明:getchar()函数用于使屏幕停止,按下Enter键后再执行下面程序。
4.create函数:
(1)函数原型:void create()
(2)功能:利用单链表、while循环和 scanf函数完成对学生信息的输入(学号、姓名、三门成绩),并计算出总分和平均分,再存入单链表中。
(3)变量及类型:
int a=0; //判断学生信息输入是否结束(学号是否为0)
struct student *p,*pnew; //结构体指针指向结点
(4)说明:学生的人数不受限制,输入结束符号即可。
5.search函数:
(1)函数原型:void search()
(2)功能:通过选项来选择调用不同函数,完成不同的功能。
(3)变量及类型:
int m,n; //switch选择变量
6.SnoSearch函数:
(1)函数原型:void SnoSearch()
(2)功能:通过学号来查找该生的基本信息。
(3)变量及类型:
int a,t; //a用来存储学号;t用来计数,以便跳出循环
struct student *p; //指针p用于指向头结点
7.NameSearch函数:
(1)函数原型:void NameSearch()
(2)功能:通过姓名来查找该生的基本信息。
(3)变量及类型:
int k,t,flag; //k用于判断;t用于计数;flag起标记作用
char b[20]; //数组b用于存放姓名
struct student *p; //指针p用于指向头结点
8.CYuYanSearch函数:
(1)函数原型:void CYuYanSearch()
(2)功能:通过C语言成绩来查找该生的基本信息。
(3)变量及类型:
int t,flag; //t用于计数;flag起标记作用
float a; //a用于存放C语言成绩
struct student *p; //指针p用于指向头结点
9.GaoShuSearch函数:
(1)函数原型:void GaoShuSearch()
(2)功能:通过高数成绩来查找该生的基本信息。
(3)变量及类型:
int t,flag; //t用于计数;flag起标记作用
float b; //b用于存放高数成绩
struct student *p; //指针p用于指向头结点
10.YingYuSearch函数:
(1)函数原型:void YingYuSearch()
(2)功能:通过英语成绩来查找该生的基本信息。
(3)变量及类型:
int t,flag; //t用于计数;flag起标记作用
float c; //c用于存放英语成绩
struct student *p; //指针p用于指向头结点
11.ZongfenSearch函数:
(1)函数原型:void ZongfenSearch()
(2)功能:通过总分来查找该生的基本信息。
(3)变量及类型:
int t,flag; //t用于计数;flag起标记作用
float d; //d用于存放总分
struct student *p; //指针p用于指向头结点
12.AverageSearch函数:
(1)函数原型:void AverageSearch()
(2)功能:通过平均分来查找该生的基本信息。
(3)变量及类型:
int t,flag; //t用于计数;flag起标记作用
float e; //e用于存放平均分
struct student *p; //指针p用于指向头结点
13.QSMSearch函数:
(1)函数原型:void QSMSearch()
(2)功能:显示前三名的基本信息
(3)变量及类型:
int s=0,r=0,w=0; //s,r,w均用做计数
float t=0,m=0,n=0; //t,m,n均用做记录最高分
struct student *p; //指针p用于指向头结点
14. BuJiGeSearch函数:
(1)函数原型:void BuJiGeSearch()
(2)功能:通过switch选择输出不及格情况。
(3)变量及类型:
int n,m,r,s,t,k,h,flag; //n,m为switch选择变量;r,s,t,k,h用做计数;flag起标记作用
struct student *p; //指针p用于指向头结点
15.ClassScore函数:
(1)函数原型:void ClassScore()
(2)功能:查看班级成绩的整体情况。
(3)变量及类型:
int i; //i用于for循环
float a=0,b=0,c=0,d,e; //a,b,c,d,e均用于中间变量
struct student *p; //指针p用于指向头结点
16.arrange函数:
(1)函数原型:void arrange()
(2)功能:通过选项来选择调用不同函数,完成不同的功能。
(3)变量及类型:
int a,m; //a,m均为switch选择变量;
17.SnoArrange函数:
(1)函数原型:void SnoArrange()
(2)功能:将学生信息按照学号进行排序。
(3)变量及类型:
int a,c,i,j; //a为switch选择变量;c用于计数;i,j用于for循环
struct student *p,*q,*k,*newp,*newhead; //指针p,q,k,newp,newhead均用于创建新链表
18.ZongFenArrange函数:
(1)函数原型:void ZongFenArrange()
(2)功能:将学生信息按照总分进行排序。
(3)变量及类型:
int a,c,i,j; //a为switch选择变量;c用于计数;i,j用于for循环
struct student *p,*q,*k,*newp,*newhead; //指针p,q,k,newp,newhead均用于创建新链表
19. correct函数:
(1)函数原型:void correct()
(2)功能:修改某生的信息。
(3)变量及类型:
int t,a,b,m,flag; // t用于计数;a用于判断;b,m为switch选择变量;flag起标记作用
struct student *p; //指针p用于指向头结点
20.del函数:
(1)函数原型:void del()
(2)功能:删除单链表中某生的基本信息。
(3)变量及类型:
int a,n,i,j; //a存放要删除的结点;n为switch选择变量;i,j用于for循环
struct student *p; //指针p用于指向头结点
21.insert函数:
(1)函数原型:void insert()
(2)功能:将某生的基本信息插入单链表中。
(3)变量及类型:
int a,n,i,j; // a存放要插入的结点;n为switch选择变量;i,j用于for循环
struct student *p,*q; //指针p用于指向头结点;指针q用于指向新生信息的结点
22.output函数:
(1)函数原型:void output()
(2)功能:输出每个学生的基本信息。
(3)变量及类型:
int s=0; //s用于计数
struct student *p //指针p用于指向头结点
23.over函数:
(1)函数原型:void over()
(2)功能:显示感谢用户使用界面。
4.C程序设计总结
(1)程序调试情况
在编写完程序后,执行时总会出现很多错误,便又重新检查程序,改写程序,再经过不断的调试,最终将程序改写完成。
(2)本人在程序中的感想
程序在编写时总是感觉非常难,而且还会出现很多小错误,从而导致出很多麻烦,最终经过耐心检查,才将问题解决。
5.结束语
由于本人完成此程序是在家中完成,又无网络可以查询,故只能参考课本,在本人的独立下完成此程序,在此须感谢白燕老师。
6.参考文献
[1]尹业安 白燕.C语言程序设计.国防科技大学出版社,2008.8
7.附录:程序清单
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void welcome();
void about();
void create();
void search();
void SnoSearch();
void NameSearch();
void CYuYanSearch();
void GaoShuSearch();
void YingYuSearch();
void ZongFenSearch();
void AverageSearch();
void QSMSearch();
void BuJiGeSearch();
void ClassScore();
void arrange();
void SnoArrange();
void ZongFenArrange();
void correct();
void del();
void insert();
void output();
void over();
struct student
{
int sno;
char name[20];
float score1;
float score2;
float score3;
float score;
double avg;
struct student *next;
};
struct student *head;
int num=0;
void main()
{
int m,n;
welcome();
about();
system("cls");
create();
system("cls");
Z: printf("1——查找\n");
printf("2——排序\n");
printf("3——学生信息的修改\n");
printf("4——链表的删除\n");
printf("5——链表的插入\n");
printf("6——链表的输出\n");
printf("7——退出\n");
scanf("%d",&n);
switch(n)
{
case 1:
system("cls");
search();
system("cls");
goto Z;
case 2:
system("cls");
arrange();
system("cls");
goto Z;
case 3:
system("cls");
correct();
system("cls");
goto Z;
case 4:
system("cls");
del();
system("cls");
goto Z;
case 5:
system("cls");
insert();
system("cls");
goto Z;
case 6:
system("cls");
output();
system("cls");
goto Z;
case 7:
system("cls");
F: printf("你真的想退出吗\n 1——是 2——否\n");
scanf("%d",&m);
switch(m)
{
case 1:
break;
case 2:
goto Z;
default:
system("cls");
printf("你的输入有误\n");
goto F;
}
break;
default:
system("cls");
printf("你的输入有误\n");
goto Z;
}
system("cls");
over();
}
void welcome()
{
printf("\n\n\n");
printf(" 【】————————————————————【】\n");
printf(" ||————————————————————||\n");
printf(" || 欢迎使用 ||\n");
printf(" || ||\n");
printf(" || ||\n");
printf(" || 学 生 成 绩 管 理 系 统 ||\n");
printf(" || ||\n");
printf(" || ||\n");
printf(" || ||\n");
printf(" || 制作人:** ||\n");
printf(" || 指导老师:** ||\n");
printf(" || ||\n");
printf(" ||————————————————————||\n");
printf(" 【】————————————————————【】\n");
getchar();
}
void about()
{
system("cls");
printf("\n\n\n");
printf("\t\t\t关于学生管理系统的说明\n\n\n");
printf(" 本程序采用链表和函数编写完成,主要功能有查找,链表的删除,链表的插入和链表的输出.\n");
printf("程序中主要运用链表部分和函数的知识.程序优点是:学生人数可以根据实际情况进行更改;\n缺点是:部分程序过于复杂,程序功能不太齐全;");
printf("本程序已经经过多次测试,尚未出现问题.\n\n若在使用中出现错误,还请谅解!");
getchar();
}
void create()
{
int a=0;
struct student *p,*pnew;
head=pnew=p=(struct student *)malloc(sizeof(struct student));
printf("请依次输入每位同学的学号,姓名和3门成绩,按0键结束\n");
printf(" 学号 姓名 C语言 高数 英语\n") ;
scanf("%d%s%f%f%f",&pnew->sno,pnew->name,&pnew->score1,&pnew->score2,&pnew->score3);
pnew->score=pnew->score1+pnew->score2+pnew->score3;
pnew->avg=pnew->score/3.0;
pnew->avg=(double)( (int)(pnew->avg*100)*0.01 );
while(1)
{
num++;
p->next=pnew;
p=pnew;
pnew=(struct student *)malloc(sizeof(struct student));
scanf("%d",&pnew->sno);
if(a==pnew->sno)
break;
scanf("%s%f%f%f",pnew->name,&pnew->score1,&pnew->score2,&pnew->score3);
pnew->score=pnew->score1+pnew->score2+pnew->score3;
pnew->avg=pnew->score/3.0;
pnew->avg=(double)( (int)(pnew->avg*100)*0.01 );
}
p->next =NULL;
}
void search()
{
int m,n;
A: printf("1——按学号查找\n");
printf("2——按姓名查找\n");
printf("3——按C语言分数查找\n");
printf("4——按高数分数查找\n");
printf("5——按英语分数查找\n");
printf("6——按总分查找\n");
printf("7——按平均分查找\n");
printf("8——总分前三名\n");
printf("9——不及格者\n");
printf("10——班级成绩情况\n");
printf("11——退出\n");
scanf("%d",&n);
switch(n)
{
case 1:
SnoSearch();
goto A;
case 2:
NameSearch();
goto A;
case 3:
CYuYanSearch();
goto A;
case 4:
GaoShuSearch();
goto A;
case 5:
YingYuSearch();
goto A;
case 6:
ZongFenSearch();
goto A;
case 7:
AverageSearch();
goto A;
case 8:
QSMSearch();
goto A;
case 9:
BuJiGeSearch();
goto A;
case 10:
ClassScore();
goto A;
case 11:
system("cls");
D: printf("你真的想退出吗\n 1——是 2——否\n");
scanf("%d",&m);
switch(m)
{
case 1:
break;
case 2:
goto A;
default:
system("cls");
printf("你的输入有误\n");
goto D;
}
break;
default:
system("cls");
printf("你的输入有误\n");
goto A;
}
}
void SnoSearch()
{
int a,t;
struct student *p;
system("cls");
printf("请输入学号:");
S: scanf("%d",&a);
t=0;p=head;
printf("\n学号为%d的成绩如下:\n",a);
printf(" 学号 姓名 C语言 高数 英语 总分 平均分\n");
while(1)
{
t++;
if(t==num+1)
{
system("cls");
printf("你输入的学号有误\n请重新输入学号:");
goto S;
}
if(a==p->sno)
{
printf("%d %s %.2f %.2f %.2f %.2f %.2lf\n",p->sno,p->name,p->score1,p->score2,p->score3,p->score,p->avg);
break;
}
p=p->next;
}
printf("\n\n\n");
}
void NameSearch()
{
int k,t,flag;
char b[20];
struct student *p;
system("cls");
printf("请输入姓名:");
T: scanf("%s",b);
t=0;flag=0;p=head;
printf("\n姓名为%s的成绩如下:\n",b);
printf(" 学号 姓名 C语言 高数 英语 总分 平均分\n");
while(1)
{
t++;
if(t==num+1)
{
if(flag==0)
{
system("cls");
printf("你输入的姓名有误\n请重新输入姓名:");
goto T;
}
else
break;
}
k=strcmp(p->name,b);
if(k==0)
{
flag=1;
printf("%d %s %.2f %.2f %.2f %.2f %.2lf\n",p->sno,p->name,p->score1,p->score2,p->score3,p->score,p->avg);
}
p=p->next;
}
printf("\n\n\n");
}
void CYuYanSearch()
{
int t,flag;
float a;
struct student *p;
system("cls");
printf("请输入C语言成绩:");
U: scanf("%f",&a);
t=0;flag=0;p=head;
printf("\nC语言成绩为%.2f的成绩如下:\n",a);
printf(" 学号 姓名 C语言 高数 英语 总分 平均分\n");
while(1)
{
t++;
if(t==num+1)
{
if(flag==0)
{
system("cls");
printf("你输入的C语言成绩有误\n请重新输入C语言成绩:");
goto U;
}
else
break;
}
if(a==p->sc
展开阅读全文