C++程序设计例题讲解

img

img

C++程序设计写出代码,再讲解一下设计思路和基本步骤。学习C++程序设计应该从哪里入门呢,有没有推荐的b站资料或者专业书籍?

基于new bing加以修改过后的编写:
推荐书籍:
书籍的话看这个视频推荐:

推荐B站视频:

[1] "C++学习笔记(入门)",https://www.bilibili.com/video/BV1et41147dr
[2]黑马比较基础易懂,

希望以上书籍和视频可以帮助你入门C++编程。

【题目2】
思路:首先需要定义枚举类型,用于表示房屋类型和职称。然后,使用 switch 语句将每个职称与对应的房屋类型相对应。最后,将计算出的房屋类型输出即可。

#include <iostream>

enum HouseType {
    House,
    Apartment,
    Studio,
    Single
};

enum Title {
    Professor,
    AssociateProfessor,
    Lecturer,
    Assistant
};

int main() {
    Title title = AssociateProfessor; // 假设一个老师的职称为副教授

    HouseType houseType;
    switch (title) {
        case Professor:
            houseType = House;
            break;
        case AssociateProfessor:
            houseType = Apartment;
            break;
        case Lecturer:
            houseType = Studio;
            break;
        case Assistant:
            houseType = Single;
            break;
        default:
            std::cout << "无效的职称。" << std::endl;
            return 0;
    }

    std::cout << "该老师只能被分配到 " << houseType << " 类型的房子。" << std::endl;

    return 0;
}


【题目3】
主要思路:

  • 使用三重循环枚举 a、b、c 的取值,范围都是 1 到 9,表示从桶中依次抓纸条的可能情况。

  • 在每次循环中判断是否满足 C=2b=4a 的条件,如果满足,则将计数器 count 加一,表示找到了一种满足条件的取法。

  • 循环结束后,输出计数器 count 的值,即满足条件的取法个数。
    该程序的时间复杂度为 O(N^3),其中 N=9,因此可以在短时间内完成运算。

#include <iostream>
using namespace std;

int main() {
    int count = 0; // 记录满足条件的取法个数

    for (int a = 1; a <= 9; a++) { // 枚举 a 的取值
        for (int b = 1; b <= 9; b++) { // 枚举 b 的取值
            for (int c = 1; c <= 9; c++) { // 枚举 c 的取值
                if (c == 2 * b && c == 4 * a) { // 判断是否满足条件
                    count++; // 满足条件的个数加一
                }
            }
        }
    }

    cout << "满足条件的取法的个数为:" << count << endl;
    return 0;
}


【题目4】
主要思路:

定义一个结构体 Student,该结构体包含四个成员分别表示学生的姓名、性别、年龄和年级。

  • 在 main() 函数中定义一个 Student 类型的结构体变量 stu。

  • 使用 cin 分别读入学生的姓名、性别、年龄和年级并赋值给结构体变量 stu 的成员变量。

  • 使用 cout 输出学生的姓名、性别、年龄和年级。
    注意事项:

  • 在输入姓名时需要使用 getline() 函数读取字符串,否则输入的空格会截断字符串。

  • 在输入完 gender 后必须使用一个额外的 cin.ignore() 语句来清除输入缓冲区中的换行符,避免影响下一次读入操作。

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

// 定义学生结构体
struct Student {
    char name[20];
    char gender;
    int age;
    int grade;
};

int main() {
    Student stu; // 定义一个学生结构体变量

    // 输入学生信息
    cout << "请输入姓名:";
    cin.getline(stu.name, 20); // 使用 getline 函数读取字符串,避免输入空格引起的问题
    cout << "请输入性别(M or F):";
    cin >> stu.gender;
    cout << "请输入年龄:";
    cin >> stu.age;
    cout << "请输入年级:";
    cin >> stu.grade;

    // 输出学生信息
    cout << "姓名:" << stu.name << endl;
    cout << "性别:" << stu.gender << endl;
    cout << "年龄:" << stu.age << endl;
    cout << "年级:" << stu.grade << endl;

    return 0;
}


【题目5】
主要思路:

  • 定义一个联合体 Score,该联合体包含三个成员分别表示三种体育成绩(引体向上、立定跳远、卧推)。

  • 在 main() 函数中定义一个 Score 类型的联合体变量 score。

  • 使用 switch 语句根据用户选择的考试项目输入成绩,并将输入的成绩赋值给联合体变量 score 的相应成员变量。
    使用 cout 输出用户的成绩。

注意事项:

  • 联合体中所有成员共享同一份内存,因此只能同时使用其中一个成员。

  • 在输入完成后可以直接通过访问联合体变量的成员来获取用户输入的成绩,不需要使用指针等其他手段。

#include <iostream>
using namespace std;

// 定义体育成绩联合体
union Score {
    int chinning; // 引体向上
    float jump; // 立定跳远
    float lift; // 卧推
};

int main() {
    Score score; // 定义一个体育成绩联合体

    char choice; // 定义一个变量表示考试项目

    cout << "请选择参加的考试项目(C - 引体向上,J - 立定跳远,L - 卧推):";
    cin >> choice;

    switch (choice) {
    case 'C':
        cout << "请输入你的引体向上成绩:";
        cin >> score.chinning;
        cout << "你的引体向上成绩为:" << score.chinning << endl;
        break;
    case 'J':
        cout << "请输入你的立定跳远成绩:";
        cin >> score.jump;
        cout << "你的立定跳远成绩为:" << score.jump << endl;
        break;
    case 'L':
        cout << "请输入你的卧推成绩:";
        cin >> score.lift;
        cout << "你的卧推成绩为:" << score.lift << endl;
        break;
    default:
        cout << "非法选项!" << endl;
        break;
    }

    return 0;
}


稍等,手工编写,有点慢。其中第二题的含义比较模糊,我是按照直接输出每个职位对应的房屋来写的,但是题目也可以理解为输入一个职位,输出对应的房屋,如果是那样,你告诉我,我再帮你修改。手工回答不易,如果满意还请赏个采纳,谢谢。
2

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> l1 = {"House", "Apartment", "Studio", "Single"};
    std::vector<std::string> l2 = {"Professor", "Associate professor", "Lecturer", "Assistant"};

    for (int i = 0; i < l1.size(); i++) {
        std::cout << l2[i] << ": " << l1[i] << std::endl;
    }

    return 0;
}

3

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main() {
    std::vector<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int count = 0;

    for (int i = 0; i < arr.size(); i++) {
        int a = arr[i];
        int b = a * 2;
        int c = a * 4;
        if (std::find(arr.begin(), arr.end(), b) != arr.end() && std::find(arr.begin(), arr.end(), c) != arr.end()) {
            count++;
    }
    }

    std::cout << count << std::endl;

    return 0;
}

4

#include <iostream>
#include <string>

// 枚举类型
enum Gender {
    MALE,
    FEMALE
};

// 学生结构体
struct Student {
    std::string name; // 姓名
    Gender gender;    // 性别
    int age;          // 年龄
    int grade;        // 年级
};

int main() {
    Student stu; // 初始化一个学生结构体变量

    std::cout << "请输入学生信息:" << std::endl;

    // 从键盘读取姓名
    std::cout << "姓名:";
    std::getline(std::cin, stu.name);

    // 从键盘读取性别
    std::cout << "性别(M-男,F-女):";
    char gender;
    std::cin >> gender;
    if (gender == 'M' || gender == 'm') {
        stu.gender = Gender::MALE;
    } else if (gender == 'F' || gender == 'f') {
        stu.gender = Gender::FEMALE;
    } else {
        std::cout << "性别输入错误!" << std::endl;
        return 0;
    }

    // 从键盘读取年龄和年级
    std::cout << "年龄:";
    std::cin >> stu.age;

    std::cout << "年级:";
    std::cin >> stu.grade;

    // 输出学生信息
    std::cout << "学生信息:" << std::endl;
    std::cout << "姓名:" << stu.name << std::endl;
    std::cout << "性别:" << (stu.gender == Gender::MALE ? "男" : "女") << std::endl;
    std::cout << "年龄:" << stu.age << std::endl;
    std::cout << "年级:" << stu.grade << std::endl;

    return 0;
}

5

#include <iostream>

// 联合体定义
union Scores {
    int chinning;  // 引体向上
    float jump;    // 跳远
    float lift;    // 举重
};

int main() {
    Scores scores;

    std::cout << "请选择项目(1-引体向上,2-跳远,3-举重):" << std::endl;
    int option;
    std::cin >> option;

    std::cout << "请输入成绩:" << std::endl;
    switch (option) {
        case 1:
            std::cin >> scores.chinning;
            std::cout << "您的引体向上成绩为:" << scores.chinning << "个" << std::endl;
            break;
        case 2:
            std::cin >> scores.jump;
            std::cout << "您的跳远成绩为:" << scores.jump << "米" << std::endl;
            break;
        case 3:
            std::cin >> scores.lift;
            std::cout << "您的举重成绩为:" << scores.lift << "公斤" << std::endl;
            break;
        default:
            std::cout << "输入错误!" << std::endl;
            break;
    }

    return 0;
}

第二题:

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Teacher {
public:
    Teacher(string name, string title) {
        this->name = name;
        this->title = title;
        this->roomType = getRoomType(title);
    }

    string getName() {
        return name;
    }

    string getTitle() {
        return title;
    }

    string getRoomType() {
        return roomType;
    }

private:
    string name;
    string title;
    string roomType;

    string getRoomType(string title) {
        map<string, string> roomMap = {
            {"Professor", "House"},
            {"Associate professor", "Apartment"},
            {"Lecturer", "Studio"},
            {"Assistant", "Single"}
        };

        if (roomMap.find(title) != roomMap.end()) {
            return roomMap[title];
        } else {
            return "";
        }
    }
};

int main() {
    int num;
    cout << "请输入老师数量:";
    cin >> num;

    Teacher* teachers[num];

    for (int i = 0; i < num; i++) {
        string name, title;
        cout << "请输入第" << i + 1 << "个老师的姓名和职称(Professor/Associate professor/Lecturer/Assistant):";
        cin >> name >> title;

        teachers[i] = new Teacher(name, title);
    }

    map<string, int> roomCountMap = {
        {"House", 0},
        {"Apartment", 0},
        {"Studio", 0},
        {"Single", 0}
    };

    for (int i = 0; i < num; i++) {
        string roomType = teachers[i]->getRoomType();
        if (roomType != "") {
            roomCountMap[roomType]++;
        }
    }

    cout << "分房方案如下:" << endl;
    for (auto it = roomCountMap.begin(); it != roomCountMap.end(); it++) {
        cout << it->first << ": " << it->second << endl;
    }

    for (int i = 0; i < num; i++) {
        delete teachers[i];
    }

    return 0;
}

我定义了一个名为Teacher的类,它有三个私有成员变量name、title和roomType,以及一个公有成员函数getRoomType。构造函数用于初始化对象的成员变量,而getRoomType函数用于根据老师的职称获取房屋类型。在main函数中,我们创建了一个Teacher指针数组,用于存储所有老师的信息。然后,我们遍历这个数组,统计每种房屋类型的数量,并输出分房方案。最后,我们释放Teacher指针数组中的所有内存。
输出示例:

请输入老师数量:4
请输入第1个老师的姓名和职称(Professor/Associate professor/Lecturer/Assistant):张三 Professor
请输入第2个老师的姓名和职称(Professor/Associate professor/Lecturer/Assistant):李四 Associate professor
请输入第3个老师的姓名和职称(Professor/Associate professor/Lecturer/Assistant):王五 Lecturer
请输入第4个老师的姓名和职称(Professor/Associate professor/Lecturer/Assistant):赵六 Assistant
分房方案如下:
Apartment: 1
House: 1
Single: 1
Studio: 1

第三题:

#include <iostream>

using namespace std;

int main() {
    int count = 0;

    for (int a = 1; a <= 9; a++) {
        int b = 2 * a;
        int c = 4 * a;
        if (b <= 9 && c <= 9) {
            count++;
            cout << "a=" << a << ", b=" << b << ", c=" << c << endl;
        }
    }

    cout << "满足条件的取法个数为:" << count << endl;

    return 0;
}

我使用单重循环枚举所有可能的a,然后计算出对应的b和c的值,判断是否满足条件c=2b=4a。如果满足条件,则输出取法,并将计数器加1。由于只需要枚举一次,时间复杂度为O(1)。
输出示例:

a=1, b=2, c=4
a=2, b=4, c=8
满足条件的取法个数为:2

第四题:

#include <iostream>
#include <cstring>

using namespace std;

struct Student {
    char name[20];
    char gender;
    int age;
    int grade;
};

int main() {
    Student s;

    cout << "请输入姓名:";
    cin.getline(s.name, 20);

    cout << "请输入性别(M/F):";
    cin >> s.gender;

    cout << "请输入年龄:";
    cin >> s.age;

    cout << "请输入年级:";
    cin >> s.grade;

    cout << "姓名:" << s.name << endl;
    cout << "性别:" << s.gender << endl;
    cout << "年龄:" << s.age << endl;
    cout << "年级:" << s.grade << endl;

    return 0;
}

我定义了一个名为Student的结构体,它有四个成员变量name、gender、age和grade。然后,我们使用cin和getline函数分别输入学生的姓名、性别、年龄和年级,并将这些信息存储在结构体变量s中。最后,我们使用cout输出学生的信息。
输出示例:

请输入姓名:张三
请输入性别(M/F):M
请输入年龄:18
请输入年级:3
姓名:张三
性别:M
年龄:18
年级:3

第五题:

#include <iostream>

using namespace std;

union Score {
    int fchinning;
    float jump;
    float lift;
};

int main() {
    Score score;
    char choice;

    cout << "请选择参加考试的项目(C表示引体向上,J表示跳远,L表示举重):";
    cin >> choice;

    switch (choice) {
        case 'C':
            cout << "请输入引体向上成绩:";
            cin >> score.fchinning;
            cout << "你的引体向上成绩为:" << score.fchinning << endl;
            break;
        case 'J':
            cout << "请输入跳远成绩:";
            cin >> score.jump;
            cout << "你的跳远成绩为:" << score.jump << endl;
            break;
        case 'L':
            cout << "请输入举重成绩:";
            cin >> score.lift;
            cout << "你的举重成绩为:" << score.lift << endl;
            break;
        default:
            cout << "输入错误!" << endl;
            break;
    }

    return 0;
}

我定义了一个名为Score的联合体,它有三个成员变量fchinning、jump和lift。然后,我们使用switch语句根据用户选择的考试项目输入对应的成绩,并将成绩存储在联合体变量score中。最后,我们使用cout输出考试成绩。
输出示例:

请选择参加考试的项目(C表示引体向上,J表示跳远,L表示举重):C
请输入引体向上成绩:10
你的引体向上成绩为:10

PS:如果有瑕疵的地方可以随时问我修改,敲代码不易,都是大学生,望采纳 谢谢!