学生管理系统实验报告.docx
《学生管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《学生管理系统实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
学生管理系统实验报告
“高级语言程序设计”课程实习报告
班级:
姓名:
学号:
日期:
2011/12/25
1.实习目的
(1)学会用数组以及函数过程。
(2)学会pascal的各种操作例如枚举的输入与输出,学会更加熟练的运用三大循环结构
(3)学会菜单式输入输出
2.实习题目与程序功能
实验题目:
学生成绩管理系统(V2.0版本)
学生的数据信息包括:
学号、姓名、性别、出生日期、数学、语文、英语三门课成绩、平均分。
某班人数最多不超过30人,具体人数由键盘输入,编程实现如下菜单驱动的学生成绩管理系统,要求每一个功能使用一个子程序实现。
(1)录入每个学生的基本信息;
(2)计算每个学生的平均分;
(3)按平均分或按某门课程的成绩从高到低输出学生信息;
(4)按学生姓名的字典顺序或按学号从小到大顺序输出学生基本信息;
(5)按年龄和性别查找学生的基本信息;
(6)按学号或姓名查找学生平均分的排名及各科成绩;
(7)查找某门课成绩最高的学生的基本信息,某门课成绩最高的可能不只一名学生;
(8)查找某门课成绩在某个分数段内的学生人数和学生基本信息;
(9)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)五个类别,统计某门课程各个类别的人数及百分比;
(10)按学号查找学生基本信息,对学生信息进行修改后保存;
要求程序运行后,先显示菜单,并提示用户输入选项,然后根据用户输入的选项执行相应的操作,要求程序设计采用自顶向下逐步求精的方法,进行模块化程序设计以及增量测试方法。
功能描述:
(1)可以显示菜单,根据用户的需求选择可以进行的操作
(2)可以录入学生信息
(3)计算每个学生的平均分;
(4)按学生姓名的字典顺序或按学号从小到大顺序输出学生基本信息;
(5)按年龄和性别查找学生的基本信息;
(6)按学号或姓名查找学生平均分的排名及各科成绩;
(7)查找某门课成绩最高的学生的基本信息,某门课成绩最高的可能不只一名学生;
(8)查找某门课成绩在某个分数段内的学生人数和学生基本信息;
(9)按优秀(90~100)、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59)五个类别,统计某门课程各个类别的人数及百分比;
(10)按学号查找学生基本信息,对学生信息进行修改后保存;
性能要求:
要保证程序有足够的健壮性。
3.算法设计
(1)在主程序中通过选择的循环实现菜单的输出。
(2)录入学生信息:
根据提示录入学生信息,,包括学号,姓名,出生年月,性别,成绩。
学生的信息用一个记录类型.性别用数字来代替字母,0代表male,其他为female
.
(3)求其平均分,即把三科成绩相加求其平均值。
(4)对学生的姓名按字典顺序或学号从小到大排序:
需要把有一个选择按姓名还是学号,如果选择1则是按姓名排序输出,2则是用学号.其中排序用的是简单排序法.
(5)按年龄和性别查找学生的基本信息:
需要输入年龄和性别同样的0代表male,其他为female。
从学生1一直到学生三查找,如果找到就输出他的信息,否则则输出查无此人.
(6)按学号或姓名查找学生平均分的排名及各科成绩:
和上面一样根据提示选择是按学号,还是按姓名查找学生的平均分排名。
假设按姓名则先把其平均分用简单选择法排序,然后再用一个循环找到和所需要查找的学生名字一样的学生,并输出其所对应的下标,即是他平均分的排名。
(7)查找某门课程的最高分,此时也需要选择是按哪门课程,此时的三科分别是一个枚举,1:
x:
=(math);
2:
x:
=(chinese);
3:
x:
=(english);
运用简单排序法从高到低排序,由于最高分可能不只一个所以只要分数和第一个的相同则输出.
(8)查找某门课成绩在某个分数段内的学生人数和学生基本信息:
"某门课程”和上述的处理一样,某个分数段需要自己输入,有一个记数器,同时赋初值0。
从1到3开始循环如果某分数在自己定义的范围之内就加一,最后输出学生的信息。
(9)和第八步相似,此时要多用几个计数器,最后用计数器的值除以总人数即是其所占的百分比.
(10)按学号查找信息,只要找到学生就输入他的个人信息。
此时的信息就把以前的信息给覆盖了.
4.主要数据结构和标识符及其说明
其中涉及到记录,枚举,数组,整型,字符串等类型。
在变量的定义上实行见名知义的原则,在全局变量中:
year,month,day分别代表出生年,月,日,math,chinese,english,average分别代表数学,语文,英语,平均分。
Number代表学号,name代表名字,bith代表出生年月日,sex代表性别。
分数使用的是数组。
三个学生也是使用的数组类型,而学生的信息是用一个记录类型保存。
其中birth也是使用的记录类型。
在分程序中temp用来交换学生位置的媒介.I,j,m为整型,用来循环的。
也有j为字符串用来代表性别。
还有c,x用来代表所选择的排序类型。
M,n用来输入分数段,counter用来计数。
Cc代表输入的学号。
5.程序运行实例
(1)输入学生信息
(2)求其平均分,此时不用输出,只需要按选择按2即可。
(3)按平均分或按某门课程的成绩从高到低输出学生信息:
不妨设按语文从低到高输出,其学号结果应为1,2,3
(4)执行第三步,选择3即可,不仿选择按姓名排序,结果应为学号为1的是第一个,其次为3号,最后为2号
(5)输入19岁,male,结果应为查无此人。
(6)查找某门课成绩最高的学生的基本信息,某门课成绩最高的可能不只一名学生
选择数学,其结果应为学生3
(7)查找没分数的人,输入2到8分,人数应该为三个人.
(8)其结果应为不及格人数为3,百分数为1
(9)输入要查找的学号1,并修改输入姓名,学号,性别,出生日期。
(10)选择11,退出界面.
6.源程序清单
programProject2;
{$APPTYPECONSOLE}
type
birthday=record
year:
integer;
month:
integer;
day:
integer;
end;
sub=(math,chinese,english,average);
student=record
number:
integer;
name:
string[10];
sex:
string;
birth:
birthday;
score:
array[sub]ofinteger;
end;
var
stu:
array[1。
.3]ofstudent;
m,a:
integer;
averag:
array[1.。
3]ofreal;
x:
sub;
procedureinput;
var
n,i:
integer;
begin
fori:
=1to3do
withstu[i]do
begin
write('学号:
');readln(number);
write('姓名:
’);readln(name);
write(’性别:
');readln(n);
ifn=0then
sex:
=’male'
else
sex:
='female';
write('出生日期(年,月,日):
');readln(birth.year,birth.month,birth.day);
write('成绩,数学,语文,英语:
');readln(score[math],score[chinese],score[english]);
end;
end;
procedureave;
var
i:
integer;
begin
fori:
=1to3do
withstu[i]do
averag[i]:
=(score[math]+score[chinese]+score[english])/3;
end;
procedurepaixun(a:
integer);
var
temp:
student;{额外加的一个小程序用来排序输出}
i,j:
integer;
begin
caseaof
1:
x:
=(average);
2:
x:
=(math);
3:
x:
=(chinese);
4:
x:
=(english);
end;
fori:
=1to2do
forj:
=1to3-ido
ifstu[j]。
score[x]>stu[j+1]。
score[x]then
begin
temp:
=stu[j];
stu[j]:
=stu[j+1];
stu[j+1]:
=temp;
end;
writeln('按学号大小排序后的学生信息如下');
writeln('学号':
10,'姓名’:
10,'性别’:
7,'生日':
7,'数学’:
10,’语文’:
7,’英语':
7,'平均分':
10);
fori:
=1to3do
withstu[i]do
begin
writeln(number,name,sex,birth.year:
6,'/',birth.month,'/',birth.day,score[math]:
6,score[chinese]:
7,score[english]:
7,averag[i]:
11:
2);
end;
end;
procedurepaixun2(a:
integer);
var
temp:
student;
i,j:
integer;
begin
ifa=1then
begin
fori:
=1to2do
forj:
=1to3—ido
ifstu[j].name>stu[j+1]。
namethen
begin
temp:
=stu[j];
stu[j]:
=stu[j+1];
stu[j+1]:
=temp;
end;
fori:
=1to3do
withstu[i]do
begin
writeln(number:
4,name:
5,birth.year:
6,birth.month:
4,birth.day:
4,sex:
10,score[math]:
4,score[chinese]:
4,score[english]:
4);
writeln(averag[i]:
4);
end;
end
else
begin
fori:
=1to2do
forj:
=1to3-ido
ifstu[j]。
name〉stu[j+1].namethen
begin
temp:
=stu[j];
stu[j]:
=stu[j+1];
stu[j+1]:
=temp;
end;
fori:
=1to3do
withstu[i]do
begin
writeln(number:
4,name:
5,birth。
year:
6,birth。
month:
4,birth。
day:
4,sex:
10,score[math]:
4,score[chinese]:
4,score[english]:
4);
writeln(averag[i]:
4);
end;
end;
end;
procedurechazhao;
var
i,m,counter:
integer;
j:
string;
begin
writeln(’要查找的年龄’);
readln(i);
writeln(’性别(字符串)');
readln(j);
counter:
=0;
form:
=1to3do
if(2011-stu[m]。
birth。
year=i)and(stu[m]。
sex=j)then
withstu[m]do
begin
writeln(number:
4,name:
5,birth.year:
6,birth。
month:
4,birth.day:
4,sex:
10,score[math]:
4,score[chinese]:
4,score[english]:
4);
writeln(averag[i]:
4);
end
else
counter:
=counter+1;
ifcounter=3then
writeln(’查无此人');
end;
procedurepingjunfenmingci(varc:
integer);
var
temp:
real;
n,i,j:
integer;
m:
string;
begin
casecof
1:
begin
writeln(’要查找的学号’);
read(n);
fori:
=1to2do
forj:
=1to3-ido
ifaverag[j]〈averag[j+1]then
begin
temp:
=averag[j];
averag[j]:
=averag[j+1];
averag[j+1]:
=temp;
end;
fori:
=1to3do
ifstu[i].number=nthen
begin
writeln(stu[i].score[math]:
4,stu[i]。
score[chinese]:
4,stu[i]。
score[english]:
4);
write('平均分排名:
’);writeln(i);
end;
end;
2:
begin
writeln(’要查找的姓名');
read(m);
fori:
=1to2do
forj:
=1to3—ido
ifaverag[j]begin
temp:
=averag[j];
averag[j]:
=averag[j+1];
averag[j+1]:
=temp;
end;
fori:
=1to3do
ifstu[i]。
name=mthen
begin
writeln(stu[i].score[math]:
4,stu[i].score[chinese]:
4,stu[i]。
score[english]:
4);
write(’平均分排名:
');writeln(i);
end;
end;
end;
fori:
=1to2do
forj:
=1to3-ido
ifaverag[j]〈averag[j+1]then
begin
temp:
=averag[j];
averag[j]:
=averag[j+1];
averag[j+1]:
=temp;
end;
fori:
=1to3do
ifstu[i]。
name=mthen
begin
writeln(stu[i].score[math]:
4,stu[i]。
score[chinese]:
4,stu[i]。
score[english]:
4);
write('平均分排名:
');writeln(i);
end;
end;
procedurechazhaohigh(p:
integer);
var
temp:
student;
i,j:
integer;
begin
casepof
1:
x:
=(math);
2:
x:
=(chinese);
3:
x:
=(english);
end;
fori:
=1to2do
forj:
=1to3-ido
ifstu[j]。
score[x]begin
temp:
=stu[j];
stu[j]:
=stu[j+1];
stu[j+1]:
=temp;
end;
fori:
=1to3do
ifstu[i]。
score[x]=stu[1].score[x]then
withstu[i]do
begin
writeln(number:
4,name:
5,birth。
year:
6,birth.month:
4,birth。
day:
4,sex:
10,score[math]:
4,score[chinese]:
4,score[english]:
4);
writeln(averag[i]:
4);
end;
end;
procedurechazhaonumber(p:
integer);
var
m,n,counter,i:
integer;
begin
writeln('输入m,n(n大于m)');
readln(m,n);
counter:
=0;
casepof
1:
x:
=(math);
2:
x:
=(chinese);
3:
x:
=(english);
end;
fori:
=1to3do
withstu[i]do
begin
if(score[x]〉=m)and(score[x]<=n)then
counter:
=counter+1;
writeln(number:
10,name:
5,birth.year:
6,birth.month:
4,birth.day:
4,sex:
10,score[math]:
4,score[chinese]:
4,score[english]:
4);
writeln(averag[i]:
4);
end;
writeln(’在’,m,'到',n,'分数段的人数为:
',counter);
end;
procedurefenlei(a:
integer);
var
counter1,counter2,counter3,counter4,counter5,i:
integer;
begin
caseaof
1:
x:
=(math);
2:
x:
=(chinese);
3:
x:
=(english);
end;
counter1:
=0;counter2:
=0;counter3:
=0;counter4:
=0;counter5:
=0;
fori:
=1to3do
withstu[i]do
begin
if(score[x]>=90)and(score[x]<=100)then
counter1:
=counter1+1
elseif(score[x]>=80)and(score[x]〈=89)then
counter2:
=counter2+1
elseif(score[x]〉=70)and(score[x]〈=79)then
counter3:
=counter3+1
elseif(score[x]〉=60)and(score[x]<=69)then
counter4:
=counter4+1
elseif(score[x]〉=0)and(score[x]〈=59)then
counter5:
=counter5+1;
end;
writeln('统计结果为’);
write(’优秀人数及百分比为:
');writeln(counter1:
4,counter1/3:
4);
write('良好人数及百分比为:
');writeln(counter2:
4,counter2/3:
4);
write('中等人数及百分比为:
');writeln(counter3:
4,counter3/3:
4);
write('及格人数及百分比为:
’);writeln(counter4:
4,counter4/3:
4);
write('不及格人数及百分比为:
');writeln(counter5:
4,counter5/3:
4);
end;
procedurechazhaobaocun;
var
cc,i:
integer;
birth1:
birthday;
score1:
array[sub]ofinteger;
begin
write(’查找的学号’);
readln(cc);
fori:
=1to3do
ifstu[i]。
number=ccthen
withstu[i]do
begin
writeln('姓名:
');readln(name);
writeln(’学号:
’);read(number);
writeln(’性别:
’);readln(m);
writeln(’出生日期:
');readln(birth1。
year,birth1.month,birth1.day);
writeln('数学分数,语文分数,英语分数');readln(score1[chinese],score1[chinese],score1[english]);
end;
writeln(’按学号大小排序后的学生信息如下');
writeln(’学号’:
10,’姓名':
10,’性别’:
7,’生日':
7,’数学':
10,'语文':
7,'英语':
7,’平均分’:
10);
fori:
=1to3do
withstu[i]do
begin
writeln(number,name,sex,birth.year:
6,’/’,birth.month,’/’,birth.day,score[math]:
6,score[chinese]:
7,score[english]:
7,averag[i]:
11:
2);
end;
end;
begin
{TODO-oUser-cConsoleMain:
Insertcodehere}
repeat
writeln(’—--—-—--—---—--——-——-——--——-———---——--—-——---——-—-—-----————---—-—-——-—-—-——');
writeln(’1。
录入每个学生的基本信息’);
writeln(’2。
计算每个学生的平均分’);
writeln('3。
按平均分或按某门课程的成绩从高到低输出学生信息');
writeln(’4。
按学生姓名的字典顺序或按学号从小到大顺序输出学生基本信息');
writeln('5.按年龄和性别查找学生的基本信息’);
writeln(’6.按学号或姓名查找学生平均分的排名及各科成绩');
writeln('7。
查找某门课成绩最高的学生的基本信息,某门课成绩最高的可能不只一名学生');
writeln(’8。
某成绩某分数段内的人数和信息’);
writeln(’9。
统计某门课程各个类别的人数及百分比');
writeln('10.按学号查找学生基本信息,对学生信息进行修改后保存');
writeln(’11。
退出系统');
writeln(’--———————-———-——-——---—--————-——-——————--——-—-—--—————-—————-------——--————');
write(’要执行的操作’);
read(m);
casemof
1:
input;
2:
ave;