资源描述
C语言课程设计
目 录
1、需求分析;
2、系统总框图;
3、每个模块设计分析;
4、列出全部定义函数及说明;
5、举例说明1、2个比较有特点算法;
6、数据分析。完备性、健壮性等;
7、存在问题和不足及对策;
8、使用说明(操作手册);
9、学习心得
前 言
计算机科学技术发展,不仅极大地促进了整个科学技术发展,而且显著地加紧了经济信息化和社会信息化进程。所以,计算机教育在全国备受重视,计算机知识和能力已成为二十一世纪人才素质基础要素之一。
现在,高等教育计算机教育发展十分快速。十多年前,只有部分理工科专业开设计算机课程。今天,几乎全部高校全部专业全部开设了程度不一样计算机课程。大家已经认识到,计算机知识已成为现代知识分子知识结构中不可缺乏关键组成部分。而除了掌握计算机基础知识和操作基础能力外,掌握一门高级编程语言,并能够熟练利用它,已成为现代大学生综合能力必需组成。
计算机技术发展如此迅猛,计算机应用如此广泛,需要学习东西愈来愈多,而我们总课时是有限。通常来说,计算机课程学习能够分为两部分:一部分是理论课程学习,一部分是上机应用实习。依据我们专业性质和要求,则应侧重于上机操作利用。为此,学校特意在暑期最终一星期安排了32个课时上机实习。
现将一星期实习内容及结果分析分列以下:
物资管理系统
一. 题目要求
1. 编辑一个物资管理系统,能进行物资信息录入,查询,打印和数据修改。
(1)物资信息录入:包含物资名称、编号、规格、入库时间、最大库存、最小库存、实际库存。
(2)物资信息查询:能够分别以名称、日期、名称和规格查询。
(3)新料入库:将新料信息和以前储存信息存在一起。
(4)物资领取:在领料以后改变实际库存量。
(5)物资打印:打印出库存全部物资。
2.在书本要求基础上,我在实习过程中又补充了一个功效即物资数据更新,这关键是为了满足假如在信息录入过程中将数据输错,能够在查询到错误后进行更改,同时假如新入库物资是以前存在,那么也能够用此功效进行入库数据输入。
3.要求数据以dat格式存放在硬盘上便于长久保留。
二. 需求分析
依据题目要求,数据以dat形式存放在硬盘上,所以应提供文件输入,输出等操作;还需要文件含有查找,替换,修改数据功效。
总体设计
依据上面需求分析,能够将这个系统设计分为以下七大模块:
一、信息录入:在每次输入信息时提供必需友谊提醒。提醒包含:1.假如选择此项功效,那么之前数据将被删除,只将此次数据存放;2.需要输入数目,确保输入能够终止;3.输入信息时提醒这是输入第多个物资信息。输入结束后以文件形式储存。
二、信息查找:按查询条件分为三个小模块。分别为以名称、日期、名称和规格查询模块。此模块只包含查询目录和选择,然后分别进入每个小模块。
1以名称查询:输入要查询物资名称,系统将其和文件里物资名称进行比较,假如找到匹配那么将其打印出来,最终统计匹配物资数量。
2.以日期查询:按要求输入查询物资入库日期,系统将其和文件里物资入库时间进行比较,假如找到匹配那么将其打印出来,最终统计匹配物资数量。
3.以名称和规格查询:按要求输入要查询物资名称和规格,系统将其和文件里物资名称和规格进行比较,假如找到匹配那么将其打印出来,最终统计匹配物资数量。
三、新料入库:打开文件,按要求输入数据后提供是否确定或从新输入选择,输入数据在确定情况下储存在原来已经存在数据后面。每次只能输入一个物资数据。
四、物资领取:输入要取出物资名称、规格、入库时间,假如找到匹配那么将库存实际量数据改变,输入要取出量不能大于实际库存量,不然输入数据无效。
五、物资打印:打印出库存物资全部信息,便于使用者了解整体情况。
六、数据更新:假如查询到库存信息有误,那么能够对其进行更改。假如需要入库物资已经存在,那么只需要更改对应数据即可。也就是能够用此功效对已经存放全部信息进行更改。
七、退出:退出整个系统。
物资管理系统
信息录入
信息查询
新料入库
物资打印
数据更新
退出
物资领取
三. 具体设计
1. 主函数
为了各模块独立性,主函数设计得比较简单,本系统关键用主函数打开做一个封面打印,包含我个人信息,然后进入主菜单选择操作。
步骤图
打印出我资料,任意键继续
进入主菜单函数
程序
/*********************************主函数**************************************/
main() /***********主函数***********/
{ puts("\n\n\n\n\t\t┌──────欢迎使用物资管理系统────┐");
puts("\t\t│Name:杨超 │");
puts("\t\t│Number:1001560 │");
puts("\t\t│E-mail: │");
puts("\t\t│Tel: │");
puts("\t\t│ │");
puts("\t\t│******************************杨超 │");
puts("\t\t│********************************.1.2 │");
puts("\t\t└────────────────────┘");
printf("\n\t\t\t 按任意键继续");
getch();
menu();
2. }主菜单函数
步骤图显示一系列功效选项
输入n,判定n是否是1-7
依据n值调用各功效模块函数
是
否
程序
menu() /***************菜单函数*************/
{
int n,m;
do
{
puts("\n\t\t*****************菜单********************\n\n");
puts("\t\t\t1.物资信息录入");
puts("\t\t\t2.物资信息查询");
puts("\t\t\t3.新料入库");
puts("\t\t\t4.物资领取");
puts("\t\t\t5.物资打印");
puts("\t\t\t6.物资数据更新");
puts("\t\t\t7.退出");
puts("\n\n\t\t***************************************\n");
puts("\t\t******************************杨超\n");
puts("\t\t********************************.1.2\n");
printf("选择操作 [1-7]:[ ]\b\b");
scanf("%d",&n);
if(n<1||n>7)
{
m=1;getchar();
}
else m=0;
}
while(m==1);
switch(n) /***********分别进入各函数******/
{case 1:write();break; /***********录入函数***********/
case 2:search();break; /***********查询函数***********/
case 3:insert();break; /***********新料入库函数*******/
case 4:lend();break; /***********领料函数***********/
case 5:print();break; /***********打印函数***********/
case 6:rewrite();break; /***********信息更改***********/
case 7:exit(0); /***********退出***********/
}
}各功效模块设计
(1) 物资信息录入
/**********************物资信息录入函数****************/
建立一个write函数用于第一次存放信息。用printf函数打印出提醒语(提醒:请确定这是你第一次录入信息,因为之前保留数据将被删除),然后用scanf函数接收一个数据给k,用if语句判定k是否为0。假如继续则输入0,那么此时if(k!=0)为假,不实施if后面语句。不然用printf_back()调回到主目录。选择继续以后,用printf函数提醒输入需用录入物资数量,同时提醒最大数字。然后用printf提醒现在开始输入信息,实施input()函数开始输入相关信息。输入信息实施后,用if(i!=0)判定是否已经输入信息,假如输入有数据那么i实施了循环,则if(i!=0)语句为真,实施save函数进行保留。没有实施i循环则if(i!=0)为假,直接实施printf函数跳到主目录。代码以下:
write()
{int i,n,k;
printf("\n\n\t提醒:请确定这是你第一次录入信息,因为之前保留数据将被删除!\n\n");
printf("\t\t\t是否继续!\n\n\t\t\t0 *****是\n\n\t\t\t其它 *****否[ ]\b\b");
scanf("%d",&k);
if(k!=0) printf_back();
printf("\n需要录入物资数量(0-%d)?:",N-1); /***N是宏定义,能够随时改变其值***/
scanf("%d",&n);
printf("\n现在输入信息\n\n");
for(i=0;i<n;i++)
{printf("\n现在输入第 %d个物资信息:\n",i+1);
input(i);
}
if(i!=0)save(n);
printf_back();
}
/**********************查询函数************************/
本函数只包含跳转到查询目录函数,然后实施查询目录。打码以下:
search()
{
searchmenu();
}
物资信息查询:
1、/********以日期查询函数********/
建立日期结构体。
struct search_date
{int year;
int month;
int day;
}s;
search_by_date()
{int j,n,m=0;
打开文件到内存,使能够对数据进行操作。
n=load();
提醒语:printf("\n输入你所查询信息日期!\ndate:");
输入数据分别赋值给日期中年月日。
scanf("%d.%d.%d",&s.year,&s.month,&s.day);
用for循环使输入日期和数据中每一个日期进行比较。
for(j=0;j<n;j++)
判定输入日期和目前物资日期是否相同,假如相同则if为真,用m统计相同日期物资个数。打印出满足条件物资信息。
if((s.year==pro[j].in_date.year)&&(s.month==pro[j].in_date.month)&&(s.day==pro[j].in_date.day))
{m++;
printf_data(j);
}
打印出满足条件物资数量。
printf("\n有%d种物资和查询相匹配!",m);
按任意键返回到主函数。
getch();
menu();
}
/********以名称查询函数********/
search_by_name()
{int j,n,m=0;char a[20];
打开文件,使能对文件中数据进行操作。
n=load();
提醒语言
printf("\n输入你所查询信息名称!\nname:");
输入一个字符数据赋值给a
scanf("%s",a);
用for循环使a和文件中每一个数据进行判定,假如相同则打印出来同时用m统计相同个数。
for(j=0;j<n;j++)
if(strcmp(a,pro[j].p_name)==0)
{m++;
printf_data(j);
}
打印出相同个数数量。
printf("\n有%d种物资和查询相匹配!",m);
任意键返回
getch();
menu();
}
/******以名称和规格查询函数******/
search_by_nameandsize()
{int j,n,m=0;char a[20],b[4];
打开文件使能对数据进行操作。
n=load();
提醒输入语,将输入字符数据赋值给a
printf("\n输入你所查询信息名称!\nname:");
scanf("%s",a);
提醒输入语,使输入字符数据赋值给b
printf("\n输入你所查询信息规格!\nsize:");
scanf("%s",b);
用for语句使输入名称和规格数据和内存中每一个数据进行比较。
for(j=0;j<n;j++)
假如数据和目前数据相同,打印出数据,同时用m统计相同个数。
if((strcmp(a,pro[j].p_name)==0)&&(strcmp(b,pro[j].size)==0))
{m++;
printf_data(j);
}
打印出匹配物资个数。
printf("\n有%d种物资和查询相匹配!",m);
任意键返回主菜单。
getch();
menu();
}
新料入库
/****************************新料入库函数****************************/
insert()
{int n,c;
打开文件使能对数据进行操作。
n=load();
puts("\n请输入相关信息:\n");
用do—while循环判定是否从新输入。
do
{
进入input函数输入新料相关数据。
input(n);
调用printf_data函数打印出刚输入新料相关数据。
printf_data(n);
按提醒语进行下一步操作。
printf("\n\n是否确定输入\n1 ).是\n2 ).从新输入\n其它).返回 [ ]\b\b");
接收一个数据赋值给c,假如c==1,那么将新输入数据保留。假如c!=1且c!=2,那么返回到主函数,假如c=2那么从新输入新料数据。
scanf("%d",&c);
if(c==1)
{
save(n+1);printf_back();
}
else if(c!=2)menu();
}while(c==2);
}
物资领取
/********************************领料函数*******************************/
lend()
{int j,n,k=0;
打开文件使能对数据进行操作。
n=load();
因为数据类型很关键,所以输出提醒语,使根据提醒操作。
printf("\n请输入你需要物资内容相关信息!");
printf("\n名称(1-20字母)\t规格(1-4字母)\t入库日期\t领取数量\n");
输入数据,分别赋值给名称、规格和入库日期,同时输入领取量。
scanf("%s\t%s\t%d.%d.%d\t%d",&take.p_name,&take.size,&take.one_date.year,&take.one_date.month,&take.one_date.day,&take.total);
用for循环判定要领取物资是否存在和库中,同时判定领取量是否小于库存量。
for(j=0;j<n;j++)
if((strcmp(take.p_name,pro[j].p_name)==0)&&(strcmp(take.size,pro[j].size)==0)&&(take.one_date.year==pro[j].in_date.year)&&(take.one_date.month==pro[j].in_date.month)&&(take.one_date.day==pro[j].in_date.day)&&(take.total<=pro[j].real_s))
假如存在物资,那么领取物资,库存实际数量更新,打印出领料后物资信息,同时使k=1。
{pro[j].real_s-=take.total;
printf_data(j);
k=1;
}
假如不存在物资,那么k值不变为0,则实施if语句返回到主菜单。
if(k==0) {printf("输入数据未找到!");getch();menu();}
领料后保留数据,返回到主菜单。
save(n);
printf_back();
}
物资打印
/**************************打印函数********************/
print()
{int i,n;
将文件数据读到内存中,使能对数据进行处理。
n=load();
用for循环打印出从文件中读出每一个数据。
for(i=0;i<n;i++)
printf_data(i);
任意键返回。
puts("\n\n\t\t\t任意键返回");
getch();
menu();
}
物资数据更新
/********************************信息更改函数***************************/
rewrite()
{char p_name[20];
long int p_num;
char size[4];
int m,n,j,k=0;
读入文件中数据,使能对其进行操作。
n=load();
用do—while语句实施循环输入。
do
{
puts("\n要更改物资信息:名称 编号 规格");
赋值给名称、编号、规格,打印出输入信息,接收数据判定选择操作。
scanf("%s%ld%s",&p_name,&p_num,&size);
printf("名称:%s\t\t编号:%ld\t\t规格:%s",&p_name,p_num,&size);
printf("\n\n\n\n\t\t\t是否继续!\n\n\t\t\t0 *****是\n\n\t\t\t1 ****退出\n\n\t\t\t其它 *****重新输入[ ]\b\b");
依据提醒信息输入一个值给m,假如退出则输入1,那么if(m==1)为真,返回到主菜单;假如要继续则输入为0,k赋值为1,那么while语句为假,进行后面操作;重新输入则输入除0和1以外数据,那么k=0,while(k!=1)为真,实施重新输入。
scanf("%d",&m);
if(m==1)
printf_back();
else if(m==0)
k=1;
}
while(k!=1);
用for循环判定要更改物资是否存在,假如存在调入input函数,重新输入物资信息,保留新信息,返回到主菜单。
for(j=0;j<n;j++)
if((strcmp(p_name,pro[j].p_name)==0)&&(p_num==pro[j].p_num)&&(strcmp(size,pro[j].size)==0))
{
puts("\n请重新输入信息\n");
input(j);
save(n);
printf_back();
}
假如没有一个匹配,提醒未找到返回主菜单。
puts("未找到\n按任意键返回!");
getch();
menu();
}
退出
假如输入为7那么直接用exit(0);结束整个程序。
各函数及说明
main() 包含个人说明和调入menu()函数。
menu() 打印出各个功效菜单,选择需要操作功效,进入各功效。
input() 输入物资名称、编号、规格、入库时间、库存最大最小和实际量。
代码以下:
input(int i) /**********输入函数********/
{printf("\n名称(1-20字母):");
scanf("%s",&pro[i].p_name);
printf("\n编号(1-7数字):");
scanf("%d",&pro[i].p_num);
printf("\n规格(1-4字母):");
scanf("%s",&pro[i].size);
printf("\n入库日期(年.月.日):");
scanf("%d.%d.%d",&pro[i].in_date.year,&pro[i].in_date.month,&pro[i].in_date.day);
printf("\n数量[库存最小-实际-最大]:");
scanf("%d-%d-%d",&pro[i].min_s,&pro[i].real_s,&pro[i].max_s);
}
insert() 新料入库函数,调入input()函数,将输入信息存放在原信息后面,提供是否继续选择操作。
lend() 领料入库函数,输入物料信息,查找物料是否存在,假如存在则取出对应数量物料,改变对应库存信息并保留,若不存在,打印出提醒。
load() 从文件中读入物资库存信息到内存,使能够对数据进行操作。
代码以下:
load() /*********从文件读入函数**********/
{
FILE*fp; /**********定义指针******/
int k;
if((fp=fopen("pro.dat","rb"))==NULL) /***以只读方法打开一个二进制文件,打开失败给出提醒***/
{printf("\n文件打开失败!\n");
return NULL;
}
for(k=0;!feof(fp);k++) /***打开成功将其全部数据读入一次到内存中***/
fread(&pro[k],sizeof(struct product),1,fp);
fclose(fp); /***关闭指针***/
return(k-1); /***给出返回值使能对读入数据进行正确操作***/
}
print() 打印出库存每一条信息。
代码以下:
print()
{int i,n;
n=load();
for(i=0;i<n;i++)
printf_data(i);
puts("\n\n\t\t\t任意键返回");
getch();
menu();
}
print_back() 操作完成后返回到主菜单函数。
代码以下:
printf_back() /**********返回提醒函数*******/
{printf("\n\n操作完成\n\n按任意键返回!\n");
getch();
menu();
}
print_data() 打印出名称、编号、规格、日期、库存最小-实际-最大。
代码以下:
printf_data(int i) /**********打印函数********/
{printf("\n名称\t\t编号\t规格\t日期\t\t库存最小-实际-最大\n");
printf("%s\t\t%d\t%s\t%d.%d.%d\t\t%d-%d-%d",pro[i].p_name,pro[i].p_num,pro[i].size,pro[i].in_date.year,pro[i].in_date.month,pro[i].in_date.day,pro[i].min_s,pro[i].real_s,pro[i].max_s);
}
rewrite() 信息更改函数,可更改库存中人以信息。
save() 将内存中数据保留到硬盘中。
代码以下:
save(int n) /*********保留函数***********/
{FILE*fp; /***定义指针***/
int k;
if((fp=fopen("pro.dat","wb"))==NULL) /***以只写方法打开一个二进制文件,文件名为pro.dat
{printf("\n文件打开失败!\n"); 假如打开失败给出提醒***/
return NULL;
}
for(k=0;k<n;k++) /***打开成功则将内存中物资信息存到硬盘上***/
if(pro[k].real_s!=0)
if(fwrite(&pro[k],sizeof(struct product),1,fp)!=1)
printf("文件存放失败\n"); /***存放失败给出提醒***/
fclose(fp);
}
search() 调入查询菜单函数。
search_by_name() 以名称为条件查询函数,找到名称相同物料,调用print_data()函数打印出匹配物料信息。
search_by_date()以日期为条件查询函数,找到入库时间相同物料,调用print_data()函数打印出匹配物料信息。
search_by_nameandsize()以名称和规格为条件查询函数,找到信息相同物料,调用print_data()函数打印出匹配物料信息。
searchmenu() 打印出提醒信息,使按要求操作,依据输入信息不一样进入各个不一样查询条件函数。
searchmenu()
{int n,w2;
do
{
puts("\n\t\t*****************查询目录********************\n\n");
puts("\t\t\t1.以名称查询");
puts("\t\t\t2.以日期查询");
puts("\t\t\t3.以名称和规格查询");
puts("\t\t\t4.返回");
puts("\n\n\t\t***************************************\n");
printf("选择命令 [1-4]:[ ]\b\b");
scanf("%d",&n);
if(n<1||n>4)
{w2=1;getchar();}
else w2=0;
}while(w2==1);
switch(n) /*********跳转到查询函数********/
{case 1:search_by_name();break; /*********转入以名称查询函数********/
case 2:search_by_date();break; /*********转入以日期查询函数***********/
case 3:search_by_nameandsize();break; /*********转入以名称和规格查询函数*****/
case 4:getch();menu(); /********跳转到菜单函数***********/
}
}
write() 将物资信息读入到内存中并保留在硬盘中。
时间结构体
struct date
{int year;
int month;
int day;
};
领料时需要输入产品信息结构体
struct one_pro
{char p_name[20];
long int p_num;
char size[4];
struct date one_date;
long int total;
struct one_pro *next;
}take;
保留文件产品信息结构体
struct product
{char p_name[20];
long int p_num;
char size[4];
struct date in_date;
long int max_s;
long int min_s;
long int real_s;
struct product *next;
}pro[N];
查询日期结构体
struct search_date
{int year;
int month;
int day;
}s;
操作展示截图:
开始界面:
提醒语后输入信息:
输入信息后选择打印结果:a编号为1000规格为xxl入库日期为.1.8库存实际量为58。
以名称查询结果:
以日期查询结果:
以名称和规格查询结果:
新料入库界面:
领取a物资5个单位后,a库存实际量为53
物资数据更新后,a名称改为aa,编号为1008,规格为xxx,入库日期为.1.10,库存信息也对应改变,同时上次输入新料信息也存放了进去:
程序特点和个人总结:
本程序是自己劳动结果,因为是第一次学习程序语言,接触程度不深,所以编写语言很简单,全部使用是部分常见语言结构,读起来也比较轻易。同时因为是初学,所以写出程序代码也显得比较浅略,对于编程高手来说显得平淡如水,这是以后需要更正地方。不过因为程序是分模块编写,看起来也比较简练,不会显得杂乱。同时有一个问题还没有处理。问题以下:
menu()
{
int n,m;
do
{
puts("\n\t\t*****************菜单********************\n\n");
puts("\t\t\t1.物资信息录入");
puts("\t\t\t2.物资信息查询");
puts("\t\t\t3.新料入库");
puts("\t\t\t4.物资领取");
puts("\t\t\t5.物资打印");
puts("\t\t\t6.物资数据更新");
puts("\t\t\t7.退出");
puts("\n\n\t\t***************************************\n");
puts("\t\t******************************杨超\n");
puts("\t\t********************************.1.2\n");
printf("选择操作 [1-7]:[ ]\b\b");
scanf("%d",&n);
if(n<1||n>7)
{
m=1;
getchar();
}
else m=0;
}
while(m==1);
开始没有加入getchar函数,程序陷入死循环,分析了很久也没有找到原因。以后在网上搜索了一个相同代码,依葫芦画瓢加上getchar()问题才处理。不过在北区机房调试程序时,没有getchar()也没有陷入死循环。
程序中使用汉字时有时会无故失灵,不改变程序重新调试又正常运行,这也是自己需要学习一点。
使用说明:
本程序交互性很强,在每次输入数据时全部有提醒,所以完全能够在程序中操作自如。但需要注意一点是,输入数据时,一定要确保和提醒类型相同,不然将出现无法预料结果。
以下:按日期查询数据时输入日期为we时,出现结果就显得莫名其妙。
展开阅读全文