c++ 刷题 错题、编程题整理

本文整理了C++编程中的一些典型题目和常见问题,包括:1) 结果输出乱码的问题;2) 分析全局变量、静态局部变量和局部变量的内存分配与释放顺序;3) 使用C++的string类实现字符串子串查找;4) 一个涉及数组和字符处理的编程问题;5) 判断一个数是否为2的幂的算法;6) 静态变量在函数中的应用及其作用。通过对这些问题的解析,有助于深入理解C++编程的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、

结果:输出乱码

2、

    答案选B。

这道题主要考察的知识点是 :全局变量,静态局部变量,局部变量空间的堆分配和栈分配

其中全局变量和静态局部变量时从 静态存储区中划分的空间,

二者的区别在于作用域的不同,全局变量作用域大于静态局部变量(只用于声明它的函数中),

而之所以是先释放 D 在释放 C的原因是,main()函数结束了,释放了D,但是C是在整个程序结束的之前才释放的。

局部变量A 是通过 new 从系统的堆空间中分配的,程序运行结束之后,系统是不会自动回收分配给它的空间的,需要程序员手动调用 delete 来释放。

局部变量 B 对象的空间来自于系统的栈空间,在该方法执行结束就会由系统自动通过调用析构方法将其空间释放。

之所以是 先 A  后 B 是因为,B 是在函数执行到 结尾 "}" 的时候才调用析构函数, 而语句 delete a ; 位于函数结尾 "}" 之前。

3、c++ 查找一个字符串是否是另一个字符串的子串

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

int main()
{
    string a = "abcdefghijklmn";
    string b = "def";
    string c = "123";
    string::size_type idx;

    // find函数返回的是位置值 无符号整形
    idx = a.find(b);  // c语言中有strstr也可以查找,但是c++中的string效率更高
    if (idx == string::npos)
        cout << "not found!\n";
    else
        cout << "found\n";
    return 0;
}

4、

#include<iostream>
using namespace std;

int main()
{
    int N, M, P, i, data, d[100] = { 0 }, num[100] = {0}, rank = 1;
    char zifu, delay[100];
    cin >> N >> M >> P;
    for (i = 0; i < N; i++)
    {
        cin >> data;
        d[i] = data;
    }
    for (i = 0; i < M; i++)
    {
        cin >> zifu >> data;
        delay[i] = zifu;
        num[i] = data;
    }
    for (i = 0; i < M; i++)
    {
        if (delay[i] == 'A')
            d[num[i] - 1]++;
        if (delay[i] == 'B')
            d[num[i] - 1]--;
    }
    for (i = 0; i < N; i++)
    {
        if (d[P - 1 ] < d[i])
            rank++;
    }
    /*for (i = 0; i < N; i++)
        cout << d[i] << " ";
    cout << endl;*/
    cout << rank << endl;
}

5、// 判断一个数是否是2的幂


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

//由于C++中没有直接将10进制转换成2进制的数
void BinaryVector(int n)
{
    if (n < 0)  // 如果是小于0的话,直接不判断
    {
        exit(1);
    }

    // 转换成2进制
    int temp;
    temp = n;
    list<int> L; // 列表,不能使用随机索引,只能按照迭代器索引
    while (temp != 0)
    {
        L.push_front(temp % 2);
        temp = temp / 2;
    }

    // 判断是否是2的幂
    int leiji = 1;
    list<int>::iterator it;
    for (it = L.begin(); it != L.end(); it++)
    {
        if (it == L.begin() && *(it) != 1)
        {
            cout << "false" << endl;
            break;
        }
        else
        {
            if (*it == 0)
                leiji++;
        }
    }
    if (leiji == L.size())
        cout << "true" << endl;
    else
        cout << "false" << endl;
}

void IsTwoPower(int n)
{
}

int main()
{
    int n;
    while (cin >> n)
    {
        BinaryVector(n);
    }
}

6、关于函数里面变量定义成静态变量

#include <iostream>
using namespace std;

int f(int);

void main()
{
    int a = 2, i;
    for (i = 0; i < 3; i++)
    {
        cout << f(a) << " ";
    }
    cout << endl;
}

int f(int a)
{
    int b = 0;
    static int c = 3;
    b++;
    c++;
    return (a + b + c);
}

c是静态变量,只会定义和初始化一次,而b是局部变量,每次调用完了都会释放,第二次使用的时候需要重新定义和初始化。

目 录 译者序 前言 第1章 对象的演化 1.1基本概念 1.1.1对象:特性十行为 1.1.2继承:类型关系 1.1.3多态性 1.1.4操作概念:OOP程序像什么 1.2为什么C++会成功 1.2.1较好的C 1.2.2采用渐进的学习方式 1.2.3运行效率 1.2.4系统更容易表达和理解 1.2.5“库”使你事半功倍 1.2.6错误处理 1.2.7大程序设计 1.3方法学介绍 1.3.1复杂性 1.3.2内部原则 1.3.3外部原则 1.3.4对象设计的五个阶段 1.3.5方法承诺什么 1.3.6方法应当提供什么 1.4起草:最小的方法 1.4.1前提 1.4.2高概念 1.4.3论述(treatment) 1.4.4结构化 1.4.5开发 1.4.6重写 1.4.7逻辑 1.5其他方法 1.5.1Booch 1.5.2责任驱动的设计(RDD) 1.5.3对象建模技术(OMT) 1.6为向OOP转变而采取的策略 1.6.1逐步进入OOP 1.6.2管理障碍 1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个袖珍C库 2.3放在一起:项目创建工具 2.4什么是非正常 2.5基本对象 2.6什么是对象 2.7抽象数据类型 2.8对象细节 2.9头文件形式 2.10嵌套结构 2.11小结 2.12练习 第3章 隐藏实现 3.1设置限制 3.2C++的存取控制 3.3友元 3.3.1嵌套友元 3.3.2它是纯的吗 3.4对象布局 3.5类 3.5.1用存取控制来修改stash 3.5.2用存取控制来修改stack 3.6句柄类(handleclasses) 3.6.1可见的实现部分 3.6.2减少重复编译 3.7小结 3.8练习 第4章 初始化与清除 4.1用构造函数确保初始化 4.2用析构函数确保清除 4.3清除定义块 4.3.1for循环 4.3.2空间分配 4.4含有构造函数和析构函数的stash 4.5含有构造函数和析构函数的stack 4.6集合初始化 4.7缺省构造函数 4.8小结 4.9练习 第5章 函数重载与缺省参数 5.1范围分解 5.1.1用返回值重载 5.1.2安全类型连接 5.2重载的例子 5.3缺省参数 5.4小结 5.5练习 第6章 输入输出流介绍 6.1为什么要用输入输出流 6.2解决输入输出流问 6.2.1预先了解操作符重载 6.2.2插入符与提取符 6.2.3通常用法 6.2.4面向行的输入 6.3文件输入输出流 6.4输入输出流缓冲 6.5在输入输出流中查找 6.6strstreams 6.6.1为用户分配的存储 6.6.2自动存储分配 6.7输出流格式化 6.7.1内部格式化数据 6.7.2例子 6.8格式化操纵算子 6.9建立操纵算子 6.10输入输出流实例 6.10.1代码生成 6.10.2一个简单的数据记录 6.11小结 6.12练习 第7章 常量 7.1值替代 7.1.1头文件里的const 7.1.2const的安全性 7.1.3集合 7.1.4与C语言的区别 7.2指针 7.2.1指向const的指针 7.2.2const指针 7.2.3赋值和类型检查 7.3函数参数和返回值 7.3.1传递const值 7.3.2返回const值 7.3.3传递和返回地址 7.4类 7.4.1类里的const和enum 7.4.2编译期间类里的常量 7.4.3const对象和成员函数 7.4.4只读存储能力 7.5可变的(volatile) 7.6小结 7.7练习 第8章 内联函数 8.1预处理器的缺陷 8.2内联函数 8.2.1类内部的内联函数 8.2.2存取函数 8.3内联函数和编译器 8.3.1局限性 8.3.2赋值顺序 8.3.3在构造函数和析构函数里隐藏行为 8.4减少混乱 8.5预处理器的特点 8.6改进的错误检查 8.7小结 8.8练习 第9章 命名控制 9.1来自C语言中的静态成员 9.1.1函数内部的静态变量 9.1.2控制连接 9.1.3其他的存储类型指定符 9.2名字空间 9.2.1产生一个名字空间 9.2.2使用名字空间 9.3C++中的静态成员 9.3.1定义静态数据成员的存储 9.3.2嵌套类和局部类 9.3.3静态成员函数 9.4静态初始化的依赖因素 9.5转换连接指定 9.6小结 9.7练习 第10章 引用和拷贝构造函数 10.1C++中的指针 10.2C+十中的引用 10.2.1函数中的引用 10.2.2参数传递准则 10.3拷贝构造函数 10.3.1传值方式传递和返回 10.3.2拷贝构造函数 10.3.3缺省拷贝构造函数 10.3.4拷贝构造函数方法的选择 10.4指向成员的指针(简称成员指针) 10.5小结 10.6练习 第11章 运算符重载 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值