C语言题目强化-DAY07


★★写在前面★★
本题库源自互联网,仅作为个人学习使用,记录C语言题目练习的过程,如果对你也有帮助,那就点个赞吧。


一、选择题

1、以下对C语言函数的有关描述中,正确的有【多选】( )
A: 在C语言中,一个函数一般由两个部分组成,它们是函数首部和函数体
B: 函数的实参和形参可以是相同的名字
C: 在main()中定义的变量都可以在其它被调函数中直接使用
D: 在C程序中,函数调用不能出现在表达式语句中

正确答案:AB
答案解析
C:主函数中定义的局部变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系,选项C错误。
D:当函数有返回值时,可以出现在表达式中,选项D错误。

2、在C语言中,以下正确的说法是( )
A: 实参和与其对应的形参各占用独立的存储单元
B: 实参和与其对应的形参共占用一个存储单元
C: 只有当实参和与其对应的形参同名时才共占用存储单元
D: 形参是虚拟的,不占用存储单元

正确答案:A
答案解析
AB:在调用函数的时候,真实传递给函数的是实参,函数定义部分函数名后的参数是形参。形参和实参的名字是可以相同的,在函数调用的时候,形参是实参的一份临时拷贝,分别占用不同的内存空间,所以选项A正确,B错误。
C:即使形参和实参的名字相同,也是占用不同的内存空间,选项C错误。
D:函数如果不被调用时,函数的形参是形式上存在的,但是函数在被调用的时候,形参是要分配内存空间的,选项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: run-time error D: suieneG

正确答案:A
答案解析:此题用到了函数的递归,每次调用print()函数的时候,s都会自增,直到遇到’\0’,递归停止,然后执行printf()函数,因此是逆序打印字符串,但是,往下递的时候,第一次调用print()函数时,++s使得最后打印的字符不是G而是e,因此选项A正确。

4、对于函数void f(int x); ,下面调用正确的是( )
A: int y=f(9); B: f(9); C: f(f(9)); D: x=f();

正确答案:B
答案解析
A:函数没有返回类型,因此不可以赋值给y,选项A错误。
C:函数没有返回类型,但是实参要是整型,因此不能将没有返回值的f(9)作为实参,选项C错误。
D:函数没有传参,并且不能接收返回值,选项D错误。

5、给定fun 函数如下,那么fun(10) 的输出结果是( )

int fun(int x)
{
	return (x==1) ? 1 : (x + fun(x-1));
}

正确答案:C
答案解析:此题依然运用到了函数的递归,实现的功能是计算1到10的和,为55。

二、编程题

1、Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决。
输入描述:Lily使用的图片包括"A" 到"Z" 、“a” 到"z" 、“0” 到"9" 。输入字母或数字个数不超过1024 。
输出描述:Lily的所有图片按照从小到大的顺序输出

牛客网【牛客网题号: HJ34 图片整理】

示例:
输入:Ihave1nose2hands10fingers
输出:0112Iaadeeefghhinnnorsssv
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void* e1,const void* e2)
{
    return *(char*)e1-*(char*)e2;
}

int main() {
	char arr[1024]={0};
	scanf("%s",arr);
	int len=0;
	len=strlen(arr);
	qsort(arr,len,sizeof(char),cmp);
	printf("%s",arr);
    return 0;
}
//用qsort()函数进行从小到大排序即可,也可以使用循环遍历的方式进行排序

2、给你一个整数数组 nums ,请计算数组的 中心下标 。
数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

leetcode【leetcode 题号:724. 寻找数组的中心下标】

示例:
输入: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 ,二者相等。
输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0
int pivotIndex(int* nums, int numsSize){
    
}
int pivotIndex(int* nums, int numsSize) {
    int sum_left = 0;
    int sum = 0;
    int i = 0, j = 0;
    if (numsSize == 0)
        return -1;
    for (i = 0; i < numsSize; i++)
    {
        sum += nums[i];
    }
    for (i = 0; i < numsSize; i++)
    {
        sum_left = 0;
        for (j = 0; j < i; j++)
        {
            sum_left += nums[j];
        }

        if (sum - nums[i] == 2 * sum_left)
        {
            return i;
        }
    }
    return -1;
}

代码思路
1、如果传入的数组长度为0,那么返回-1;
2、计算数组所有元素之和存放在sum变量当中;
3、双层循环,外层循环控制分隔的数组元素位置,内层循环计算该元素之前的元素之和;
4、条件判断,如果该元素之前元素之和*2等于总和减去该元素的值,那么可以返回此时的元素下标;
5、如果两层循环都走遍了都没有返回值,则说明这个数组不满足题意的要求,返回-1。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学不会编程的小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值