C课设报告:多功能上课点名系统 - 图文

更新时间:2024-05-02 14:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言课程设计实习报告

C语言课程设计实习报告

专 业:地空学院 学 号: 88888888 班级序号: 666666 姓 名: 指导教师:

1

C语言课程设计实习报告

目录

一、C语言课程设计的目的 ..................................................................... 3 二.题目:自动点名系统 ........................................................................... 3 三、总体设计............................................................................................. 3 四 详细设计............................................................................................. 6 1 结构体及函数 .................................................................................. 6 2 主函数............................................................................................... 7 3 各函数设计 ...................................................................................... 9 五 上机操作......................................................................................... 24 学 习 心 得............................................................................................. 30 六、算法和系统的优缺点 ...................................................................... 31 七 :原代码(附录) ............................................................................ 31

2

C语言课程设计实习报告

C语言程序设计报告

(实习日期: 2013-12至2014-1)

一、C语言课程设计的目的

高级语言课程设计是学习完《高级语言程序设计》课程后进行的一次全面的综合性上机实验。其目的在于为同学提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼同学的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。

二.题目:自动点名系统

需求分析:设计一个供教师上课使用的自动点名系统,满足实际点名中的以下功能

1 计算机随机选取学生,进行点名。 2 可以记录学生是否到课。

3 查询历史记录,包括已经点过的学生记录和旷课的学生记录。 4 点名时有公平性,任意两个人被点次数差不超过一次(不包括有旷课记录的学生)。

5 对旷过课的学生单独点名。 6 清除历史记录。

7 系统功能清晰、使用方便。 8 用文件记录点名、旷课的数据。

三、总体设计

系统由6个模块组成:

3

C语言课程设计实习报告

点名 系统 连续点名模块多人点名模块 浏览历史模块 (printrecord) 点旷过课学生模块 (pickhistory) 清除模块 (clear) 退出模块 (exit) (pickc)(pickn) 连续点名模块:输入’c’(choose)点一个人,输入’e’(end)返回主菜单,每次点人后输入学生的到课情况(y/n)。

连续点名模块(pickc) 选出一个学生 是否到课?(y/n) 继续点名?(c/e)

多人点名模块:根据输入的要点名人数点名,同时记录到课情况,点完后返回主菜单

4

C语言课程设计实习报告

多人点名模块 (pickn) 输入点名人数 记录到课情况 返回主菜单

浏览历史模块:选择后显示历史记录(点名记录、到课记录)。

点旷课学生模块:额外点所有有旷到记录的学生,不计入总点名次数,但如果又旷到,则旷到次数加一。此次上课点名(此次运行程序)已经由前两个模块点到的,不会出现在这个模块。(即不会出现一个旷到学生被意外记两次的情况)

点旷过课学生模块 (pickhistory) 点名,记录到课情况 返回菜单

清除模块:清除历史记录。

退出模块:退出程序。

5

C语言课程设计实习报告

四 详细设计

1 结构体及函数

学生信息(姓名、学号)存在结构体Student中,各功能由函数实现。 #include

#include #include #include #include #define N 57

typedef struct //存储学生信息 {

char num[9]; char name[7];

}Student;

void choose(Student *stu,int *a,int *b,int *c); //choose a student int minimum(int *a); //数组最小值函数

void function(Student *stu,int *a,int *b,int *c); //主菜单函数 void pickn(Student *stu,int *a,int *b,int *c); //选多个学生的函数 void pickc(Student *stu,int *a,int *b,int *c); //连续选学生的函数

6

C语言课程设计实习报告

void pickhistory(Student *stu,int *b,int *c); //点旷到学生的函数 void printrecord(Student *stu,int *a,int *b); //浏览历史函数

void read(Student *stu); //读取student.txt的函数 void saverecord(int *a,int *b); //存储历史记录到sturecord.dat的函数 void loadrecord(int *a,int *b); //读取文件 sturecord.dat的函数 void clear(int *a,int *b); //清除历史记录函数

void title(); //打印标题函数 void menu(); //打印目录函数 void borderup(); //打印上边界函数 void borderdown(); //打印下边界函数

2 主函数

主函数有读取学生信息、读取历史记录、显示菜单、点名、存储信息的功能,全部用函数实现。

int main() {

int a[N]={0},b[N]={0},c[N]={0}; // a,b,c数组分别存被点次数、 Student stu[N]; //旷课次数、本次上课是否被点

srand((unsigned)time(NULL));

7

C语言课程设计实习报告

read(stu); loadrecord(a,b);

title(); menu();

function(stu,a,b,c);

saverecord(a,b); return 0; }

开始 显示功能 判断 根据判断的值调用各功能模块函数 结束 8

C语言课程设计实习报告

3 各函数设计

(1) 存读数据函数

1 从student.txt读取学生信息的函数

void read(Student *stu) {

FILE *fp;

int i; //circulate

char c,d[5],e,*p; //\判断是否为名字的字符,\存名字后

的空格与回车,\存中间的空格

fp=fopen(\ //open file if(fp==NULL) {

printf(\

exit (0); }

for(i=0;i

fgets(stu[i].num,9,fp); //学号 e=fgetc(fp);

9

C语言课程设计实习报告

}

p=&stu[i].name; //名字 c='\\0';

}

while(c!='\\t') { }

c=fgetc(fp); if(c!='\\t') { } else { } *p='\\0'; fgets(d,5,fp); *p=c; p++;

fclose(fp);

2 保存点名记录到sturecord.dat的函数

void saverecord(int *a,int *b)

10

C语言课程设计实习报告

{ FILE *fp;

if((fp=fopen(\ { printf(\ exit (0);

}

if(fwrite(a,sizeof(int),N,fp)!=N)

printf(\

if(fwrite(b,sizeof(int),N,fp)!=N)

printf(\

fclose(fp);

}

3 从sturecord.dat读取点名记录的函数

void loadrecord(int *a,int *b) { FILE *fp;

if((fp=fopen(\

{

11

//二进制方式存数据 C语言课程设计实习报告

}

printf(\

saverecord(a,b); //如果 sturecord.data不存在则新建立一个 exit (0);

if(fread(a,sizeof(int),N,fp)!=N)

printf(\

if(fread(b,sizeof(int),N,fp)!=N)

printf(\

fclose(fp);}

(2)基本函数

1 数组最小值函数

求数组中的最小值,由choose函数调用,choose函数中的随机数r要满足a[r]=miminum(a)才使用。即每次只点被点过次数最少的学生。

int minimum(int *a) {

int mi,i;

mi=a[0]; for(i=0;i

if(mi>a[i])

12

C语言课程设计实习报告

}

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函数中调用。 void choose(Student *stu,int *a,int *b,int *c)

{ do { }

r=rand()%N; //r为0到N-1的随机数 int r;

char yon,e; //’yon’ yes or no ,’e’接收回车

while(a[r]!=minimum(a));

13

a[r]++; //记录下被点学生 c[r]++;

C语言课程设计实习报告

printf(\ %s\\n\printf(\ %s\\n\

printf(\ Enter 'y' or 'n' to record attendance:[ ]\\b\\b\yon=getchar();

e=getchar(); //接收回车 putchar('\\n'); if(yon=='n') {

b[r]++; //记录旷到

printf(\ ****************************\\n\

printf(\ the absence has been saved.\\n\ }

printf(\ ****************************\\n\\n\

}

(3)功能模块 1 连续点名函数

输入’c’ 点名,直到输入’e’时结束

void pickc(Student *stu,int *a,int *b,int *c) //参数在调用chooses时使用 {

char coe='c',e; //’coe’控制点名或是结束,'e' 接收回车

borderup(); //打印边界,每个功能函数开始结尾都有

14

C语言课程设计实习报告

//使程序运行时显得清晰

while(coe=='c') {

printf(\ Enter 'c' to choose,enter 'e' to end:[ ]\\b\\b\coe=getchar(); e=getchar();

if(coe=='c') {

putchar('\\n');

choose(stu,a,b,c); }

} }

2 点n人函数

输入要点的人数点名

borderdown();

void pickn(Student *stu,int *a,int *b,int *c) {

int n,i,e;

borderup();

15

C语言课程设计实习报告

borderdown(); }

3 浏览历史模块

显示被点情况、旷到情况

printf(\ How many students do you want to check? [ ]\\b\\b\scanf(\e=getchar(); printf(\

for(i=0;i

choose(stu,a,b,c);

void printrecord(Student *stu,int *a,int *b) { int i; borderup();

printf(\name number of being picked number of absence

number\\n\

for(i=0;i

printf(\ %d %d %s\\n\

16

C语言课程设计实习报告

}

borderdown(); }

4 点旷到学生模块

点所有有旷到记录的学生,完成显示’finish’。因为不随机,不调用choose。

void pickhistory(Student *stu,int *b,int *c) {

int i,yon,e;

borderup(); for(i=0;i

if(b[i]!=0 && c[i]==0) //有旷到记录且这节课还没点过的 { //后半段与choose 函数一致

printf(\ %s\\n\

printf(\ %s\\n\

printf(\ yon=getchar(); e=getchar(); putchar('\\n'); if(yon=='n') {

17

C语言课程设计实习报告

b[i]++;

printf(\

printf(\

printf(\ } }

printf(\

borderdown();

}

5 清除模块

用saverecord函数使历史记录sturecord.dat恢复到原始值。

void clear(int *a,int *b) {

int i;

for(i=0;i

18

a[i]=0; b[i]=0;

C语言课程设计实习报告

saverecord(a,b);

printf(\ All record has been clear successfully.\\n\\n\\n\}

删除模块:

用户输入要删除的信息,如输入歌曲名 ,根据歌曲名找到其他记录并删除。 [程序]

void delete() {

int j,v,c; char w[20]; FILE *fp;

printf(\scanf(\

fp=fopen(\

for(j=0;j<100;j++) { } v=j;

for(j=0;j

19

if(fread(&dan[j],sizeof(struct system),1,fp)!=1) break;

C语言课程设计实习报告

}

{ } fclose(fp);

if(strcmp(w,dan[j].name)==0) c=j;

fp=fopen(\ for(j=0;j

printf(\i--; if(j!=c)

fwrite(&dan[j],sizeof(struct system),1,fp);

(4)菜单函数

菜单函数调用五个功能函数实现菜单的功能,return回到主函数存储数据后程序结束。

void function(Student *stu,int *a,int *b,int *c) {

char f,e; //'f'存选择 'e' 存回车

20

C语言课程设计实习报告

}

while(1) {

printf(\ Enter function number<1-6>:[ ]\\b\\b\scanf(\e=getchar();

}

switch(f) { }

case '1':pickc(stu,a,b,c);break; case '2':pickn(stu,a,b,c);break; case '3':printrecord(stu,a,b);break; case '4':pickhistory(stu,b,c);break; case '5':clear(a,b);break;

case '6':printf(\ \default:menu(); //menu函数打印功能及对应数字

}

(5)打印界面函数

21

C语言课程设计实习报告

void title()

{ printf(\

printf(\ *\\n\printf(\ ROLL CALL SYSTEM *\\n\printf(\ *\\n\ printf(\}

void menu() { borderup(); printf(\ printf(\ 1:choose one student each time\\n\ printf(\ 2:choose several students\\n\ printf(\ 3:open history record\\n\ printf(\ 4:choose students who have absence recored\\n\ printf(\ 5:clear history\\n\ printf(\ 6:exit\\n\ printf(\ (default:show this instruction again)\\n\ borderdown(); }

void borderup() {

printf(\}

void borderdown() {

printf(\}

22

C语言课程设计实习报告

开始 读入数据 选择功能 保存数据 结束 连续点名 点多人 历史记录 点旷到学生 清除记录 退出

程序的流程图如上

23

C语言课程设计实习报告

五 上机操作

1 主菜单函数

2 连续点名功能

24

C语言课程设计实习报告

25

C语言课程设计实习报告

3 多人点名功能

26

C语言课程设计实习报告

4浏览历史模块.

27

C语言课程设计实习报告

5 点旷到学生模块

28

C语言课程设计实习报告

6.删除记录模块

7 退出模块

29

C语言课程设计实习报告

学 习 心 得

这次C语言课程设计让我学到了很多东西,有了自己设计程序、编写程序的经验,可以自己解决编程过程中的遇到的困难与问题。

一开始随机数不会写,到网上查阅了资料学会了随机数需要的函数。文件的读写也碰到了很多问题,编写从student.txt读信息到结构体的函数用了很长时间,刚写的时候不是字符数目不对,就是对fgets函数不熟悉(不知道碰到回车符时自动结束)。在读写信息存到文件sturecord.dat时,用二进制存取,但在打开与读取时没用’wb’’rb’因而碰到了很奇怪的问题,做了很多检查又看了书后才发现问题。

有一次没有改完错误就关了机,过了几天才又编写,结果打文件编译有问题时完全忘了在哪有问题,提示有8个错误。然后只能隔离各个函数检查,不久发现了问题所在。

有时候改了很多地方才又重新编译,结果错了很多处,找了一下找不到问题,又忘记改了哪里,让事情变得很麻烦。这让我知道以后大幅更改前应先另存文件或将改的地方做标记。

当运行效果更预计不一样时,我学会了从运行情况分析代码不完善的地方。例如,各功能函数编好了后,运行时发现依次运行123456功能时3不正常,显示error(表示输入了1-6以外的数),之后456也error,但第一次运行3、4、5或6又正常。之后我分别运行11、

30

C语言课程设计实习报告

22、33、44、55、66。发现只有连续用两次2功能时有问提,并且之后再用其他的也有问题。于是我确定是2的函数有问题,并且是输入的问题,在之后运行其他功能时是把回车传了进去。检查后发现2中确实忘记接收回车。

这次编程让我学到了不少知识,更让我意识到了自己动手实践的重要性,有耐心、毅力才能把事情做好。

六、算法和系统的优缺点

系统的优点是简洁、清晰,每次次用完一个功能屏幕上的内容都在一个框内,显得有条理。点名的信息以文件储存,便于调用。

改进思路:

在删除模块中加入可选择的删除模式,达到如查找模块一样的可选择模式删除。另外在退出系统模块中加入返回主菜单功能。

七 :原代码(附录)

#include

31

C语言课程设计实习报告

#include #include #include int i=0; struct system {

char author[20]; char singer[20]; char time[20]; char name[20];

} dan[100];

void enter() { int j; char c[2]; FILE *fp;

if((fp=fopen(\

{

printf(\exit(0);

32

C语言课程设计实习报告

}

for(j=0;j

printf(\scanf(\

printf(\scanf(\printf(\scanf(\printf(\scanf(\

fwrite(&dan[j],sizeof(struct system),1,fp);

if(fwrite(&dan[i++],sizeof(struct system),1,fp)!=1)

printf(\

else printf(\

printf(\scanf(\

if(strcmp(c,\

}

33

C语言课程设计实习报告

}

fclose(fp);

void delete() {

int j,v,c; char w[20]; FILE *fp;

printf(\scanf(\

fp=fopen(\

for(j=0;j<100;j++) { } v=j;

for(j=0;j

if(strcmp(w,dan[j].name)==0)

34

if(fread(&dan[j],sizeof(struct system),1,fp)!=1) break;

C语言课程设计实习报告

}

}

c=j;

fclose(fp);

fp=fopen(\ for(j=0;j

printf(\i--; if(j!=c)

fwrite(&dan[j],sizeof(struct system),1,fp);

void browse() {

int j; FILE *fp;

fp=fopen(\ for(j=0;j<100;j++) {

35

C语言课程设计实习报告

}

}

if(fread(&dan[j],sizeof(struct system),1,fp)==1) { } else break;

printf(\printf(\printf(\printf(\printf(\

fclose(fp);

void search() {

int flag,j,x; char w[20]; FILE *fp; char v[20];

printf(\

printf(\printf(\

36

C语言课程设计实习报告

printf(\scanf(\ if(x==3) {

flag=0;

printf(\ scanf(\ fp=fopen(\ for(j=0;j<100;j++) { }

37

if(fread(&dan[j],sizeof(struct system),1,fp)!=1) break; if(strcmp(dan[j].name,w)==0) { }

printf(\printf(\printf(\printf(\printf(\flag=1;

C语言课程设计实习报告

}

if(flag==0)

printf(\

fclose(fp);

else if(x==2) {

flag=0;

printf(\ scanf(\ fp=fopen(\ for(j=0;j<100;j++) {

if(fread(&dan[j],sizeof(struct system),1,fp)!=1) break; if(strcmp(dan[j].singer,v)==0) {

printf(\printf(\printf(\printf(\printf(\flag=1;

38

C语言课程设计实习报告

}

}

}

if(flag==0)

printf(\

fclose(fp);

else if(x==1) {

flag=0;

printf(\ scanf(\

fp=fopen(\ for(j=0;j<100;j++) {

if(fread(&dan[j],sizeof(struct system),1,fp)!=1) break; if(strcmp(dan[j].author,w)==0) {

printf(\printf(\printf(\printf(\printf(\

39

C语言课程设计实习报告

}

}

}

}

flag=1;

if(flag==0)

printf(\

fclose(fp);

else printf(\

main() {

while(1) { int a;

printf(\to the song'system!------by change\\n\

printf(\^o^*******************\\n\\n\

printf(\ printf(\

40

MENU

C语言课程设计实习报告

printf(\ printf(\ printf(\

printf(\\

printf(\ }

}

scanf(\if(a==0) break; switch(a) {

case 1:enter();break; case 2:delete();break; case 3:browse();break; case 4:search();break; }

41

本文来源:https://www.bwwdw.com/article/k41g.html

Top