C语言课程设计数据汇总系统.doc_第1页
C语言课程设计数据汇总系统.doc_第2页
C语言课程设计数据汇总系统.doc_第3页
C语言课程设计数据汇总系统.doc_第4页
C语言课程设计数据汇总系统.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高级程序设计语言 课程设计报告 得分:信电工程学院高级语言程序设计课程设计报告 题目: 数据汇总系统 班级: 10电信1班学号: 20100504159姓名: 彭 华指导教师: 黄为勇 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语言的而各种基本操作。本程序涉及结构体,数组,文件等方面的知识。通过本程序的训练,我们对C语言的文件操作有一个更深的了解。1.2系统功能 1、输入记录功能(从键盘输入销售的:商品代号,商品名称,数量,价格,所属类别(包括:日用品,电器用品,水果,生产资料) 2、按商品代号查询销售情况。 3、统计各类别商品的销售额。 4、统计商品销售总额。 5、按商品代号排序功能。 6、增加记录、删除记录、修改记录功能。 7、统计结果保存在文本文件中。 8、从文本文件中读取数据、显示。1.3设计要求设计一个总菜单,分别调用各个子功能模块。撰写课程设计报告,并打印。2、 程序功能模块组成及流程图2.1系统功能模块此管理系统主要由以下五大功能模块组成:商品销售管理系统输入记录查询记录更新记录统计记录输出记录从文件读入从键盘输入按商品代号查询修改记录删除记录插入记录排序记录统计销售额输出至屏幕输出至文件图1 商店销售管理系统功能模块图2.2各模块流程图1、 主函数main()的执行流程定义变量char ch=0; domenu();select=getchar();输入得一个字符 switch(select)case 1: add();break; 增加记录信息case 2:del();break; 删除记录case 3:cinb; 查找记录if(b=8) :find();break;姓名查询找if(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输入有误,是否继续选择doch=getchar();读入一个字符(y/n)while(ch=Y&ch=y&ch=N&ch=n);while(ch=Y|ch=y); 图3.1主函数程序简单说明:该功能主要显示的是给用户一个进入界面,它主要的是显示该程序主要能够执行的有哪些功能。2、输入记录 输入记录模块主要将数据存入结构体指针中,它调用fopen()函数读取文件,若文件中无数据,系统提示错误,返回主菜单界面这时用户选择1,调用creat()函数,建立文件并输入数据。3、查询记录 查询记录主要是按照商品的代号进行查询。在查询函数search()中,若输入的代号不存在(if(flag=0)),则系统提示未找到此记录,否则,输出相应的商品的销售信息。4、更新记录 此模块实现了对商品销售记录的修改、添加、删除和排序,下面分别介绍这四个更能模块: 1)、修改记录修改记录需要对指针所指向的数据域中值进行修改。首先,它调用display()函数,将已有的记录显示出来,然后用户输入需要修改的商品的代号,再输入新的商品代号及其它记录,并写入文件中。2)、添加记录首先用户输入要添加的商品的代号及其他信息,然后调用strcmp()函数,检验新加的信息是否存在。若存在,则输出是否重新输入的提示,若不存在,用strcpy()函数,将新记录添加到已有记录的后面,然后保存到文件中。3)、删除记录用户输入要删除的商品代号,调用strcmp()函数,将输入的代号和已有的代号进行比较,若存在该记录,则将指向该记录的指针前移,即删除该记录。4)、排序记录排序的方法有很多,本程序采用选择排序实现按商品代号从小到大的排序。5)、统计记录该功能的实现比较简单,定义一个数组,通过循环读取指针变量p所指的数据域中的值。再将同一类商品的销售额保存在数组中。6)、输出记录当把记录输入文件时,调用save()函数,将指针p所指向的值写入文件fp所指向的文件。当把记录输至屏幕时,可以调用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()函数原型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) 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)主函数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 |.|.|.|.|.| 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 . nint saveflag=0; /是否需要存盘的标志变量/定义与商品有关的数据结构typedef struct shop /标记为shopchar f110; /商品编号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);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(HEADER1);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存储的时单链表中头节点的指针,该头节点没有存储销售信息,指针域指向的后继节点才有销售信息*/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保存按商品编号在单链表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)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); /输入价格或数量/if(t=0) printf(n 请输入大于0的数值!n); /进行数据校验/while(tnext;system(cls);Disp(l); /先打印出已有的销售记录while(r-next!=NULL)r=r-next; /将指针移至链表最末尾,准备添加记录while(l) /一次可输入多条记录,直至输入编号为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(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(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-next=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=Locate(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=无销售记录!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(); saveflag=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,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-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指插入位置,newinfo指插入记录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-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,输入新的商品编号:);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(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,则进行存盘操作/将指针赋值给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,shchtotal=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-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( 水 果销售总额为:%.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(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) /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=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)FILE* 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(count0)getchar();printf(nnnn=保存文件成功,总共保存记录数目是:%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(sizeof(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( 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();printf(n=是否在文件中保存修改后的记录?(y/n):);scanf(ch=y|ch=Y);Save(l);printf(=thank you for useness!); getchar();break;switch(select) case 1:Add(l);break; /增加销售记录 case 2:D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论