1.系统分析
1.1课程设计内容
1.2系统功能需求分析
1、问题定义
创建一个商品信息管理系统。假设系统中每件商品记录只包括编码、价格、商品名称等信息。程序的运行效果如下图所示,选择任意菜单后,实现相应功能。
在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2.系统设计
2.1总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
本商品管理系统要求采用数组实现,如图2.1所示,它由如下五大功能模块组成:
- 1.录入商品基本信息模块。完成将数据存入数组的工作。定义一个int型整型变量,该数组把首地址给menu-item指针变量,并调用page-title()函数输出“录入商品基本信息”这句话。商品信息记录由商品的编码、名字、价格构成。但录入商品基本信息时运用了for循环语句。录入商品的数量不能为空,否则跳出for循环。录入商品信息时,系统将商品信息存储在数组中,即void product-new()启到录入商品信息的作用。完成录入信息后,调用return-confirm()函数,提示是否继续,否则按任意键返回主页面。
- 2.修改商品基本信息模块。运用了条件判断语句if语句,在此商品信息管理系统中,完成了对商品信息记录的维护。将修改过的信息重新存入到源数据中。其中还调用了search-num()函数与之键入的商品信息作比较,即键入商品信息不能为空。
- 3.删除商品基本信息模块。定义一个int整型变量,再调用page-title函数输出“注销商品基本信息”这句话,再运用if选择结构语句,判断条件是输入的商品不能为空,条件成立即执行程序,将此商品信息从源数据中删除。其中调用了search-num()函数与之键入的商品信息作比较,判断键入的商品信息不能为空,成立既可以删除。
- 4.浏览商品基本信息模块。该模块运用了for循环结构语句,内嵌套if选择结构语句,调用search-num()函数与之键入商品信息作比较,即输入信息不能为空,否则跳出循环,成立即可浏览商品,最后并调用return-confirm()函数提示是否继续此模块,“否”按任意键返回主界面。
2.2详细设计
2.2.1数据结构设计
struct product //定义结构体数组
{
int num; //成员表列
float price;
char name[21];
}products[32]; //变量名表列
定义了一个结构体数组product,共有32个元素,product【0】~product【31】。每个数组元素都具有struct product类型。该数组各元素在内存中连续存放,占用一段连续的储存单元。
2.2.2主控流程
主函数:
void main()
{
system("color 0A");
menu: page_title(" 操作选单 ");
printf("请用数字键选择操作\n\n");
printf("1 录入商品基本信息\n2 修改商品基本信息\n");
printf("3 注销商品基本信息\n4 浏览商品");
printf(" 0 退出\n");
switch(getch())
{
case '1' : product_new();break;
case '2' : product_edit();break;
case '3' : product_del();break;
case '4' : browser();break;
case '0' : exit(0);
}
goto menu; //跳转到指定的位置,即主页面
}
主函数运用了函数为空类型(void):利用选择结构(switch)实现在主函数中的调用各个子函数,利用goto函数实现返回主菜单的循环。menu只是一个标号。switch(getch())也可以定义为:
scanf(“%d”,&c);
switch(c);
调用system子函数,其中“color 0A”即可改变背景的颜色和字体的颜色。此外,主函数也调用了page-title()函数输出“操作选单”这句话。
2.2.3录入商品基本信息模块
子函数:
(1). 录入商品信息函数
Void product-new();
{
int n;
page_title("录入商品基本信息");
printf("编号-名字-价格\n");
for(n=0;n<32;n++)
if(products[n].num==0) break;
printf("编号:");
scanf("%d",&products[n].num);
printf("名字:");
scanf("%s",&products[n].name);
printf("价格:");
scanf("%f",&products[n].price);
return_confirm();
}
定义一个整型变量n,n既是商品信息总数也是循环变量,确定新的库存量定义为n<32,输入的商品信息,用for循环语句直到输入商品的库存量大于等于32,结束循环。
录入商品基本信息 For(n=0;n<32;n++) 将数据存入到成员表列
Return-confirm() |
(2).删除商品信息函数
void product_del()
{
int n;
page_title("注销商品基本信息");
if((n=search_num())!=0) products[n].num=0;
printf("\n!该商品已注销.\n");
return_confirm();
}
定义一个整型变量n,调用page-title输出“注销商品基本信息”这句话,运用if选择结构语句,判断条件是输入商品信息不能为空,即调用search-num()函数与之比较,条件成立即可注销该商品。
注销商品基本信息 If(n=search-num()!=0)
Products【n】.num=0;
该数据已从成员表列中删除 |
(3).编辑商品信息函数
void product_edit()
{
int n;
page_title("编辑商品基本信息");
if((n=search_num())!=0)
{
printf("\n请重新输入新信息:\n编号:");
scanf("%d",&products[n].num);
printf("名字:");
scanf("%s",&products[n].name);
printf("价格:");
scanf("%f",&products[n].price);
}
return_confirm();
}
定义一个整型变量n,调用page-title输出“编辑商品基本信息”这句话,运用if选择结构语句,判断条件是输入商品信息不能为空,即调用search-num()函数与之比较,条件成立即可重新编辑该商品信息。最后调用return-confirm()函数,提示是否继续此模块,“否”按任意键返回主界面。
编辑商品基本信息 If(n=search-num()!=0)
请重新输入新信息: 编号: 名称: 价格: Return-confirm() |
(4).浏览商品信息函数
void browser()
{int n,i;
system("CLS");//清屏
printf("商品列表:\n");
for(i=0;i<32;i++)
{
if((n=search_num())!=0);break;
}
return_confirm();
}
定义两个整型变量n,i;其中i是商品信息录入量。运用system函数起到清屏的作用。再运用格式化输出函数printf,原样输出“商品表列”这句话,再运用for循环控制结构查询商品信息,商品信息库存量最大不能超过32,内嵌套一个if选择结构语句,调用
search-num() 这个函数与输入信息作比较,两者是否相等,不相等说明输入信息有误查找不到此类商品。
(5).其他子函数功能描述
- Void page-title(char *menu-item)
定义一个叫page-title的函数,其形参定义为一个指针变量menu-item。其中void是函数类型,page-titile是函数名,括号里面char参数类型,menu-item是参数名。Printf是原样输出括号里面的内容,其中“>”“<”是普通字符原样输出,“%s”是格式控制,“menu-item”是指针变量。这是一个显示页眉的函数,同时通过参数menu-item指针变量,输出指针所指向的内容,即可以显示当前的状态。这个函数的作用是在下一页执行指定的操作。
- Void return-confirm()
定义一个叫return-confirm的函数,其作用是提示是否继续执行当前任务,不继续可以按任意键返回到主页面。 System函数其存放在#include“Windows.h”函数库当中。
- Intsearch-num()
定义一个叫search-num的函数,其功能是查找商品。其 通过商品的编号进行查找。首先定义两个整型变量n、i,运用for循环语句,确定库存量定义为n<32,内嵌套一个if选择结构语句,判断输入的商品信息与库存量商品信息是否一致以及输入商品不能为空,条件成立即可输出商品的编号、名称、价格,若条件不成立即会输出一句话“输入错误或编号不存在”。
3.系统编码设计
3.1编码
3.1.1程序预处理
注:包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。
#include "stdio.h" /*标准输入输出函数库*/
#include "stdlib.h" /*标准函数库*/
#include "string.h" /*字符串函数库*/
#include "conio.h" /*屏幕操作函数库*/
#include"windows.h" //存放清屏、改变字体颜色等函数//
struct product //定义结构体数组
{
int num; //成员表列
float price;
char name[21];
}products[32]; //变量名表列
void page_title(char *menu_item) // 定义一个页眉函数
system("CLS"); 调用DOS命令,清屏
printf(">>> 商品管理系统 <<<\n\n- %s -\n\n",menu_item);
}
void return_confirm() //按任意键返回
{
printf("\n按任意键返回\n");
getch();
system("CLS"); //调用DOS命令,清屏
}
void product_new() //录入信息函数
{
int n;
page_title("录入商品基本信息");
printf("编号-名字-价格\n");
for(n=0;n<32;n++)
if(products[n].num==0) break;
printf("编号:");
scanf("%d",&products[n].num);
printf("名字:");
scanf("%s",&products[n].name);
printf("价格:");
scanf("%f",&products[n].price);
return_confirm();
}
int search_num() //定义一个查找信息函数
{
int n,i;
printf("请输入商品编号:");
scanf("%d",&i);
system("CLS"); 调用DOS命令,清屏
for(n=0;n<32;n++)
{
if(products[n].num==i&&products[n].num!=0)
{
printf("编号:%d\n",products[n].num);
printf("名字:%s\n",products[n].name);
printf("价格:%f\n",products[n].price);
return n;
}
}
printf("\n输入错误或编号不存在.\n");
return 0;
}
void product_del() //删除信息函数
{
int n;
page_title("注销商品基本信息");
if((n=search_num())!=-1) products[n].num=0;
printf("\n!该商品已注销.\n");
return_confirm(); //按任意键返回
}
void product_edit() //编辑信息函数
{
int n;
page_title("编辑商品基本信息");
if((n=search_num())!=-1)
{
printf("\n请重新输入新信息:\n编号:");
scanf("%d",&products[n].num);
printf("名字:");
scanf("%s",&products[n].name);
printf("价格:");
scanf("%f",&products[n].price);
}
return_confirm(); //按任意键返回
}
void browser() //浏览信息函数
{int n,i;
system("CLS"); //调用DOS命令,清屏
printf("商品列表:\n");
for(i=0;i<32;i++)
{
if((n=search_num())!=-1);break;
}
return_confirm(); //按任意键返回
}
void main() //主函数
{
system("color 0A"); //设置界面以及字体颜色
menu: page_title(" 操作选单 ");
printf("请用数字键选择操作\n\n");
printf("1 录入商品基本信息\n2 修改商品基本信息\n");
printf("3 注销商品基本信息\n4 浏览商品");
printf(" 0 退出\n");
switch(getch())
{
case '1' : product_new();break;
case '2' : product_edit();break;
case '3' : product_del();break;
case '4' : browser();break;
case '0' : exit(0);
}
goto menu; //跳转到指定位置
}
3.2测试与调试
一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行认真仔细的测试与调试。
测试是通过运行程序发现错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句顺序颠倒、多加“;”或少加“{}”等等。调试则是确定测试中找到的错误性质并改正错误的过程。测试与调试通常交替进行,即测试——调试——再测试——再调试。
3.2.1主菜单运行如下:
输入0~4其中任何一个数字键选择指定的操作,如按“1”,即可进入到“录入商品基本信息”界面。
输入商品基本信息,编号、名字、价格。如下所示:
输入完商品基本信息后可按任意键返回。其录入商品信息存在成员表列。按“2”即可进入“修改商品基本信息”界面。输入要修改的商品编号即可修改商品。
重新输入修改商品的信息
修改完成后可以按任意键返回。返回主界面,按“3”可以进入“注销商品信息”界面中。输入你要注销的商品编号,如图所示:
输入编码正确即该商品被注销。
如果输入编码不正确,就会显示如下:
回到主界面后,按“4”即可进入到“浏览商品信息界面”中。显示如下:
输入你要浏览的商品编号,就可以查看商品的编码、名称、价格。
浏览完成可以按任意键返回主界面。
按“0”即退出系统。
3.3系统维护
经测试与调试确认软件无错时,开发就告一段落,这时可以交付软件供用户使用,但是在软件的使用过程中还会面临更加漫长的工作,即软件维护。一般维护的工作有:更改使用中发现的错误;为适应实际环境而对程序进行修改;为满足新的需求而对程序作必要的改进等等。
4.归纳与总结
4.1开发经验
通过对本题目的开发,体会到要掌握以下几点内容。
- 遵循自顶向下的设计方法,逐步求精得程序设计方法。
- 结构化程序设计是在进行以模块功能和处理过程设计为主的详细设计时应遵循的方法和原则。
- 编写主函数,并进行测试与调试。当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。C语言提供丰富的库函数,编程序时要善于使用库函数,避免不必要的劳动。
- 定义函数时,应选好参数的个数和数据类型。
需要源程序可以在我的资源里下载
需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。
纷传 点击用微信打开即可,过程有点繁琐请见谅。