版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上 得分:信电工程学院高级语言程序设计课程设计报告 题目: 数据汇总系统 班级: 10电信1班学号: 姓名: 彭 华指导教师: 黄为勇 2013年 1 月7日目 录1、程序目标及功能-21.1课题背景-21.2系统功能 - 21.3设计要求-22、程序功能模块组成及流程图-32.1系统功能模块-32.2各模块流程图-43、程序主要数据结构及函数列表 -63.1 程序中使用的数据结构-63.2 函数列表-64、 程序代码及运行结果 -84.1 程序代码-84.2 运行结果-225、结与体会-261、 程序目标及功能1.1课题背景<<C语言程序设计>>
2、;课程设计是对学生的一种全面综合训练,它包括问题分析,总体结果设计,用户界面设计,程序设计基本技能和技巧,以至一整套软件工作规范的训练和科学作风的培养.是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节.通常,课程设计的课题比平时的习题复杂得多,也更接近实际.课程设计着眼于应用的结合点,使学生学会如何把书上的知识用于解决实际问题,培养软件工作所需的动手能力;另一方面,能使书上的知识变”活”,使学生更好的深入理解和灵活掌握教学内容. 本程序旨在训练学生的基本编程能力,了解管理系统的开发流程,进一步熟悉C语言的而各种基本操作。本程序涉及结构体,数组,文件等方面的知识。通过本程序的训练,我们对
3、C语言的文件操作有一个更深的了解。1.2系统功能 1、输入记录功能(从键盘输入销售的:商品代号,商品名称,数量,价格,所属类别(包括:日用品,电器用品,水果,生产资料) 2、按商品代号查询销售情况。 3、统计各类别商品的销售额。 4、统计商品销售总额。 5、按商品代号排序功能。 6、增加记录、删除记录、修改记录功能。 7、统计结果保存在文本文件中。 8、从文本文件中读取数据、显示。1.3设计要求设计一个总菜单,分别调用各个子功能模块。撰写课程设计报告,并打印。2、 程序功能模块组成及流程图2.1系统功能模块此管理系统主要由以下五大功能模块组成:商品销售管理系统输入记录查询记录更新记录统计记录输
4、出记录从文件读入从键盘输入按商品代号查询修改记录删除记录插入记录排序记录统计销售额输出至屏幕输出至文件图1 商店销售管理系统功能模块图2.2各模块流程图1、 主函数main()的执行流程定义变量char ch='0' domenu();select=getchar();输入得一个字符 switch(select)case '1': add();break; 增加记录信息case '2':del();break; 删除记录case '3':cin>>b; 查找记录if(b=8) :find();break;姓名查询找if
5、(b=9) :find2();break;号码查找else :输出错误信息case '4':modify();break; 修改记录case '5':insert();break;插入记录case '6':count();break;统计记录case '7':sort();break;排序case '8':save();保存记录case9:system();disp;breakfast显示记录case0:read();读取记录default: wrong();getchar();break输入有误,是否继续选择do
6、ch=getchar();读入一个字符(y/n)while(ch='Y'&&ch='y'&&ch='N'&&ch='n');while(ch='Y'|ch='y'); 图3.1主函数程序简单说明:该功能主要显示的是给用户一个进入界面,它主要的是显示该程序主要能够执行的有哪些功能。2、输入记录 输入记录模块主要将数据存入结构体指针中,它调用fopen()函数读取文件,若文件中无数据,系统提示错误,返回主菜单界面这时用户选择1,调用creat()函数,建立
7、文件并输入数据。3、查询记录 查询记录主要是按照商品的代号进行查询。在查询函数search()中,若输入的代号不存在(if(flag=0)),则系统提示未找到此记录,否则,输出相应的商品的销售信息。4、更新记录 此模块实现了对商品销售记录的修改、添加、删除和排序,下面分别介绍这四个更能模块: 1)、修改记录修改记录需要对指针所指向的数据域中值进行修改。首先,它调用display()函数,将已有的记录显示出来,然后用户输入需要修改的商品的代号,再输入新的商品代号及其它记录,并写入文件中。2)、添加记录首先用户输入要添加的商品的代号及其他信息,然后调用strcmp()函数,检验新加的信息是否存在。
8、若存在,则输出是否重新输入的提示,若不存在,用strcpy()函数,将新记录添加到已有记录的后面,然后保存到文件中。3)、删除记录用户输入要删除的商品代号,调用strcmp()函数,将输入的代号和已有的代号进行比较,若存在该记录,则将指向该记录的指针前移,即删除该记录。4)、排序记录排序的方法有很多,本程序采用选择排序实现按商品代号从小到大的排序。5)、统计记录该功能的实现比较简单,定义一个数组,通过循环读取指针变量p所指的数据域中的值。再将同一类商品的销售额保存在数组中。6)、输出记录当把记录输入文件时,调用save()函数,将指针p所指向的值写入文件fp所指向的文件。当把记录输至屏幕时,可
9、以调用display()函数将记录输出,如果已有记录保存在文件中,那么也可以用read()函数直接读取记录。3、 程序主要数据结构及函数列表3.1 程序中使用的数据结构 商品销售信息结构体typedef struct shop /标记为shopchar f110; /商品编号char f210; /商品名称float f3; /价格int f4; /数量char f510; /所属类别;结构体shop用于存储商品的基本信息,包括商品的编号、名称、数量、单价、类型。3.2 函数列表1) menu()函数原型:void menu()menu()为菜单函数,输出一个菜单表列。2) creat()函数
10、原型void creat(S *P,int n)creat()函数用于创建记录3) display()函数原型viod display(S *p,int n)display()函数可将用户已输入的记录在屏幕上显示出来。4) search()函数原型;void search(S *p, int n)search()函数用于在指针中按商品代号查找满足条件的商品销售记录,并显示出来。5) modify()函数原型:void modify(S *p ,int n)modify()用于修改商品的销售记录。6) add()函数原型:void add(S *p,int n)add()函数用于添加记录。7)
11、del()函数原型;void del(S *p ,int n)del()函数用于删除满足条件的记录。8) tongji ()函数原型:void tongji (S *p,int n)Tongji()函数用于统计商品的单项销售额,同一类商品的销售额及销售总额。9) sort()函数原型:void sort(S *p,int n)sort()函数用于对已有的记录按代号进行升序排序。10) save()函数原型:void save(S p10000,int n)save()用于将输入的数据写入磁盘文件中。11) read()函数原型:void read(S *p,int n)read()用于读取文件
12、中的记录。12)主函数main()整个管理系统的控制部分,其详细说明可参考图3.1.4、 程序代码及运行结果4.1程序代码:#include "stdio.h"#include "stdlib.h"#include "string.h"/#include "conio.h"#define HEADER1 " .商品销售管理系统. n"#define HEADER2 " | 商品编号 | 商品名称 | 价格 | 数量 | 所属类别 | n"#define HEADER3 &qu
13、ot; |.|.|.|.|.| n"#define FORMAT " | %-8s| %-9s| %-3.2f| %-5d| %-9s| n"#define DATA p->data.f1,p->data.f2,p->data.f3,p->data.f4,p->data.f5 /f1-f5分别表示商品编号.名称.价格.数量.类别。#define END " . n"int saveflag=0; /是否需要存盘的标志变量/定义与商品有关的数据结构typedef struct shop /标记为shopchar f1
14、10; /商品编号char f210; /商品名称float f3; /价格int f4; /数量char f510; /所属类别;/定义每个记录或节点的数据结构,标记为:nodetypedef struct nodestruct shop data; /数据域struct node *next; /指针域Node,*Link; /Node为node类型的结构变量,*Link为node类型的指针变量/主菜单void menu()system("cls");printf("nn 商店销售管理系统 nn");printf(" *系统主菜单* n&q
15、uot;);printf(" * 1 增加销售记录 2 删除销售记录 * n");printf(" * 3 查询销售记录 4 修改销售记录 * n");printf(" * 5 插入销售记录 6 统计销售记录 * n");printf(" * 7 排序销售记录 8 保存销售记录 * n");printf(" * 9 显示销售记录 0 退出销售系统 * n");printf(" * n"); /显示记录void printheader() /格式化输出表头printf(HEAD
16、ER1);printf(HEADER2);printf(HEADER3);void printdata(Node *pp) /格式化输出表中数据Node *p;p=pp;printf(FORMAT,DATA);void wrong() /输出按键错误信息printf("nnnnn*Error:输入错误!按任意键返回*n"); getchar();void Nofind() /输出未查到此商品的销售信息printf("n=>无此商品的销售信息");void Disp(Link l) Node *p;p=l->next; /*l存储的时单链表中头
17、节点的指针,该头节点没有存储销售信息,指针域指向的后继节点才有销售信息*/if(!p) /p=NULL,NULL在stdlib中定义为0printf("n=>Not student record!n");getchar();return;printf("nn");printheader(); /输出表格头部while(p) /逐条输出链表中存储的销售信息printdata(p);p=p->next; /移动至下一个节点printf(HEADER3);getchar();/记录查找定位/findmess保存要查找的具体内容;f1保存按商品编号在
18、单链表l中查找;Node* Locate(Link l,char findmess,char f)Node *r;if(strcmp(f,"f1")=0) r=l->next;while(r)if(strcmp(r->data.f1,findmess)=0) /若找到findmess值的编号return r;r=r->next;return 0; /若未找到,返回一个空指针/输入数据/输入字符串,并进行长度验证(度<lens)void stringinput(char *t,int lens,char *notice)char n225; dopri
19、ntf(notice); /显示提示信息scanf("%s",&n); /输入字符串if(strlen(n)>lens)printf("n exceed the required length! n");/进行长度校验,超过lens值重新输入while(strlen(n)>lens);strcpy(t,n); /将输入的字符串拷贝到字符串t中char numberinput(char *notice)float t;/do printf(notice); /显示提示信息 scanf("%f",&t); /输
20、入价格或数量/if(t<=0) printf("n 请输入大于0的数值!n"); /进行数据校验/while(t<=0);return t;/增加销售记录void Add(Link l)Node *p,*r,*s; /实现添加操作的临时结构体指针变量char ch,flag=0,f110;r=l;s=l->next;system("cls");Disp(l); /先打印出已有的销售记录while(r->next!=NULL)r=r->next; /将指针移至链表最末尾,准备添加记录while(l) /一次可输入多条记录,直至
21、输入编号为0的记录节点添加操作while(l) /输入编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作stringinput(f1,10,"输入商品编号(输入“0”返回主菜单):"); /格式化输入学号并检验flag=0;if(strcmp(f1,"0")=0) /输入为0,则退出添加操作,返回主界面 return;s=l->next;while(s) /查询商品编号是否已经存在,若存在则要求重新输入一个未被占用的编号if(strcmp(s->data.f1,f1)=0)flag=1;break;s=s->next;if(
22、flag=1) /提示用户是否重新输入getchar();printf("=>编号 %s 不可用,是否重新输入?(y/n):",f1); scanf("%c",&ch);if(ch='Y'|ch='y')continue;elsereturn;elsebreak;p=(Node *)malloc(sizeof(Node); /申请内存空间if(!p)printf("n allocate memory failure "); /申请失败,打印提示信息return; /返回主界面strcpy(
23、p->data.f1,f1); /将字符串f1拷贝到p->data.f1中stringinput(p->data.f2,10,"请输入商品名称:");p->data.f3=numberinput("请输入商品销售价格:");p->data.f4=numberinput("请输入商品销售数量:");stringinput(p->data.f5,10,"请输入商品类别(包括:日用,电器,水果,生产):"); p->next=NULL; /表明这是链表的尾部节点r->nex
24、t=p; /将新建的节点加入到链表尾部中r=p;saveflag=1; return;/查询销售记录void Qur(Link l) /按商品编号查询销售记录 char searchinput20; /保存用户输入的查询内容 Node *p; if(!l->next) /若链表为空 system("cls"); printf("n=>无销售信息"); getchar(); return; system("cls"); stringinput(searchinput,10,"请输入商品编号:"); p=L
25、ocate(l,searchinput,"f1"); /在l中查找编号为searchinput值的节点,并返回节点的指针 if(p) /若p!=NULL printheader(); printdata(p); printf(END); printf("按任意键返回"); getchar(); else Nofind(); getchar();/删除销售信息void Del(Link l)Node *p,*r;char findmess20;if(!l->next)system("cls");printf("n=>
26、;无销售记录!n");getchar();return;system("cls");Disp(l);stringinput(findmess,10,"输入销售商品编号:");p=Locate(l,findmess,"f1");if(p) /p!=NULLr=l;while(r->next!=p)r=r->next;r->next=p->next; /将p所指节点从链表中删除free(p); /释放内存空间printf("n=>删除成功!n");getchar(); savef
27、lag=1;elseNofind();getchar();/修改销售记录void Modify(Link l)Node *p;char findmess20;if(!l->next)system("cls");printf("n=>无销售记录");getchar();return;system("cls");printf("修改销售记录");Disp(l);stringinput(findmess,10,"输入销售的商品编号:");p=Locate(l,findmess,"
28、f1"); /查询到该节点if(p) /若p!=NULL,表明已经找到该节点printf("商品编号:%s,n",p->data.f1);printf("商品名称:%s,",p->data.f2);stringinput(p->data.f2,10,"输入新的商品名称:");printf("商品单价:%f,",p->data.f3);p->data.f3=numberinput("商品价格:");printf("销售数量:%d,",p-
29、>data.f4);p->data.f4=numberinput("销售数量:");printf("商品类别:%s,",p->data.f5);stringinput(p->data.f5,10,"商品类别(包括:日用,电器,水果,生产):"); printf("n=>修改成功!n");Disp(l);saveflag=1; elseNofind();getchar();/插入销售信息void Insert(Link l)Link p,v,newinfo; /p指插入位置,newinf
30、o指插入记录char ch,f110,s10; /s保存插入点位置之前的编号,num保存输入的新记录的编号int flag=0;v=l->next;system("cls");Disp(l);while(1);stringinput(s,10,"please input insert location after the Number:");flag=0;v=l->next;while(v) /查询商品编号是否存在,flag=1表示该编号存在if(strcmp(v->data.f1,f1)=0)flag=1;break;v=v->
31、next;if(flag=0)/break; /若编号存在,则进行之前的新纪录的输入操作/elsegetchar();printf("n=>编号 %s 不存在,重新输入?(y/n):",s);scanf("%c",&ch);if(ch='Y'|ch='y')stringinput(s,10,"please input insert location after the Number:n");elsereturn; /以下为新纪录的输入操作stringinput(f1,10,"输入
32、新的商品编号:");v=l->next;while(v)if(strcmp(v->data.f1,s)=0)printf("=>编号 %s 已经存在!n",f1);printheader();printdata(v);printf("n");getchar();return;v=v->next;newinfo=(Node *)malloc(sizeof(Node);if(!newinfo) printf("n 申请内存失败 "); /如没有申请到,打印提示信息return; /返回主界面strcpy(
33、newinfo->data.f1,f1);stringinput(newinfo->data.f2,10,"名称:");newinfo->data.f3=numberinput("单价:");newinfo->data.f4=numberinput("数量:"); stringinput(newinfo->data.f5,10,"类别(包括:日用,电器,水果,生产)"); newinfo->next=NULL;saveflag=1;/在main()有对该全局变量的判断,若为1,则
34、进行存盘操作/将指针赋值给p,因为l中头节点的下一个节点才实际保存着销售记录p=l->next;while(1)if(strcmp(p->data.f1,s)=0) /在链表中插入一个节点newinfo->next=p->next;p->next=newinfo;break;p=p->next; Disp(l);printf("nn");getchar();/统计销售记录void Tongji(Link l)Node *r=l->next;float a,rytotal=0,dqtotal=0,shgtotal=0,shchtota
35、l=0,total=0; /分别保存日用品,电器,水果,生产资料的销售额和总销售额a=(r->data.f3)*(r->data.f4); if(!r)system("cls");printf("n=>Not student record!n");getchar();return;system("cls");Disp(l);while(r) a=r->data.f3*r->data.f4;if(r->data.f5="日用")rytotal=rytotal+a;else if(r
36、->data.f5="电器")dqtotal=dqtotal+a;else if(r->data.f5="水果")shgtotal=shgtotal+a;elseshchtotal=shchtotal+a; r=r->next; printf("n-统计结果-n");/printf(" 日用 品销售总额为:%.2f (元)n",rytotal);/printf(" 电器用品销售总额为:%.2f (元)n",dqtotal); /printf(" 水 果销售总额为:%.
37、2f (元)n",shgtotal);/printf(" 生产资料销售总额为:%.2f (元)n",shchtotal); total=rytotal+dqtotal+shgtotal+shchtotal;printf(" 销 售 总 额 为:%.2f (元)n",total);printf("nn按任意键返回");getchar();/排序销售记录void Sort(Link l)Link ll;Node *p,*rr,*s;if(l->next=NULL)system("cls");printf
38、("n=>无销售记录!n");getchar();return;ll=(Node*)malloc(sizeof(Node); /用于创建新的节点if(!ll)printf("n 申请内存失败"); /如没有申请到,打印提示信息return; /返回主界面ll->next=NULL;system("cls");Disp(l); /显示排序前的所有销售记录p=l->next;while(p) /p!=NULLs=(Node*)malloc(sizeof(Node); /新建节点用于保存从链表中取出的节点信息if(!s)
39、/s=NULLprintf("n 申请内存失败"); /如没有申请到,打印提示信息return; /返回主界面s->data=p->data; /填数据域 s->next=NULL; /指针域为空rr=ll;/rr链表是用于存储插入单个节点后保持排序的链表/ll是这个链表的头指针,每次从头开始查找插入位置while(rr->next!=NULL && rr->next->data.f1>=p->data.f1)rr=rr->next; /指针移至编号比p所指的编号小的节点位置if(rr->next=
40、NULL)/若新链表ll中的所有节点的商品编号值都比p->data.f1大,就将p所指的节点加入到链表尾部rr->next=s;else /否则将该节点插入至第一个编号值比它小的节点的前面s->next=rr->next;rr->next=s; p=p->next; /原链表中的指针下移一个节点l->next=ll->next; /ll中存储的是已排列的链表的头指针p=l->next;Disp(l);saveflag=1;printf("n =>排序成功!n");/存储销售记录void Save(Link l)FI
41、LE* fp;Node *p;int count=0;fp=fopen("c:shop","wb"); /以只写方式打开二进制文件if(fp=NULL) /打开文件失败printf("n=>打开文件失败n");getchar(); return;p=l->next;while(p)if(fwrite(p,sizeof(Node),1,fp)=1) /每次写一条记录或一个节点信息至文件p=p->next;count+; elsebreak;if(count>0)getchar();printf("nnn
42、n=>保存文件成功,总共保存记录数目是:%dn",count);getchar();saveflag=0;elsesystem("cls");printf("当前连接为空,无销售记录被保存!n");getchar();fclose(fp); /关闭此文件/主函数void main()Link l; /定义链表FILE *fp; /文件指针int select; /保存选择结果变量char ch; /保存y.Y.n.Nint count=0; /保存文件中的记录条数(节点个数) Node *p,*r;l=(Node*)malloc(size
43、of(Node); if(!l)printf("n allocate memory failure "); /提示分配内存失败 return; l->next=NULL;r=l;fp=fopen("C:shop","ab+"); /以追加方式打开一个二进制文件,可读可写,如无此文件,会创建此文件 if(fp=NULL)printf("n=>不能打开文件!n");exit(0);while(!feof(fp)p=(Node*)malloc(sizeof(Node); if(!p)printf("
44、 memory malloc failure!n"); /申请失败 exit(0); /退出 if(fread(p,sizeof(Node),1,fp)=1) /一次从文件中读取一条成绩记录p->next=NULL;r->next=p;r=p; /r指针后移一个位置 count+;fclose(fp); /关闭文件printf("n=>open file sucess,the total records number is : %d.n",count);menu();while(1)system("cls");menu();p=r;printf("n 请输入你的选择(0-9):"); /显示提示信息scanf("%d",&select);if(select=0)if(saveflag=1) /若对链表的数据有所修改且未进行存盘操作,则此标志为1getchar();p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2026版)医院请示报告制度
- 2026北京双高面试题库及答案
- 2025年中国环保收缩膜市场调查研究报告
- 2025年中国灯具遥控器市场调查研究报告
- 2025年中国海员半皮手套市场调查研究报告
- 2025年中国汽车制冷剂回收再生加注中心市场调查研究报告
- 2025年中国平光胶圈市场调查研究报告
- 护理警示:护理沟通的重要性
- 护理求职中的职业适应技巧
- 护理管理进修政策解读汇报
- 长租公寓盈利模式与成本结构优化
- 2026年自贡市自流井区社区工作者招聘笔试参考试题及答案解析
- 2026年初级经济师之初级经济师工商管理从业资格考试真题及参考答案详解AB卷
- 雨课堂学堂在线学堂云审计法律研究与案例(西南政法大学)单元测试考核答案
- 2026安徽合肥市发展和改革委员会上半年招聘事业单位工作人员20人考试备考试题及答案解析
- 2026年危险化学品重点县专家指导服务自查表
- 2026年贵州综合评标专家库评标专家考试经典试题及答案
- 2025-2026学年统编版二年级下册小学道德与法治每课教学设计(附目录)
- 2026年1月浙江首考英语真题(原卷版)
- 低压配电箱选型及安装技术标准
- 水资源保护规划编制规程(2025版)
评论
0/150
提交评论