C++编程训练2


1.有 3 个强盗,抢了一个珠宝箱,打开一看,里面很多颗珠宝,分轮次来,老大拿 3 个,老 二拿 2 个,老三拿一个,构成一个轮次,接着开始下一轮,直到拿完宝箱中的珠宝。目前已 知老三拿了 25 颗珠宝,请问 1)宝箱里面原来有多少颗珠宝;2)老大和老二拿了多少颗。 输出所有可能的结果。

#include <iostream>
using namespace std;

/*此代码只能用于解决这一个问题的几种情况,若老三的珠宝数是一个未知数,则需要另外编写程序,使用穷举法解决问题,每个人按照顺序依次增加,打印出相应的结果*/
int main() {
    //老三有25颗,那么起码分了25轮
    //最少的情况是老大75,老二50,老三25
    //数组中第一个存老大,第二个存老二,第三个存老三
    int ngems[3] = { 75,50,25 };
    //n用于存储情况的数量,total为总数
    int n = 0, total = 0;
    //每个循环存储一种情况
    while (true) {
        //先老大逐个增加,最多增加3个
        if (ngems[0] != 78) {
            for (int i = 0;i <= 3;++i) {
                ngems[0] = 75 + i;
                total = ngems[0] + ngems[1] + ngems[2];
                n += 1;
                cout << "第" << n << "种情况为:" << endl;
                cout << "宝箱里面原来有" << total << "颗珠宝" << endl;
                cout << "老大的数量为" << ngems[0] << "。" << endl;
                cout << "老二的数量为" << ngems[1] << "。" << endl;
                cout << "老三的数量为" << ngems[2] << "。\n" << endl;
            }
        }
        else {
            for (int j = 1;j <= 2;++j) {
                ngems[1] = 50 + j;
                total = ngems[0] + ngems[1] + ngems[2];
                n += 1;
                cout << "第" << n << "种情况为:" << endl;
                cout << "宝箱里面原来有" << total << "颗珠宝" << endl;
                cout << "老大的数量为" << ngems[0] << "。" << endl;
                cout << "老二的数量为" << ngems[1] << "。" << endl;
                cout << "老三的数量为" << ngems[2] << "。\n" << endl;
            }
        }
        if (ngems[1] == 52) { break; }
    }
    return 0;
}

2.定义一个学生结构体,成员包括学生姓名、学号、性别、上学期学分绩点;用一个数组去 保存学生信息,共计N个, 问 1:然后进行排序,1)按照学号排序;2)按照绩点排序。排序方法 3 种,交换、选择、 冒泡都要用。 问 2:查找数组中是否有指定学号的学生,如果有,显示出该学生的基本信息,查找方法, 采用顺序查找和折半查找。 问 3:这些学生的平均绩点是多少。哪些人低于平均绩点,要显示出来。

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    //使用结构体存储每位学生的信息
    struct Student {
        string name;
        double ID;
        string sex;
        float GPA;
    };
    //N为学生数量,i和j用于控制循环
    int N = 0, i=0, j=0;
    cout << "请输入学生的总数N:" << endl;
    cin >> N;
    Student* pas = new Student[4];
    for (i = 0;i < N;++i) {
        cout << "请依次输入一个学生的姓名,学号,性别以及上学期的绩点:"<< endl;
        cin >> pas[i].name >> pas[i].ID >> pas[i].sex >> pas[i].GPA;
    }

    //问1(1)按照学号排序
    //交换排序法
    Student temp;
    for (i = 0;i < N - 1;++i) {
        for (j = i + 1 ;j < N;++j) {
            if (pas[i].ID > pas[j].ID) {
                temp = pas[i];
                pas[i] = pas[j];
                pas[j] = temp;
            }
        }
    }
    cout << "按学号从小到大的排序结果为:" << endl;
    for (i = 0;i < N;++i) {
        cout<< pas[i].name << " " << pas[i].ID << " " 
            << pas[i].sex << " " << pas[i].GPA<<endl;
    }
    //问1(2)按照绩点排序
    //选择排序法
    for (i = 0;i < N - 1;++i)
    {
        int min_GPA = i;
        for (j = i + 1;j < N;j++) {
            if (pas[j].GPA < pas[min_GPA].GPA) {
                min_GPA = j;
            }
        }
        if (i != min_GPA) {
            temp = pas[i];
            pas[i] = pas[min_GPA];
            pas[min_GPA] = temp;
        }
    }
    cout << "按上学期绩点从小到大的排序结果为:" << endl;
    for (i = 0;i < N;++i) {
        cout << pas[i].name << " " << pas[i].ID << " "
            << pas[i].sex << " " << pas[i].GPA << endl;
    }
    //问1(2)按照绩点排序
    //冒泡排序法
    /*for (i = 0;i < N - 1;i++) {
        for (j = 0;j < N - i - 1;++j) {
            if (pas[j].GPA > pas[j + 1].GPA)
                temp = pas[j];
                pas[j] = pas[j + 1];
                pas[j + 1] = temp;
        }
    }
    cout << "按上学期绩点从小到大的排序结果为:" << endl;
    for (i = 0;i < N;++i) {
        cout << pas[i].name << " " << pas[i].ID << " "
            << pas[i].sex << " " << pas[i].GPA << endl;
    }*/

    //问2
    double youID;
    cout << "请输入学号:" << endl;
    cin >> youID;
    bool flag = true;
    //顺序法
    for (i = 0;i < N;++i) {
        if (youID == pas[i].ID) {
            cout << "这位同学的信息为:" << " ";
            cout << pas[i].name << " " << pas[i].ID << " "
                << pas[i].sex << " " << pas[i].GPA << endl;
            flag = false;
        }
    }
    if (flag) {
        cout << "系统中没有这个学生的信息。" << endl;
    }

    //二分法查找
    /*int begin = 0, end = N, mid;
    while (begin <= end) {
        mid = (begin + end) / 2;
        if (youID == pas[mid].ID) {
            cout << pas[mid].name << " " << pas[mid].ID << " "
                << pas[mid].sex << " " << pas[mid].GPA << endl;
            flag = false;
            break;
        }
        else if (youID > pas[mid].ID) {
            begin = mid;
        }
        else {
            end = mid;
        }
    }
    if (flag) {
        cout << "系统中没有这个学生的信息。" << endl;
    }*/
    //问3
    float ave_GPA = 0.0f, sum_GPA = 0.0f;
    for (i = 0;i < N;++i) {
        sum_GPA += pas[i].GPA;
    }
    ave_GPA = sum_GPA / N;
    cout << "这些学生的平均学分绩点为:" << ave_GPA << endl;
    for (i = 0;i < N;++i) {
        if (pas[i].GPA < ave_GPA) {
            cout << pas[i].name << "的学分绩点低于平均学分绩点." << endl;
        }
    }
    if (pas) {
        delete[] pas;
        pas = nullptr;
    }
    return 0;
}

文章作者: 陈细利
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陈细利 !
评论
  目录