资源描述
.
HUBEIUNIVERSITY OF AUTOMOTIVE TECHNOLOGY
C语言程序设计
课程设计报告
课设题目: 商品售后管理
专 业: 电气工程与其自动化
班 级:
姓 名:
成 绩:
完成日期:2013年5月27日-2012年6月21日
指导教师: 胡宁亚
目 录
C语言程序设计0
课程设计报告0
1.课程设计目的2
2.需求分析2
2.1要求2
2.2任务描述3
2.3运行环境3
2.4开发工具3
3.总体设计3
3.1系统流设计3
3.2系统模块设计5
4.详细设计5
4.1数据结构设计5
4.2模块接口设计6
4.3 以下是几个主要模块的流程图:7
5.运行结果11
5.1主菜单界面:12
5.2信息录入界面:13
5.3信息浏览界面:14
5.4 信息查询界面:14
5.5信息修改界面:17
5.6信息插入界面:18
5.6信息删除界面:19
6.程序调试与测试19
6.1程序调试19
6.2程序测试20
6.3程序测试的正确的界面24
7.问题与不足27
8.建议27
9.编程体会28
10.程序源代码:28
11.参考文献49
12.用户使用手册50
1.课程设计目的
1) 通过课程设计,加深对结构化程序设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。
2) 通过课程设计,进一步掌握C语言中重要的数据结构。掌握并熟练运用指针、链表、结构体、文件等数据结构。
3) 通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。
4) 通过课程设计,培养C语言知识运用和自学能力,真正的把课堂上获得的知识运用起来,培养自己对程序编写的兴趣,并能独立设计和实现一个小型系统。
5) 通过课程设计,加强了自己的程序分析能力。
2.需求分析
2.1要求
1) 遵循软件开发过程的基本规;能灵活应用,初步具备运用C程序解决实际问题的能力。
2) 运用结构化程序设计方法,按照课程设计题目要求,完成包括需求分析、数据结构设计、概要设计、详细设计、编写代码、调试和测试C程序等过程。
3) 学会利用数组、结构体、链表进行相关信息表示。
4) 功能模块划分清晰,系统结构图符合功能操作要求,且有详尽的功能描述
5) 各主要功能模块有详尽的流程图与描述,用函数的形式实现,且调用入口、功能、出口等关系正确。
6) 所设计的C程序较好的可读性和可靠性;程序书写风格规,注释清晰。
7) 界面友好(良好的人机互交),凡需要输入信息时,都有较详尽的提示信息,并对输入信息有较完善的值域分析。
8) 程序经上机调试通过,不应出现语法型、功能型错误,并获得满意的结果。
9) 学会通过各功能性测试用例测试程序的能力,尽可能避免原则性错误的出现。
10) 掌握编写、调试和测试C语言程序的基本技巧,充分理解结构化程序设计的基本方法。
11) C语言课程设计报告的容反应实际设计过程,且符合格式要求,无抄袭现象。
2.2任务描述
已知一售后服务站负责10个公司各10种产品的售后服务,产品信息包括:编号,型号,名称,生产厂家、保修期返修、保修期外返修(维修)等;经手人10人,信息为:编号。维修站需要经常统计产品售后返修情况,以便给产品生产厂商提出改进意见。
此系统以商品售后管理为背景,提供对商品维修信息的录入、编辑、查找、统计等功能。具体功能实现如下:
1) 信息录入:实现商品维修信息的录入功能,并能将其以文件形式加以保存。
2) 编辑功能:实现商品的维修信息的添加,并对指定的信息进行删除或修改等功能。
3) 信息浏览功能:实现全部维修信息的浏览。
4) 查询功能:实现按商品编号查询、按公司名称查询维修信息的功能。
5) 统计功能: 指定时间的全部维修信息查询。
6) 系统以菜单方式工作,界面清晰,易于操作。
2.3运行环境
1) WindowsXP/7系统
2) VC++6.0编译环境
2.4开发工具
C语言
3.总体设计
3.1系统流设计
系统的功能模块大致如图1所示:
程序欢迎界面
主菜单界面
学生信息录入
统计男女人数
学生信息修改
学生信息查询
学生信息删除
学生信息浏览
退出系统
按学号查询
按XX查询
指定班级浏览
全部信息浏览
操作模式界面
管理模式界面
查询模式界面
XX信息建立
管理数据建立
图1系统功能模指定商品编号浏览
快
3.2系统模块设计
1) 课程名称界面:构造函数void question();,实现课程设计名称以与设计容要求的显示。
2) 主菜单界面:构造函数int menu_select();,实现系统主菜单的显示。
3) 维修信息录入:构造函数void loadRec();,实现维修信息的录入与显示。
4) 维修信息修改:构造函数void modifyRec(),实现对需要修改维修信息的商品的查找,并实现商品维修信息修改界面的显示并对维修信息进行修改。
5) 维修信息查询:构造函数void select(),实现查询界面的显示。并通过对按商品编号查询函数void searchRec()、按公司名称查询函数void searchgongsi()、按照维修日期查询函数void searchqijian()、按照是否在维修期查询函数void searchweixiu()的调用,实现相应的商品维修信息的查询。
6) 维修信息删除:构造函数void deleteRec(),实现对指定学商品编号的维修信息的删除。并通过函数free(),释放存空间。
7) 维修信息浏览:构造函数void listRec(),实现全部维修信息的浏览。
4.详细设计
4.1数据结构设计
根据系统要求,系统中需要保存的数据信息,其结构如下:
数据项名称
数据项系统表示
数据类型
数据长度
备注
商品编号
num
字符串
10
经手人编号
maker
双精度实数
8
公司名称
name
字符串
10
维修时间
tiem
字符串
10
维修期
shi
字符串
10
根据系统要求,系统中需要保存的类别信息,其结构如下:
类别代号
char num
double maker
char num
char shi
chartime
类别名称
商品编号
经手人编号
公司名称
维修期
维修时间
为了能实现不受限制的增加商品维修信息,采用链表的结构保存维修信息,在增加商品的基本信息时,创建一个维修信息的节点,将其插入到链表中,示意图如下。
维修信息1
维修信息2
通讯录信息1
221
维修信息3
维修信息4
为此,先声明一个类型为struct student的结构体,其成员为学生的简历信息。然后通过对指针、链表、文件等数据结构的操作,实现对学生简历信息的录入,插入,存盘,查询,浏览,删除,修改等一系列操作。其中,结构体定义如下:
struct product
{
char num[10];
doublemaker;
char name[10];
char time[10];
char shi20];
struct product *next;
};
4.2模块接口设计
1) 所有函数模块声明如下:
void createRec(); /*新建商品维修记录*/
void loadRec(); /*从磁盘文件导入商品信息到存*/
int selectmenu(); /*查询的子菜单*/
void searchRec(); /*输入商品编号以查询维修记录*/
void modifyRec(); /*输入商品编号以修改维修记录*/
void insertRec(); /*插入商品维修记录*/
void deleteRec(); /*删除商品维修记录*/
void listRec(); /*显示所有商品维修记录信息*/
void writeInfo(); /*保存商品维修记录*/
void exit0(); /*退出*/
void question(); /*显示上平售后管理的题目和要求*/
int menu_select(); /*主菜单*/
void select(); /*选择函数*/
void searchmaker(); /*根据商品编号查询商品维修信息*/
void searchgongsi(); /*根据公司名称查询商品维修信息*/
void searchweixiu(); /*根据是否在维修期查询商品维修信息*/
void searchqijian(); /*根据维修期查询商品维修信息*/
2) 并定义一个全局变量:
struct product *head = NULL;
3) 主要模块的实现
系统以主函数void main()为入口,首先通过textcolor(YELLOW)以与textbackgroud(GREEN)将文本颜色置为黄色,背景颜色置为绿色。
调用void auther()函数,显示课程设计名称与作者信息。调用void welcome()函数,显示系统欢迎界面。
然后调用void mainmenu()函数,进入主菜单界面。系统接收用户输入的选择,调用相应的函数,进入到下一级菜单进行相关工作。
4.3 以下是几个主要模块的流程图:
1) 主菜单函数:
调用对应选项函数
退出系统
打印主菜单
接受用户选项
是否合法
是否为0
是
否
是
否
图2 主函数流程图
2) 信息浏览函数:
需要修改的产品编号
是否存在
修改界面
是
选择修改内容
实现修改
回主菜单
打印信息查询子菜单
接收用户选项
是否合法
是否为0
否
是
是
否
回主菜单
按照商品编号查询
按照公司名称查询
根据维修日期查询
图3 信息浏览流程图
3) 信息修改函数:
否
图4 信息修改流程图
4) 信息插入函数:
完成插入
插入界面
是否存在
插入位置(输入数字)
需要插入位置
是
否
回主菜单
图5 维修信息的插入
5) 维修信息的删除函数:
需要删除的产品编号
是否存在
删除界面
是
选择删除信息
实现修改
回主菜单
否
图6 维修信息的删除
6) 显示题目的函数:
打印主菜单
接受用户选项
显示题目
按任意键返回主菜单
图7 显示题目和要求
7) 保存维修信息的函数:
打印主菜单
接受用户选项
保存维修信息
图8 保存维修信息
5.运行结果
5.1主菜单界面:
图9主菜单界面
输入功能选择,系统自动进入相应功能界面。
5.2信息录入界面:
图10 信息录入界面
5.3信息浏览界面:
图11 全部信息浏览
5.4 信息查询界面:
从键盘中输入选择,可以按产品编号,公司名称和维修日期进行查询,并显示结果。
图12 按商品售后查询的主界面
图13 按产品编号查询的结果
图14 按照公司名称查询
图15 按照维修日期查询
5.5信息修改界面:
从键盘中输入需要修改维修信息的商品编号,自动提示输入新的信息。
图16 维修信息修修改界面
5.6信息插入界面:
图17 维修信息插入界面
5.6信息删除界面:
图 18 维修信息删除界面
6.程序调试与测试
6.1程序调试
(1) 各模块分别调试过程与结果。
我设计的商品售后管理系统(c语言程序)有17个函数,主函数可以调用这17个函数,首先由void loadRec()实现从文件中读取商品的编号,经手人编号,维修公司,是否在维修期,维修的时间(年-月-日)。调试的结果是该函数可以成功从文件中读取到相应的信息。
void createRec() 用来新建商品维修记录
void loadRec() 从磁盘文件导入商品信息到存
void searchRec() 输入商品编号以查询维修记录
void modifyRec() 输入商品编号以修改维修记录
void insertRec() 插入商品维修记录
void delete () 删除商品维修记录
void list () 显示一段时间所有商品维修记录信息
void writeInfo() 保存商品维修记录
void exit0() 退出
void question() 显示题目和要求
int menu_select() 主菜单
void select() 子菜单
void searchmaker() 根据经手人查询
void searchgongsi() 根据公司名称查询
void searchweixiu() 根据是否在维修期查询
void searchqijian() 根据维修时间查询
各项运行良好,均能达到基本要求。
(2) 集成调试过程与结果。
各项运行良好,主函数可以调用其它函数,各项功能也可以实现。
(3) 功能调试过程与结果
可以根据上述的子函数分别实现商品售后管理的查询,新建,删除,保存,退出,插入各项功能。
6.2程序测试
文件录入出错界面
主菜单输入出错界面
新建商品维修记录出错界面
查询界面出错
插入界面出错
删除界面出错
6.3程序测试的正确的界面
文件录入正确
主菜单输入正确界面
新建维修记录
查询界面正确输入
删除正确界面
插入正确界面
注:测试中出现的问题的原因和分析
当执行完所有操作退出系统时一定要按照系统指示退出系统,不能强行退出,否则本次操作将会无效!
7.问题与不足
(1) 需求分析中存在的问题和分析
题目并没有说明可以按照日期或是编号对维修记录进行排序。
(2) 概要设计中存在的问题和分析
系统在进行维修查询上有些粗糙,不是很完美。
(3) 详细设计中存在的问题和分析
新建维修信息这个功能不是特别的人性化,而且我没有对输入的维修日期是否不正确进行判断,比如输入2099-89-98这个不正确的日期,依然会被读入并进行操作。
(4) 代码编制中存在的问题和分析
在输入函数中,再输入的地方加一个while(1){if(…)break;}对输入的选择进行判断,输入的数据以字符串的形式赋给一个数组对输入数据的前两位进行判断,这样系统会更完美。
(5) 调试和测试中存在的问题和分析
每执行一个操作后一定要执行保存功能,这样才能将信息与时准确无误的把存入文件。
8.建议
对于课设的时间按排,可以提前把题目给学生,这样可以提前做课设以与复习考试。建议使用集中的时间来做课程设计,把时间分成一段一段的会影响学生的的积极性和效率。就我所知,很多同学都不参加周末的课设,等到了最后几周才去编程序。而且由于最后几周都临近考试,好多编程序的同学甚至没有时间去复习考试科目。可以说这对于绝大多数人来说都是不小的负担。像那种一下子就把程序编出来的人不多。
9.编程体会
大的C语言程序编程,对于我们初学者来说,是有一定困难的。在本次的课程设计编程中,我遇到了许多问题和困难,函数功能的不熟悉,对文件的读入不是很熟悉,更有一些函数从来没了解过,在程序的一次一次调试失败下,我曾经灰心过,但在同学和老师的指导下,我有找回了信心,最终克服了许多困难,终于完成了程序的编写。在这里要感指导老师的悉心指导和同学们的无私帮助。
通过这次课程设计,我受益匪浅,感受颇多。首先,我对很多的函数有了新的认识,对这些函数有了更深刻的理解;其次,学会了多种函数同时运用的设计和编程,明白了编写源程序的基本过程和基本方法;再次,写源程序的过程中我又学到了一些新的函数或是自己不会的函数的用法,例如我学会了如何自动从文件中读入数据,如何调用函数,对于函数和变量都有所认知。了解了getchar()和system("cls")的用法和作用等,对指针和链表有了更深刻的认识,比如建立链表的具体操作、在进行文件操作时,文件末尾不能存在回车、写入文件时一定要注意文件中数据的格式,否则在后面的读文件中会出错、在用“fscanf“写整型和浮点型的数据到文件是不能把“&”漏掉。
。这次课程设计课总的来说,让我明白了许多,学会了许多,我编写程序的能力有了很大的提高,此次编程过程的经验和知识对于进我今后的学习有很大的帮助。
通过这次课设的编程,我发现了自己平时学习中的许多漏洞,这是学习时的不认真造成的。我相信自己,在今后的学习中,会更加认真刻苦,掌握更多的知识。做一个有用的人。
10.程序源代码:
/* 一件商品的信息为:商品编号、经手人编号、商品生产公司,从键盘输入 n 件商品的信息,并
保存在 c:/1/1.txt 文件中。 */
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include <stdlib.h>
#include<conio.h>
#define LEN sizeof(struct product)
struct product
{ char num[10];
double maker;
char name[10];
char shi[10];
char time[10];
struct product *next;
};
void createRec(); /*新建商品维修记录*/
void loadRec(); /*从磁盘文件导入商品信息到存*/
int selectmenu();
void searchRec(); /*输入商品编号以查询维修记录*/
void modifyRec(); /*输入商品编号以修改维修记录*/
void insertRec(); /*插入商品维修记录*/
void deletes (); /*删除商品维修记录*/
void list (); /*显示一段时间所有商品维修记录信息*/
void writeInfo(); /*保存商品维修记录*/
void exit0(); /*退出*/
void question(); /*显示题目和要求*/
int menu_select(); /*主菜单*/
void select(); /*子菜单*/
void searchmaker(); /*根据经手人查询*/
void searchgongsi(); /*根据公司名称查询*/
void searchweixiu(); /*根据是否在维修期查询*/
void searchqijian(); /*根据维修日期查询*/
/*链表操作所用结构体指针*/
struct product *head=NULL,*p1,*p2,*p3;/*定义结构体指针head 为头指针p1 为输入数据缓存空间指针p2 为尾指针*/
int writeinfo_flag=0;
int main()
{ loadRec();
for(;;)
{ switch(menu_select())
{ case 1: system("cls"); createRec();break;
case 2: system("cls"); select();break;
case 3: system("cls"); modifyRec();break;
case 4: system("cls"); insertRec();break;
case 5: system("cls"); deletes ();break;
case 6: system("cls"); list ();break;
case 7: system("cls"); writeInfo();break;
case 0: system("cls"); exit0();return 0;
case 8: system("cls"); question();break;
default :{ getchar();
printf("\n 选择错误,请正确输入你的选择(0~5),:\n");
printf("\n 按任意键返回......\n");
getchar();
getchar();
system("cls"); /*清屏*/
}
}
}
return 0;
}
int menu_select()
{ int c;
printf("\n\n\n \t\t※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf(" \t\t※※\t\t\t\t \t ※※\n");
printf(" \t\t※※\t ﹡题目:商品售后管理﹡\t ※※\n");
printf(" \t\t※※\t\t\t\t \t ※※");
printf(" \n\t\t※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t\t 欢迎使用本商品售后管理系统 \n");
printf("\t\t **************主菜单************\n");
printf("\t\t\t 1.新建商品维修记录\n");
printf("\t\t\t 2.查询商品维修记录\n");
printf("\t\t\t 3.修改商品维修记录\n");
printf("\t\t\t 4.插入商品维修记录\n");
printf("\t\t\t 5.删除商品维修记录\n");
printf("\t\t\t 6.显示全部商品维修记录信息\n");
printf("\t\t\t 7.保存商品维修记录\n");
printf("\t\t\t 8.显示本题目和主菜单\n");
printf("\t\t\t 0.退出\n");
printf("\t\t 使用本商品售后管理系统 \n");
printf("\t\t 指导老师:胡宁亚\n");
printf("\t\t T1223-9 00 : \n");
printf("\t\t 联系方式:(短号)\n");
printf("\t\t 所有 \n");
printf("\n 输入你的选择(0~8):\n");
scanf("%d",&c);
return c;
}
int selectmenu()
{ int c;
printf("\t\t 欢迎使用本商品售后管理系统 \n");
printf("\t\t**************查询菜单**************\n");
printf("\t\t\t 1.商品编号\n");
printf("\t\t\t 2.公司名称\n");
printf("\t\t\t 3.维修时间\n");
/* printf("\t\t\t 4.是否在维修期间\n");*/
printf("\t\t\t 0.退出\n");
printf("\n 输入你的选择(0~3):\n");
scanf("%d",&c);
return c;
}
void select()
{
while(1)
{
switch(selectmenu())
{
case 1:
system("cls");
searchRec();
printf("\n\t\t\t按任意键继续\n");
getch();
system("cls");
break;
case 2:
system("cls");
searchgongsi();
printf("\n\t\t\t按任意键继续\n");
getch();
system("cls");
break;
case 3:
system("cls");
searchweixiu();
printf("\n\t\t\t按任意键继续\n");
getch();
system("cls");
break;
case 4:
system("cls");
searchqijian();
printf("\n\t\t\t按任意键继续\n");
getch();
system("cls");
break;
case 0:
system("cls");
return ;
break;
}
}
}
/*从磁盘文件导入商品信息到存*/
void loadRec()
{ FILE *fp;
int n=0;
if((fp=fopen("c:\\1\\1.txt","r"))==NULL) /*打开文件*/
{ printf("文件不存在或无法打开!\n");
return;
}
head=p1=(struct product *)malloc(LEN); /*开辟一个新单元*/
p1->next =NULL;
while(!feof(fp))
{ n++;
fscanf(fp,"%s%lf%s%s%s", p1->num,&p1->maker,p1->name,p1->shi,p1->time);
if(p1->num[0]<'0'||p1->num[0]>'9') {n--;break;}
p2=(struct product *)malloc(LEN); /*开辟一个新单元*/
p1->next =p2;
p3=p1;
p1=p2;
p1->next =NULL;
}
free(p2);
p3->next=NULL;
printf("\n %d项信息输入完毕,按任意键返回......\n",n);
getchar();
system("cls"); /*清屏*/
writeinfo_flag=0; /*设置保存记录标志*/
if( fclose(fp) ) /* 关闭文件 */
{
printf( "Can not close the file!\n" );
exit(0);
}
}
void question()
{ system("cls");
printf("\n\n\n \t\t※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf(" \t\t※※\t\t\t\t \t ※※\n");
printf(" \t\t※※\t ﹡题目:商品售后管理﹡\t ※※\n");
printf(" \t\t※※\t\t\t\t \t ※※");
printf(" \n\t\t※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf(" 某售后服务站负责10个公司各10种产品的售后服务。 \n");
printf(" 产品信息包括产品编号,生产厂家,维修人编号 \n");
printf(" 1、新建商品维修记录 \n");
printf(" 2、查询商品维修记录 \n");
printf(" 3、修改商品维修记录 \n");
printf(" 4、插入商品维修记录 \n");
printf(" 5、删除商品维修记录 \n");
printf(" 6、显示一段时间商品维修记录信息 \n");
printf(" 7、显示本题目和主菜单 \n");
printf(" 8、显示本题目和主菜单 \n");
printf(" \n");
system("pause");
system("cls");
return;
}
/*新建商品维修记录*/
void createRec()
{ int n,i;
if(head!=0) { p3=head;
while( p3->next!=NULL)
p3=p3->next;
getchar();
printf("\n 维修数据库已存在,新建维修信息将接续在信息库的后面,按任意键继续......:\n");
getchar();
system("cls"); /*清屏*/
p3->next=p1=(struct product *)malloc(LEN); /*开辟一个新单元*/
}
else head=p1=(struct product *)malloc(LEN); /*开辟一个新单元*/
p1->next =NULL;
printf("\n\n 请输入希望建立的维修基本信息条数:\n");
do{ scanf("%d",&n);
if(n<1||n>10) printf("\n\n输入围有误,请重新输入希望建立的维修基本信息条数n(n<1&&n<10):\n");
}while(n<1||n>10);
printf("\n\n 请每行按产品编号(num<=2位) 经手人编号 公司名称(name<=10汉字) 是否在维修期 维修的时间的形式输入%d条维修记录:\n",n);
for(i=0;i<n;i++)
{
scanf("%s%lf%s%s%s", p1->num,&p1->maker,p1->name,p1->shi,p1->time);
p2=(struct product *)malloc(LEN); /*开辟一个新单元*/
p1->next =p2;
p3=p1;
p1=p2;
p1->next =NULL;
}
free(p2);
p3->next=NULL;
printf("\n %d项信息输入完毕,按任意键返回......\n",n);
getchar();
system("cls"); /*清屏*/
writeinfo_flag=1; /*清除保存记录标志*/
}
/*查询商品维修记录*/
void searchRec()
{
char num[10];
p1=head;
if(p1==NULL)
{ printf("\n\n维修信息数据库为空!!! \n");
printf("\n 按任意键返回......\n");
getch();
system("cls"); /*清屏*/
return ;
}
printf("\n\n 请输入产品号以便查证:\n");
scanf("%s",num);
while(p1!=NULL)
{ if(strcmp(p1->num,num )==0)
{ printf("\t该维修信息如下:\n\t 产品号:");
printf("%s\n",p1->num );
printf("\t 经手人编号:");
printf("%.0f\n",p1->maker );
printf("\t 公司名称:");
printf("%s\n",p1->name );
printf("\t 是否在维修期:");
printf("%s\n",p1->shi);
展开阅读全文