写这个的大体思路很简单,就是结构体,然后排序等等,由于是帮非计科类的同学写的,不让用stl库,于是就只能手动实现排序,如果可以用结构体排序代码量会少很多,也就几十行就可以。总之,比较基础,在期末考试周中写写代码找找感觉。
计算机软件技术基础(VC)
综合编程作业
一、题目:商品管理程序
二、目的与要求
目的
培养学生综合利用C++语言进行程序设计的能力,培养学生综合利用C++语言进行程序设计的能力,熟悉数组的操作,加强函数的运用,掌握典型算法的使用,提高软件系统分析能力和程序文档建立、归纳总结的能力。
基本要求
要求用C++语言编程,在Visual C++环境下调试完成;
要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;
要求提供操作菜单,以便用户进行选择;
应对程序添加必要的注释;
要求应用本课所讲授的程序设计语言知识来解决问题,使用教材前六章的内容来完成程序。
3.创新要求
在基本要求达到后,进行创新设计:
对程序功能进行拓展,使其更加实用。例如增加删除功能和插入功能,即找到指定商品后将其从原数组中删除;将新商品的信息按照商品代码升序的顺序插入到原数组中。
三、设计方法和基本原理
1.功能描述
编写一个简单的商品信息管理程序,主要完成商品的一些信息的计算,商品的排序、查询及显示功能。
问题详细描述
某商场的电器区有多种商品,每种商品包括以下信息:代码(整型),名称(字符串),总量(整型),单价(双精度),销售量(整型),库存量(=总量-销售量,整型),销售额(销售量*单价,双精度),例如目前有五种商品的基本信息,如表1所示。
要求在主函数中对各类商品的信息进行初始化,编写多个函数分别实现下列功能,而后在main函数中进行调用。
各个函数的功能描述为:
计算函数cal:计算各类商品的库存量及销售额。
排序函数sort1:按库存量升序排序,若库存量相同则按销售量升序排序,要求使用冒泡法排序。
排序函数sort2:按商品名称降序排序,要求使用选择法排序。
查询函数search:根据商品代码查找指定商品。若找到则返回该商品的下标,否则返回-1。
汇总函数total:计算并返回销售总额(所有商品的销售额的和)。
显示函数output:输出商品的信息。
显示菜单函数showMenu:显示菜单。
下面给出程序运行的部分界面:
程序首先计算库存量与销售额,而后显示菜单,提示用户输入数字1~6以进行对应操作,运行界面如图1所示。
若用户输入的菜单选项不满足要求(未在1~6范围内),则给出提示信息,提示用户重新输入,直到用户输入正确选项,运行界面如图2所示。
根据问题的描述,为实现程序的功能,可按照下述过程完成程序(仅供参考,可自行设计实现过程及方法):
在主函数中定义结构体数组存储五种商品的信息,并使用给出的数据对该数组进行初始化,而后调用cal函数进行计算。
为方便用户选择,应提供良好的操作界面供用户使用,根据不同的要求进入到对应的功能模块。执行完某个功能后,应重新显示菜单,因此可定义显示菜单函数showMenu,并将该函数的调用置于循环结构中。
为实现根据用户的不同输入(共6个)调用对应函数,应采用多分支结构,可使用switch语句或else if语句实现。为实现多次输入,应将将菜单的显示、用户对菜单选项的输入及各个功能模块的调用置于一个循环结构,当输入为6时,结束该循环。
输入待查找商品的代码,再调用查找函数search进行查找,若找到,调用output函数输出该商品的信息,否则输出未找到的提示信息。
四、主要技术问题的描述
根据三的分析与描述,主要问题在于:
结构体类型的构造(struct PRO)
为表示商品的完整信息,该类型应包括以下成员:代码(int code)、名称(char name[20]) ,总量(int amount) ,单价(double price),销售量(int sale1),商品的库存量(int stock),销售额(double sale2)。
函数的参数传递问题
由于该程序是对结构体数组的操作,因此使用传递地址的方法,并传递数组长度。以查找函数为例,该函数的原型说明语句为:int search(PRO s[],int n ,int x); ,即在长度为n的s数组中查找代码为x的商品,若找到,则返回该商品的下标,否则返回-1。形参分别表示结构体数组,数组长度及待查商品的代码。
查询后如何调用output函数只输出一种商品的信息
已知output函数的原型说明语句为: void output(PRO s[],int n); ,因此若要输出下标为k的一个商品的信息, 调用形式应为:output(s+k, 1); ,其中,s为结构体数组名,k为调用查询函数search后返回的商品下标,1表示输出商品的个数。
5
10120 HaierCon 2998 155 55
10564 IPodMP3 1250 245 32
11254 SegaHDisk 655 120 20
15826 IBMLapgtop 8188 80 15
18257 SontDigtC 3588 150 29
//
// main.cpp
// LCS
//
// Created by 陈冉飞 on 2019/6/21.
// Copyright © 2019 陈冉飞. All rights reserved.
//
//#include
#include
#include
using namespace std;
#define name_max_length 100
//宏定义最多的商品数
#define type_total_max 50
struct goods{
int code;
char name[name_max_length];
int num; //总量
double price;
int sold_num;
int remain_num;
double total;
};
//计算函数cal
void cal(goods g[],int type_total){
for (int i = 0; i<type_total; i++) {
g[i].remain_num = g[i].num - g[i].sold_num;
g[i].total = g[i].sold_num*g[i].price;
}
}
//排序函数1
void sort1(goods g[],int type_total){
int i,j,pos;
goods temgoods;
for(i = 0; i < type_total-1; i++)
{
pos = i;
for(j = i; j < type_total; j++)
{
if(g[pos].remain_num > g[j].remain_num){
pos = j;
}else if(g[pos].remain_num == g[j].remain_num){
if(g[pos].sold_num > g[i].sold_num){
pos = j;
}
}
}
if(pos != i)
{
temgoods = g[i];
g[i] = g[pos];
g[pos] = temgoods;
}
}
}
//排序函数2
void sort2(goods g[],int type_total){
int i,j,pos;
goods temgoods;
for(i = 0; i < type_total-1; i++)
{
pos = i;
for(j = i; j < type_total; j++)
{
if(strcmp(g[pos].name,g[j].name) < 0)
pos = j;
}
if(pos != i)
{
temgoods = g[i];
g[i] = g[pos];
g[pos] = temgoods;
}
}
}
//查询函数
int search(goods g[],int type_total,char temname[]){
for (int i = 0; i<type_total; i++) {
if (strcmp(g[i].name, temname) == 0) {
return i+1;
}
}
return -1;
}
//汇总函数
int total(goods g[],int type_total){
int sum = 0;
for (int i = 0; i<type_total; i++) {
sum+=g[i].total;
}
return sum;
}
//显示函数
void output(goods g[],int type_total){
cout<<" 代码 名称 单价 总量 销售量 库存量 销售额"<<endl;
for (int i = 0; i<type_total; i++) {
cout<<setw(10)<<g[i].code;
printf("%20s",g[i].name);
cout<<setw(10)<<g[i].price<<setw(10)<<g[i].num<<setw(10)<<g[i].sold_num<<setw(10)<<g[i].remain_num<<setw(10)<<g[i].total<<endl;
}
}
//显示菜单函数
void showMenu()
{
cout<<"******************************"<<endl;
cout<<"请输入1—6内的数字"<<endl;
cout<<"1 按照库存量升序排序"<<endl;
cout<<"2 按照商品名称降序排序"<<endl;
cout<<"3 查找指定代码的商品信息"<<endl;
cout<<"4 计算销售总额"<<endl;
cout<<"5 输出商品的信息"<<endl;
cout<<"6 结束"<<endl;
cout<<"******************************"<<endl;
}
int main(int argc, const char * argv[]) {
goods g[type_total_max] = {0};
int type_total;
cout<<"请输入商品种类总数"<<endl;
cin>>type_total;
//输入信息和计算库存量、销售额的部分
for (int i = 0; i<type_total; i++) {
//提示输入
cout<<"请依次输入商品代码、名称、总量、单价、销售量"<<endl;
cin>>g[i].code;
scanf("%s",g[i].name); //暂时还不能输入有空格的字符串
cin>>g[i].price>>g[i].num>>g[i].sold_num;
}
//调用cal来计算出库存量 销售额
cal(g, type_total);
//成绩管理系统开始
int target_num;
while (true) {
showMenu();
cout<<"请输入选项:"<<endl;
cin>>target_num;
if (target_num<=6&&target_num>=1) {
switch (target_num) {
case 4:
cout<<total(g, type_total)<<endl;
break;
case 5:
output(g, type_total);
break;
case 6:
return 0;
case 1:
sort1(g, type_total);
output(g, type_total);
break;
case 2:
sort2(g, type_total);
output(g, type_total);
break;
case 3:
char target_name[name_max_length];
cout<<"请输入你想查找的名称"<<endl;
scanf("%s",target_name);
int target =search(g,type_total,target_name);
cout<<" 代码 名称 单价 总量 销售量 库存量 销售额"<<endl;
cout<<setw(10)<<g[target].code;
printf("%20s",g[target].name);
cout<<setw(10)<<g[target].price<<setw(10)<<g[target].num<<setw(10);
cout<<g[target].sold_num<<setw(10)<<g[target].remain_num<<setw(10)<<g[target].total<<endl;
break;
}
}
else{
cout<<"输入错误,请输入1-6范围内的数字"<<endl;
}
}
return 0;
}
//
//5
//10120 HaierCon 2998 155 55
//10564 IPodMP3 1250 245 32
//11254 SegaHDisk 655 120 20
//15826 IBMLapgtop 8188 80 15
//18257 SontDigtC 3588 150 29
这个课设还有一点不足,就是在每个商品的名字的处理,无法处理空格,更改的话可以通过循环、getchar改一下。
//
// main.cpp
// ZSR
//
// Created by 陈冉飞 on 2019/6/21.
// Copyright © 2019 陈冉飞. All rights reserved.
//
//#include
#include
#include
using namespace std;
#define name_max_length 100
//宏定义最多的商品数
#define type_total_max 50
#define gender_max_length 10
struct goods{
int code;
char name[name_max_length];
char gender[gender_max_length];
float salary;
};
//排序函数1
int sort1(goods g[],int type_total){
int pos = 0,max_salary = -0xffffff;
for (int i = 0; i<type_total; i++) {
if (g[i].salary > max_salary) {
pos = i;
max_salary = g[i].salary;
}
}
return pos+1;
}
//排序函数2
int sort2(goods g[],int type_total){
int pos = 0,min_salary = 0xffffff;
for (int i = 0; i<type_total; i++) {
if (g[i].salary < min_salary) {
pos = i;
min_salary = g[i].salary;
}
}
return pos+1;
}
//查询函数
int search(goods g[],int type_total,char temname[]){
for (int i = 0; i<type_total; i++) {
if (strcmp(g[i].name, temname) == 0) {
return i+1;
}
}
return -1;
}
//汇总函数
int total(goods g[],int type_total){
int sum = 0;
for (int i = 0; i<type_total; i++) {
sum+=g[i].salary;
}
return sum;
}
//显示函数
void output(goods g[],int type_total){
cout<<" 工号 姓名 性别 月工资 "<<endl;
for (int i = 0; i<type_total; i++) {
cout<<setw(10)<<g[i].code;
printf("%20s",g[i].name);
printf("%10s",g[i].gender);
cout<<setw(10)<<g[i].salary<<endl;
}
}
//显示菜单函数
void showMenu()
{
cout<<"******************************"<<endl;
cout<<"请输入1—6内的数字"<<endl;
cout<<"1 显示所有职工的信息"<<endl;
cout<<"2 查找并输出月工资最高值"<<endl;
cout<<"3 查找并输出月工资最低值"<<endl;
cout<<"4 计算并输出所有职工月工资平均值"<<endl;
cout<<"5 查找并输出姓名为制定"<<endl;
cout<<"6 结束"<<endl;
cout<<"******************************"<<endl;
}
int main(int argc, const char * argv[]) {
//文件输入
// freopen("测试文档名字.txt", "r", stdin);
goods g[type_total_max] = {0};
int type_total;
cout<<"请输入工人总数"<<endl;
cin>>type_total;
//输入信息和计算库存量、销售额的部分
for (int i = 0; i<type_total; i++) {
//提示输入
cout<<"请依次输入工人工号、姓名、性别、月工资"<<endl;
cin>>g[i].code;
scanf("%s",g[i].name); //暂时还不能输入有空格的字符串
scanf("%s",g[i].gender);
cin>>g[i].salary;
}
//成绩管理系统开始
int target_num;
while (true) {
showMenu();
cout<<"请输入选项:"<<endl;
cin>>target_num;
if (target_num<=6&&target_num>=1) {
switch (target_num) {
case 6:
return 0;
case 1:
output(g, type_total);
break;
case 2:
cout<<"第"<<sort1(g, type_total)<<"个月工资最高"<<endl;
break;
case 3:
cout<<"第"<<sort2(g, type_total)<<"个月工资最低"<<endl;
break;
case 4:
cout<<total(g, type_total)/type_total<<endl;
break;
case 5:
char target_name[name_max_length];
cout<<"请输入你想查找的名称"<<endl;
scanf("%s",target_name);
int target = search(g,type_total,target_name);
cout<<" 工号 姓名 性别 月工资 "<<endl;
cout<<setw(10)<<g[target].code;
printf("%20s",g[target].name);
printf("%10s",g[target].gender);
cout<<setw(10)<<g[target].salary<<endl;
break;
}
}else{
cout<<"输入错误,请输入1-6范围内的数字"<<endl;
}
}
return 0;
}
6
2635 acb man 7862
2351 asiacjtg women 10923
7812 opaw women 3252
1234 saoiugr women 6880
2365 alsjdgaew men 9023
8971 oierr men 4772
这两个管理系统大同小异,都是结合结构体再写个排序,其他的都是一些基础语法的运用。