

🔥个人主页:@草莓熊Lotso
🎬作者简介:C++研发方向学习者
📖个人专栏:************************************************************************************************************************************************************************************************************************************************************《C语言》《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》****************************************************************************************************************************************************************************************************************************************************************
⭐️人生格言:生活是默默的坚持,毅力是永久的享受。
前言:我们距离学习完C语言已经很久了,在数据结构学完后,博主准备通过这16天的强化训练和大家一起回顾C语言的知识,今天依旧是五道选择和两道编程题,希望大家能有所收获。
目录
选择题:
1、以下对C语言函数的有关描述中,正确的有【多选】( )
A: 在C语言中,一个函数一般由两个部分组成,它们是函数首部和函数体
B: 函数的实参和形参可以是相同的名字
C: 在main()中定义的变量都可以在其它被调函数中直接使用
D: 在C程序中,函数调用不能出现在表达式语句中
答案解析:
正确答案:AB主函数中定义的局部变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系,C错误;当函数有返回值时,可以出现在表达式中,D错误
2、在C语言中,以下正确的说法是( )
A: 实参和与其对应的形参各占用独立的存储单元
B: 实参和与其对应的形参共占用一个存储单元
C: 只有当实参和与其对应的形参同名时才共占用存储单元
D: 形参是虚拟的,不占用存储单元
答案解析:
正确答案:A
在调用函数的时候,真实传递给函数的是实参,函数定义部分函数名后的参数是形参。形参和实参的名字是可以相同的,在函数调用的时候,形参是实参的一份临时拷贝,分别占用不同的内存空间,所以A正确,B错误,及时形参和实参的名字相同,也是占用不同的内存空间,所以B错误;函数如果不被调用时,函数的形参是形式上存在的,但是函数在被调用的时候,形参是要分配内存空间的,所以D错误。
3、在上下文及头文件均正常的情况下,下列代码的输出是( )(注: print 已经声明过)
A: suiene B: neius C: run-time error D: suieneG
cpp
int main()
{
char str[] = "Geneius";
print(str);
return 0;
}
print(char* s)
{
if (*s)
{
print(++s);
printf("%c", *s);
}
}
答案解析:
正确答案:A代码实现了递归倒序打印字符串的功能,但是++s使得s的值发生了变化,回不到'G'的位置上,故而没有打印'G
4、对于函数 void f(int x); ,下面调用正确的是( )
A: int y=f(9); B: f(9); C: f(f(9)); D: x=f();
答案解析:
正确答案:B
函数f是没有返回值的,不能给int类型变量赋值,故A错误,同时需要一个整型参数,C中f(9)不能作为f的参数,也是错的,D 选项没有传参,也不能接收返回值也是错误的。
5、给定 fun 函数如下,那么 fun(10) 的输出结果是( )
A: 0 B: 10 C: 55 D: 3628800
cpp
int fun(int x)
{
return (x==1) ? 1 : (x + fun(x-1));
}
答案解析:
正确答案:C
代码是一个递归函数,计算x+(x-1)+(x-2)+...+2+1即等差数列的和
编程题:
1.图片整理
题目链接: 图片整理_牛客题霸_牛客网
题目描述:

题目示例:

代码演示:
cpp
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void*p1,const void*p2)
{
return *(char*)p1-*(char*)p2;
}
int main() {
char s[1001];
scanf("%s",s);
qsort(s,strlen(s),sizeof(char),cmp);
printf("%s",s);
return 0;
}
题目解析:
- 这道题考察的其实就是字符排序,每个 ascii 字符在内存都有一个对应的 ascii 值,通过内存中数据的存储进行排序就行,这里直接用的qsort。
2.寻找数组的中心下标
题目描述:

题目示例:

代码演示:
cpp
int pivotIndex(int* nums, int numsSize) {
int total = 0;
for (int i = 0; i < numsSize; ++i) {
total += nums[i];
}
int sum = 0;
for (int i = 0; i < numsSize; ++i) {
if (2 * sum + nums[i] == total) {
return i;
}
sum += nums[i];
}
return -1;
}
题目解析:
- 先算数组总和
total
,再遍历数组,用sum
累加左侧元素,当2 * sum + nums[i] == total
时,i
就是中心下标,否则返回-1
,通过一次遍历找中心下标,时间复杂度 O(n) ,空间复杂度 O(1)
往期回顾:
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day4
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day5
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day6
结语:本篇博客就到此结束了,C 语言的精髓在于对细节的掌控和对底层的理解,这需要持续实践。愿你带着这份训练中获得的思维与习惯,在编程路上走得更稳、更远。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。