C语言程序课程设计报告餐饮结账管理系统设计.doc
C语言程序设计课程设计报告设计题目:餐饮结账管理系统设计 1 设计任务1.1 设计题目的描述功能:餐饮结账信息包括:编号、时间、台面号、顾客数量、接待服务生、实收金额。试设计一餐饮结账管理系统,使之能提供以下功能:1结账信息录入、修改、删除功能;2查询浏览功能:按台面号查询、按接待服务生查询;3 按照实收金额排序。4统计总收入、顾客总数等功能。1.2 设计要求(1)仔细审题,明确题目要求。(2)按照结构化的程序设计思想,将程序模块化,将相对独立的功能写成函数。(3)要求编程、调试通过并演示;程序编写规范,添加适当注释。(4)按照课程设计报告的内容和格式要求,撰写课程设计报告,并且打印。2 设计方案说明2.1 数据的存储结构餐饮结账信息包括:编号、时间、台面号、顾客数量、接待服务生、实收金额。因此需要使用结构体,而结账信息又不止是一个,所以使用结构体数组,这里定义结构体struct bill,定义数组billM。struct billint num; /编号int time4; /时间int table; /台面号int count; /顾客数量char name20; /服务生姓名int money; /实收金额billM;2.2函数之间的调用关系说明 main menuInputmodifydeletersearchsearch2sortincomenumbermodify_asaveDisplay_allreadFromFiledisplay2.3函数说明1)函数 void menu() void menu() 菜单函数 此函数为主菜单,从此处进入其他模块。 变量 c :使用c选择进入其它功能。C=1?是 否 C=2?执行 是 否Input 执行 C= Modify 2)函数void input()void input() 信息录入,将录入的信息存入文件bill中此函数将从键盘输入的信息录入文件bill中。使用scanf输入结构体中各个量;打开文件bill成功选择输入的信息个数N输入第i个信息直到i>=N保存并关闭文件3)函数 void readFromFile()void readFromFile() 从文件中读取信息并存入数组bill30此函数将文件bill中信息读出并存入bill打开文件读第i个文件直到i>=N关闭文件4)函数 void save()void save() /*保存函数*/此函数用于在修改与删除后保存数据。打开文件写入第i个文件直到i>=N关闭文件5)函数 void display_all() void display_all() 信息全部显示通过此函数可显示所有输入信息。readFromFile()读取文件中信息printf显示第i个信息直到i<=N6)函数 void display(int i)void display(int i) 单个信息显示 i为要修改的信息号从modify函数中读入此函数用于在修改等功能后显示第i个信息,用于核对。用printf显示第i个信息的所有数据 7)函数 int modify_a(int i)int modify_a(int i) 修改主函数时调用此函数此函数用于修改其中一个或多个信息,并返回一个数值用于确定是否修改。 变量c用于确定修改项目从键盘输入一个C的值c>7|c<1是 否错误 w1=2重试 c=1是 否输入新信息 c=显示修改后第i个信息输入w1的值返回值w18) 函数 void modify()void modify() 修改信息主函数此函数用于修改其中一个信息并保存从文件bill中读入数据w0=1k=-1输入n的值 循环判断billi.num-n=0?是 否k=i k=-1输出无记录w1=modify_a(k);w1=1?是 否保存 输入w0值 结束 9)函数 void deleter()void deleter() 删除记录此函数用于删除记录中的一条信息。从文件bill中读入信息w1=1k=-1输入n 循环判断n-billi.num=0? 是 否k=i k=-1无记录display(i)输入w0 w0=1?是 否billi=billi+1; save(); 结束输入w1值10)函数 void search1()void search1() 台面号查询此函数用于按台面号查询信息并输出信息。从文件bill中读入信息w0=1输入number循环判断number=billi.table?是 否j=i j=-1display(j) 无此号输入w0的值 11)函数 void search2()void search2() 接待服务生查询此函数用于按接待服务生姓名查询信息并显示。从文件bill中读入信息w0=1输入a20循环判断strcmp(billi.name,a)=0?是 否j=i j=-1display(j) 无此姓名输入w0的值12)函数 void sort()void sort() 金额排序此函数用于按金额对所有信息进行排序并输出。关键变量struct bill t 为中间变量,用于交换billi与billi+1的值。从文件bill中读取文件billi.money>billi+1.money)是 否t=billi;billi=billi+1;billi+1=t; 不变i=0 i<N-1-j i+j=0 j<N-1 j+display(i)i=0 i<N i+w0=2输入w0的值判断是否返回13)函数 void income()void income() 总收入统计此函数用于统计总收入并输出。关键变量sum用于统计总收入从文件bill中读取文件sum=sum+billi.moneyi=0;i<N;i+输出sumw0=2输入w0的值判断是否返回14)函数 void number()void number() 顾客总数统计此函数用于统计顾客总数。关键变量number用于统计顾客总数从文件bill中读取文件number=number+billi.count;i=0;i<N;i+输出numberw0=2输入w0的值判断是否返回3设计题目源代码清单#include<stdio.h>#include<string.h>#include<stdlib.h>#define M 30struct billint num; /编号int time4; /时间int table; /台面号int count; /顾客数量char name20; /服务生姓名int money; /实收金额billM;int N;/*菜单*/void menu() char c;void input();void modify();void deleter();void search1();void search2();void sort();void income(); void number();doprintf("nnn"); printf(" <<<<餐饮结账管理系统>>>> n"); printf("-n"); printf("nn"); printf("-1录入 2修改 3删除 -nn"); printf("-4台面号查询 5接待服务生查询-nn"); printf("-6金额排序 7总收入 8顾客总数 -nn"); printf("- 0退出 -nn"); printf("-n"); printf("nn"); printf("请选择服务(0-8)"); c=getchar(); switch(c) case '1': input();getchar();break; case '2': modify();getchar();break; case '3': deleter();getchar();break; case '4': search1();getchar();break; case '5': search2();getchar();break; case '6': sort();getchar();break; case '7': income();getchar();break; case '8': number();getchar();break; case '0': printf("n谢谢使用,再见!"); exit(0); printf("n"); default: printf("n输入有误,重试!:"); c=getchar(); while(1); /*信息录入,将录入的信息存入文件bill中*/void input() FILE *fp; int i; if(fp=fopen("bill","w")=NULL) printf("cannot open the filen"); return; printf("输入信息个数(0-%d)?:",M-1); scanf("%d",&N); printf("请输入数据:n"); for(i=0;i<N;i+) printf("输入账单 %d 信息:n",i+1); printf("编号:"); scanf("%d",&billi.num); printf("时间(月.日 时:分):"); scanf("%d%d%d%d",&billi.time0,&billi.time1,&billi.time2,&billi.time3); printf("台面号:"); scanf("%d",&billi.table); printf("顾客数量:"); scanf("%d",&billi.count); printf("接待服务生:"); scanf("%s",billi.name); printf("实收金额:"); scanf("%d",&billi.money); for(i=0;i<N;i+) if(fwrite(&billi,sizeof(struct bill),1,fp)!=1) printf("file write errorn"); return; fclose(fp);/*从文件中读取信息并存入数组sbillN*/void readFromFile() int i;FILE *fp; if(fp=fopen("bill","rb")=NULL) printf("cannot open the filen"); return; for(i=0;i<N;i+) fread(&billi,sizeof(struct bill),1,fp); fclose(fp);/*保存函数*/void save()FILE *fp; int i; if(fp=fopen("bill","w")=NULL) printf("cannot open the filen"); return; for(i=0;i<N;i+) if(billi.num!='0') if(fwrite(&billi,sizeof(struct bill),1,fp)!=1) printf("file write errorn"); return; fclose(fp);/*信息全部显示*/void display_all()int i; readFromFile();printf("全部信息:n");for(i=0;i<N;i+)printf("编号:%d 时间:%d.%d %d:%d 台面号:%d 顾客数量:%d 接待服务生:%s 实施金额:%d",billi.num,billi.time0,billi.time1, billi.time2,billi.time3,billi.table,billi.count,billi.name,billi.money); printf("n");/*单个信息显示*/void display(int i) printf("编号:%d 时间:%d%d%d%d 台面号:%d 顾客数量:%d 接待服务生:%s 实施金额:%d",billi.num,billi.time0,billi.time1,billi.time2,billi.time3,billi.table,billi.count,billi.name,billi.money);/* 修改函数调用函数*/int modify_a(int i) int c,w1; printf("n修改选项=>nn 1).编号 2).时间 3).台面号 4).顾客数量 5).接待服务生 6).实收金额 7).取消并返回"); printf("请选择?: "); scanf("%d",&c); if(c>7|c<1) printf("n选择错误,请重试"); getchar();do switch(c) case 1: printf("编号:"); scanf("%d",&billi.num); break; case 2:printf("时间:") ; scanf("%d.%d%d:%d",&billi.time0,&billi.time1,&billi.time2,&billi.time3);break;case 3: printf("台面号:"); scanf("%d",&billi.table); break; case 4: printf("顾客数量:"); scanf("%d",&billi.count); break; case 5: printf("接待服务生:"); scanf("%s",billi.name); break; case 6: printf("实收金额:"); scanf("%d",&billi.money); break; case 7: menu(); printf("n现在:n"); display(i); printf("n确定?n 1).是 2).不,重新修改 3).返回不保存 "); scanf("%d",&w1); while(w1=2); return(w1);/*修改信息*/void modify() int i,n,k,w0=1,w1; readFromFile(); do k=-1; display_all(); do printf("n输入要修改的编号数n编号:"); scanf("%d",&n); for(i=0;i<N;i+) if(billi.num-n=0) k=i; if(k=-1) printf("nn没有记录请重新输入!");while(k=-1);w1=modify_a(k); if(w1=1) printf("n 修改成功 n是否继续? 1).是 2).保存返回 "); save(); scanf("%d",&w0); while(w0=1); /*删除记录*/void deleter()int i,k,n,w0,w1; readFromFile(); dok=-1;display_all();do printf("n输入要删除的编号:n"); scanf("%d",&n); for(i=0;i<N;i+) if(n-billi.num=0) k=i; if(k=-1)printf("n无记录,请重新输入!n"); while(k=-1); display(i);printf("n确定删除? 1)是 2)返回n ");scanf("%d",&w0); if(w0=1)for(i=k;i<N;i+)billi=billi+1; save();else break; display_all();printf("n删除成功,是否继续? 1)是 2)返回 ");scanf("%d",&w1);while(w1=1);/*台面号查询*/void search1() int i,j,w0; int number; readFromFile(); do j=-1; printf("n请输入台面号查询:"); scanf("%d",&number); for(i=0;i<N;i+) if(number=billi.table) j=i; display(j); printf("n"); if(j=-1) printf("无此号!"); printf("n继续? 1)是 2)返回 "); scanf("%d",&w0); while(w0=1);/*接待服务生查询*/void search2() char a20; int i,j,w0; do j=-1; printf("n请输入接待服务生姓名查询:"); scanf("%s",a); for(i=0;i<N;i+) if(strcmp(billi.name,a)=0) j=i; display(j); printf("n"); if(j=-1) printf("无此姓名!"); printf("n继续? 1)是 2)返回 "); scanf("%d",&w0); while(w0=1);/*金额排序*/void sort()int i,j,w0;struct bill t; readFromFile(); printf("nn");for(j=0;j<N-1;j+)for(i=0;i<N-1-j;i+)if(billi.money<billi+1.money)t=billi; billi=billi+1; /*调换billi与billi+1的值*/ billi+1=t; printf("由大到小为:n");for(i=0;i<N;i+)display(i);printf("n"); doprintf("n返回? 1)是 2)否");scanf("%d",&w0);while(w0=2);/*总收入统计*/void income()int i,sum=0,w0; readFromFile();for(i=0;i<N;i+) sum=sum+billi.money; printf("nn");printf("总收入:%d",sum);doprintf("n返回? 1)是 2)否");scanf("%5d",&w0);while(w0=2);/*顾客总数统计*/void number() int i,number=0,w0; readFromFile();for(i=0;i<N;i+) number=number+billi.count;printf("nn");printf("顾客总数:%d",number);doprintf("n返回? 1)是 2)否");scanf("%5d",&w0);while(w0=2);/*主函数*/void main()menu();4 程序测试4.1 测试数据说明测试数据包括:编号、时间、台面号、顾客数量、接待服务生、实收金额。编号时间(int 数组)台面号Int顾客数量Int接待服务生char数组实收金额Int17.2 12:1252li3227.2 12:2236wang12837.2 12:3228zhao18647.2 12:4243zhang9557.2 12:5215li1054.2 输出结果说明1)菜单界面,进入系统首先显示主菜单,之后可通过选择不同的数字来运用此餐饮结账系统的各项功能。 图1 菜单2)录入界面,选择1后根据提示输入需要输入的信息个数,之后可依次录入几条不同信息。 图2 录入3)修改界面,选择2后依次输入修改编号1, 与项目6,并更改为35,保存返回。 图3 修改信息4)按台面号查询信息,选择4后依次查询台面号3与6,之后返回。 图4 台面号查询5)按服务生姓名查询,选择5后查询服务生li,之后返回。 图5 服务生查询6)按金额排序,选择6后可按金额从大到小排序显示,之后返回。 图6 按金额排序7)求总收入,选择7后可求出总收入,之后返回。 图7 总收入8)求顾客总数,选择8后可求出顾客总数,之后返回。 图8 顾客总数9)删除信息,选择3后输入要删除的编号3,删除后显示,并返回。 图9 删除信息10)退出程序,选择0后退出餐饮结账管理系统。 图10 退出5 课程设计总结通过为期一周的课程设计,我们对C语言这门课程有了更深一步的了解。它是计算机程序设计的重要理论技术基础,在我们的学习中占据着十分重要的地位。1 这次课程设计运用C语言知识,编写一个参饮结账管理系统。其中遇到了不少问题,平时自己在编写一些普通常见的程序时感觉得心应手,非常简单,但此次拿到这个程序的要求后第一感觉就是无法下手。通过老师指导终于有了思路,在之后的编写中碰到修改这个函数时只知道通过直接输入可以代替原有数据,但不知道如何使修改更加完美,后来通过网上查找资料而解决了此问题,从而使各个数据互不影响的修改,而不是要改就必须重新输入一遍。最大问题是删除,开始时绞尽脑计都想不到该如何删除,曾经试过许多的办法都无法完成,到最后所有其他的功能完成后才从排序时的互换billi与billi+1的影响下想到用后一个代替前一个的想法。剩下的都就是一些小的细节问题,例如如何使每项功能完成后返回主菜单而在退出时却不返回(解决方法是在主菜单函数中加入while(1),而把退出的数字有9变为0),如何使功能完成后不会直接返回而有人为控制(在函数后使用dowhile在用w0控制退出与否)。剩余就是一些符号如“&”、“=”“= =”d等的使用一定要注意细节。2通过完成本课题,我进一步熟悉C语言的基本知识,并掌握真正的较复杂的程序的一些基本算法思想,掌握C语言的文件操作(包括从磁盘读入和向磁盘写入内容),进一步熟悉结构体的用法,数组的建立运用和函数的调用等。同时也使我知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。