汕头职业技术学院
C语言课程实训报告
编号:
C语言程序设计报告
题 目:
院 (系):
专 业:学生姓名:
学 号:
指导教师:
学生信息管理系统 桂电职院计算机系 张俊伟 1012310415、1012310432 钟永权
20xx年4月5日
实现的任务
完成对学生信息管理系统设计即能对若干人的信息进行各种管理。
设计内容如下:
1.确定能记录学生信息的数据结构:学号、姓名、性别等信息,它是本程序的核心数据结构,定义为如下的结构体类型:
int shoudSave=0; /*全局变量,用于记录数组的当前位置*/
struct student /*定义结构体类型,代表学生信息*/
{
char Number[10]; /*学号*/
char Name[20]; /*姓名*/
char Age[3]; /*年龄*/
char Sex[4]; /*性别*/
2.程序具有以下基本功能:
? 输入学生的资料:输入个人的资料,并且可选择继续输入或退出到主菜单,若输入的学号信息已经存在会提示已经存在是否进行修改。
? 从文件调入资料:对所要的资料进行调配。
? 查询学生的资料:可按姓名查找某人记录,也可按学号查找某人记录。若找到,则显示所有人的记录,否则提示未找到,无论查找成功否,都可以退到主菜单。
? 删除学生的资料:删除已输入的记录。输入姓名或者学号查找要删除的记录,若找到,提示是否确定删除,若选择是,则删除该人信息,若选择否,则取消;若没找到,提示无此人信息。
? 追加学生的资料:此项可以追加到学生的详细信息。
? 显示学生的成绩:此项可以输入出刚才输入的所有数据。
? 统计学生的成绩:可以统计出个人总分和平均分、单科平均分、总分最高分、总分最低分等。
? 保存输入的资料:要想刚输入的数据永久保存在文件中要选此项。 ? 对成绩进行排序:此项对学生的各科成绩可以进行排序等。
设计要求如下:
1.核心数据结构用到的结构体要采用动态内存分配和链表结构。地址也要
求存储在动态分配的内存中,以节约内存。内存的起始地址存储在结构体的成员
指针student中。
2.使用文件进行存储和管理。程序启动时可从文件中读取通信信息,或从
键盘输入通信信息;运行过程中如添加或删除记录时也可对文件进行存取;退出
前可选择将通信信息保存到文件中。
3.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口
要注释清楚。对程序其它部分也进行必要的注释。
4.对系统进行功能模块分析、画出总流程图和各模块流程图。
5.用户界面要求使用方便、简洁明了、美观大方、格式统一。所有功能可
以反复使用,最好使用菜单。
6.通过命令行相应选项能直接进入某个相应菜单选项的功能模块。
7.所有程序需调试通过。
老师评语:
目录
课题的目的意义………………………………………………6 功能介能………………………………………………………6 模块和流程图………………………………………………….6 用户使用说明书……………………………………………….8 总结…………………………………………………………….8 人员安排………………………………………………………8 参考文献………………………………………………………8 程序代码……………………………………………………8-21
课程设计的目的
课程设计围绕课程的整体教学目标进行,课程设计的题目具有一定的综合性和应性,只靠个别单元的知识一般不能实现课程设计的目标,需要对课程知识进行综合运用。要完成好课程设计,就要对课程知识进行系统学习、复习、总结、应用,达到在实践中学习知识、掌握知识、应用知识和培养能力的目的。
1、通过课程设计,进一步熟悉掌握以下知识:数据类型、分支控制、循环控制、函数的定义及调用、结构体及数组、指针、文件操作、编译预处理等。 达到系统理解、综合运用课程知识的学习目标。
2、通过课程设计,培养学生结构化程序、模块化程序设计的方法和能力。
3、通过课程设计,提高分析问题、解决问题、以及综合利用C语言程序解决实际问题的方法。
4、通过课程设计,掌握程序的局部测试、调试方法,建立程序系统调试、测试的基本概念和思想,学会较大程序的系统测试、调试方法解。
5、了解软件的编制过程。
功能介绍
这是一款简单的以C语言为基础的信息管理系统。这款软件的功能包括输入记录、显示所有记录、插入记录、删除一份记录、输入学号或者姓名查询、将记录写入文件和导入记录,同时具有开始登录模块加密。
模块和流程图
此软件包括8个模块,分别是输入模块、显示记录模块、查询模块、排序模块、 插入记录模块、删除记录模块、文件写入模块、导入模块以及主函数。
流程图
输入函数: 输出函数:
用户使用说明
此程序为一个简单的信息管理系统,有记录、显示所有记录、添加删除记录以及查找记录的功能。在主菜单中,请选择您所需要的操作:
①.输入学生的资料 ②.从文件调入资料
③.查询学生的成绩 ④.删除学生的资料
⑤.追加学生的资料 ⑥.显示学生的成绩
⑦.统计学生的成绩 ⑧.保存输入的资料
⑨.对成绩进行排序
? 输入学生的资料:输入个人的资料,并且可选择继续输入或退出到主菜
单,若输入的学号信息已经存在会提示已经存在是否进行修改。
? 从文件调入资料:对所要的资料进行调配。
? 查询学生的资料:可按姓名查找某人记录,也可按学号查找某人记录。
若找到,则显示所有人的记录,否则提示未找到,无论查找成功否,都可以退到主菜单。
? 删除学生的资料:删除已输入的记录。输入姓名或者学号查找要删除的
记录,若找到,提示是否确定删除,若选择是,则删除该人信息,若选?
?
?
?
?
择否,则取消;若没找到,提示无此人信息。 追加学生的资料:此项可以追加到学生的详细信息。 显示学生的成绩:此项可以输入出刚才输入的所有数据。 统计学生的成绩:可以统计出个人总分和平均分、单科平均分、总分最高分、总分最低分等。 保存输入的资料:要想刚输入的数据永久保存在文件中要选此项。 对成绩进行排序:此项对学生的各科成绩可以进行排序等。
总结:
本次设计十分成功,但是仍然存在不足之处,由于对链表不是十分熟悉,没有能充分使用链表保存数据,内存使用不够高效,由于自己实力不足,一些功能无法实现,使设计出的软件,功能不够完善。本次设计综合运用了,我们这个学期所学的所有知识,这是一次十分有益的实践活动,是对我们是否掌握了课本知识的综合检测,也是对我们实践能力的一次检验。对设计出的软件,因使用结构链表使内存得到更高效的利用,并节约内存的使用,提高程序运行效率。
人员安排:
黄莉做前提提议设想,组织架构,负责程序的编译,黄正青负责优化和修改。
参考文献
C语言程序设计及互联网。
附:核心代码
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define SC printf /*定义符号常量,代表输出函数*/
int shoudSave=0; /*全局变量,用于记录数组的当前位置*/
struct student /*定义结构体类型,代表学生信息*/
{
char Number[10]; /*学号*/
char Name[20]; /*姓名*/
char Age[3]; /*年龄*/
char Sex[4]; /*性别*/
};
typedef struct node
{
struct student data;
struct node *next;
}Node,*Link;
void menu() /* 本函数用于输出主菜单信息 */
{
SC("\n○●○●○●○●○●○●○●○◇学生信息管理系统◇●○●○●○●○●○●○●○●\n");
SC("\t\t ①.输入学生的资料\t\t ②.从文件调入资料\n");
SC("\t\t ③.查询学生的成绩\t\t ④.删除学生的资料\n");
SC("\t\t ⑤.追加学生的资料\t\t ⑥.显示学生的成绩\n");
SC("\t\t ⑦.统计学生的成绩\t\t ⑧.保存输入的资料\n");
SC("\t\t ⑨.对成绩进行排序\t\t ◎.退出系统\n");
SC("\n○●○●○●○●○●○●○●○●○●○●○●○●○●○●○●○●○●○●○●○●\n");
}
void printstart() /* 本函数用于输出多次用到的符号 */
{ SC("﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌"); }
void Wrong() /* 本函数用于输出错误信息 */
{ SC("\n=====>温馨提示:您输入错误!\n"); }
void Nofind() /* 本函数用于输出未找到信息 */
{ SC("\n=====>温馨提示:没有找到您要找的学生!\n"); }
void printe(Node *p) /* 本函数用于输出学生信息 */
{
SC("※学号:%s\t※姓名:%s\n※性别:%s\n",p->data.Number,p->data.Name, p->data.Age,p->data.Sex,);
}
Node* Locate(Link l,char findmess[],char NameorNumber[]) /* 该函数用于定位连表中符合要求的接点,并返回该指针 */
{ Node *r; if(strcmp(NameorNumber,"Number")==0) /* 按学号查询 */ { r=l->next; while(r!=NULL)
{ if(strcmp(r->data.Number,findmess)==0) return r; r=r->next; } }
else if(strcmp(NameorNumber,"Name")==0) /* 按姓名查询 */
{ r=l->next; while(r!=NULL)
{ if(strcmp(r->data.Name,findmess)==0)
return r;
r=r->next;
}
}
return 0;
}
void Add(Link l) /* 本函数用于增加学生信息 */
{ Node *p,*r,*s;
char Number[10];
r=l;
s=l->next;
while(r->next!=NULL)
r=r->next; /* 将指针置于最末尾 */
while(1)
{
SC("\n=====>请您输入学号[按'0'返回上一级菜单]:");
scanf("%s",Number);
if(strcmp(Number,"0")==0)
break;
while(s)
{
if(strcmp(s->data.Number,Number)==0)
{
SC("=====>温馨提示:学号为'%s'的学生已经存在,若要修改请你选择'4 修改'!\n",Number);
printstart();
printe(s);
printstart();
SC("\n");
return;
}
s=s->next;
}
p=(Node *)malloc(sizeof(Node));
strcpy(p->data.Number,Number);
SC("=====>请您输入姓名:"); scanf("%s",p->data.Name); getchar(); SC("=====>请您输入性别:"); scanf("%s",p->data.Sex); getchar(); /* 信息输入已经完成 */
p->next=NULL;
r->next=p;
r=p;
shoudSave=1;
}
}
void Qur(Link l) /* 本函数用于查询学生信息 */
{
int sel;
char findmess[20];
Node *p;
if(!l->next)
{
SC("\n=====>温馨提示:没有资料可以查询!\n"); return;
}
SC("\n=====>1.按学号查找\n=====>2.按姓名查找\n"); SC("温馨提示:请输入1或2选择查找方式:");
scanf("%d",&sel);
if(sel==1)/* 按学号查询 */
{
SC("=====>请您输入要查找的学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"Number");
if(p)
{
SC("\t\t\t\t查找结果\n");
printstart();
printe(p);
printstart();
}
else
Nofind(); }
else if(sel==2) /* 按姓名查询 */
{
SC("=====>请您输入要查找的姓名:"); scanf("%s",findmess);
p=Locate(l,findmess,"Name");
if(p)
{
SC("\t\t\t\t查找结果\n"); printstart();
printe(p);
printstart();
}
else
Nofind(); }
else
Wrong(); }
void Del(Link l) /* 本函数用于删除学生信息 */ {
int sel;
Node *p,*r;
char findmess[20];
if(!l->next)
{ SC("\n=====>提示:没有资料可以删除!\n"); return; } SC("\n=====>1.按学号删除\n=====>2.按姓名删除\n"); SC("温馨提示:请输入1或2选择删除方式:"); scanf("%d",&sel);
if(sel==1)
{ SC("=====>请您输入要删除的学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"Number");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
SC("\n=====>温馨提示:该学生信息已经成功删除!\n"); shoudSave=1;
}
else
Nofind();
}
else if(sel==2)
{
SC("=====>请您输入要删除的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"Name");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
SC("\n=====>温馨提示:该学生信息已经成功删除!\n");
shoudSave=1;
}
else
Nofind();
}
else
Wrong();
}
void dellall() /* 本函数用于删除所有学生信息(即直接删除文件) */ {
getchar();
char jian2;
SC("\n=====>温馨提示:确定删除全部学生信息吗?(Y/N):");
scanf("%c",&jian2);
if(jian2=='y'||jian2=='Y')
{
system("del .\\student.txt");
SC("\n=====>温馨提示:所有记录删除成功!按任意键退出系统!......\n");
exit(0);
}
if(jian2=='n'||jian2=='N')
{
SC("\n=====>温馨提示:记录尚未删除! ......\n");
}
else
Wrong();
}
void Modify(Link l) /* 本函数用于修改学生信息 */
{
Node *p;
char findmess[20];
if(!l->next)
{
SC("\n=====>温馨提示:没有资料可以修改!\n");
return;
}
SC("请您输入要修改的学生学号:");
scanf("%s",findmess);
p=Locate(l,findmess,"Number");
if(p)
{
SC("=====>请您输入新学号(原学号%s):",p->data.Number); scanf("%s",p->data.Number); getchar();
SC("=====>请您输入新姓名(原姓名%s):",p->data.Name); scanf("%s",p->data.Name); getchar();
SC("=====>请您输入新性别(原性别%s):",p->data.Sex); scanf("%s",p->data.Sex); getchar();
}
else
Nofind();
}
void outputall(Link l) /* 本函数用于输出全部学生信息 */
{
int count=0;
Node *p;
p=l->next;
if(!p)
{ SC("\n=====>温馨提示:没有资料可以显示!\n"); return; }
SC("\n\t\t\t文件中所有学生的记录如下\n\n");
printstart();
while(p)
{
printe(p);
printstart();
p=p->next;
}
SC("\n\n");
}
void Tongji(Link l) /* 本函数用于输出统计信息 */
{
Node *page,*page2; /* 用于指向各项的接点 */
Node *r=l->next;
if(!r)
{
SC("\n=====>温馨提示:没有资料可以统计!\n");
return ;
}
page=page2=r;
while(r!=NULL)
{
if(r->data.Age<=page->data.Age) page=r;
if(r->data.Age>=page2->data.Age) page2=r;
r=r->next;
}
SC("------------------------------统计结果--------------------------------\n");
SC("=>年龄最小者:\t姓名:%s %s岁\n",page->data.Name,page->data.Age); SC("=>年龄最大者:\t姓名:%s %s岁\n",page2->data.Name,page2->data.Age); printstart();
}
void Save(Link l) /* 本函数用于保存文件更改 */
{
FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen("student.txt","wb");
if(fp==NULL)
{
SC("\n=====>温馨提示:重新打开文件时发生错误!\n");
exit(1);
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
{
flag=0;
break;
}
}
if(flag)
{
SC("\n=====>温馨提示:学生信息保存成功.(有%d条记录已经保存.)\n",count); shoudSave=0;
}
fclose(fp);
}
void help() /* 本函数用于帮助信息 */
{printstart();
SC("\t\t\t开发者:黄莉、黄正青\n\t\t\t班级:10级计算机应用技术4班\n\t\t\t 指导老师:钟永权\n\t\t\t 版本号:V1.0\n");
printstart();
}
void exit(Link l) /* 本函数用于退出系统和保存信息改动 */
{
char jian;
{
if(shoudSave==1)
{ getchar(); SC("\n=====>温馨提示:资料已经改动,是否将改动保存到文件中(Y/N)?\n");
scanf("%c",&jian);
if(jian=='y'||jian=='Y') Save(l);
else exit(0);}
SC("\n=====>温馨提示:您已经成功退出系统,谢谢使用本系统!\n");exit(0); }
}
void password() /* 本函数用于加密模块 */
{
int password;
int i=0;
printstart();
SC("\n\t\t\t ◇ 欢迎使用学生信息管理系统 ◇ \n\n");
printstart();
SC("温馨提示:您只有三次输入密码的机会哦!");
SC("\n\n\n\n\n\n\t\t◇请您输入密码:");
while(i<3)
{
scanf("%d",&password);
getchar();
if(password==888888)
{SC("您输入的密码正确。\n");i=999;break;}
i++;}
if(i!=999)
{SC("对不起,您输入的密码不正确!系统将退出......\n");exit(0);} }
void main() /* 程序主函数 */
{
password();
Link l; /* 链表 */
FILE *fp; /* 文件指针 */
int sel; /* 选择 */
char jian; /* 选择 */
int count=0;
Node *p,*r;
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
r=l;
fp=fopen("student.txt","r+");
if(fp==NULL)
{
SC("\n○●○●○●○●○●○●○●○◇学生信息管理系统◇●○●○●○●○●○●○●○●\n");
SC("\n=====>温馨提示:源文件尚未存在,是否现在创建?(Y/N):"); scanf("%c",&jian);
if(jian=='y'||jian=='Y') {fp=fopen("student.txt","w+");SC("\n=====>温馨提示:源文件创建成功!......\n");}
else
if(jian=='N'||jian=='n') {SC("\n=====>温馨提示:文件尚未创建,请按任意键退出系统......\n");exit(0);}
else {Wrong();exit(0);}
}
SC("\n=====>温馨提示:源文件已经打开,正在导入记录......\n");
while(!feof(fp))
{
p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp)) /* 将文件的内容放入接点中 */
{
p->next=NULL;
r->next=p;
r=p; /* 将该接点挂入连中 */
count++;
}
}
fclose(fp); /* 关闭文件 */
SC("\n=====>温馨提示:记录导入完毕,共导入%d条记录.\n",count);
while(1)
{
menu();
SC("温馨提示:请按1-9选择您的操作:");
scanf("%d",&sel);
switch(sel)
{ case 1:Add(l);break; /* 输入学生的资料 */
case 2:Del(l);break; /* 从文件调入资料 */
case 3:Qur(l);break; /* 查询学生的成绩 */
case 4:Modify(l);break; /* 删除学生的资料 */
case 5:Save(l);break; /* 追加学生的资料 */
case 6:Tongji(l);break; /* 显示学生的资料 */
case 7:dellall();break; /* 统计学生的成绩 */
case 8:outputall(l);break; /* 保存输入的资料 */
case 9:help();break; /* 对成绩进行排序 */
case 0:exit(l);break; /* 退出系统 */
default:Wrong();getchar();break;}
}
}
食品专业课程设计报告院系:专业:班级:学生姓名:指导教师:实习地点:实习时间:报告成绩:一、实习目的1、通过实地参观,真切地感受公…
模拟电子技术课程实训报告课题名称基于单片机的系别机电系专业电气自动化班级09级学号35号学生姓名指导教师袁从贵完成日期20xx52…
经济与管理学院国际经济与贸易专业学生姓名度艳班级国贸09102班学号20xx01010241指导教师刘金红实习单位李文锁城长沙分公…
广州航海高等专科学校课程设计实训报告课程ASPNET程序设计基础与实训教程题目网络课程生成系统专业计算机应用技术指导教师王琢成绩班…
《会计手工帐模拟实训课程》课程学习感悟怀着一份新鲜又有那么一点紧张的心情,我开始了会计手工帐模拟实训的第一堂课。当指导老师一声话下…
高徳君转眼间两个月的实训培训就要结束,08汽修2班全体学生的努力与付出下,在教务科精心策划和周密安排下,以及在自己的辛勤工作和不懈…
[日期:20xx-6-3020:36:29]来源:本站原创作者:佚名[字体:大中小]随着课程改革的深入,教师的职责越来越不是单纯地…
实训报告实训名称:英语教学设计实训人:展示三指导老师:实训地点:教室、图书馆、教研室实训时间:20xx年x月x日20xx年x月x日…
四年的大学生活弹指一瞬间,在即将毕业之际,我选择了抚顺市知明教育培训学校担任课程顾问一职。第一次进入知明教育培训学校应聘的时候,就…