【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day7

🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏:************************************************************************************************************************************************************************************************************************************************************《C语言》《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》****************************************************************************************************************************************************************************************************************************************************************

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言:我们距离学习完C语言已经很久了,在数据结构学完后,博主准备通过这16天的强化训练和大家一起回顾C语言的知识,今天依旧是五道选择和两道编程题,希望大家能有所收获。


目录

选择题:

编程题:

1.图片整理

2.寻找数组的中心下标


选择题:

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.寻找数组的中心下标

题目链接: 724. 寻找数组的中心下标 - 力扣(LeetCode)

题目描述:

题目示例:

代码演示:

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 语言的精髓在于对细节的掌控和对底层的理解,这需要持续实践。愿你带着这份训练中获得的思维与习惯,在编程路上走得更稳、更远。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。