语言及程序设计 课程设计报告
班级:软件 81501 学号:********* 姓名:张 *
2016年1月
1
C
一、题目内容描述
输入超市10种菜的价格信息,每个信息含有成员名为“编号、菜名、卖菜人、单价、数量、优惠折扣、金额(由计算得到)、金额排名”,分别编写六个函数求:
(1)输入一个卖菜人,查询所有该卖菜人的信息并输出,若不存在显示没找到。 (2)输入一个新菜名的信息,按编号顺序将该信息插入后输出。 (3)输入一个已存在菜名信息,删除该菜名的信息后输出。 (4)求每种菜的金额=单价*数量*(1-优惠折扣); (5)求所有菜的总数量和总金额并输出;
(6)对所有菜按金额进行降序排序并输出其信息。 要求:
10种菜的数据用文件存储,每种菜信息的结构体用数组和单链表,首先建立一个具有10种菜数据的单链表或数组,并在程序执行后先显示“菜单”,当输入为1时,执行第(1)个函数;当输入为2时,执行第(2)个函数;当输入为3时,执行第(3)个函数;当输入为4时,执行第(4)个函数;当输入为5时,执行第(5)个函数;当输入为6时,执行第(6)个函数;当输入为7时,退出系统,当输入其他数字时,提示输入有错误。
二、应用程序功能的详细说明
输入数字 1 查询卖菜人信息 输入数字 2 输入一个新菜名的信息,按编号顺序将该信息插入后输出 输入数字 3 输入一个已存在菜名信息,删除该菜名的信息后输出 输入数字 4 每种菜的总金额
输入数字 5 所有菜的总数量和总金额
输入数字 6 所有菜按金额进行降序排序并输出其信息 输入数字 7 退出程序 输入其他数字 提示输入错误 三、输入数据类型、格式和内容
数据类型:
int num;
char vge_name[8]; char name[10]; float price; int mount; float discount; float money; int race;
四、 主要模块的算法描述
主函数:
2
(一)查找工人信息
3
(二)添加蔬菜信息
(三)删除蔬菜信息
4
(四)计算每一种菜的总价
5
(五)输出所有菜的数量及价格总和
6
(六)降序输出蔬菜信息
7
(七)退出程序
(八)输入错误
五、程序的源代码清单
数组法:
#include #define LEN sizeof(struct vegetable) struct vegetable { int num; char vge_name[8]; char name[10]; float price; int mount; float discount; float money; int race; }x[15]; void print1() {printf(\" **************************************************************\\n\");} void print() //从文件输入 {int i; FILE*f1; 8 f1=fopen(\"D:\\\\xy.txt\ for(i=0;i<10;i++) fscanf(f1,\"%d%s%s%f%d%f\discount); } void sort1() //排序 { int i,j; struct vegetable b; for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(x[i].num printf(\"┌─────────┐\\n\"); printf(\"│ 菜名 │ 总金额 │\\n\"); for(i=0;i<10;i++) {printf(\"├────┼────┤\\n\"); {a[i].money=(x[i].price)*(x[i].mount)*(x[i].discount); printf(\"│%-6s │%-8.2f│\\n\ printf(\"└─────────┘\\n\"); } float add1() //所有菜的总数量和总金额 { int i,j,b=0; float c=0; for(j=0;j<10;j++) c=c+(x[j].price)*(x[j].mount)*(x[j].discount); for(i=0;i<10;i++) b=b+x[i].mount; printf(\"┌───┬────┐\\n\"); printf(\"│总数量│ 总金额 │\\n\"); printf(\"├───┼────┤\\n\"); printf(\"│%4d │%6.2f │\\n\ 9 printf(\"└───┴────┘\\n\"); } void sort() //排序法 { int i,j; struct vegetable b; for(i=0;i<10;i++) x[i].money=(x[i].price)*(x[i].mount)*(x[i].discount); for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(x[i].money {printf(\"├───┼────┼───┼──┼──┼──┼───┤ \\n\"); printf(\"│%6.2d│ %-6s │%-6s│%3.2f│%3d │%3.2f│%6.2f│\\n\ printf(\"└───┴────┴───┴──┴──┴──┴───┘\\n\"); } void insert() //插入函数 {int i,j; struct vegetable t,b; FILE*f2; f2=fopen(\"D:\\\\xy1.txt\sort1(); printf(\"输入新信息后自动排序输出\\n\"); printf(\"必须按照以下格式输入 且每个信息之间用空格隔开: \\n\"); printf(\"编号 菜名 姓名 单价 数量 折扣\\n\"); printf(\"15008 大米 黄晓明 5 56 0.8\\n\"); printf(\"\\n\"); scanf(\"%d%s%s%f%d%f\x[10]=t; for(j=0;j<10;j++) for(i=0;i<10-j;i++) if(x[i].num 10 fprintf(f2,\"│ 编号 │ 菜名 │ 姓名 │单价│数量│折扣│\\n\"); for(i=0;i<11;i++) {fprintf(f2,\"├───┼────┼───┼──┼──┼──┤ \\n\"); fprintf(f2,\"│%6.2d│ %-6s │%-6s│%3.2f│%3d │%3.2f│\\n\ fprintf(f2,\"└───┴────┴───┴──┴──┴──┘\\n\"); printf(\"\\n\"); printf(\"请进入D盘中的xy1文件查看\\n\"); fclose(f2); } void data() //查询卖菜人信息函数 { int i=0; char a[10]; scanf(\"%s\ for(i=0;i<10;i++)if(i==10) printf(\"\\n输入有误\\n\"); else if(strcmp(x[i].name,a)==0) {printf(\"结果如下:\\n\"); printf(\"┌───┬────┬───┬──┬──┬──┐\\n\"); printf(\"│ 编号 │ 菜名 │ 姓名 │单价│数量│折扣│\\n\"); printf(\"├───┼────┼───┼──┼──┼──┤ \\n\"); printf(\"│%6.3d│ %s │%-6s│%3.2f│%3d \\n\ printf(\"└───┴────┴───┴──┴──┴──┘\\n\"); break; } } void dele() //删除菜信息函数 { int i,j; char a[10]; printf(\"请输入一种菜名来删除\\n\"); scanf(\"%s\ for(i=0;i<10;i++) {if(strcmp(x[i].vge_name,a)==0) for(j=i;j<10;j++) x[j]=x[j+1]; } printf(\"┌───┬────┬───┬──┬──┬──┐\\n\"); printf(\"│ 编号 │ 菜名 │ 姓名 │单价│数量│折扣│\\n\"); %3.2f│11 │ for(i=0;i<9;i++) {printf(\"├───┼────┼───┼──┼──┼──┤ \\n\"); printf(\"│%6.2d│ %-6s │%-6s│%3.2f│%3d │%3.2f│\\n\ printf(\"└───┴────┴───┴──┴──┴──┘\\n\"); } main() { int i,c; print1(); printf(\" ** 1.查询卖菜人信息 **\\n\"); printf(\" ** 2.输入一个新菜名的信息,按编号顺序将该信息插入后输出 **\\n\"); printf(\" ** 3.输入一个已存在菜名信息,删除该菜名的信息后输出 **\\n\"); printf(\" ** 4.每种菜的总金额 **\\n\"); printf(\" ** 5.所有菜的总数量和总金额 **\\n\"); printf(\" ** 6.所有菜按金额进行降序排序并输出其信息 **\\n\"); printf(\" ** 7.退出程序 **\\n\"); print1(); print(); printf(\" \\n 请输入需要执行的序号:\\n\"); scanf(\"%d\ switch(c) {case 1:data();break; case 2:insert();break; case 3:dele();break; case 4:add();break; case 5:add1();break; case 6:sort();break; case 7:break; default: printf(\"\\n 输入有误!!\\n\\n\"); } } 链表法: #include 12 #include #define LEN sizeof(struct vegetable) struct vegetable { int num; char vge_name[8]; char name[10]; float price; int mount; float discount; float money; int race; struct vegetable *next; }; int n; void print1() {printf(\" **************************************************************\\n\");} struct vegetable *creat()//创建链表函数 {int i; struct vegetable *p1,*p2,*head; FILE*f1; f1=fopen(\"D:\\\\xy.txt\ p1=p2=head=(struct vegetable*)malloc(LEN); for(i=0;i<10;i++) {fscanf(f1,\"%d%s%s%f%d%f\p1->discount); p1=(struct vegetable*)malloc(LEN); p2->next=p1; p2=p1; } p2=NULL; return(head); } void print(struct vegetable *head)//查询卖菜人信息函数 {int i; char a[10]; 13 scanf(\"%s\for(i=1;i<10;i++) { if(strcmp(head->name,a)==0) break; else head=head->next;} if(i==10) printf(\"无该人信息\\n\"); else {printf(\"查找结果如下:\\n\"); printf(\"┌───┬────┬───┬──┬──┬──┐\\n\"); printf(\"│ 编号 │ 菜名 │ 姓名 │单价│数量│折扣│\\n\"); printf(\"├───┼────┼───┼──┼──┼──┤ \\n\"); printf(\"│%6.2d│ %-6s │%-6s│%3.2f│%3d │%3.2f│ \\n\ printf(\"└───┴────┴───┴──┴──┴──┘\\n\"); } } float add3(struct vegetable *head) //一种菜的总价 {int i; struct vegetable *p; p=head; printf(\"┌────────┐\\n\"); printf(\"│ 菜名 │ 总金额 │\\n\"); for(i=1;i<=10;i++) {printf(\"├───┼────┤\\n\"); printf(\"│%-6s│%-8.2f│ \\n\ p=p->next;} printf(\"└────────┘\\n\"); } float add4(struct vegetable *head)//所有菜的总数量和总金额 {int i,j,all=0; float all1=0.0; struct vegetable *p,*b; p=head;b=head; for(j=0;j<10;j++) { p->money=(p->price)*(p->mount)*(p->discount); all1+=p->money; p=p->next; 14 } for(i=0;i<10;i++) { all+=b->mount; b=b->next; } printf(\"┌───┬────┐\\n\"); printf(\"│总数量│ 总金额 │\\n\"); printf(\"├───┼────┤\\n\"); printf(\"│%4d │%6.2f │\\n\ printf(\"└───┴────┘\\n\"); } struct vegetable insert(struct vegetable *head)//插入函数 { int i,j; struct vegetable *p,*p1,*p2,*p3,t; p1=malloc(LEN); scanf(\"%d%s%s%f%d%f\discount); p2=head;head=p1;p1->next=p2; p=head; for(i=0;i<11;i++) { p2=p->next; for(j=0;j<10-i;j++) { if(p->num p3=p->next;p->next=p2->next;p2->next=p3;} p2=p2->next; } p=p->next; } printf(\"结果如下\\n\"); printf(\"┌───┬────┬───┬──┬──┬──┐\\n\"); printf(\"│ 编号 │ 菜名 │ 姓名 │单价│数量│折扣│\\n\"); for(i=0;i<11;i++) { printf(\"├───┼────┼───┼──┼──┼──┤ \\n\"); printf(\"│%6.2d│ %-6s │%-6s│%3.2f│%3d │%3.2f│ \\n\ 15 head=head->next; } printf(\"└───┴────┴───┴──┴──┴──┘\\n\"); } void dele(struct vegetable *head)//删除菜信息函数 { int i=0; char a[20]; struct vegetable *p,*p1; p=head;p1=head; printf(\"请输入想删除的蔬菜名:\\n\"); scanf(\"%s\ while(strcmp(p->vge_name,a)!=0&&i<10) {p1=p;p=p->next;i++;} if(i==10) printf(\"无此菜信息\\n\"); else { if(i==0) { head=head->next; printf(\"┌───┬────┬───┬──┬──┬──┐\\n\"); printf(\"│ 编号 │ 菜名 │ 姓名 │单价│数量│折扣│\\n\"); for(i=0;i<9;i++) { printf(\"├───┼────┼───┼──┼──┼──┤ \\n\"); printf(\"│%6.2d│ %-6s │%-6s│%3.2f│%3d │%3.2f│ \\n\ head=head->next; } printf(\"└───┴────┴───┴──┴──┴──┘\\n\"); } else { p1->next=p->next; printf(\"┌───┬────┬───┬──┬──┬──┐\\n\"); printf(\"│ 编号 │ 菜名 │ 姓名 │单价│数量│折扣│\\n\"); for(i=0;i<9;i++) { printf(\"├───┼────┼───┼──┼──┼──┤ \\n\"); 16 printf(\"│%6.2d│ %-6s │%-6s│%3.2f│%3d │%3.2f│ \\n\ head=head->next; } printf(\"└───┴────┴───┴──┴──┴──┘\\n\"); } } } void sort(struct vegetable *head)//排序函数 { int i,j; struct vegetable *p,*p1,*p2,*p3,t; p1=head; p=head; for(i=0;i<10;i++) { p1->money=p1->price*p1->mount*p1->discount; p1=p1->next; } for(i=0;i<10;i++) { p2=p->next; for(j=0;j<10-i;j++) { if(p->money p3=p->next;p->next=p2->next;p2->next=p3;} p2=p2->next; } p=p->next; } printf(\"┌───┬────┬───┬──┬──┬──┬───┐\\n\"); printf(\"│ 编号 │ 菜名 │ 姓名 │单价│数量│折扣│ 总价 │\\n\"); for(i=0;i<10;i++) { printf(\"├───┼────┼───┼──┼──┼──┼───┤ \\n\"); printf(\"│%6.2d│ %-6s │%-6s│%3.2f│%3d │%3.2f│%6.2f│ \\n\oney); 17 head=head->next; } printf(\"└───┴────┴───┴──┴──┴──┴───┘\\n\"); } main() { int i,c; print1(); printf(\" ** 1.查询卖菜人信息 **\\n\"); printf(\" ** 2.输入一个新菜名的信息,按编号顺序将该信息插入后输 出 **\\n\"); printf(\" ** 3.输入一个已存在菜名信息,删除该菜名的信息后输出 **\\n\"); printf(\" ** 4.每种菜的总金额 **\\n\"); printf(\" ** 5.所有菜的总数量和总金额 **\\n\"); printf(\" ** 6.所有菜按金额进行降序排序并输出其信息 **\\n\"); printf(\" ** 7.退出程序 **\\n\"); print1(); printf(\" \\n 请输入需要执行的序号:\\n\"); creat(); scanf(\"%d\ switch(c) {case 1:system(\"cls\");printf(\"请输入卖菜人姓名:\\n\");print(creat());break; case 2:system(\"cls\");insert(creat());break; case 3:dele(creat());break; case 4:add3(creat());break; case 5:add4(creat());break; case 6:sort(creat());break; case 7:break; default: printf(\"\\n 输入有误!!\\n\\n\"); } } 18 六、心得体会 刚开始学C语言时不知该从何学起,书本上满满的代码,很多都看不懂。老师上课也很快,有点赶不上的节奏,有时候在上机的时候虽说程序能够看懂,有一定的理解。但自己去写一个程序却要花很长一段时间思考和编写。 在我看来,这门专业科还是要靠自己专研的,没有什么捷径可走。自己在课余时间试着去自己上机操作,按照课本的例题慢慢锻炼,最后再只看题,不看课本,有时自己也会去想一些方法,然后用这方法再去编写程序解决遇到的问题。只有这样不断的操作实践,才能让我的C语言有很大的提高。 此外,C语言的学习是一个需要耐心和细心的过程,到目前为止,有些时候一些编程还是会有一些小问题出现,有些时候会将“=”和“==”等效了,有时候会将“a*b”写成“ab”,因此在每次在编完程序试运行之前,我都会自己去检查一次,把编译的事情自己先做一次,逐渐地,我感觉编程出现问题的地方都能预先自己解决了。 对于C语言的学习我的感受就是实践比一味的去看课本效率更高,也学的更快更轻松,这次的C语言报告也给了我一次锻炼自己的机会,通过这次的实习报告让我对流程图的编写有了一定的认识。思路虽然不是太难,但流程图也比较难画。 总而言之,到此为止的C语言实习让我觉得很满足很充实,C语言的编程之中解决问题的思路,也都有了一定的了解。希望接下来的学习能够让我对C语言有更加深入的了解,也争取获得更好的成绩。 19 因篇幅问题不能全部显示,请点此查看更多更全内容