-
个人简介
该用户太懒,我是新人,简介不知道怎么写☺点个自安呗,,
,
,
,
,
试试复制在chrome(上课禁止腐朽,回家玩去【重点提醒!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!】)
, , , , ,
, , , , , , , , ,
四级2025年6月真题
题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 A D D B C B C B C B B D C B B C++ 四级 2025 年 06 月 1 单选题(每题 2 分,共 30 分) 第 1 题 在C++中,声明一个指向整型变量的指针的正确语法是( )。 A. int* ptr; B. int ptr; C. int ptr; D. ptr int; 第 2 题 下面的函数接收一个 行 列的二维数组并输出其中元素,则横线上不能填写( )。 A. int arr[3][4] B. int arr[][4] C. int (arr)[4] D. int* arr 第 3 题 在C++中, int arr[3][4] 和 int* arr = new int[12] 均可模拟一个 行 列的二维数组。关于这两种方 式,下面说法错误的是( )。 A. int arr[3][4] 在栈上分配空间,适合数组较小的情况; B. int* arr = new int[12] 在堆上分配空间,数组较大时也适用; C. 这两种方式申请的内存空间都是连续的。 D. 这两种方式申请的内存都能自动释放。 第 4 题 关于以下 C++代码,说法正确的是( )。 void printArray(________) { for (int i = 0; i < 3; ++i) for (int j = 0; j < 4; ++j) std::cout << arr[i][j] << " "; } 12345 A. 正确编译并输出 Hello! B. 编译错误:找不到函数 greet() C. 编译警告但可以运行 D. 链接错误 第 5 题 在C++中,如果希望通过函数修改传入的结构体对象的内容,应该使用哪种参数传递方式? A. 值传递或引用传递 B. 值传递或指针传递 C. 引用传递或指针传递 D. 仅指针传递 第 6 题 以下哪个选项正确描述了C++中形参和实参的区别? A. 形参是函数调用时传递给函数的具体值,实参是函数定义中声明的变量。 B. 形参是函数定义中声明的变量,实参是函数调用时传递给函数的具体值。 C. 形参和实参在函数调用时是完全相同的。 D. 形参只在函数内部可见,实参在函数外部可见。 第 7 题 运行如下代码会输出( )。 A. 100 100 100 B. 50 50 50 C. 50 100 100 D. 50 50 100 int main() { greet(); return 0; }void greet() { cout << "Hello!" << endl; } 12345678 int value = 100; void print1() { int value = 50; cout << value << " "; cout << ::value << " "; }void print2() { cout << value << " "; }print1(); print2(); 1234567891011121314 第 8 题 小杨在整理一副扑克牌的所有红心扑克牌,使其从小到大排列。他的做法是:最开始抓到第1张扑克牌被认 为已经排好序;然后抓第2张扑克牌,将其插入至有序部分的正确位置;不断循环步骤,每次将新抓到扑克牌插入至 有序部分,直至抓完所有扑克牌,这样抓牌结束时就完成了扑克牌的排序。小杨这种整理扑克牌的方式与( )排序 的方式最接近。 A. 冒泡排序 B. 插入排序 C. 选择排序 D. 直接排序 第 9 题 以下哪种情况是使用插入排序的合适场景? A. 数据量非常大,且乱序严重 B. 希望获得稳定排序,但不要求实时性 C. 数据几乎有序,只需少量调整 D. 想在交换次数最少的前提下排好大数组 第 10 题 以下关于递推算法基本思想的描述,正确的是( )。 A. 递推算法通过将问题分解为相互独立的子问题来解决。 B. 递推算法从已知的基础情况出发,通过某种关系逐步推导出更大规模问题的解。 C. 递推算法通常用于穷举所有可能的解决方案。 D. 递推算法适用于在每一步做出局部最优选择以达到全局最优。 第 11 题 给定如下算法,其时间复杂度为( )。 A. B. C. D. 第 12 题 下述斐波那契数列计算的时间复杂度是( )。 bool f(int arr[], int n, int target) { for (int i = 0; i < n; i++) { int sum = 0; for (int j = 0; j < n; j++) { if (i & (1 << j)) { sum += arr[j]; } }if (sum == target) return true; }return false; } 123456789101112 A. B. C. D. 第 13 题 关于下面 C++ 程序的描述,( )最准确。 A. 将从标准输入读取每行,并输出到屏幕 B. 程序无法运行,因为 getline 只能读取 cin C. 将 data.txt 中的每一行读取并输出到屏幕 D. 程序将创建 data.txt 并写入默认文本 第 14 题 在C++中,异常处理机制(try-catch块)的主要目的是( )。 A. 提高程序的运行速度。 B. 在程序发生运行时错误时,提供一种结构化的错误处理方式。 C. 确保程序在编译时没有错误。 D. 减少程序的内存占用。 第 15 题 为了提高冒泡排序的效率,如果某轮“冒泡”中没有执行任何交换操作,说明数组已经完成排序,可直接返 回结果,则两条横线上分别应该填写( )。 A.int fibonacci(int n) { if (n == 0) return 0; if (n == 1) return 1; return fibonacci(n - 1) + fibonacci(n - 2); } 123456 ifstream in("data.txt"); string line; while (getline(in, line)) { cout << line << endl; } 12345 void bubbleSortWithFlag(vector &nums) { for (int i = nums.size() - 1; i > 0; i--) { bool flag; ________________ // 在此处填入代码 for (int j = 0; j < i; j++) { if (nums[j] > nums[j + 1]) { swap(nums[j], nums[j + 1]); ___________________________ // 在此处填入代码 } }if (!flag) break; } } 123456789101112131415 题号 1 2 3 4 5 6 7 8 9 10 答案 B. C. D. 2 判断题(每题 2 分,共 20 分) 第 1 题 下面C++代码正确声明了一个返回 int 类型、接受两个 int 参数的函数。 第 2 题 下面C++代码的输出是 15 。 第 3 题 下面c++代码在一个结构体中又定义了别的结构体。这种结构嵌套定义的方式语法不正确。 flag = false; flag = false; 12 flag = false; flag = true; 12 flag = true; flag = false; 12 flag = true; flag = true; 12int add(int, int); 1 void foo(int x) { x += 5; }int main() { int a = 10; foo(a); cout << a << endl; } 12345678 #include #include using namespace std; struct Library { struct Book { struct Author { string name; int birthYear; };string title; int year; Author author; };string name; vector books; 12345678910111213141516171819 第 4 题 在C++中,相比于值传递,使用引用传递作的优点可以直接操作和修改原始变量,避免数据拷贝,提高效 率。第 5 题 下面这段代码不合法,因为每一行都必须显式初始化 个元素。 int arr[2][3] = {{1, 2}, {3}}; 第 6 题 以下程序中使用了递推方式计算阶乘( ),计算结果正确。 第 7 题 无论初始数组是否有序,选择排序都执行 次比较 第 8 题 以下C++代码,尝试对有 n 个整数的数组 arr 进行排序。这个代码实现了选择排序算法。 第 9 题 如果一个异常在 try 块中抛出但没有任何 catch 匹配,它将在编译时报错。 第 10 题 下面C++代码实现将 Hello 写入 data.txt 。 3 编程题(每题 25 分,共 50 分) 3.1 编程题 1 试题名称:画布裁剪 时间限制:1.0 s 内存限制:512.0 MB 3.1.1 题目描述 小 A 在高为 宽为 的矩形画布上绘制了一幅画。由于画布边缘留白太多,小 A 想适当地裁剪画布,只保留画的主 体。具体来说,画布可以视为 行 列的字符矩阵,其中的字符均为 ASCII 码位于 之间的可见字符,小 A 只保留画布中由第 行到第 行、第 列到第 列构成的子矩阵。 小 A 将画布交给了你,你能帮他完成画布的裁剪吗? }; 20 int factorial(int n) { int res = 1; for (int i = 0; i < n; ++i) { res *= i; }return res; } 1234567 for (int i = 0; i < n - 1; ++i) { int minIndex = i; for (int j = i + 1; j < n; ++j) { if (arr[j] < arr[minIndex]) minIndex = j; }if (minIndex != i) swap(arr[i], arr[minIndex]); } 123456789 ofstream out("data.txt"); out << "Hello"; out.close(); 123 3.1.2 输入格式 第一行,两个正整数 ,分别表示画布的行数与列数。 第二行,四个正整数 ,表示保留的行列边界。 接下来 行,每行一个长度为 的字符串,表示画布内容。 3.1.3 输出格式 输出共 行,每行一个长度为 的字符串,表示裁剪后的画布。 3.1.4 样例 3.1.4.1 输入样例 1 3.1.4.2 输出样例 1 3.1.4.3 输入样例 2 3.1.4.4 输出样例 2 3.1.5 数据范围 对于所有测试点,保证 , , 。 3.1.6 参考程序 3 5 2 2 2 4 ..... .><. ..... 12345 >< 1 5 5 1 2 3 4 AbCdE fGhIk LmNoP qRsTu VwXyZ 1234567 CdhI 12 #include using namespace std; const int N = 105; int n, m; char s[N][N]; int x1, x2, y1, y2; int main() { scanf("%d%d", &n, &m); scanf("%d%d%d%d", &x1, &x2, &y1, &y2); for (int i = 1; i <= n; i++) scanf("%s", s[i] + 1); for (int i = x1; i <= x2; i++) { 123456789101112131415 3.2 编程题 2 试题名称:排序 时间限制:1.0 s 内存限制:512.0 MB 3.2.1 题目描述 体育课上有 名同学排成一队,从前往后数第 位同学的身高为 ,体重为 。目前排成的队伍看起来参差不齐, 老师希望同学们能按照身高从高到低的顺序排队,如果身高相同则按照体重从重到轻排序。在调整队伍时,每次只 能交换相邻两位同学的位置。老师想知道,最少需要多少次交换操作,才能将队伍调整成目标顺序。 3.2.2 输入格式 第一行,一个正整数 ,表示队伍人数。 接下来 行,每行两个正整数 和 ,分别表示第 位同学的身高和体重。 3.2.3 输出格式 输出一行,一个整数,表示最少需要的交换次数。 3.2.4 样例 3.2.4.1 输入样例 1 3.2.4.2 输出样例 1 3.2.4.3 输入样例 2 3.2.4.4 输出样例 2 s[i][y2 + 1] = 0; printf("%s\n", s[i] + y1); }return 0; } 1617181920 51 60 3 70 2 80 4 55 4 50 123456 8 1 54 0 4 0 2 0 3 0 1 0 123456 1 1 3.2.5 数据范围 对于所有测试点,保证 , 。 3.2.6 参考程序 #include #include #include #include using namespace std; int main() { int n, ans = 0; scanf("%d", &n); vector<pair<int,int>> a(n); for (int i = 0; i < n; i ++) scanf("%d%d", &a[i].first, &a[i].second); for (int i = 0; i < n; i ++) for (int j = i + 1; j < n; j ++) if (a[i] < a[j]) ans ++; cout << ans << '\n'; return 0; } 1234567891011121314151617181920212223
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
, 为什么二维数组的第一维可以不定义? 二维数组第一维可以不定义(比如 int arr[][4]),核心原因是 C 语言编译器不需要第一维的大小,就能通过 “列数” 和 “数组元素总大小” 计算出第一维的长度—— 本质是为了适配 “数组存储特性” 和 “函数传参需求”,下面分两个核心场景详细解释: 一、场景 1:定义数组时初始化(编译器计算第一维) 例1:明确分组的初始化int arr[ ][4] = {{1,2}, {3,4,5}, {6}}; 列数 N=4,编译器按 “4 个元素一行” 分组: 第一行:1、2(剩余 2 个元素补 0,即 [1,2,0,0]); 第二行:3、4、5(剩余 1 个补 0,即 [3,4,5,0]); 第三行:6(剩余 3 个补 0,即 [6,0,0,0]); 总元素数 = “行数 × 列数”=3×4=12,编译器通过 “分组次数” 直接确定行数 = 3,无需计算总元素数。 例子 2:不分组的初始化(同样生效) int arr[ ][4] = {1,2,3,4,5,6,7,8}; 列数 N=4,编译器自动按 4 个一组拆分: 第一行:1、2、3、4; 第二行:5、6、7、8; 直接确定行数 = 2,等价于 int arr[2][4]。 关键:列数不能省略! 如果写成 int arr[ ][ ] = {1,2,3,4};,编译器会报错 —— 因为没有列数 N,无法确定 “每一行分几个元素”,也就算不出行数,更无法分配连续内存。 二、场景 2:函数参数中的二维数组(本质是数组指针) 当二维数组作为函数参数时(比如 void func(int arr[ ][4])),第一维省略的原因更核心: C 语言中数组不能直接作为函数参数传递,数组名会自动 “退化” 为指向数组首元素的指针; 二维数组的首元素是 “第一行”(类型是 int[4],即 “4 个 int 的一维数组”),所以退化后的指针类型是 int (arr)[4](数组指针,指向 4 个 int 的数组); 这个数组指针的类型只和 “列数 4” 有关(必须明确指向的一维数组长度),和 “行数” 无关 —— 无论二维数组是 2 行、3 行,只要列数是 4,退化后的指针类型都是 int ()[4]; 因此,函数参数中写 int arr[][4] 时,第一维的数字是 “无效的”(编译器会忽略),比如 int arr[100][4] 和 int arr[][4] 完全等价,最终都会解析为 int (arr)[4]。 例子:函数传参的等价写法 下面三个函数声明完全一样,编译器都会解析为 “接收 int ()[4] 类型的数组指针”: void func1(int arr[ ][4]); // 推荐写法,清晰表明是二维数组(列数4) void func2(int arr[100][4]);// 多余的100会被编译器忽略 void func3(int (*arr)[4]); // 本质写法(数组指针)
为什么列数仍不能省略? 如果写成 void func(int arr[ ][ ]),编译器无法确定数组指针指向的 “一维数组长度”(不知道是 4 个 int,还是 5 个 int),后续通过 arr[i][j] 访问元素时,无法计算正确的内存地址(比如 arr[1][0] 应该跳 4 个 int 的长度,还是 5 个?),所以必须明确列数。
总结:核心逻辑 二维数组第一维可以省略,本质是 “列数已经提供了足够的内存定位信息”: 定义时初始化:列数确定 “每行元素数”,编译器自动拆分行数; 函数传参时:数组退化为数组指针,指针类型只依赖列数,行数无意义。 而列数不能省略,是因为它决定了 “内存块的分组规则” 和 “指针运算的步长”—— 没有列数,编译器就无法正确分配内存或计算元素地址。 一句话记:二维数组 “列定行不定”,列数是编译器的 “定位基准”。
int arr[2][3]={{1,2,3},{4,5,6}};则*((arr+1)+2)的值是 要解决这个问题,核心是理解二维数组的指针本质,一步步拆解表达式 ((arr+1)+2) 的含义: 第一步:明确二维数组的存储与指针特性 对于二维数组 int arr[2][3] = {{1,2,3},{4,5,6}}: 数组名 arr 是指向二维数组首元素的指针,而二维数组的首元素是一个一维数组(即第一行 arr[0]),因此 arr 的类型是 int ()[3](指向包含 3 个 int 的一维数组的指针)。 二维数组在内存中连续存储,布局为:1 2 3 4 5 6(第一行完直接接第二行)。 第二步:拆解 arr+1 的含义 指针运算规则:指针 + n 表示指向 “当前指针指向类型的第 n 个后续元素”。 arr 指向第一行(arr[0],类型是 int[3]),因此 arr+1 指向第二行(arr[1]),本质是 &arr[1](指向第二行这个一维数组的指针)。 第三步:拆解 *(arr+1) 的含义 * 是指针解引用操作,作用是获取指针指向的内容: arr+1 指向第二行(arr[1]),因此 (arr+1) 就是第二行本身(即一维数组 arr[1])。 而一维数组名 arr[1] 又会隐式转换为指向其首元素的指针(&arr[1][0],类型是 int),指向第二行的第一个元素 4。 第四步:拆解 *(arr+1)+2 的含义 此时 (arr+1) 是 int 类型(指向 arr[1][0]),指针 + 2 表示指向 “当前元素的第 2 个后续元素”: *(arr+1) + 2 即 &arr[1][0] + 2,指向第二行的第 3 个元素(索引为 2),也就是 &arr[1][2]。 第五步:拆解 ((arr+1)+2) 的含义 最后一次解引用,获取指针指向的内容: *(arr+1)+2 指向 arr[1][2],因此 ((arr+1)+2) 就是 arr[1][2] 的值。 最终结果 二维数组 arr[1][2] 对应的值是 6。
int (arr)[4]和int arr[4]的区别 这两个表达式的核心区别是 运算符优先级 和 变量本质 不同 ——int* arr[4] 是「指针数组」(数组里存 4 个 int 指针),int (arr)[4] 是「数组指针」(指向一个含 4 个 int 元素的数组的指针)。 一、先拆语法:优先级决定本质 1.int arr [4]:指针数组(数组 → 元素是指针) 语法逻辑:[ ] 优先级比 * 高,所以先结合 arr[4],表示「arr 是一个长度为 4 的数组」;再结合前面的 int*,表示「数组的每个元素是 int* 类型(int 指针)」。 通俗理解:一个 “装指针的盒子”,盒子里有 4 个位置,每个位置都放着一个指向 int 变量的指针。 2. int (*arr)[4]:数组指针(指针 → 指向数组) 语法逻辑:括号 () 强制 * 和 arr 先结合,所以先是 arr,表示「arr 是一个指针」;再结合后面的 [4] 和 int,表示「这个指针指向的是一个 “含 4 个 int 元素的数组”」。 通俗理解:一个 “指向数组的指针”,它本身是指针,专门指向特定长度(4 个 int)的数组,不能指向单个 int 或其他长度的数组。 二、核心区别对比表 int arr [4](指针数组)本质是数组(长度 4) int (*arr)[4](数组指针)本质是指针(指向 “4 个 int 的数组”)
最后记个口诀 无括号:int* arr[N] → 指针数组(先数组,后指针) 有括号:int (*arr)[N] → 数组指针(先指针,后数组) 优先级是核心,记住 [ ] 比 * 优先级高,括号可以 “反转” 结合顺序!
-
最近活动
- 铁外信息学BC班限时比赛20251126 IOI(严格)
- 2025OiClass入门组周赛计划#04(周六副本) OI
- 2025.11.20铁外GESP四级限时赛 IOI(严格)
- 铁外信息学BC班进制转化作业20251111 作业
- 铁外信息学BC班函数作业20251104 作业
- 铁外信息学B班字符串20251021 作业
- 铁外信息学B班字符数组讲解20250925 作业
- 【铁外】GESP三级真题训练(选择判断题)满分50 OI
- 【铁外】2025 CSP-J1初赛模拟测试1 OI
- 铁外信息学B班训练集20250916 作业
- 2025.9铁外ABC摸底测试 IOI(严格)
- 第六届oiclass信息学夏令营Class14-字符串 作业
- 第六届oiclass信息学夏令营Class13-字符和字符数组 作业
- 第六届oiclass信息学夏令营Class11-二维数组 作业
- 20250814铁外信息学夏令营测试2 IOI
- 20250812铁外信息学夏令营---一维数组进阶+二维数组 作业
- 20250811铁外信息学夏令营课后作业 作业
- 第六届oiclass信息学夏令营-模拟测试1(订题) 作业
- 20250811铁外信息学夏令营测试1 IOI
- 第六届oiclass信息学夏令营-模拟测试1 IOI(严格)
- 20250809铁外夏令营作业-一维数组 作业
- 第六届oiclass信息学夏令营Class10-一维数组进阶 作业
- 20250808铁外夏令营作业-循环结构4-while语句1 作业
- 第六届oiclass信息学夏令营Class9-一维数组的定义和基础应用 作业
- 第六届oiclass信息学夏令营Class8-循环嵌套 作业
- 第六届oiclass信息学夏令营Class7-循环结构-while语句 作业
- 第六届oiclass信息学夏令营Class6-循环结构-for语句进阶 作业
- 20250808铁外夏令营作业-循环结构3 作业
- 【铁外夏令营线上班测试】8.7 前四天学习内容测试 IOI
- 20250807铁外1夏令营作业-循环结构2 作业
- 第六届oiclass信息学夏令营Class5-循环结构-for语句基础 作业
- 第六届oiclass信息学夏令营Class4作业-多分支结构-if语句 作业
- 第六届oiclass信息学夏令营Class3作业-if语句 作业
- 第六届oiclass信息学夏令营Class2作业-表达式 作业
- 第六届oiclass信息学夏令营Class1作业-程序结构 作业
-
Stat
-
Rating