C语言课程设计报告1doc.docx

上传人:b****6 文档编号:4267895 上传时间:2022-11-28 格式:DOCX 页数:28 大小:212.13KB
下载 相关 举报
C语言课程设计报告1doc.docx_第1页
第1页 / 共28页
C语言课程设计报告1doc.docx_第2页
第2页 / 共28页
C语言课程设计报告1doc.docx_第3页
第3页 / 共28页
C语言课程设计报告1doc.docx_第4页
第4页 / 共28页
C语言课程设计报告1doc.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

C语言课程设计报告1doc.docx

《C语言课程设计报告1doc.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告1doc.docx(28页珍藏版)》请在冰豆网上搜索。

C语言课程设计报告1doc.docx

C语言课程设计报告1doc

学生信息管理程序

一、设计目的:

使用结构体数组结构实现简单的学生信息管理功能,要求具有数据输入、数据输出、数组排序、元素插入、元素删除、查询信息等功能。

程序最多容纳60名学生的记录。

二、设计要求:

1、intInput(void);//使用程序中一个空白结构体,输入一名学生的个人及学习信息信息。

此功能区返回一个值记录程序存储学生记录的数量*/

2、voidChange_record(void);//修改学生的记录选项。

3、voidDelete_record(void);//删除学生记录选项。

4、voidSort_record(void);//根据学生某项信息排序学生记录选项。

5、voidQuery_record(void);//查询学生记录选项。

6、voidDisplay(void);//显示出当前程序存储的所有学生信息选项。

7、voidAdd_from_text(inte);//从文本中提取学生记录输入程序进行处理。

8、voidWrite_to_text(void);//将当前程序中存储的学生记录写入一个文本文件中。

9、voidEnding(void);//退出选项。

三、总体设计:

1、主函数模块:

主函数设计较为简单,主要是使用switch语句通过选择结构将整个程序能够实现的功能提示用户选择。

具体流程图:

 

主函数代码:

intmain(void)//对主函数的定义。

{

n=0;

for(i=0;i

{

strcpy(stu[i].name,"\0");

stu[i].num=0;

stu[i].score=0;

}

for(;;)//通过for语句实现使用户自由决定是否重复使用此程序。

{

switch(Menu_select1())//使用switch语句调用用户指定菜单项对应的函数。

{

case1:

Input(n);//插入学生记录函数。

for(i=0,n=0;i

{

if(stu[i].num!

=0)

n++;

}

break;

case2:

Change_record();//修改学生的记录函数。

break;

case3:

Delete_record();//删除学生记录函数。

break;

case4:

Sort_record();//排序函数。

break;

case5:

Query_record();//查询函数。

break;

case6:

Dispaly();//展示函数。

break;

case7:

printf("请输入文件的路径:

");

scanf("%s",name0);

printf("请输入此文本中有多少名学生的记录:

");

scanf("%d",&j);

Add_from_text(j,name0);//从文本中添加学生记录的函数。

n+=j;

break;

case8:

printf("请输入文件的路径:

");

scanf("%s",name0);

Write_to_text();//将学生记录写入文本的函数。

break;

case9:

//结束程序使用界面选项。

Ending();

break;

default:

continue;//菜单循环显示。

}

system("cls");

}

system("pause");//防止程序运行窗口闪退。

return0;

}

2、菜单模块:

菜单模块包括主菜单和部分功能中要调用的附属菜单,作用是向用户说明其输入的选择信息将使程序实现什么样的功能。

具体流程图:

 

 

3、功能模块

功能模块的设计就是通过编写多个的函数对应程序所要求实现的功能。

函数在主函数中将被编号,使用户向程序输入的编号就能调用相应的函数体现程序的功能。

具体流程图:

 

 

四、详细设计及源代码:

#include

#include//提供system();语句。

#include//提供strlen()函数。

#defineN60//定义全局常量N作为结构体数组stu[]下标。

intb,c,num0,n,i=0,j=0;

charname0[40];/*将程序中多次定义的标识符设置为全局变量。

*/

structstudent

{

charname[40];

intnum;

intscore;

}stu[N];

intMenu_select1(void);

intMenu_select2(void);

intMenu_select3(void);

intMenu_select4(void);

intMenu_select5(void);

intMenu_select6(void);

intMenu_select7(void);

intMenu_select8(void);

intMenu_select9(void);//声明程序中用到的多种菜单函数。

structstudent*point1,*point2;//全局定义程序中多次用到得结构体指针变量。

int(*pot2)(void)=Menu_select2;

int(*pot4)(void)=Menu_select4;

int(*pot6)(void)=Menu_select6;

int(*pot8)(void)=Menu_select8;//定义指向菜单函数的指针。

intjudgement(void);

intjudgement_small(void);//声明程序要调用的两个判断特殊情况的函数。

FILE*fp;//定义指向文件型数据的指针变量。

voidChange_service(void);

voidQuery_service(void);

voidDelete_service(void);

void(*ser1)(void)=Change_service;

void(*ser2)(void)=Delete_service;

void(*ser3)(void)=Query_service;//定义指向在有特定功能的函数内部使用的函数的指针。

voidSort_service1(intpo);

voidSort_service2(intpo);//声明两个在有排序功能的函数中腰使用的函数。

voidswap(structstudent*po1,structstudent*po2);//对交换函数的声明。

voidEnding(void);//对有结束功能的函数的声明。

voidfind(int(*p)(void),void(*q)(void));//对一个形参是指向函数的指针的函数的声明。

voidInput(intn)//对有插入学生记录功能的函数的定义。

{

printf("请输入学生姓名:

");

scanf("%s",&stu[n].name);

printf("请输入学生序号:

");

stu[n].num=judgement();

printf("请输入学生信息:

");

scanf("%d",&stu[n].score);

system("cls");//此语句执行后将清除运行窗口显示的结果。

}

voidChange_record(void)//对有修改学生记录功能的函数的定义。

{

find(pot2,ser1);//在函数内部调用函数。

}

voidDelete_record(void)//对有删除学生记录功能的函数的定义。

{

find(pot4,ser2);

}

voidSort_record(void)//对有排序学生记录功能的函数的定义。

{

j=Menu_select8();//通过菜单函数的返回值提供用户的选择信息来执行用户选定的功能

for(;judgement_small()>0;)//for语句中的判断用判断函数处理后以提示是否输入错误。

{

if(j==1)

{

j=Menu_select9();

Sort_service1(j);//通过菜单函数的返回值作为另一个函数的实参来执行用户选定的功能。

break;

}

elseif(j==2)

{

j=Menu_select9();

Sort_service2(j);

break;

}

else

continue;

}

}

voidQuery_record(void)//对有查询学生记录功能的函数的定义。

{

find(pot6,ser3);

}

voidDispaly(void)//对有显示全部学生记录功能的函数的定义。

{

for(i=0;i

{

printf("第%d位学生姓名为%s\n",i+1,stu[i].name);

printf("班内序号为%d\n",stu[i].num);

printf("学习信息为%d\n\n",stu[i].score);

}

system("pause");//防止运行窗口闪退。

}

voidEnding(void)//对有退出功能的函数的定义。

{

system("cls");

printf("\n\t************************************************************\n\n\n\n");

printf("\n\t\t\t欢迎下次继续使用,再见!

\n\n");

printf("\n\n\n\t************************************************************\n\n\t");

exit(0);//正常退出程序。

}

voidAdd_from_text(inte,charch)//对有可从文本文件中提取学生记录的函数的定义。

{

fp=fopen(name0,"r");//使指针指向文件。

if((fp=fopen(name0,"r"))==NULL)//判断指针所指向的文件是否存在,不存在退出此函数。

{

printf("无法找到路径为%s的文本文件。

\n",name0);

system("pause");

return;

}

else//存在则从此文件中提取学生记录。

{

for(i=n;i<(n+e+1);i++)

{

fscanf(fp,"%s%d*%d",&stu[i].name,&stu[i].num,&stu[i].score);

}

printf("已提取出文本文件名称为%s中的所有学生记录!

\n",name0);

system("pause");

}

fclose(fp);//关闭文本文件,即指针fp不再指向任何文件。

}

voidWrite_to_text(void)//对可将程序中存储并处理后的学生记录输出至一个文本文件。

{

fp=fopen(name0,"w");//使指针指向文件。

if((fp=fopen(name0,"w"))==NULL)//判断指针所指向的文件是否存在,不存在退出此函数。

{

printf("无法找到名为%d的文本文件。

\n",name0);

system("pause");

return;

}

else//存在则将程序中储存的学生记录写入该文件。

{

fprintf(fp,"姓名\t\t\t\t\t*班内序号\t*学习信息*\n");

for(i=0;i

{

fprintf(fp,"%-40s*%-14d*%-5d*\n",stu[i].name,stu[i].num,stu[i].score);

}

printf("已将学生记录存储入名称为%s的文件中!

\n",name0);

system("pause");

}

fclose(fp);//关闭文本文件,即指针fp不再指向任何文件。

}

voidChange_service(void)//对在有修改学生记录功能的函数中要调用的函数的定义。

{

chartemp1[40];

inttemp2,temp3;

switch(Menu_select3())/*菜单函数的返回值用作switch语句的选择信息

(选择项较多用switch语句较少则用if语句)。

*/

{

system("cls");

case1:

printf("此学生当前姓名为%s,请输入要修改后的名字;",(*point1).name);/*由于此函数作为实参

在find()函数被调用,在调用前已经将寻找到得项的地址付给了全局指针变量point1*/

scanf("%s",temp1);

strcpy(point1->name,temp1);

break;

case2:

printf("此学生当前序号为%d,请输入要修改后的序号;",(*point1).num);

temp2=judgement();

(*point1).num=temp2;

break;

case3:

printf("此学生当前信息为%d,请输入要修改后的信息;",(*point1).score);

scanf("%d",&temp3);

(*point1).score=temp3;

break;

default:

break;

}

}

voidQuery_service(void)//对在有查询学生记录功能的函数中要调用的函数的定义。

{

switch(Menu_select7())//同上,选择项较多用switch语句。

{

case1:

printf("此学生当前姓名为%s,班级内序号为%d,学习信息为%d\n",point1->name,point1->num,

point1->score);/*由于此函数作为实参在find()函数被调用,在其内调用前已经将寻找到得项的地址付给了

全局指针变量point1*/

system("pause");

break;

case2:

printf("此学生当前姓名为%d。

\n",point1->name);

system("pause");

break;

case3:

printf("此学生当前班内序号为%d。

\n",point1->num);

system("pause");

break;

case4:

printf("此学生当前班内序号为%d。

\n",point1->score);

system("pause");

default:

break;

}

}

voidDelete_service(void)//对在有删除学生记录功能的函数中要调用的函数的定义。

{

j=Menu_select5();//选择项较少用if语句。

if(j==1)

{

charsure;

printf("此学生当前姓名为%s,班级内序号为%d,学习信息为%d\n",point1->name,point1->num,

point1->score);/*由于此函数作为实参在find()函数被调用,在其内调用前已经将寻找到得项的地址付给了

全局指针变量point1*/

printf("请按回车键确认您的操作!

\n");

for(;;)

{

if(getchar(sure)=='\n')

{

point2=&stu[n-1];

swap(point1,point2);

n--;

break;

}

}

system("cls");

printf("删除记录成功,感谢使用!

");

system("pause");

}/*这里删除一个学生的全部记录的实现方法是:

锁定要删除的学生记录将其地址赋给point1,通过地址来

把此时存入得学生记录中最后一位的信息存入该名学生信息存储的位置,然后清空最后一位学生的占用的结构体

数组元素并对程序中记录存入学生记录数量的全局变量n做减一处理*/

elseif(j==2)//只删除一名学生的信息的功能。

{

point1->score=0;//指定学生信息清零。

}

else

system("pause");

}

voidSort_service1(intpo)//对在有排序学生记录功能的函数中要调用的第一个函数的定义,即通过班内序号排序。

{

intm=judgement_small();

if(po==1)//成立做降序处理。

{

for(i=0;i

{

for(c=i+1;c

{

b=i;

if(stu[c].num>stu[b].num)

{

point1=&stu[c];

point2=&stu[b];

b=c;

swap(point1,point2);//调用函数交换两个结构体数组元素内的所有信息。

}

}

}

printf("排序成功!

感谢使用!

\n");

system("pause");

}

else//不成立则做升序处理。

{

for(i=0;i

{

for(c=i+1;c

{

b=i;

if(stu[c].num

{

point1=&stu[c];

point2=&stu[b];

b=c;

swap(point1,point2);

}

}

}

printf("排序成功!

感谢使用!

\n");

system("pause");

}

}

voidSort_service2(charpo)//对在有排序学生记录功能的函数中要调用的第二个函数的定义,即通过学习信息排序。

{

intm=judgement_small();

if(po==1)//做升序处理

{

for(i=0;i

{

for(c=i+1;c

{

b=i;

if(stu[c].score>stu[b].score)

{

point1=&stu[c];

point2=&stu[b];

b=c;

swap(point1,point2);

}

}

}

printf("排序成功!

感谢使用!

\n");

system("pause");

return;

}

else//做降序处理。

{

for(i=0;i

{

for(c=i+1;c

{

b=i;

if(stu[c].score

{

point1=&stu[c];

point2=&stu[b];

b=c;

swap(point1,point2);

}

}

}

printf("排序成功!

感谢使用!

\n");

system("pause");

return;

}

}

voidswap(structstudent*po1,structstudent*po2)/*对一个具有交换值功能的函数的定义,具体功能是交换两个结构体数组元素内的所有信息*/

{

structstudenttemp0;

temp0=*po1;

po1=po2;

*po2=temp0;

}

voidfind(int(*p)(void),void(*q)(void))/*对一个形参是指向函数的指针的函数的定义,此函数将在查询、删除、修改函数中被使用,即通过用户输入的一名学生的名字或班内序号锁定该名学生记录的地址,保存在全局指针变量point1中,然后用_service函数处理*/

{

for(;;)

{

j=p();//通过函数的指针调用函数

if(j==1)

{

printf("请输入学生的姓名:

");

scanf("%s",name0);

name0[strlen(name0)+1]='\0';//防止字符数组越界。

for(i=0;i

{

if(strcmp(name0,stu[i].name)==0)//比较两个字符数组

{

point1=&stu[i];//全局变量存入锁定的学生地址。

q();

return;//退出函数。

}

}

if(i>n)//对特殊情况的处理。

printf("经寻找后没有发现姓名为%s的学生记录存入程序!

\n",name0);

system("pause");

break;

}

elseif(j==2)

{

printf("请输入学生的序号:

");

scanf("%d",&num0);

fo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1