软件工程实践报告

 -

 软件工程实践报告 设计题目:

 商品销售统计

  学校:

  南昌航空大学

 班级:

  姓名:

 学号:

 指导老师:

 邱天

 完成日期:

 2014 年 2 月 19 日

 -

  摘要

  商品销售统计系统程序设计利用计算机技术,使得企业生产、库存和销售能够有利结合起来,提高企业的效率和效益。

 利用该系统可以为决策者和管理者及时掌握时常动态和企业的生产状况,以及对员工销售额的统计。

 销售统计系统是一个商品企业单位不可缺少的部分,它的内容对于公司的决策者和管理者来说都至关重要,所以销售统计系统应该能够为管理人员提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点。随着科学技术的不断提高,计算机科学 日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。

 作为计算机应用的一部分,使用计算机对员工信息及业绩进行管理,具有手工管理所无法比拟的优点。

 关键字 :计算机技术、提高效益、日渐成熟、不可或缺。

 -

  目录

 第一章、 课设设计目的与要求

 ................................ .........

 1 1 1.1

 目的与要求 ................................................. 2 第二章、 课题介绍 ------ 商品销售系统

 ................................. .

 3 3 2.1 课设题目 ................................................... 3 2.2

  任务和要求 ................................................ 3 第三章、 算法的设计

 ................................. .

 错误!未定义书签。

 3.1 本程序的流程图 .............................................. 5 3.2 算法的思路 .................................................. 5 第四章、 详细设计与调试

 ................................ .............

 8 8 4.1 系统界面管理 ................................................ 8 4.2 商品管理界面 ................................................ 8 4.3 商品管理各功能的实现 ........................................ 9 4.3.1 商品的添加............................................. 9 4.3.2 商品的删除............................................. 9 4.3.3 商品的查找............................................ 10 4.3.4 商品的显示............................................ 10 4.4 购物功能的实现 ............................................. 11 第五章、 调试手册与测试数据

 ................................ ........

 12 5.1 调试手册 ................................................... 12 5.2 测试数据 ................................................... 12 第六章 实验心得与体会.............................................. 13 附录一............................................................. 14 附录二............................................................. 21

 -

  前

 言

  近年来,随着商品销售市场的不断扩大,有关商品的各种信息量也成倍增加,面对着庞大的信息量,传统的人工方式管理会导致商品销售管理上的混乱,人力与物力过多浪费,用于支付职员的工资不断增加,从而使各大商品经销商的负担过重,影响整个销售部门的运作和控制管理,因此,必须制定一套合理、有效,规范和实用的商品销售管理系统,对欲要销售的商品进行集中统一的管理。本系统开发的总设计目标是实现商品经销商对商品的系统化、规范化和自动化管理,实现对所经销商品的集中统一管理。

 - 欢迎下载 第一章 课设设计目的与要求 1.1 目的

  《Visual C++面向对象与可视化程序设计》是计算机专业一门重要的专业基础课。此次课程设计的目的是以程序设计语言为基础,通过完成一些具有一定难度的课程设计题目的编写、调试、运行工作,进一步掌握面向过程和面向对象程序设计的基本方法和编程技巧,巩固所学理论知识,使理论与实际相结合。从而提高自我分析问题、解决问题的能力。通过课程设计,学生在下述各方面的能力应该得到锻炼:

 (1)进一步巩固、加深学生所学专业课程《Visual C++面向对象与可视化程序设计》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。

 (2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。

 (3)利用所学知识,开发小型应用系统,掌握运用 C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。

 (4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。

  (5)掌握面向对象的程序设计方法。

 (6)进一步掌握在集成环境下如何调试程序、修改程序和程序的测试。

 - 欢迎下载 1.2

 要求 从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:

 1)

 根据实现的功能,划分出合理的对象类,明确对象类间的关系。

 2)利用所学知识,开发小型应用系统,掌握运用 C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。

 3)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。

 4) 为每个对象类设计正确的域和方法,为每个方法设计合理的方法体。同时,为对象类及内部的域和方法运用正确的修饰符,如访问控制符等。

 5)编程简练,程序功能齐全,能正确运行。

 6)进一步掌握在集成环境下如何调试程序、修改程序和程序的测试。

 - 欢迎下载 第二章

 课题介绍 ------ 商品销售系统

 2.1 课设题目 编写商品销售统计程序,商品的信息有:商品的名称,计量单位(重量或件),单价。所有商品的信息事先已存入计算机,屏幕上显示所有商品的名称,选择商品名,输入商品计量单位(如重量,件数等),根据单价算出总价。客户一次购物可能购买多种商品,程序应计算出客户应付的钱款数。

 2.2

  任务和要求 程序分为两个部分:第一部分用于输入商品的信息并允许修改和删除;第二部分实现销售统计。程序运行时由用户选择进入哪一部分功能,并能在运行时在两部分之间切换。第二部分运行时,首先显示所有商品名称及代码(商品数目较多时,应考虑分屏显示),用户输入商品代码及商品重量或件数,用户一次操作可输入若干商品的购买信息,然后输入一个特殊的代码(如-1)表示本次购物结束。此时。程序计算出应付钱款数并显示。

 测试数据:

 程序应输入不少于 10 种商品的信息,并进行模拟运行。

 实现提示:

 本程序的商品信息管理可采用既定义一个商品类,每种商品作为商品类的实例(对象)存储在链表节点中的数据结构。

 - 欢迎下载 2.3

 问题分析 :

  按照要求这个程序的编写要求,由于包含多种实现要求,所以在编写时需要多个实现函数,这样就要定义一个类或机构体来统筹各个函数以及用链表或指针数组来储存输入的常量数据,并且在各个转换点设置相应的提示语句使整个程序便于操作。在修改数据的函数实现时,由于一个商品包含多个变量,要想在修改某一个数据后而不影响其他的数据,所以就必须要有一个 switch 语句;在商品信息显示函数的实现时,由于中间要有一个购买函数的实现,所以商品数量会随着商品的购买而减少,所以要将购买的数量另外定义一个变量。关于switch 语句的运用在这个程序这可能要多次使用,主要在一个函数拥有多个变量或变量函数。

 - 欢迎下载 第三章 算法的设计

 3.1 本程序的流程图

 结束

 3.2 算法的思路 3.2.1 定义一个结构体,该结构体用来存放商品的代码,名称等信息:

 struct shangpin {int number; char name[30]; float weight; float price; 输入产品编号或 产品名称

 判断编号或名称

  添加、删除、查询、排序 显示、保存、汇总、计算

 结束 开始

 - 欢迎下载 shangpin *next; };

  3.2.2 定义 list 链表类,用来动态的存放商品的信息:

 class list {

 //定义链表类

  shangpin *elems;

 public:

 list() {elems=0;}

 ~list();

 virtual bool insert();

  void insert1(shangpin *pr,float wgt);//此虚函数在派生类中可重新定义

  bool insert2();

 virtual bool deletes(int); //此虚函数在派生类中可重新定义

 bool contain(int); //定义重载的构造函数

  bool contain1(int);

  shangpin *chazhao(int);

 void print();

  void print1();

  void shanchu(); };

 - 欢迎下载 3.2.3 定义 list 的派生类 set 类,用来对商品进行操作:

 class set:public list {

  int card;//将集合类 set 定义为链表类 list 的派生类

  struct shangpin shp;

 public:

 set() {}

 bool insert();

 //重定义此函数

 bool deletes(int); //重定义此函数 };

 - 欢迎下载 第四章 详细设计与调试 采用 C++6.0 作为开发工具,用面向对象编程,对所要处理的商品信息进行存储,分别调用各个功能函数来处理。

 4.1 系统界面管理 void inr() { cout<<endl; cout<<"****************************************************************"<<endl; cout<<"

 欢迎进入商店系统,请选择相应的功能,如 按 1 键,进行商品管理操作"<<endl; cout<<"

 1 :商品管理 "<<"

  "<<"2 :购物"<<endl; cout<<"

 a :退出"<<endl; cout<<"****************************************************************"<<endl;

 4.2 商品管理界面 void ini() { cout<<endl; cout<<"****************************************************************"<<endl; cout<<"

 欢迎进入商品管理系统,请选择相应的功能,如 按 1 键,进行添加操作"<<endl; cout<<"

 1 :添加 "<<"

  "<<"2 :删徐 "<<endl; cout<<"

 3 :查找"<<"

 "<<"4 :显示 "<<endl; cout<<"

 q :退出"<<endl; cout<<"****************************************************************"<<endl; cout<<"请选择:"; }

 - 欢迎下载 4.3 商品管理各功能的实现 4.3.1 商品的添加 bool list::insert()

  //定义 list 类中插入元素的成员函数 {int num;cout<<"请再次输入商品的代码"<<endl; cin>>num;

  shangpin *elem=new shangpin;

 //为新元素分配存储

  if (elem!=0) {

  elem->number=num;

 cout<<"请输入商品的名称"<<endl;

 cin>>elem->name;

 cout<<"请输入商品的价格(单位:元)"<<endl;

 cin>>elem->price;//将新元素插入到链表头

  elem->next=elems;

  elems=elem;

  return true;

  }

  else return false; } 4.3.2 商品的删除 bool list::deletes(int number)

  //定义 list 类中删除元素的成员函数 {

  if(elems==0) return false;

 //若表为空,返回 false

  shangpin *tmp=elems;

  if(elems->number==number)

  {

  //若待删除的元素为表头元素

  elems=elems->next;

  delete tmp;

  return true;

  }

  else

  for(shangpin *elem=elems; elem->next!=0; elem=elem->next)

  if(elem->next->number==number)

  {

  //循环查找待删除元素

 tmp=elem->next;

 elem->next=tmp->next;

 delete tmp;

 return true;

  }

 - 欢迎下载

  return false; }

 4.3.3 商品的查找 bool list::contain1(int number) {

 if(elems==0){cout<<"没有此商品"<<endl;return false;}

 if(elems->number==number){cout<<"商品代码:"<<elems->number<<"商品名称:"<<elems->name<<"商品价格:"<<elems->price<<endl; return true;}

  else

  for(shangpin *elem=elems; elem->next!=0; elem=elem->next)

  if(elem->next->number==number){

 cout<<" 商 品 代 码 :

 "<<elem->next->number<<" 商 品 名 称 :"<<elem->next->name<<"商品的价格:"<<elem->next->price<<"元"<<endl;

 return true;}

  cout<<"没有此商品"<<endl;

  return false; }

 4.3.4 商品的显示 void list::print()

  //输出链表中各元素 {

  if(elems==0) return;

  for(shangpin *elem=elems; elem!=0; elem=elem->next)

  cout<<" 商 品 代 码 :

 "<<elem->number<<"

 "<<" 商 品 名 称 :"<<elem->name<<"

 "<<"商品价格:"<<elem->price<<"元"<<endl;

  cout<<endl; } void list::print1()

  //输出链表中各元素 {

  if(elems==0) return;

  for(shangpin *elem=elems; elem!=0; elem=elem->next)

  cout<<" 商 品 代 码 :

 "<<elem->number<<"

 "<<" 商 品 名 称 :"<<elem->name<<"

 "<<"商品价格:"<<elem->price<<"元"<<"商品的重量或件数:"<<elem->weight<<endl;

  cout<<endl; }

 - 欢迎下载 4.4 购物功能的实现 cout<<"请输入你所要购买的商品的代码"<<endl;

  cin>>num4;

  cout<<"请输入你要购买的件数或重量"<<endl;

  cin>>weight;

  shangpin *p;

  p=ptr->chazhao(num4);

  ptr1->insert1(p,weight);

  zonge=zonge+(p->price)*weight;

  cout<<"是否购物完毕?"<<endl;

  cout<<"如果购物完毕,请输入** b **结束购物"<<endl;

 cout<<"如果继续购物,请随机输入一个字符,但不要输入**b**或**B**"<<endl;

  cin>>ch2;}

  cout<<"你购买的商品清单如下:"<<endl;

  ptr1->print1();

  ptr1->shanchu();

  cout<<"你所要支付的总金额为:"<<zonge<<endl;

  zonge=0;

 - 欢迎下载 第五章 调试手册与测试数据 5.1 调试手册 (1)、error C2143: syntax error : missing ";" before "}"行 246 少了一个分号 (2)、error C2562: "main" : "void" function returning a value空类型不能有返回值 (3)、error C2679: binary "<<" : no operator defined which takes a right-hand operand of type "" (or there is no acceptable conversion)

  t[i].getName 后面少了() 5.2 测试数据:

 进入演示程序后,即显示对话形式的提示操作过程:

 - 欢迎下载 第六章 实验心得与体会 c++课程设计在基本知识上由老师引导,自己很多都靠自学,不明白的问老师,但由此自学能力得到了很大的培养。在设计过程中,我感觉到一点:程序是不能一气呵成的,至少一气呵成的程序不会尽善尽美,程序编写要一步一步的完成。

 首先,对于要编写的程序要有一个总体思想,要明确想要什么,只要把思想理顺清楚了,如此才能够把程序分割成几个模块,即多个函数,一块一块的编写,然后将分散的函数用另外的函数链接起来或者用 main 函数链接。到了这一步,程序的框架也就完成了,之后就是调试查错误以及修改了。为了让自己的程序更加的美观和更加的简洁,最后我们还得对程序再进行进一步的修改,优化程序的阶段是很重要的。

 - 欢迎下载 附录一 源程序:

 #include<iostream.h> #include <conio.h> struct shangpin {int number; char name[30]; float weight; float price; shangpin *next; }; class list {

 //定义链表类

  shangpin *elems;

 public:

 list() {elems=0;}

 ~list();

 virtual bool insert();

  void insert1(shangpin *pr,float wgt);//此虚函数在派生类中可重新定义

  bool insert2();

 virtual bool deletes(int); //此虚函数在派生类中可重新定义

 bool contain(int);

  bool contain1(int);

  shangpin *chazhao(int);

 void print();

  void print1();

  void shanchu(); }; class set:public list {

  int card;//将集合类 set 定义为链表类 list 的派生类

  struct shangpin shp;

 public:

 set() {}

 bool insert();

 //重定义此函数

 bool deletes(int); //重定义此函数 };

 shangpin *list::chazhao(int number) {

  //若表为空,返回 false

  shangpin *tmp=elems;

  if(elems->number==number)

  //若待删除的元素为表头

 - 欢迎下载 元素

  return tmp;

  else

  for(shangpin *elem=elems; elem->next!=0; elem=elem->next)

  if(elem->next->number==number)

  {

  //循环查找待删除元素

 tmp=elem->next;

 return tmp;

  } } void list::shanchu() {

  shangpin *tmp=elems;

  for(shangpin *elem=elems; elem!=0;)

  {

  tmp=elem;

  elem=elem->next;

  delete tmp;

  } } list::~list()

 //list 类得析构函数定义,循环释放各元素所占的存储 {

  shangpin *tmp=elems;

  for(shangpin *elem=elems; elem!=0;)

  {

  tmp=elem;

  elem=elem->next;

  delete tmp;

  } } void list::insert1(shangpin *pr,float wgt) { shangpin *elem=new shangpin;

 //为新元素分配存储

  if (elem!=0) {

  elem->number=pr->number;

 int i;

 for(i=0;i<30;i++)

 elem->name[i]=pr->name[i];

 elem->weight=wgt;

 elem->price=pr->price;//将新元素插入到链表头

  elem->next=elems;

  elems=elem;

  } }

 - 欢迎下载 bool list::insert2() {

 int num; cin>>num;

  shangpin *elem=new shangpin;

 //为新元素分配存储

  if (elem!=0) {

  elem->number=num;

  elem->next=elems;

  elems=elem;

  return true;

  }

  else return false; } bool list::insert()

  //定义 list 类中插入元素的成员函数 {int num;cout<<"请再次输入商品的代码"<<endl; cin>>num;

  shangpin *elem=new shangpin;

 //为新元素分配存储

  if (elem!=0) {

  elem->number=num;

 cout<<"请输入商品的名称"<<endl;

 cin>>elem->name;

 cout<<"请输入商品的价格(单位:元)"<<endl;

 cin>>elem->price;//将新元素插入到链表头

  elem->next=elems;

  elems=elem;

  return true;

  }

  else return false; }

 bool list::deletes(int number)

  //定义 list 类中删除元素的成员函数 {

  if(elems==0) return false;

 //若表为空,返回 false

  shangpin *tmp=elems;

  if(elems->number==number)

  {

  //若待删除的元素为表头元素

  elems=elems->next;

  delete tmp;

  return true;

  }

  else

  for(shangpin *elem=elems; elem->next!=0; elem=elem->next)

  if(elem->next->number==number)

  {

  //循环查找待删除元素

 - 欢迎下载

 tmp=elem->next;

 elem->next=tmp->next;

 delete tmp;

 return true;

  }

  return false; } bool list::contain(int number) {

  //判元素 val 在链表中是否存在

 if(elems==0)return false;

  if(elems->number==number) return true;

  else

  for(shangpin *elem=elems; elem->next!=0; elem=elem->next)

  if(elem->next->number==number)

  return true;

  return false; } bool list::contain1(int number) {

 if(elems==0){cout<<"没有此商品"<<endl;return false;}

 if(elems->number==number){cout<<"商品代码:"<<elems->number<<"商品名称:"<<elems->name<<"商品价格:"<<elems->price<<endl; return true;}

  else

  for(shangpin *elem=elems; elem->next!=0; elem=elem->next)

  if(elem->next->number==number){

 cout<<" 商 品 代 码 :

 "<<elem->next->number<<" 商 品 名 称 :"<<elem->next->name<<"商品的价格:"<<elem->next->price<<"元"<<endl;

 return true;}

  cout<<"没有此商品"<<endl;

  return false; } void list::print()

  //输出链表中各元素 {

  if(elems==0) return;

  for(shangpin *elem=elems; elem!=0; elem=elem->next)

  cout<<" 商 品 代 码 :

 "<<elem->number<<"

 "<<" 商 品 名 称 :"<<elem->name<<"

 "<<"商品价格:"<<elem->price<<"元"<<endl;

  cout<<endl; } void list::print1()

  //输出链表中各元素 {

  if(elems==0) return;

  for(shangpin *elem=elems; elem!=0; elem=elem->next)

  cout<<" 商 品 代 码 :

 "<<elem->number<<"

 "<<" 商 品 名 称 :

 - 欢迎下载 "<<elem->name<<"

 "<<"商品价格:"<<elem->price<<"元"<<"商品的重量或件数:"<<elem->weight<<endl;

  cout<<endl; } bool set::insert()

 //在 set 类中的 insert 的重定义版本 {int num1; cout<<"请输入商品代码"<<endl; cin>>num1;

  if(list::contain(num1)==false&&list::insert())

  {

  //先判断此元素是否存在,然后再调用基类的此函数版本

  ++card;

  return true;

  }

  return false; } bool set::deletes(int number) //在 set 类中的 deletes 的重定义版本 {

  if(list::deletes(number))

 //调用基类中的此函数版本

  {

 card--;

 return true;

  }

  return false; } void ini() { cout<<endl; cout<<"****************************************************************"<<endl; cout<<"

 欢迎进入商品管理系统,请选择相应的功能,如 按 1 键,进行添加操作"<<endl; cout<<"

 1 :添加 "<<"

  "<<"2 :删徐 "<<endl; cout<<"

 3 :查找"<<"

 "<<"4 :显示 "<<endl; cout<<"

 q :退出"<<endl; cout<<"****************************************************************"<<endl; cout<<"请选择:"; } void inr() { cout<<endl; cout<<"****************************************************************"<<endl; cout<<"

 欢迎进入商店系统,请选择相应的功能,如 按 1 键,进行商品管理操作"<<endl; cout<<"

 1 :商品管理 "<<"

  "<<"2 :购物"<<endl; cout<<"

 a :退出"<<endl;

 - 欢迎下载 cout<<"****************************************************************"<<endl; cout<<"请选择:"; } void main() { list *ptr;

  set set1; ptr=&set1;

  list *ptr1;

  set set2;

 ptr1=&set2;

 char ch1;char ch; float zonge=0; inr(); cin>>ch1; while(ch1!="a"&&ch1!="a") {

 switch(ch1)

 {case "1":

 ini();

 cin>>ch;

 while(ch!="q"&&ch!="Q")

 {

 switch( ch)

  {

 case "1":ptr->insert(); break;

  case "2":int num2;cout<<" 请 输 入 你 所 需 要 删 除 的 商 品 代 码"<<endl;cin>>num2;

 ptr->deletes(num2);

  break;

  case "3":cout<<" 请 输 入 你 所 要 查 找 的 商 品 的 代 码 "<<endl;int num3;cin>>num3;ptr->contain1(num3);break;

  case "4":ptr->print();break;

  case "q":;

  }

  ini();

  cin>>ch;

 }break;

 case "2":

  ptr->print();

  char ch2;

  while(ch2!="b"&&ch2!="B")

  {int num4;float weight;

 - 欢迎下载

  cout<<"请输入你所要购买的商品的代码"<<endl;

  cin>>num4;

  cout<<"请输入你要购买的件数或重量"<<endl;

  cin>>weight;

  shangpin *p;

  p=ptr->chazhao(num4);

  ptr1->insert1(p,weight);

  zonge=zonge+(p->price)*weight;

  cout<<"是否购物完毕?"<<endl;

  cout<<"如果购物完毕,请输入** b **结束购物"<<endl;

 cout<<"如果继续购物,请随机输入一个字符,但不要输入**b**或**B**"<<endl;

  cin>>ch2;}

  cout<<"你购买的商品清单如下:"<<endl;

  ptr1->print1();

  ptr1->shanchu();

  cout<<"你所要支付的总金额为:"<<zonge<<endl;

  zonge=0;

 break;

 case "a":;

 }

 inr();

 cin>>ch1; }

 }

 - 欢迎下载 附录二 参考文献 [1].黄维通 贾续涵编著《Vissual C++面向对象与可视化程序设计(第三版)》北京:清华大学出版社 [2].严蔚敏 吴伟明 编著《数据结构(C 语言版)》北京:清华大学出版社 [3] 何鹏飞. Delphi7 程序设计教程.北京:清华大学出版社,2003. [4] 张玉起.仓库物流管理数据库系统设计.北京:今日科苑,2007年 14 期,起止页码:149-150