c语言实习报告

更新时间:2024-06-21 14:11:01 阅读量: 综合文库 文档下载

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

国 地 质 大 学

本科生课程论文封面

课程名称 C语言程序设计 教师姓名: 邵老师 本科生姓名: 常标 本科生学号: 20091003439 本科生专业: 应用化学 所在院系: 材化学院

类别: C.本科生

日期: 2011 年 7 月 8 日

课程设计评语

对课程论文的评语:

平时成绩: 总 成 绩:

课程论文成绩: 评阅人签名: - 2 -

注:1、无评阅人签名成绩无效;

2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效;

3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。

目 录

课程设计评语 .................................. - 2 - 目 录 ................................................ - 3 - 1.课程论文题目错误!未定义书签。 2.程序设计思路错误!未定义书签。 3.功能模块图 ..................................... 4 4.数据结构设计错误!未定义书签。 5.算法设计 ......................................... 5 6.程序代码 ...... 错误!未定义书签。 7.程序运行结果错误!未定义书签。

8.编程中遇到的困难及解决方法错误!未定

9.总结心得及良好建议错误!未定义书签。

- 3 -

10.致谢 ............ 错误!未定义书签。

一、课程论文题目

设计一个学生成绩管理系统,对在校某班学生几门课程的考试成绩进行统一管理。每个学生记录包括学号、姓名、年龄、数学、英语、物理成绩、总成绩,默认一学号为序存放。

(1)一个文件按一班为单位存储学生记录

(2)将允许的操作分为六种,以A、B、C、D、E、F为标志(若设置菜单操作更加)

A:插入一个新的学生记录(录入学生信息) B:修改学生记录 C:删除一个学生记录 D:登记成绩 E:修改成绩 F:浏览全班成绩 (3)计算学生的总成绩

(4)按学号排序输出全班成绩表

二、程序设计思路

根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入、

输出操作;在程序中需要浏览学生的信息,应提供显示、查找、排序操作;在登记成绩时,为了避免重复输入,应提供删除功能和避免重复输入的功能;另外还应提供键盘式选择菜单实现功能选择。根据以上分析,程序设计思路大致如下:

1、定义一个学生结构体,包含学生的所有信息。

2、编写主函数即menu,把一些功能函数加入到主函数中,由switch来调用不同的函数,从而实现不同的功能。同时在主函数中增加文件输入(fread)、输出(fwrite)功能函数。

3、编写各个功能函数。

4、最后,编译程序,检查程序逐步修改完善。

三、功能模块图

学生成绩管理系统

- 4 -

数据查找 成绩排序 数据输入 数据显示 数据插入

四、数据结构设计

由于学生是一个由多个信息组成的集合,所以要用结构体数组来存储学生的所有信息,方便整体修改和替换。 同时文件的输入输出都采用了指针的结构。

五、算法设计

1、主菜单函数,功能模块图 主函数main 输入函数IO_ReadInfo() 插修改函数 删除函数 排序函数 查找函数 显示函数 入函数Students_InsStudents_MoStudents_DStudents_SStudents_SeStudents_D ertdify() elete() ortByID() archByID() isplay() () 输出函数IO_Writefo() 其中6个函数的选择通过switch来实现,根据编者的选择来调用不同的函数,从而实现各个功能。 /*主程序*/ void main() {

char choice; IO_ReadInfo(); while(1) {

printf(\学生成绩管理系统------\\n\ printf(\:插入一个新的学生记录\\n\ printf(\:修改学生记录\\n\

- 5 -

printf(\:删除一个学生记录\\n\

printf(\:按姓名查询单个同学信息\\n\ printf(\:按学号排序\\n\ printf(\:浏览全班成绩\\n\ printf(\请选择(A-F):\ scanf(\ getchar();

switch(choice) {

case 'A': Student_Insert(); break; case 'B': Student_Modify(); break; case 'C': Student_Delete(); break; case 'D': Student_Select(); break; case 'E': Student_SortByID();break; case 'F': Student_Display(); break; case 'G': exit(0); }

IO_WriteInfo(); } }

2、Tol函数

Tol函数的功能是求学生总成绩,在求总成绩时会调用,但不会出现在主函数中。

/*求总成绩*/

float Tol(struct Student stu) {

return (stu.Math+stu.English+stu.Physics); }

3、Students_SearchByIndex函数

该函数的功能是来输入的学号来找到数组的下标,从而找到该学号对应的结构体的信息。不会在主函数中出现,但会被其他函数调用。

/*通过学号返回数组下标*/

int Student_SearchByIndex(char id[])

{ int i;

for (i=0;i

if (strcmp(students[i].ID,id)==0) return i;

return -1; }

4、Students_SearchByName函数

该函数的功能是来输入的姓名来找到数组的下标,从而找到该姓名对应

- 6 -

的结构体的信息。不会在主函数中出现,但会被其他函数调用。 /*通过姓名返回数组下标*/

int Student_SearchByName(char name[]) { int i;

for (i=0;i

if(strcmp(students[i].Name,name)==0) return i; return -1; }

5、Students_DisplaySingle函数

该函数的功能是来显示单个学生的信息,不会在主函数中出现,但会被其他函数调用。

/*显示单条学生记录*/

void Student_DisplaySingle(int index)

{

printf(\学号\姓名\年龄\数学\英语\物理\总成绩\

printf(\

printf(\ndex].Name,students[index].Age,students[index].Math,students[index].English,students[index].Physics,students[index].Total);

}

6、Students_Insert函数

该函数的功能是来插入学生的信息(也可以说的登记学生的信息),它有调用Tol函数来实现求总成绩的功能。还有一个小功能,就是他可以避免重复输入学号,是通过循环来实现的。该函数在主函数中有出现。 /*插入学生信息*/ void Student_Insert() {

int i; while(1) {

printf(\请输入学号:\

scanf(\ getchar();

printf(\请输入姓名:\

scanf(\ getchar();

printf(\请输入年龄:\

scanf(\ getchar();

printf(\请输入数学:\

- 7 -

scanf(\ getchar();

printf(\请输入英语:\

scanf(\ getchar();

printf(\请输入物理:\

scanf(\ getchar();

students[num].Total=Tol(students[num]); /*判断是否输入了相同学号*/

for (i=0;i

if (strcmp(students[i].ID,students[num].ID)==0) {

printf(\有相同学号\ break; } }

if (i==num) num++; printf(\是否继续?(Y/N)\ if (getchar()=='N') {

break; } } }

7、Students_Modify函数

该函数的功能是用来修改学生的信息,要求输入学号时,它通过调用Students_SearchByIndex函数来找到该学号对应的学生的信息,从而修改信息。同时也调用了Tol函数。它在主函数中有出现。 /*修改学生信息*/ void Student_Modify() {

while(1) {

char id[20]; int index;

printf(\请输入要修改的学生的学号:\ scanf(\ getchar();

index=Student_SearchByIndex(id); if (index==-1) {

- 8 -

printf(\学生不存在!\\n\ } else {

printf(\你要修改的学生信息为:\\n\ Student_DisplaySingle(index); printf(\请输入新值--\\n\ printf(\请输入学号:\

scanf(\ getchar();

printf(\请输入姓名:\

scanf(\ getchar();

printf(\请输入年龄:\

scanf(\ getchar();

printf(\请输入数学:\

scanf(\ getchar();

printf(\请输入英语:\

scanf(\ getchar();

printf(\请输入物理:\

scanf(\ getchar();

students[index].Total=Tol(students[index]); }

printf(\是否继续?(Y/N)\ if (getchar()=='N') {

break; } } }

8、Students_Delete函数

该函数的功能是用来删除没用的学生的信息,它通过调用Students_SearchByIndex函数来找到要删除的学生,然后通过调用Students_DisplaySingle函数显示要删除的学生的信息。它在主函数中有出现。 /*删除学生信息*/ void Student_Delete() { int i; while(1)

- 9 -

{

char id[20]; int index;

printf(\请输入要删除的学生的学号:\ scanf(\ getchar();

index=Student_SearchByIndex(id); if (index==-1) {

printf(\学生不存在!\\n\ } else {

printf(\你要删除的学生信息为:\\n\ Student_DisplaySingle(index); printf(\是否真的要删除?(Y/N)\ if (getchar()=='Y') {

for (i=index;i

students[i]=students[i+1]; }

num--; }

getchar(); }

printf(\是否继续?(Y/N)\ if (getchar()=='N') {

break; } } }

9、Student_Select函数

该函数的功能是用来按姓名查找学生的信息。不在主函数中出现。 /*按姓名查询*/ void Student_Select() {

while(1) {

char name[20]; int index;

- 10 -

printf(\请输入要查询的学生的姓名:\ scanf(\ getchar();

index=Student_SearchByName(name); if (index==-1) {

printf(\学生不存在!\\n\ } else {

printf(\你要查询的学生信息为:\\n\ Student_DisplaySingle(index); }

printf(\是否继续?(Y/N)\ if (getchar()=='N') {

break; } } }

10、Students_SortByID函数

该函数的功能是把学生的学号按从小到大的顺序依次排列。它在主函数中有出现。

/*按学号排序*/ void Student_SortByID() {

int i,j;

struct Student tmp; for (i=0;i

for (j=1;j

if (strcmp(students[j-1].ID,students[j].ID)==1) {

tmp=students[j-1];

students[j-1]=students[j]; students[j]=tmp; } } } }

11、Students_Display函数

该函数的功能是输出所有学生的信息,即浏览全班同学的信息。它在主

- 11 -

函数中有出现。

/*显示学生信息*/ void Student_Display() { int i;

printf(\学号\姓名\年龄\数学\英语\物理\总成绩\

printf(\ for (i=0;i

printf(%udents[i].Age,

students[i].Math,students[i].English,students[i].Physics,students[i].Total); } }

12、IO_ReadInfo函数

该函数的功能是用来从文件中读入学生的信息。在主函数中有出现。 /*将学生信息从文件读出*/ void IO_ReadInfo() {

FILE *fp; int i;

if ((fp=fopen(\ {

printf(\不能打开文件!\\n\ return; }

if (fread(&num,sizeof(int),1,fp)!=1) {

num=-1; } else {

for(i=0;i

fread(&students[i],sizeof(struct Student),1,fp); } }

fclose(fp); }

13、IO_WriteInfo函数

该函数的功能是用来向文件中输入学生的信息。在主函数中有出现。

- 12 -

/*将学生信息写入文件*/ void IO_WriteInfo() {

FILE *fp; int i;

if ((fp=fopen(\ {

printf(\不能打开文件!\\n\ return; }

if (fwrite(&num,sizeof(int),1,fp)!=1) {

printf(\写入文件错误!\\n\ }

for (i=0;i

if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1) {

printf(\写入文件错误!\\n\ } }

fclose(fp); }

六、程序代码

#include \ #include \#include \

/*定义学生结构体*/

struct Student {

char ID[20]; char Name[20]; int Age; float Math; float English; float Physics; float Total; }students[1000];

/*声明学生数组及学生数量*/

- 13 -

int num=0;

/*求总成绩*/

float Tol(struct Student stu) {

return (stu.Math+stu.English+stu.Physics); }

/*通过学号返回数组下标*/

int Student_SearchByIndex(char id[]) { int i;

for (i=0;i

if (strcmp(students[i].ID,id)==0) return i;

return -1; }

/*通过姓名返回数组下标*/

int Student_SearchByName(char name[]) { int i;

for (i=0;i

if(strcmp(students[i].Name,name)==0) return i; return -1; }

/*显示单条学生记录*/

void Student_DisplaySingle(int index) {

printf(\学号\姓名\年龄\数学\英语\物理\总成绩\

printf(\

printf(\].Name,students[index].Age,

students[index].Math,students[index].English,students[index].Physics,students[index].Total); }

- 14 -

/*插入学生信息*/ void Student_Insert() {

int i; while(1) {

printf(\请输入学号:\

scanf(\ getchar();

printf(\请输入姓名:\

scanf(\ getchar();

printf(\请输入年龄:\

scanf(\ getchar();

printf(\请输入数学:\

scanf(\ getchar();

printf(\请输入英语:\

scanf(\ getchar();

printf(\请输入物理:\

scanf(\ getchar();

students[num].Total=Tol(students[num]); /*判断是否输入了相同学号*/

for (i=0;i

if (strcmp(students[i].ID,students[num].ID)==0) {

printf(\有相同学号\ break; } }

if (i==num) num++; printf(\是否继续?(Y/N)\ if (getchar()=='N') {

break; } } }

- 15 -

/*修改学生信息*/ void Student_Modify() {

while(1) {

char id[20]; int index;

printf(\请输入要修改的学生的学号:\ scanf(\ getchar();

index=Student_SearchByIndex(id); if (index==-1) {

printf(\学生不存在!\\n\ } else {

printf(\你要修改的学生信息为:\\n\ Student_DisplaySingle(index); printf(\请输入新值--\\n\ printf(\请输入学号:\

scanf(\ getchar();

printf(\请输入姓名:\

scanf(\ getchar();

printf(\请输入年龄:\

scanf(\ getchar();

printf(\请输入数学:\

scanf(\ getchar();

printf(\请输入英语:\

scanf(\ getchar();

printf(\请输入物理:\

scanf(\ getchar();

students[index].Total=Tol(students[index]); }

printf(\是否继续?(Y/N)\ if (getchar()=='N') {

- 16 -

break; } } }

/*删除学生信息*/ void Student_Delete() { int i; while(1) {

char id[20]; int index;

printf(\请输入要删除的学生的学号:\ scanf(\ getchar();

index=Student_SearchByIndex(id); if (index==-1) {

printf(\学生不存在!\\n\ } else {

printf(\你要删除的学生信息为:\\n\ Student_DisplaySingle(index); printf(\是否真的要删除?(Y/N)\ if (getchar()=='Y') {

for (i=index;i

students[i]=students[i+1]; }

num--; }

getchar(); }

printf(\是否继续?(Y/N)\ if (getchar()=='N') {

break; } } }

- 17 -

/*按姓名查询*/

void Student_Select() {

while(1) {

char name[20]; int index;

printf(\请输入要查询的学生的姓名:\ scanf(\ getchar();

index=Student_SearchByName(name); if (index==-1) {

printf(\学生不存在!\\n\ } else {

printf(\你要查询的学生信息为:\\n\ Student_DisplaySingle(index); }

printf(\是否继续?(Y/N)\ if (getchar()=='N') {

break; } } }

/*按学号排序*/

void Student_SortByID() {

int i,j;

struct Student tmp; for (i=0;i

for (j=1;j

if (strcmp(students[j-1].ID,students[j].ID)==1) {

tmp=students[j-1];

students[j-1]=students[j]; students[j]=tmp;

- 18 -

} } } }

/*显示学生信息*/ void Student_Display() { int i;

printf(\学号\姓名\年龄\数学\英语\物理\总成绩\

printf(\ for (i=0;i

printf(%udents[i].Age,

students[i].Math,students[i].English,students[i].Physics,students[i].Total); } }

/*将学生信息从文件读出*/ void IO_ReadInfo() {

FILE *fp; int i;

if ((fp=fopen(\ {

printf(\不能打开文件!\\n\ return; }

if (fread(&num,sizeof(int),1,fp)!=1) {

num=-1; } else {

for(i=0;i

fread(&students[i],sizeof(struct Student),1,fp); } }

fclose(fp);

- 19 -

}

/*将学生信息写入文件*/ void IO_WriteInfo() {

FILE *fp; int i;

if ((fp=fopen(\ {

printf(\不能打开文件!\\n\ return; }

if (fwrite(&num,sizeof(int),1,fp)!=1) {

printf(\写入文件错误!\\n\ }

for (i=0;i

if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1) {

printf(\写入文件错误!\\n\ } }

fclose(fp); }

/*主程序*/ void main() {

char choice; IO_ReadInfo(); while(1) {

printf(\学生成绩管理系统------\\n\ printf(\:插入一个新的学生记录\\n\ printf(\:修改学生记录\\n\

printf(\:删除一个学生记录\\n\

printf(\:按姓名查询单个同学信息\\n\ printf(\:按学号排序\\n\ printf(\:浏览全班成绩\\n\ printf(\请选择(A-F):\ scanf(\

- 20 -

getchar();

switch(choice) {

case 'A': Student_Insert(); break; case 'B': Student_Modify(); break; case 'C': Student_Delete(); break; case 'D': Student_Select(); break; case 'E': Student_SortByID();break; case 'F': Student_Display(); break; case 'G': exit(0); }

IO_WriteInfo(); } }

七、程序运行结果

1、显示主菜单

2、显示A:输入学号20091003439,姓名CHANGBIAO,年龄21,数学123,英语123,物理123

- 21 -

输入Y,继续输入:学号20091003440,姓名changbiao,年龄21,数学123,英语124,物理125

输入Y:继续输入学号20091003440,姓名changbiao,年龄21,数学123,英语124,物理123

- 22 -

自此,该函数的两个功能都以实现。

2、继续输入N:选择B,输入学号20091003440,姓名changbiao,年龄21,数学111,英语111,物理111

3、输入N:选择A,继续输入数据

学号20091003438,chang,21,123,123,123 学号20091003441,biao,21,123,123,123

- 23 -

输入N:选择C,删除学号20091003441的信息

4、输入N:选择D,查询姓名为changbiao的信息

5、输入N:继续输入E

6、输入F:浏览所有学生的信息

- 24 -

八、编程中遇到的困难及解决方法

我遇到的困难大致有四个:

1、在没有编写for循环时,输入了相同的学号都不知道,后来经过自己的反复摸搜,终于找到了解决的方法。即增加了一下程序 /*判断是否输入了相同学号*/

for (i=0;i

if (strcmp(students[i].ID,students[num].ID)==0) {

printf(\有相同学号\ break; } }

if (i==num) num++;

2、我在编写 Student_Insert()函数中for循环时总是遇到问题,编译不知道多少次,都没有把程序编对,后来找老师后,经过老师的耐心指导,我发现了自己的问题:自己没把输入法切换到正确的输入状态。

3、我发现文件不能清空,造成以前用过的数据还在里面,使得后来的数据有点乱,所以想把文件清空后在输入,可是不知道怎么弄。后来请老师帮忙时,老师说你搜索一下,我搜到了,但是由于系统的问题,搜索到的答案不能用。所以我把这个问题给放弃了,没有把这个功能增加进去。

4、自己总是出现一些小的错误,导致程序编了好久才完成。最后还因为U盘中毒而前功尽弃,但是我并没有而放弃了,在最后一天里,我花了整整一天弄完了。虽然很累,但是很值。

- 25 -

九、总结心得及良好建议

C语言实习基本上由老师引导,自己很多都靠自学,不明白的问老师,自学能力得到了很大的培养。在实习过程中,我感觉到一点,程序是不能一气呵成的。至少一气呵成的程序不会尽善尽美。程序编写要一步一步的完成。首先,对于要编的程序要有一个总体思路。要明确想要什么。只要把思路理清楚了,程序就好编写了。把程序分割成几个块,即多个函数,一块一块的编写。然后将分散的函数用另外的函数连接起来或者用main函数连接。到这一步,程序也就初步编成了,之后便是调试,检查错误。最后我觉得还可以对于已经编写好的程序进行一些修改添加,使它更加人性化。优化程序的阶段是很重要的。

以上的建议太好,所以我摘抄了。接下来是我自己的心得:

虽然老师把程序给了我,但是我并没有因为这个而觉得没什么好做的了,反而我觉得我们应该多学点,至少应该把里面所有的知识点都弄懂,这样才不至于浪费宝贵的时间。所以在实习的期间,我没有上网,而是把老师发给我的程序仔细的阅读了一遍,这一个过程持续了两个晚上,所以我感觉自己对这个程序已经很了解了。所以在接下来的时间了,我按照程序安排设计重新修改了程序,使得程序更加的优化,同时也满足了实习的要求。

我的建议:不论老师对我们的要求如何,我们都应该严格要求自己,做到脚踏实地,认认真真完成属于自己应该做的事。

十、致谢

在C语言的实习过程中,让我巩固了C语言的基础知识,以前从来没有这样编过完整的程序,实习让我有这样的一个机会,自己独立编写程序。我觉得自己说学的东西不多,但是可以将它们运用出来。在实习过程中,首先我要感谢我的老师,一个是带我走进C语言大门的赵老师,因为她,我开始喜欢C语言,把所学知识掌握牢固。同时,在这次实习中,邵老师对我的帮助对我最难忘。题目本身是很简单的,在老师的教学风格影响下,我在编写完最初程序后,有自己添加了很多功能。之后,在邵老师介绍下,我又不断优化了程序编译。邵老师也给过我其他发展的建议,在此,我要感谢他。最后,我还要感谢给我帮助的同学,在一些程序问题上,我和同学交流经验,学到了很多在书本上学不到的东西。

总之,我真诚的感谢在这次实习中给过我帮助的人! 在实习过程中给邵老师添加了不少麻烦,希望老师不要介意,再次感谢老师耐心的指导。

- 26 -

九、总结心得及良好建议

C语言实习基本上由老师引导,自己很多都靠自学,不明白的问老师,自学能力得到了很大的培养。在实习过程中,我感觉到一点,程序是不能一气呵成的。至少一气呵成的程序不会尽善尽美。程序编写要一步一步的完成。首先,对于要编的程序要有一个总体思路。要明确想要什么。只要把思路理清楚了,程序就好编写了。把程序分割成几个块,即多个函数,一块一块的编写。然后将分散的函数用另外的函数连接起来或者用main函数连接。到这一步,程序也就初步编成了,之后便是调试,检查错误。最后我觉得还可以对于已经编写好的程序进行一些修改添加,使它更加人性化。优化程序的阶段是很重要的。

以上的建议太好,所以我摘抄了。接下来是我自己的心得:

虽然老师把程序给了我,但是我并没有因为这个而觉得没什么好做的了,反而我觉得我们应该多学点,至少应该把里面所有的知识点都弄懂,这样才不至于浪费宝贵的时间。所以在实习的期间,我没有上网,而是把老师发给我的程序仔细的阅读了一遍,这一个过程持续了两个晚上,所以我感觉自己对这个程序已经很了解了。所以在接下来的时间了,我按照程序安排设计重新修改了程序,使得程序更加的优化,同时也满足了实习的要求。

我的建议:不论老师对我们的要求如何,我们都应该严格要求自己,做到脚踏实地,认认真真完成属于自己应该做的事。

十、致谢

在C语言的实习过程中,让我巩固了C语言的基础知识,以前从来没有这样编过完整的程序,实习让我有这样的一个机会,自己独立编写程序。我觉得自己说学的东西不多,但是可以将它们运用出来。在实习过程中,首先我要感谢我的老师,一个是带我走进C语言大门的赵老师,因为她,我开始喜欢C语言,把所学知识掌握牢固。同时,在这次实习中,邵老师对我的帮助对我最难忘。题目本身是很简单的,在老师的教学风格影响下,我在编写完最初程序后,有自己添加了很多功能。之后,在邵老师介绍下,我又不断优化了程序编译。邵老师也给过我其他发展的建议,在此,我要感谢他。最后,我还要感谢给我帮助的同学,在一些程序问题上,我和同学交流经验,学到了很多在书本上学不到的东西。

总之,我真诚的感谢在这次实习中给过我帮助的人! 在实习过程中给邵老师添加了不少麻烦,希望老师不要介意,再次感谢老师耐心的指导。

- 26 -

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

Top