C课设报告多功能上课点名系统Word文档下载推荐.docx
《C课设报告多功能上课点名系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C课设报告多功能上课点名系统Word文档下载推荐.docx(37页珍藏版)》请在冰点文库上搜索。
清除历史记录。
退出模块:
退出程序。
四详细设计
1结构体及函数
学生信息(姓名、学号)存在结构体Student中,各功能由函数实现。
#include<
stdio.h>
#include<
stdlib.h>
#include<
iostream.h>
conio.h>
time.h>
#defineN57
typedefstruct//存储学生信息
{
charnum[9];
charname[7];
}Student;
voidchoose(Student*stu,int*a,int*b,int*c);
//chooseastudent
intminimum(int*a);
//数组最小值函数
voidfunction(Student*stu,int*a,int*b,int*c);
//主菜单函数
voidpickn(Student*stu,int*a,int*b,int*c);
//选多个学生的函数
voidpickc(Student*stu,int*a,int*b,int*c);
//连续选学生的函数
voidpickhistory(Student*stu,int*b,int*c);
//点旷到学生的函数
voidprintrecord(Student*stu,int*a,int*b);
//浏览历史函数
voidread(Student*stu);
//读取student.txt的函数
voidsaverecord(int*a,int*b);
//存储历史记录到sturecord.dat的函数
voidloadrecord(int*a,int*b);
//读取文件sturecord.dat的函数
voidclear(int*a,int*b);
//清除历史记录函数
voidtitle();
//打印标题函数
voidmenu();
//打印目录函数
voidborderup();
//打印上边界函数
voidborderdown();
//打印下边界函数
2主函数
主函数有读取学生信息、读取历史记录、显示菜单、点名、存储信息的功能,全部用函数实现。
intmain()
inta[N]={0},b[N]={0},c[N]={0};
//a,b,c数组分别存被点次数、
Studentstu[N];
//旷课次数、本次上课是否被点
srand((unsigned)time(NULL));
read(stu);
loadrecord(a,b);
title();
menu();
function(stu,a,b,c);
saverecord(a,b);
return0;
}
3各函数设计
(1)存读数据函数
1从student.txt读取学生信息的函数
voidread(Student*stu)
FILE*fp;
inti;
//circulate
charc,d[5],e,*p;
//"
c"
判断是否为名字的字符,"
d"
存名字后的空格与回车,"
e"
存中间的空格
fp=fopen("
students.txt"
"
r"
);
//openfile
if(fp==NULL)
{
printf("
filedon'
texist!
\n"
exit(0);
}
for(i=0;
i<
N;
i++)//存信息到stu[57]
fgets(stu[i].num,9,fp);
//学号
e=fgetc(fp);
p=&
stu[i].name;
//名字
c='
\0'
;
while(c!
='
\t'
)
{
c=fgetc(fp);
if(c!
{
*p=c;
p++;
}
else
*p='
fgets(d,5,fp);
}
fclose(fp);
2保存点名记录到sturecord.dat的函数
voidsaverecord(int*a,int*b)
if((fp=fopen("
sturecord.dat"
wb"
))==NULL)
can'
topenafiletosavedata\n"
exit(0);
if(fwrite(a,sizeof(int),N,fp)!
=N)//二进制方式存数据
filewriteerror(arraya)\n"
if(fwrite(b,sizeof(int),N,fp)!
=N)
filewriteerror(arrayb)\n"
3从sturecord.dat读取点名记录的函数
voidloadrecord(int*a,int*b)
rb"
topensturecord.data\nrunitagain!
\n\a"
saverecord(a,b);
//如果sturecord.data不存在则新建立一个
if(fread(a,sizeof(int),N,fp)!
filereaderror(arraya)\n"
if(fread(b,sizeof(int),N,fp)!
filereaderror(arrayb)\n"
(2)基本函数
1数组最小值函数
求数组中的最小值,由choose函数调用,choose函数中的随机数r要满足a[r]=miminum(a)才使用。
即每次只点被点过次数最少的学生。
intminimum(int*a)
intmi,i;
mi=a[0];
i++)
if(mi>
a[i])
mi=a[i];
return(mi);
2点名函数
Choose函数可以用随机数r从stu[N]结构体中随机选择一个再输出相应学生信息,a[N]记录下被点学生(a[r]++;
),之后可以用b[N]记录学生是否到课(y/n)。
c[N]记录此次课(此次运行程序)的点名,不保存到sturecord.dat,用于防止此次上课点名已经由随机点名模块(pickn,pickc)点到的,不会出现在旷到学生点名模块(pickhistory)。
将在pickc、pickn函数中调用。
voidchoose(Student*stu,int*a,int*b,int*c)
{
intr;
charyon,e;
//’yon’yesorno,’e’接收回车
do
{
r=rand()%N;
//r为0到N-1的随机数
while(a[r]!
=minimum(a));
a[r]++;
//记录下被点学生
c[r]++;
printf("
%s\n"
stu[r].name);
stu[r].num);
\nEnter'
y'
or'
n'
torecordattendance:
[]\b\b"
yon=getchar();
e=getchar();
//接收回车
putchar('
\n'
if(yon=='
b[r]++;
//记录旷到
****************************\n"
theabsencehasbeensaved.\n"
****************************\n\n"
}
(3)功能模块
1连续点名函数
输入’c’点名,直到输入’e’时结束
voidpickc(Student*stu,int*a,int*b,int*c)//参数在调用chooses时使用
charcoe='
c'
e;
//’coe’控制点名或是结束,'
e'
接收回车
borderup();
//打印边界,每个功能函数开始结尾都有
//使程序运行时显得清晰
while(coe=='
Enter'
tochoose,enter'
toend:
coe=getchar();
e=getchar();
if(coe=='
putchar('
choose(stu,a,b,c);
borderdown();
2点n人函数
输入要点的人数点名
voidpickn(Student*stu,int*a,int*b,int*c)
intn,i,e;
borderup();
Howmanystudentsdoyouwanttocheck?
[]\b\b"
scanf("
%d"
&
n);
n;
choose(stu,a,b,c);
borderdown();
3浏览历史模块
显示被点情况、旷到情况
voidprintrecord(Student*stu,int*a,int*b)
namenumberofbeingpickednumberofabsencenumber\n"
{printf("
%6s%d%d%s\n"
stu[i].name,a[i],b[i],stu[i].num);
4点旷到学生模块
点所有有旷到记录的学生,完成显示’finish’。
因为不随机,不调用choose。
voidpickhistory(Student*stu,int*b,int*c)
inti,yon,e;
if(b[i]!
=0&
&
c[i]==0)//有旷到记录且这节课还没点过的
{//后半段与choose函数一致
printf("
stu[i].name);
stu[i].num);
\nEnter'
{
b[i]++;
printf("
}
finish!
5清除模块
用saverecord函数使历史记录sturecord.dat恢复到原始值。
voidclear(int*a,int*b)
a[i]=0;
b[i]=0;
printf("
Allrecordhasbeenclearsuccessfully.\n\n\n"
删除模块:
用户输入要删除的信息,如输入歌曲名,根据歌曲名找到其他记录并删除。
[程序]
voiddelete()
intj,v,c;
charw[20];
Pleaseinputthesong'
namewhichyouwanttodelete:
"
%s"
w);
data.txt"
for(j=0;
j<
100;
j++)
if(fread(&
dan[j],sizeof(structsystem),1,fp)!
=1)break;
v=j;
v;
if(strcmp(w,dan[j].name)==0)
c=j;
}
if(j!
=c)
fwrite(&
dan[j],sizeof(structsystem),1,fp);
DeleteOK!
i--;
(4)菜单函数
菜单函数调用五个功能函数实现菜单的功能,return回到主函数存储数据后程序结束。
voidfunction(Student*stu,int*a,int*b,int*c)
charf,e;
//'
f'
存选择'
存回车
while
(1)
Enterfunctionnumber<
1-6>
:
scanf("
%c"
f);
switch(f)
case'
1'
pickc(stu,a,b,c);
break;
2'
pickn(stu,a,b,c);
3'
printrecord(stu,a,b);
4'
pickhistory(stu,b,c);
5'
clear(a,b);
6'
\n"
return;
default:
menu();
//menu函数打印功能及对应数字
(5)打印界面函数
voidtitle()
{printf("
****************************************************************\n"
**\n"
*ROLLCALLSYSTEM*\n"
***************************************************************\n"
voidmenu()
Instruction:
1:
chooseonestudenteachtime\n"
2:
chooseseveralstudents\n"
3:
openhistoryrecord\n"
4:
choosestudentswhohaveabsencerecored\n"
5:
clearhistory\n"
6:
exit\n"
(default:
showthisinstructionagain)\n"
voidborderup()
-----------------------------------------------------------\n"
voidborderdown()
-----------------------------------------------------------\n\n\n\n"
程序的流程图如上
五上机操作
1主菜单函数
2连续点名功能
3多人点名功能
4浏览历史模块.
5点旷到学生模块
6.删除记录模块
7退出模块
学习心得
这次C语言课程设计让我学到了很多东西,有了自己设计程序、编写程序的经验,可以自己解决编程过程中的遇到的困难与问题。
一开始随机数不会写,到网上查阅了资料学会了随机数需要的函数。
文件的读写也碰到了很多问题,编写从student.txt读信息到结构体的函数用了很长时间,刚写的时候不是字符数目不对,就是对fgets函数不熟悉(不知道碰到回车符时自动结束)。
在读写信息存到文件sturecord.dat时,用二进制存取,但在打开与读取时没用’wb’’rb’因而碰到了很奇怪的问题,做了很多检查又看了书后才发现问题。
有一次没有改完错误就关了机,过了几天才又编写,结果打文件编译有问题时完全忘了在哪有问题,提示有8个错误。
然后只能隔离各个函数检查,不久发现了问题所在。
有时候改了很多地方才又重新编译,结果错了很多处,找了一下找不到问题,又忘记改了哪里,让事情变得很麻烦。
这让我知道以后大幅更改前应先另存文件或将改的地方做标记。
当运行效果更预计不一样时,我学会了从运行情况分析代码不完善的地方。
例如,各功能函数编好了后,运行时发现依次运行123456功能时3不正常,显示error(表示输入了1-6以外的数),之后456也error,但第一次运行3、4、5或6又正常。
之后我分别运行11、22、33、44、55、66。
发现只有连续用两次2功能时有问提,并且之后再用其他的也有问题。
于是我确定是2的函数有问题,并且是输入的问题,在之后运行其他功能时是把回车传了进去。
检查后发现2中确实忘记接收回车。
这次编程让我学到了不少知识,更让我意识到了自己动手实践的重要性,有耐心、毅力才能把事情做好。
六、算法和系统的优缺点
系统的优点是简洁、清晰,每次次用完一个功能屏幕上的内容都在一个框内,显得有条理。
点名的信息以文件储存,便于调用。
改进思路:
在删除模块中加入可选择的删除模式,达到如查找模块一样的可选择模式删除。
另外在退出系统模块中加入返回主菜单功能。
七:
原代码(附录)
malloc.h>
string.h>
inti=0;
structsystem
charauthor[20];
charsinger[20];
chartime[20];
charname[20];
}dan[100];
voidenter()
intj;
charc[2];
w"
Cannotopenthefile!
exit(0);
i;
Pleaseinputtheauthor:
dan[i].author);
sname:
dan[i].name);
Pleaseinputthesinger:
dan[i].singer);
Pleaseinputtheoutday:
dan[i].time);
if(fwrite(&
dan[i