关于c++:Essentiacal-c课后题

练习2.2和练习2.3

头文件

#pragma once

#include<iostream>
#include<vector>

void Pentagonal(const std::vector<int> &inputs, int num);
inline bool IsValidNum(const int num, const std::vector<int> &v) {
    if (num <= 0 || num >= 1024 || num <= v.size()) {
        return false;
   }
   return true;
}

cc文件

#include "practice_2_2.h"

void Pentagonal(std::vector<int> &inputs, int num) {
    // 先判断 num 是否非法
    if (!IsValidNum(num, inputs)) {
        return;
    }
    for (int i = inputs.size() + 1; i < num + 1;i++) {
        int value = i * (3 * i - 1) / 2;
        inputs.push_back(value);
    }
}

void PrintElements(const std::vector<int> * inputs) {
    for (int ele : *inputs) {
        std::cout << ele << std::endl;
    }
}

int main() {
    std::vector<int> v;
    Pentagonal(v, 10);
    Pentagonal(v, 20);
    PrintElements(&v);
    // return 0 示意程序胜利运行
    return 0;
}

练习2.4

头文件

#pragma once
#include<iostream>
#include<vector>

const std::vector<int> * GetPentagonal(int num);

int GetValueFromIndex(int index, const std::vector<int> * v);

cc文件

#include "practice_2_4.h"
#include<string>

/*
    我一开始的上面这种上面是谬误的, 起因是仅仅是申明了一个
    指向vector<int>的指针, 然而这个指针并没有指向任何的
    对象, 所以间接调用 -> size()函数的话必定是会报错的
*/
// const std::vector<int> * GetPentagonal(int num) {
//     // 部分动态对象指针
//     static std::vector<int> * v;
//     if (num <= 0 || num > 1024) {
//         return v;
//     }
//     for (int i = v -> size() + 1; i < num + 1; i++) {
//         std::cout << "point" << i << std::endl;
//         v -> push_back(i * (3 * i - 1) / 2);
//     }
//     return v;
// }

const std::vector<int> * GetPentagonal(int num) {
    // 部分动态对象 间接初始化一个对象
    static std::vector<int> v;
    if (num <= 0 || num > 1024) {
        return &v;
    }
    for (int i = v.size() + 1; i < num + 1; i++) {
        v.push_back(i * (3 * i - 1) / 2);
    }
    return &v;
}

int GetValueFromIndex(int index, const std::vector<int> * v) {
    // 判断是否为空指针
    if (v == 0) {
        return -1;
        std::cout << "Error : v is nullptr" << std::endl;
    }
    // 判断 index 是否超出
    if (index >= v -> size()) {
        return -1;
        std::cout << "Error : index too large!" << std::endl;
    }
    return (*v)[index];
}

int main() {
    const std::vector<int> *v = GetPentagonal(10);
    // 判断是否为空指针
    if (v == 0) {
        std::cout << "Error: v is nullptr" << std::endl;
    }
    std::cout << GetValueFromIndex(5, v) << std::endl;    
    // 确认下空指针是否为0
    // 留神 指针能够和0比 一般来说对象不能和0比 要申明为指针
    std::string* check = nullptr;
    if (check == 0) {
        std::cout << "the value of nullptr is 0" << std::endl;
    }
    return 0;
}

练习2.5/2.6

头文件

#pragma once
#include<iostream>
#include<vector>

int max(int a, int b);
float max(float a, float b);
std::string max(const std::string &a, const std::string &b);
int max(const std::vector<int> &v);
float max(const std::vector<float> &v);
std::string max(const std::vector<std::string> &v);
int max(const int *arr[]); // 数组只能申明为指针?
template <typename T> T TemplateMax(T a, T b);

cc文件

#include "practice_2_5.h"
#include<string.h>

int max(int a, int b) {
    return (a > b) ? a : b;
}
float max(float a, float b) {
    return (a > b) ? a : b;
}
std::string max(const std::string &a, const std::string &b) {
    std::cout << "a:" << a << "," << "b:" << b << std::endl;
    bool bigger = a.compare(b);
    return bigger ? a : b;
}

template <typename T>
T TemplateMax(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    std::cout << max(1,2) << std::endl;
    std::cout << max(1.2f, 2.4f) << std::endl;
    std::cout << max("abc", "abcd") << std::endl;
    std::cout << max(110, 112) << std::endl;
    return 0;
}

补充

  • 练习2.5中的字符串比拟, 应用 > 操作符 和 a.compare(b) 都无奈正确返回后果, 留一个问题在这, 心愿好心人能予以解答。https://segmentfault.com/q/10…

先送外卖去了…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理