C语言课程设计——实现简单的管理系统

写这个的大体思路很简单,就是结构体,然后排序等等,由于是帮非计科类的同学写的,不让用stl库,于是就只能手动实现排序,如果可以用结构体排序代码量会少很多,也就几十行就可以。总之,比较基础,在期末考试周中写写代码找找感觉。

C++管理系统实现

商品管理系统

题干信息

1.功能描述
编写一个简单的商品信息管理程序,主要完成商品的一些信息的计算,商品的排序、查询及显示功能。
问题详细描述
某商场的电器区有多种商品,每种商品包括以下信息:代码(整型),名称(字符串),总量(整型),单价(双精度),销售量(整型),库存量(=总量-销售量,整型),销售额(销售量*单价,双精度),例如目前有五种商品的基本信息,如表1所示。

在这里插入图片描述

要求在主函数中对各类商品的信息进行初始化,编写多个函数分别实现下列功能,而后在main函数中进行调用。
各个函数的功能描述为:
计算函数cal:计算各类商品的库存量及销售额。
排序函数sort1:按库存量升序排序,若库存量相同则按销售量升序排序,要求使用冒泡法排序。
排序函数sort2:按商品名称降序排序,要求使用选择法排序。
查询函数search:根据商品代码查找指定商品。若找到则返回该商品的下标,否则返回-1。
汇总函数total:计算并返回销售总额(所有商品的销售额的和)。
显示函数output:输出商品的信息。
显示菜单函数showMenu:显示菜单。

全部代码
//
//  main.cpp
//  LCS
//
//  Created by 陈冉飞 on 2019/6/21.
//  Copyright © 2019 陈冉飞. All rights reserved.
//

//#include <bits/stdc++.h>
#include<iostream>
#include<iomanip>
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

运行结果要求

下面给出程序运行的部分界面:
程序首先计算库存量与销售额,而后显示菜单,提示用户输入数字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

运行结果

在这里插入图片描述
这个课设还有一点不足,就是在每个商品的名字的处理,无法处理空格,更改的话可以通过循环、getchar改一下。

职工工资信息管理系统

题干信息

在这里插入图片描述

代码
//
//  main.cpp
//  ZSR
//
//  Created by 陈冉飞 on 2019/6/21.
//  Copyright © 2019 陈冉飞. All rights reserved.
//

//#include <bits/stdc++.h>
#include<iostream>
#include<iomanip>
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

运行结果

在这里插入图片描述

总结

这两个管理系统大同小异,都是结合结构体再写个排序,其他的都是一些基础语法的运用。

  • 21
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值