资源描述
C语言课程设计实验报告
班级
姓名
学号
11130730
实验课程
C
实验名称
实验设备管理系统
实验成绩
实验日期
2023.3.5
任课教师
一、 目的(本次课程设计 所涉及并规定掌握的知识点。)
课程设计
在学校实验室的设备管理工作中,设备的编排是一项十分复杂、棘手的工作。在编排过程中,由于数量多容易犯错。运用计算机辅助进行设备编排工作,既提高了编排的科学性,又可大大减轻管理人员的工作强度,提高工作效率,从而教学设备管理现代化迈上了一个新台阶。
实验室设备信息用文献存储,故要提供文献的输入输出操作;要可以完毕设备的录入和修改,需要提供设备添加和修改操作;实现对设备进行分类记录,需要提供排序操作;实现对设备的查询需要提供查找操作;此外还要提供键盘式选择菜单以实现功能选择总体设计
整个系统被设计为实验设备信息输入模块、实验设备信息添加模块、实验设备信息修改模块、实验设备分类记录模块和实验设备查询模块。
知识点
1.对于结构体数组的定义使用
2.指针变量的使用
3.以文献方式输入输出,纯熟掌握文献的各种方式
4.对于循环的应用格式
5.一些函数的应用,如strcmp函数
总结:提高程序设计能力与课堂知识内容的应用,掌握程序设计的基本方法和调
试技能。对指针,数组,文献了解更加深刻。
二、使用环境 (本次上机实践所使用的平台和相关软件。 )
Visual C++
三、内容与设计思想 (1 .设计思绪 2 .重要数据结构 3 .重要代码结构 4 .重要代码段分析 。 )
1 .设计思绪
如下图所示
实验设备管理系统
添加
追加
修改
记录
搜索
按编号
按名称
按价格
2 .重要数据结构
typedef struct EquInfo //定义结构体
{ char equipCode[10]; //编号
char equipType[20]; //种类
char equipName[20]; //名称
float equipPrice; //价格
char buyDate[20]; //购买日期
int scrap; //是否报废
char scrapDate[20]; //报废日期
}EquInfo;
3 .重要代码结构
1.主函数
开 始
显 示 一 系 列 功 能 选 项
输入n,判断n是否是0~5?
调 用 与 n 相 应 的 模 块
N
Y
输入用户要输入设备的个数i
2.添加模块
输入设备的各项具体信息
退出
将输入的信息存储到文献的中
2
1
返回主菜单
3.修改模块
输入要修改的设备编号
是否找到该设备资料
显示找到的记录,调用修改函数
显示没有找到
对该设备的信息进行修改
返回主菜单
返回主菜单
y
n
输入设备类型
退出
2
1
返回主菜单
输出记录结果
文献中的设备信息进行记录
4.记录模块
5.搜索模块
询问用户想要选择的搜索方式
4 .重要代码段分析
(1).添加模块
重要是实现设备的添加,输入添加的设备个数,然后用for循环语句,循环次数是你输入的设备个数。循环输出设备的编号,种类名称,用fopen打开文献,w写方式实现初次添加。
int addition() /*添加模块*/
{
EquInfo news[50];
int i,j,c;
FILE *fp;
system("cls");
printf("你想输入多少个设备?\n");
scanf("%d",&i); /*输入要添加的设备个数*/
for(j=0;j<i;j++)
{ printf("------------------\n");
printf("输入设备编号\n");
scanf("%s",&news[j].equipCode);
printf("输入设备种类\n");
scanf("%s",news[j].equipType);
……
if((fp=fopen("swy.txt","w"))==NULL) /*打开文献,输入保存*/
{printf("不能打开文献!\n");}
for (j=0;j<i;j++)
{ fprintf(fp,"%s %s %s %f %s %d %s ",news[j].equipCode,news[j].equipType,news[j].equipName,news[j].equipPrice,news[j].buyDate,news[j].scrap,news[j].scrapDate); }
fclose(fp);
printf("\n-----------------------\n");
printf("返回主菜单? \n");
printf("1.是\n");
printf("2.不,退出\n");
scanf("%d",&c);
if(c==1)return(-1);
if(c==2)return(0); } /*任务结束选择是返回主菜单还是跳出*/
(2).修改模块
用for循环使用feof函数从文献头逐个读取文献字符直到文献结尾,其中用了strcmp函数,比较文献中的数据与输入数是否匹配,若是匹配,返回0,说明你输入的编号对的,键面进入请输入新的编号、种类、名称等,将修改后的信息写入文献中,成功后输出write。
int modifty() /*修改模块*/
{
if((fp=fopen("swy.txt","r"))==NULL)
{ printf("\n不能打开文献!\n");}
for(i=0;!feof(fp);i++) //文献头逐个读取文献字符直到文献结尾
{
fscanf(fp,"%s %s %s %f %s %d %s ",equ[i].equipCode,equ[i].equipType,equ[i].equipName,&equ[i].equipPrice,&equ[i].buyDate,&equ[i].scrap,&equ[i].scrapDate);
if(strcmp(equ[i].equipCode,code)==0)//判断文献的数据与输入数是否匹配
{ printf("------------------\n");
printf("输入新设备编号\n");
scanf("%s",equ[i].equipCode);
printf("输入新设备种类\n"); }} /*将修改后的信息写入文献
fclose(fp);
j=i;
for(i=0;i<j;i++)
{
fprintf(fp,"%s %s %s %f %s %d %s ",equ[i].equipCode,equ[i].equipType,equ[i].equipName,equ[i].equipPrice,equ[i].buyDate,equ[i].scrap,equ[i].scrapDate);
}
printf("\nwrite!\n");
fclose(fp); }
(3).记录模块
先输入设备类型,判断是否匹配,是的话输出ok,并把相应的内容输出,定义一个计数器count,每循环一次,自加1
int total()//记录模块
{
float sum=0;int count=0; float aver=0;char type[20]; EquInfo equ;
if(strcmp(equ.equipType,type)==0) {
printf("\nOK!\n");
printf("%s,%s,%s,%f,%s,%d,%s\n",equ.equipCode,equ.equipType,equ.equipName,equ.equipPrice,equ.buyDate,equ.scrap,equ.scrapDate);
count++;
sum+=equ.equipPrice;
aver=sum/count;
} }
fclose(fp);
printf("----------记录--返回结果-----------");
printf("\n\n这个类型的是:%d",count);
printf("\n\n记录的总价格:%f",sum);
printf("\n\n平均价格是:%f",aver);}
(4).搜索模块
分为按编号搜索,设备名搜索,设备价格搜索,用switch循环,来判断进入哪个,比如若输入为1 ,就会按编号搜索。
switch(choice)
{
case 0:exit(0);break;
case 1:
printf("请输入设备编号:\n");
scanf("%s",code);
for(i=0;!feof(fp);i++)//从文本中读取设备编号
{fscanf(fp,"%s %s %s %f %s %d %s ",equ.equipCode,equ.equipType,equ.equipName,&equ.equipPrice,&equ.buyDate,&equ.scrap,&equ.scrapDate);
if(strcmp(equ.equipCode,code)==0) {
printf("\nequipCode,equipType,equipName,equipPrice,buyDate,scrap,ScrapDate\n"); printf("\n%s,%s,%s,%f,%s,%d,%s\n",equ.equipCode,equ.equipType,equ.equipName,equ.equipPrice,equ.buyDate,equ.scrap,equ.scrapDate); }}
getchar();
break;
case 2:
printf("请输入设备名称:\n");
scanf("%s",name);
for(i=0;!feof(fp);i++)
{fscanf(fp,"%s %s %s %f %s %d %s ",equ.equipCode,equ.equipType,equ.equipName,&equ.equipPrice,&equ.buyDate,&equ.scrap,&equ.scrapDate);
if(strcmp(equ.equipName,name)==0) { printf("\nequipCode,equipType,equipName,equipPrice,buyDate,scrap,ScrapDate\n"); printf("\n%s,%s,%s,%f,%s,%d,%s\n",equ.equipCode,equ.equipType,equ.equipName,equ.equipPrice,equ.buyDate,equ.scrap,equ.scrapDate); } }
getchar();
break;
case 3:
printf("请输入设备价格:\n");
scanf("%f",&price);
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s %s %s %f %s %d %s ",equ.equipCode,equ.equipType,equ.equipName,&equ.equipPrice,&equ.buyDate,&equ.scrap,&equ.scrapDate);
if(equ.equipPrice==price) { printf("\nequipCode,equipType,equipName,equipPrice,buyDate,scrap,ScrapDate\n");
printf("\n%s,%s,%s,%f,%s,%d,%s\n",equ.equipCode,equ.equipType,equ.equipName,equ.equipPrice,equ.buyDate,equ.scrap,equ.scrapDate);
} }
getchar();
break; }
(5).追加模块
与添加模块相似,只有一个地方不同,追加是以fopen打开文献,以a追加的方式追加数据的
if((fp=fopen("swy.txt","a"))==NULL) //a 方式为追加
{printf("不能打开文献!\n");
}
for (j=0;j<i;j++){
fprintf(fp,"%s %s %s %f %s %d %s ",newequ[j].equipCode,newequ[j].equipType,newequ[j].equipName,newequ[j].equipPrice,newequ[j].buyDate,newequ[j].scrap,newequ[j].scrapDate);
}
fclose(fp);
四、调试过程 (1 .测试数据设计 2 .测试结果分析 )
(1)测试数据设计:
进入主菜单:根据需求操作,按“1”添加信息,以便测试
设备个数:2
设备编号:1
设备各类:abc
设备名称:switch
设备价格:90
购买日期:20230101
是否报废:0
报废日期:0
(2)测试结果分析:
1.主菜单函数:根据需求输入相应的操作
主菜单
2.添加模块:当输入1后,进入添加页面,对设备的各方面信息进行添加
添加设备
添加后文本中的数据
3.修改模块:输入您需要修改的设备编号,假如输入的编号与查找不相同将真的提醒返回菜单或退出,对的进入如下键面
修改设备信息
修改后文本中的信息
4.追加模块:输入您需要追加的设备个数,进行设备信息的添加,进入如下所示
追加设备
追加后文献中的数据
5.记录模块:输入设备类型,进行设备信息的记录,进入如下所示
分类记录
6.搜索模块:选择你需要搜索的方式,可以按编号搜索,也可以按设备名搜索,还可以按设备价格搜索,如下所示
按编号搜索
按价格搜索
按设备名搜索
7.退出模块:选择5直接退出系统
退出
五、总结
1 .设计中碰到的问题及解决过程
文本中会出现乱码,但不是所有数据都就乱码,而是文献是的其中某一项是
乱码,应当不是fread与fprint的问题,后来发现我定义的是char字符串
类型,但在输入数据时scanf("%d",&equ[i].buyDate);用的是%d的格式输
入。
2 .设计中产生的错误及因素分析
在修改模块中,修改数据成功后,信息写入文献中,成功后,在键面上输出
Write证明你已经修改信息成功。可是会出现好几个write,文本中有几条
就会出现几个write。通过讨论,得知,修改成功后没有跳出for循环,
遍历文本中的信息,每遍历一次,循环输出一次ok。最后把输出语句放入
For循环外面。这问题就成功解决。
3 .设计体会和收获。
通过一个星期的上机实践学习,使我对C语言有了更进一步的结识和了解,运用C语言可以解决许多实际问题,特别在在信息管理方面。要想学好它要重在实践,要通过不断的上机操作才干更好地学习它,通过实践,我也发现自己有好多局限性之处,对C语言的一些标准库函数不太了解,尚有对函数调用的对的使用不够熟悉,尚有对C语言中经常出现的错误也不了解。通过询问老师和同学,翻阅课本和上网查找等方式,在解决问题的过程中,使我在这几个方面的结识有所提高,同时也学到了新东西。
通过实践的学习,我结识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。同时我们随时都要培养自己的动手能力,只有这样,才干更好的适应这个日新月异的飞速发展的社会。
六、附录
1、原代码
#include<stdio.h>
#include<stdlib.h> //涉及头文献
#include<string.h>
typedef struct EquInfo //定义结构体
{ char equipCode[10]; //编号
char equipType[20]; //种类
char equipName[20]; //名称
float equipPrice; //价格
char buyDate[20]; //购买日期
int scrap; //是否报废
char scrapDate[20]; //报废日期
}EquInfo;
EquInfo news; //实例化结构体
/*********************添加模块*****************************/
int addition() /*添加模块*/
{ EquInfo news[50];
int i,j,c;
FILE *fp;
system("cls");
printf("**********************************************************\n");
printf("添加设备:\n");
printf("**********************************************************\n");
printf("你想输入多少个设备?\n");
scanf("%d",&i); /*输入要添加的设备个数*/
for(j=0;j<i;j++)
{
printf("------------------\n");
printf("输入设备编号\n");
scanf("%s",&news[j].equipCode);
printf("输入设备种类\n");
scanf("%s",news[j].equipType);
printf("输入设备名称\n");
scanf("%s",news[j].equipName);
printf("输入设备价格\n");
scanf("%f",&news[j].equipPrice);
printf("输入购买日期\n");
scanf("%s",&news[j].buyDate); //判断是否报废
printf("是否报废?0/1\n");
scanf("%d",&news[j].scrap);
printf("输入报废日期\n");
scanf("%s",&news[j].scrapDate);
}
if((fp=fopen("swy.txt","w"))==NULL) /*打开文献,输入保存*/
{printf("不能打开文献!\n");
}
for (j=0;j<i;j++){
fprintf(fp,"%s %s %s %f %s %d %s ",news[j].equipCode,news[j].equipType,news[j].equipName,news[j].equipPrice,news[j].buyDate,news[j].scrap,news[j].scrapDate);
}
fclose(fp);
printf("\n-----------------------\n");
printf("返回主菜单? \n");
printf("1.是\n");
printf("2.不,退出\n");
scanf("%d",&c);
if(c==1)return(-1);
if(c==2)return(0); /*任务结束选择是返回主菜单还是跳出*/
}
/*******************************修改模块*********************/
int modifty() /*修改模块*/
{
EquInfo equ[50];
char code[10];
int i,j,c;
FILE *fp;
system("cls");
printf("**********************************************************\n");
printf("修改设备信息:\n");
printf("**********************************************************\n");
printf("请输入要修改的设备编号:\n");
scanf("%s",code); /*输入要修改的设备编号*/
printf("------------------------------------\n");
if((fp=fopen("swy.txt","r"))==NULL)
{
printf("\n不能打开文献!\n");
}
for(i=0;!feof(fp);i++) //从文献头一个一个的读取字符,读到文献的结尾。
{
fscanf(fp,"%s %s %s %f %s %d %s ",equ[i].equipCode,equ[i].equipType,equ[i].equipName,&equ[i].equipPrice,&equ[i].buyDate,&equ[i].scrap,&equ[i].scrapDate);
if(strcmp(equ[i].equipCode,code)==0)//判断文献中的数据与输入数是否匹配
{
printf("------------------\n");
printf("输入新设备编号\n");
scanf("%s",equ[i].equipCode);
printf("输入新设备种类\n");
scanf("%s",equ[i].equipType);
printf("输入新设备名称\n");
scanf("%s",equ[i].equipName);
printf("输入新设备价格\n");
scanf("%f",&equ[i].equipPrice);
printf("输入新购买日期\n");
scanf("%s",&equ[i].buyDate); //判断是否报废
printf("输入新是否报废?0/1\n");
scanf("%d",&equ[i].scrap);
printf("输入新报废日期\n");
scanf("%s",&equ[i].scrapDate);
}
} /*将修改后的信息写入文献中*/
fclose(fp);
j=i;
if((fp=fopen("swy.txt","w"))==NULL)
{
printf("\n不能打开文献!\n");
}
for(i=0;i<j;i++)
{
printf("\nwrite!\n");
fprintf(fp,"%s %s %s %f %s %d %s ",equ[i].equipCode,equ[i].equipType,equ[i].equipName,equ[i].equipPrice,equ[i].buyDate,equ[i].scrap,equ[i].scrapDate);
}
fclose(fp);
printf("\n------------------------------------\n");
printf("返回菜单? \n");
printf("1.是 \n");
printf("2.不,退出\n");
scanf("%d",&c);
if(c==1)return(-1);
if(c==2)return(0);
}
int total()//记录模块
{
int c;
float sum=0;
int count=0;
float aver=0;
char type[20];
EquInfo equ;
int i;
FILE *fp;
system("cls");
if((fp=fopen("swy.txt","r"))==NULL)
{
printf("\n不能打开文献!\n");
}
printf("请输入设备类型:\n");
scanf("%s",type);
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s %s %s %f %s %d %s \n",equ.equipCode,equ.equipType,equ.equipName,&equ.equipPrice,&equ.buyDate,&equ.scrap,&equ.scrapDate);
if(strcmp(equ.equipType,type)==0) //判断文献中的数据与输入数是否匹配
{
printf("\nOK!\n");
printf("%s,%s,%s,%f,%s,%d,%s\n",equ.equipCode,equ.equipType,equ.equipName,equ.equipPrice,equ.buyDate,equ.scrap,equ.scrapDate);
count++;
sum+=equ.equipPrice;
aver=sum/count;
}
}
fclose(fp);
printf("----------记录--返回结果-----------");
printf("\n\n这个类型的是:%d",count);
printf("\n\n记录的总价格:%f",sum);
printf("\n\n平均价格是:%f",aver);
printf("\n按任意键退出......");
getchar();//得到任意一个数
printf("\n-----------------------\n");
printf("返回主菜单? \n");
printf("1.是 \n");
printf("2.否,退出\n");
scanf("%d",&c);
if(c==1)return(-1);
if(c==2)return(0);
}
/***********************************搜索模块******************************/
int search() /*搜索模块*/
{
char code[10];
char name[20];
float price;
int choice;
int c;
FILE *fp;
EquInfo equ;
int i;
system("cls");
fp=fopen("swy.txt","r");
if(fp==NULL)exit(0);
printf("选一种方式搜索:\n\n");
printf("1.编号搜索\n\n");
printf("2.设备名搜索 \n\n");
printf("3.设备价格搜索\n\n");
printf("0.返回\n\n");
printf("请输入号码 0-3:");
scanf("%d",&choice);
if(choice==0)exit(0);
switch(choice)
{
case 0:exit(0);break;
case 1:
printf("请输入设备编号:\n");
scanf("%s",code);
for(i=0;!feof(fp);i++)//从文本中读取设备编号
{
fscanf(fp,"%s %s %s %f %s %d %s ",equ.equipCode,equ.equipType,equ.equipName,&equ.equipPrice,&equ.buyDate,&equ.scrap,&equ.scrapDate);
if(strcmp(equ.equipCode,code)==0)//strcmp函数,两个字符串相等,返回0
{
printf("\nequipCode,equipType,equipName,equipPrice,buyDate,scrap,ScrapDate\n");
printf("\n%s,%s,%s,%f,%s,%d,%s\n",equ.equipCode,equ.equipType,equ.equipName,equ.equipPrice,equ.buyDate,equ.scrap,equ.scrapDate);
}
}
getchar();
break;
case 2:
printf("请输入设备名称:\n");
scanf("%s",name);
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s %s %s %f %s %d %s ",equ.equipCode,equ.equipType,equ.equipName,&equ.equipPrice,&equ.buyDate,&equ.scrap,&equ.scrapDate);
if(strcmp(equ.equipName,name)==0)
{
printf("\nequipCode,equipType,equipName,equipPrice,buyDate,scrap,ScrapDate\n");
printf("\n%s,%s,%s,%f,%s,%d,%s\n",equ.equipCode,equ.equipType,equ.equipName,equ.equipPrice,equ.buyDate,equ.scrap,equ.scrapDate);
}
}
getchar();
break;
case 3:
printf("请输入设备价格:\n");
scanf("%f",&price);
for(i=0;!feof(fp);i++)
{ fscanf(fp,"%s %s %s %f %s %d %s ",equ.equipCode,equ.equipType,equ.equipName,&equ.equipPrice,&equ.buyDate,&equ.scrap,&equ.scrapDate);
if(equ.equipPrice==price)
{
printf("\nequipCode,equipType,equipName,equipPrice,buyDate,scrap,ScrapDate\n");
printf("\n%s,%s,%s,%f,%s,%d,%s\n",equ.equipCode,equ.equipType,equ.equipName,equ.equipPrice,equ.buyDate,equ.scrap,equ.scrapDate);
}
}
getchar();
break;
}
fclose(fp);
printf("\n-----------------------\n");
printf("返回菜单? \n");
printf("1.是\n");
printf("2.否,退出\n");
scanf("%d",&c);
if(c==1)return(-1);
if(c==2)return(0);
}
int input() /*追加模块*/
{ EquInfo newequ[50];
int i,j;
int c;
FILE *fp;
system("cls");
printf("**********************************************************\n");
printf("追加设备:\n");
printf("*******************************MENU***********************\n");
printf("你想追加多少个设备?\n");
scanf("%d",&i); /*追加要添加的设备个数*/
for(j=0;j<i;j++)
{
printf("------------------\n");
printf("输入设备编号\n");
scanf("%s",&newequ[j].equipCode);
printf("输入设备种类\n");
scanf("%s",newequ[j].equipType);
printf("输入设备名称\n");
scanf("%s",newequ[j].equipName);
printf("输入设备价格\n");
scanf("%f",&newequ[j].equipPrice);
printf("输入购买日期\n");
scanf("%s",&newequ[j].bu
展开阅读全文