第12周(春)项目2 - "双肩挑"教师

本文介绍了一个使用C++实现的多重继承示例,其中包括Teacher、Cadre及Teacher_Cadre三个类的设计与实现。通过该示例,展示了如何在派生类中调用基类的方法并整合多个基类的数据成员。
/*
*程序的版权和版本声明部分:
*Copyright(c)2013,烟台大学计算机学院学生 .
*All rights reserved.
*作者:李家豪
*完成日期:2014年5月27点.
*版本号:v0.1。
*问题描述:要求:
(1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。
(2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资)。
(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。
(4)在类体中声明成员函数,在类外定义成员函数。
(5)在派生类Teacher_Cadre的成员函数show中调用Teacher类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务与工资。
。
*程序输入:
*程序输出:
*问题分析:
*算法设计:
*我的程序:
*/
#include<string>
#include <iostream>
using namespace std;
class Teacher
{
public:
    Teacher(string nam,int a,char s,string tit,string ad,string t);
    void display();
protected:
    string name;
    int age;
    char sex;
    string title;
    string addr;
    string tel;
};

Teacher::Teacher(string nam,int a,char s,string tit,string ad,string t):
    name(nam),age(a),sex(s),title(tit),addr(ad),tel(t) { }

void Teacher::display()
{
    cout<<"name:"<<name<<endl;
    cout<<"age"<<age<<endl;
    cout<<"sex:"<<sex<<endl;
    cout<<"title:"<<title<<endl;
    cout<<"address:"<<addr<<endl;
    cout<<"tel:"<<tel<<endl;
}

class Cadre
{
public:
    Cadre(string nam,int a,char s,string p,string ad,string t);
    void display();
protected:
    string name;
    int age;
    char sex;
    string post;
    string addr;
    string tel;
};

Cadre::Cadre(string nam,int a,char s,string p,string ad,string t):
    name(nam),age(a),sex(s),post(p),addr(ad),tel(t) {}

void Cadre::display()
{
    cout<<"name:"<<name<<endl;
    cout<<"age:"<<age<<endl;
    cout<<"sex:"<<sex<<endl;
    cout<<"post:"<<post<<endl;
    cout<<"address:"<<addr<<endl;
    cout<<"tel:"<<tel<<endl;
}

class Teacher_Cadre:public Teacher,public Cadre
{
public:
    Teacher_Cadre(string nam,int a,char s,string tit,string p,string ad,string t,float w);
    void show( );
private:
    float wage;
};

Teacher_Cadre::Teacher_Cadre(string nam,int a,char s,string t,string p,string ad,string tel,float w):
    Teacher(nam,a,s,t,ad,tel),Cadre(nam,a,s,p,ad,tel),wage(w) {}

void Teacher_Cadre::show( )
{
    Teacher::display();
    cout<<"post:"<<Cadre::post<<endl;
    cout<<"wages:"<<wage<<endl;
}

int main( )
{
    Teacher_Cadre te_ca("Wang-li",50,'f',"prof.","president","135 Beijing Road,Shanghai","(021)61234567",1534.5);
    te_ca.show( );
    return 0;
}
 
运行结果:
<img src="https://img-blog.youkuaiyun.com/20140527144726734?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjM2ODk4Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
体会心得: 0.0
用C语言实现 题目要求: 1、用户在购置网站上有消费积分m,最近网站推出积分换购的活动。 2、每种商品换购的次数不限,如:换购“新款毛巾”10条、12条、100条,都可以。 3、用户积分换购后几乎都会有剩余,找出换购后积分损失最小的前5种组合。 4、★★★特意注意:★★★ 换购商品的商品种数N是【动态】的,如:“李宁双肩包”下架了,但又增加了“香皂”、“牙刷”等。 也就是说,除了商品种数N的值、struct stru_sp sp[N]可能变化,其它所有代码不改变,就能处理任意商品种数。 文件名: 大作业4.cpp 要求: 不允许直接用N层循环嵌套,详见文件“错误写法.cpp”。 参考数据: 商品名称 消耗积分 ---------------------------------------------------------------- 李宁双肩包 8200 新款毛巾 678 金吉星软包抽纸 1040 2018洗车大毛巾 1250 小米移动电源2 7900 不锈钢保温杯 8690 滋润型护肤脂 710 真好芦荟胶 1900 维达 手帕纸 2090 佳洁士巨人专用 395 --------------------------------------------------------------- 建议: 用结构体存储数据,可以在此基础上增加属性(最小数量、最大数量、当前数量等),如下所示: //N值是变化的 #define N 10 struct stru_sp sp[N]= { {"李宁双肩包", 8200}, {"新款毛巾", 678}, {"金吉星软包抽纸", 1040}, {"2018洗车大毛巾", 1250}, {"小米 移动电源2", 7900}, {"不锈钢保温杯", 8690}, {"滋润型护肤脂", 710}, {"真好芦荟胶", 1900}, {"维达 手帕纸", 2090}, {"佳洁士巨人专用", 395} }; 参考答案: ================================= 用户积分:5093 ================================= ☆-----------第1选择-----------☆ 以下所有商品消耗积分:5091 商品名称 需积分 换购数 --------------------------------- 李宁双肩包 8200 0 新款毛巾 678 2 金吉星软包抽纸 1040 0 2018洗车大毛巾 1250 1 小米 移动电源2 7900 0 不锈钢保温杯 8690 0 滋润型护肤脂 710 0 真好芦荟胶 1900 0 维达 手帕纸 2090 1 佳洁士巨人专用 395 1 ================================= ☆-----------2选择-----------☆ 以下所有商品消耗积分:5090 商品名称 需积分 换购数 --------------------------------- 李宁双肩包 8200 0 新款毛巾 678 0 金吉星软包抽纸 1040 1 2018洗车大毛巾 1250 1 小米 移动电源2 7900 0 不锈钢保温杯 8690 0 滋润型护肤脂 710 1 真好芦荟胶 1900 0 维达 手帕纸 2090 1 佳洁士巨人专用 395 0 ================================= ☆-----------第3选择-----------☆ 以下所有商品消耗积分:5090 商品名称 需积分 换购数 --------------------------------- 李宁双肩包 8200 0 新款毛巾 678 0 金吉星软包抽纸 1040 0 2018洗车大毛巾 1250 0 小米 移动电源2 7900 0 不锈钢保温杯 8690 0 滋润型护肤脂 710 2 真好芦荟胶 1900 0 维达 手帕纸 2090 1 佳洁士巨人专用 395 4 ================================= ☆-----------第4选择-----------☆ 以下所有商品消耗积分:5088 商品名称 需积分 换购数 --------------------------------- 李宁双肩包 8200 0 新款毛巾 678 1 金吉星软包抽纸 1040 0 2018洗车大毛巾 1250 1 小米 移动电源2 7900 0 不锈钢保温杯 8690 0 滋润型护肤脂 710 0 真好芦荟胶 1900 0 维达 手帕纸 2090 0 佳洁士巨人专用 395 8 ================================= ☆-----------第5选择-----------☆ 以下所有商品消耗积分:5086 商品名称 需积分 换购数 --------------------------------- 李宁双肩包 8200 0 新款毛巾 678 2 金吉星软包抽纸 1040 1 2018洗车大毛巾 1250 0 小米 移动电源2 7900 0 不锈钢保温杯 8690 0 滋润型护肤脂 710 0 真好芦荟胶 1900 1 维达 手帕纸 2090 0 佳洁士巨人专用 395 2 ================================= 评分标准: 与前5个选择相匹配,对上一个 10分, 有递归函数, 40分 未用递归 -20 未排序 -10
06-13
### 题目重述 用户在购置网站上有消费积分$m$,网站推出积分换购活动。每种商品换购次数不限,需要找出换购后积分损失最小的前5种组合。商品种类数$N$是动态变化的,除商品种类数和商品数组外,代码不应更改。不允许使用多层循环嵌套。 ### 详解 为了实现这个功能,我们可以使用递归回溯算法,结合结构体存储商品信息,并对结果进行排序以找到前5个最优解。 1. **结构体定义** 使用结构体`struct stru_sp`存储商品名称和所需积分。定义动态数组`sp[N]`来保存商品信息。 2. **递归回溯** 编写递归函数`find_combinations`,尝试每种商品的不同换购数量,计算总积分消耗并记录符合条件的结果。 3. **排序与输出** 将所有可能的组合按积分消耗从大到小排序,输出前5个最优解。 ### 代码实现 以下是完整的C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #define MAX_COMB 1000 // 假设最多有1000种组合 #define N 10 // 初始商品数量 // 定义商品结构体 typedef struct { char name[50]; int cost; } stru_sp; // 全局变量 stru_sp sp[N] = { {"李宁双肩包", 8200}, {"新款毛巾", 678}, {"金吉星软包抽纸", 1040}, {"2018洗车大毛巾", 1250}, {"小米移动电源2", 7900}, {"不锈钢保温杯", 8690}, {"滋润型护肤脂", 710}, {"真好芦荟胶", 1900}, {"维达 手帕纸", 2090}, {"佳洁士巨人专用", 395} }; int m = 5093; // 用户积分 int combinations[MAX_COMB][N]; // 记录组合 int combination_costs[MAX_COMB]; // 记录每个组合的积分消耗 int combination_count = 0; // 记录组合数量 // 递归查找组合 void find_combinations(int index, int remaining_points, int *current_combination) { if (index == N || remaining_points <= 0) { if (remaining_points >= 0) { int total_cost = m - remaining_points; if (combination_count < MAX_COMB) { for (int i = 0; i < N; i++) { combinations[combination_count][i] = current_combination[i]; } combination_costs[combination_count++] = total_cost; } } return; } // 不选择当前商品 find_combinations(index + 1, remaining_points, current_combination); // 尝试选择当前商品 int count = 0; while (remaining_points >= 0) { current_combination[index] = count; find_combinations(index + 1, remaining_points, current_combination); count++; remaining_points -= sp[index].cost; } } // 比较函数,用于qsort排序 int compare(const void *a, const void *b) { return *(int *)b - *(int *)a; } // 输出前5个最优组合 void print_top_combinations() { qsort(combination_costs, combination_count, sizeof(int), compare); printf("=================================\n"); printf(" 用户积分:%d\n", m); printf("=================================\n"); int printed_combinations = 0; for (int i = 0; i < combination_count && printed_combinations < 5; i++) { for (int j = 0; j < combination_count && printed_combinations < 5; j++) { int total_cost = 0; for (int k = 0; k < N; k++) { total_cost += combinations[j][k] * sp[k].cost; } if (total_cost == combination_costs[i]) { printf("☆-----------第%d选择-----------☆\n", printed_combinations + 1); printf("以下所有商品消耗积分:%d\n", total_cost); printf("商品名称 需积分 换购数\n"); printf("---------------------------------\n"); for (int k = 0; k < N; k++) { printf("%-16s %-5d %d\n", sp[k].name, sp[k].cost, combinations[j][k]); } printf("=================================\n"); printed_combinations++; } } } } int main() { int current_combination[N] = {0}; find_combinations(0, m, current_combination); print_top_combinations(); return 0; } ``` ### 知识点 1. **递归算法** 递归用于遍历所有可能的商品组合,避免使用多层循环嵌套。递归通过不断减少剩余积分来尝试不同的换购方案。 2. **结构体应用** 结构体用于存储商品信息,方便管理和扩展。可以通过增加属性(如最小数量、最大数量等)进一步优化。 3. **排序算法** 使用`qsort`对结果进行排序,确保输出前5个积分损失最小的组合。`qsort`是一个高效的排序函数,适用于此类场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值