目录
选择题
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
已经声明过)
int main()
{
char str[] = "Geneius";
print(str);
return 0;
}
print(char *s)
{
if(*s)
{
print(++s);
printf("%c", *s);
}
}
- A
suiene
- B
neius
- C 运行错误
- D
suieneG
答案:A
解析:
代码实现了递归倒序打印字符串的功能,但是++s
存在副作用,在第一次进入递归时s已经被改变,注意区分s+1
和++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)的输出结果是
int fun(int x)
{
return (x==1) ? 1 : (x + fun(x-1));
}
- A 0
- B 10
- C 55
- D 3628800
答案:C
解析:
代码是一个递归函数,计算x+(x-1)+(x-2)+...+2+1即等差数列的和
编程题
图片整理
题目链接:图片整理_牛客题霸_牛客网 (nowcoder.com)
描述
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、"a"到"z"、"0"到"9"表示。
数据范围:每组输入的字符串长度满足 1≤ n≤1000
输入描述:
一行,一个字符串,字符串中的每个字符表示一张Lily使用的图片。
输出描述:
Lily的所有图片按照从小到大的顺序输出
思路解析:
因为图片最后是按照对应字符的ASCII码值从小到大依次输出,故直接将原数组中的所有字符进行排序再输出即可,注意字符数组的实际长度不一定是开辟的长度,使用strlen
进行计算
参考代码
#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 str[1000] = {0};
scanf("%s",str);
qsort(str, strlen(str), sizeof(char), cmp);
for(int i = 0; i<strlen(str);i++)
{
printf("%c", str[i]);
}
return 0;
}
寻找数组的中心下标
题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode)
给你一个整数数组nums
,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为0
,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回-1
。
思路解析:
本题观察规律,当数组中存在中心下标时,满足sumLeft + sumRight + numMid = total
,化简等式可以得到numMid = total - sumLeft - sumRight
,因为存在中心下标,故存在sumLeft == sumRight
,则等式简化为total = 2 * sumLeft + numMid
,而sumLeft
即为此时数组的前缀和,如果数组的前缀和的两倍加上中心下标的数值为total
值时即为存在中心下标,此时numMid
对应的下标即为中心下标,否则没有中心下标,在程序中,当左侧或右侧不存在前缀和时,默认前缀和为0
参考代码:
/*
* @lc app=leetcode.cn id=724 lang=c
*
* [724] 寻找数组的中心下标
*/
// @lc code=start
int pivotIndex(int *nums, int numsSize)
{
// 求数组总和
int total = 0;
for (int i = 0; i < numsSize; i++)
{
total += nums[i];
}
// 求前缀和
int sum = 0;// 当不存在左侧前缀和时,默认为0
for (int i = 0; i < numsSize; i++)
{
if (2 * sum + nums[i] == total)
{
return i;
}
sum += nums[i];
}
return -1;
}
// @lc code=end