目录
选择题
考点一:C语言函数
考点二:函数在内存中存储
考点三:函数的具体使用
考点四:调用函数的理解
考点五:递归函数
编程题
【牛客网题号: HJ34 图片整理】【难度:中等】
【 leetcode 题号:724. 寻找数组的中心下标】【难度:简单】
以下对C语言函数的有关描述中,正确的有【多选】( )
A: 在C语言中,一个函数一般由两个部分组成,它们是函数首部和函数体
B: 函数的实参和形参可以是相同的名字
C: 在main()中定义的变量都可以在其它被调函数中直接使用
D: 在C程序中,函数调用不能出现在表达式语句中
正确答案:AB
主函数中定义的局部变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系,C错误;
当函数有返回值时,可以出现在表达式中,D错误
在C语言中,以下正确的说法是( )
A: 实参和与其对应的形参各占用独立的存储单元
B: 实参和与其对应的形参共占用一个存储单元
C: 只有当实参和与其对应的形参同名时才共占用存储单元
D: 形参是虚拟的,不占用存储单元
正确答案:A
在调用函数的时候,真实传递给函数的是实参,函数定义部分函数名后的参数是形参。形参和实参的名字是可以相同的,在函数调用的时候,形参是实参的一份临时拷贝,分别占用不同的内存空间,所以A正确
即使形参和实参的名字相同,也是占用不同的内存空间,所以B错误;
函数如果不被调用时,函数的形参是形式上存在的,但是函数在被调用的时候,形参是要
分配内存空间的,所以D错误。
小知识:
实际参数(实参):
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
在上下文及头文件均正常的情况下,下列代码的输出是( )(注: 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: run-time error D: suieneG
正确答案:A(注意s前面有个空格)
知识点:函数声明
因为程序是
从上往下
按顺序走的,如果其它函数写在主函数后面而且没有被声明的话,此时程序是不知道有这个函数,那程序走到这些函数被调用的地方的时候,是找不到它们函数的本体的,因为从头都没发现函数体但如果在程序开头
声明
过的话,在程序走到函数声明的地方时,就相当于将最后的函数体整体替代了声明的语句,就告诉程序是有这个函数的,那在调用的时候就能被调用了
代码实现了递归倒序打印字符串的功能,但是++s使得s的值发生了变化,回不到'G'的位置上,故而没有打印'G'
*s为G,执行print(e),printf(e)被压入倒数第1层,应该输出e;
*s为e,执行print(n),printf(n)被压入倒数第2层,应该输出n;
*s为n,执行print(e),printf (e) 被压入倒数第3层,应该输出e;
*s为e,执行print(i),printf (i) 被压入倒数第4层,应该输出i;
*s为i,执行print(u),printf (u) 被压入倒数第5层,应该输出u;
*s为u,执行print(s),printf (s) 被压入倒数第6层,应该输出s;
*s为s,执行print(\0),printf (\0) 被压入倒数第7层,应该输出空格;
开始跳出print,从上向下得到压入栈中的printf,得到最后结果“ suiene”
对于函数 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选项没有传参,也不能接收返回值也是错误的。
给定 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即等差数列的和
描述
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、"a"到"z"、"0"到"9"表示。
数据范围:每组输入的字符串长度满足 1≤n≤1000
输入描述:
一行,一个字符串,字符串中的每个字符表示一张Lily使用的图片。
输出描述:
Lily的所有图片按照从小到大的顺序输出
示例1
输入:
Ihave1nose2hands10fingers
输出:
0112Iaadeeefghhinnnorsssv
题目传送门:OJ链接
#include
#include
int main()
{
char arr[1000] = { 0 };
int i = 0;
while (scanf("%s", &arr) != EOF)//如果没有这样写会超内存的
{
int a[1000] = { 0 };//定义一个数组,记录字符存放的个数
int len = strlen(arr);
for (i = 0; i < len; i++)
{
a[arr[i]]++;//对应ASCII码次数+1
}
for(int i=0; i<1000; i++)//遍历数组a
{
while (a[i] != 0)//如果a里面的字符还有
{
printf("%c",i);//打印字符,此时i为字符
a[i]--;//字符次数-1,到0为止
}
}
printf("\n");
}
return 0;
}
冒泡排序:相邻数据之间进行比较交换,将较大或较小的数据向后推到数组末尾,然后开始下一轮次大数据的冒泡过程
#include
#include
int main()
{
char arr[1000] = { 0 };
while (scanf("%s", &arr) != EOF)
{
int len = strlen(arr);
for (int i = 0; i < len - 1; i++)
{
for (int j = i + 1; j < len; j++)
{
if (arr[i] > arr[j])
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
printf("%s\n", arr);
}
return 0;
}
给你一个整数数组 nums ,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。
示例 1:
输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。
题目传送门:OJ链接
思路:
从数组的0下标处开始向后逐下标统计,计算当前下标左边之和,和右边之和,进行判断,相等则为中心下标,如果
数组循环结束都没有找到中心下标,则返回-1,表示没有中心下标
int pivotIndex(int* nums, int numsSize)
{
int i = 0;
int total = 0;
for(i=0;i