C语言题目强化-DAY15


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


一、选择题

1、有如下代码,则*(p[0]+1) 所代表的数组元素是( )
A: a[0][1] B: a[1][0] C: a[1][1] D: a[1][2]

正确答案:C
答案解析:p是一个指针数组,p[0] = a[1];此处a[1]是二维数组的第二行的数组名,数组名表示首元素的地址,a[1]是a[1][0]的地址,所
以p[0]中存储的是第2行第1个元素的地址,p[0]+1就是第二行第2个元素的地址,*(p[0]+1)就是第二行第二个元素了,选项C正确。

2、关于指针下列说法正确的是【多选】( )
A: 任何指针都可以转化为void * B: void *可以转化为任何指针
C: 指针的大小为8个字节 D: 指针虽然高效、灵活但可能不安全

正确答案:ABD
答案解析:C选项,指针占几个字节要看平台,64位环境下8个字节,32位环境下4个字节。

3、以下scanf 函数调用选项中, 错误的是( )

struct T
{
	char name[20];
	int age;
	int sex;
} a[5], *pa=a;

A: scanf(“%s”,a[0].name); B: scanf(“%d”, &pa[0].age);
C: scanf(“%d”,&(pa->age)); D: scanf(“%d”, pa->age);

正确答案:D
答案解析:scanf(“输入控制符”, 输入参数);功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。scanf输入时要通过地址找空间,B、C用了&是正确的。name属于字符数组的数组名,相当于数组的首地址,A正确。单独的pa->age可用于输出语句获取值的形式,用在scanf中的时候需要&操作符,选项D错误。

4、如下函数fun 计算prod=123*…*n ,并返回计算结果值。但当n>12 时,返回值不正确。要找出该程序的错误,正确的调试方法是( )

int fun(int n)
{
	int prod = 1 , i = 0;
	for(i = 1;i <= n;i++)
	{
	prod *= i;
	}
	return prod;
}

A: 监视变量prod的值,在prod *= i;行处设置断点,然后单步运行,直到发现错误原因
B: 监视变量prod的值,在return prod;行处设置断点,程序中断后,即可发现错误原因
C: 在prod=1;处设置断点,然后在函数调用堆栈中即可发现错误原因
D: 监视变量i的值,在for (i=1; i<=n; i++)行处设置断点,然后单步运行,直到发现错误原因

正确答案:A
答案解析:依题目已知情况,当n<=12时结果是正确的,说明是随着参数的变大计算过程中哪里出了问题,故而要在prod *= i;处设断
点,查看原因。错误原因是数据过大时整型溢出,选项A正确。

5、下列给定程序中,函数fun 的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]、a[1]、a[2]… 中,把偶数从数组中删除,奇数个数通过函数值返回。 例如,若a所指数组中的数据最初排列为: 9,1,4,2,3,6,5,8,7 ,删除偶数后,a所指数组中的数据为: 9,1,3,5,7 ,返回值为5。请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果( )

int fun(int a[], int n)
{
	int i, j;
	j=0;
	for (i=0; i<n; i++)
	if (a[i]%2== _________ )
	{
	a[j]=a[i];
	_________;
	}
	return _________;
}

A: 0 j++ j B: 1 j++ j+1 C: 0 j++ j+1 D: 1 j++ j

正确答案:D
答案解析:代码实现的思路应该是arr[i]是奇数的时候要存储起来,所以第一个空是1,最开始j是0,每次找到一个奇数就存储到arr[j]的
位置,那接下里j需要+1,所以得第二个空是j++,当循环停止的时候,j其实就是奇数的个数。所以最后返回j,第三个空是j,选项D正确。

二、编程题

1、现在有一个长度为 n 的正整数序列,其中只有一种数值出现了奇数次,其他数值均出现偶数次,请你找出那个
出现奇数次的数值。
输入描述:第一行:一个整数n,表示序列的长度。第二行:n个正整数ai,两个数中间以空格隔开。
输出描述:一个数,即在序列中唯一出现奇数次的数值。

牛客网【牛客网题号: KS33 寻找奇数】

#include<stdio.h>
int main()
{
    int n=0;
    int num=0;
    int sum=0;
    scanf("%d",&n);
    
    for(int i=0;i<n;i++)
    {
        scanf("%d",&num);
        sum^=num;
    }
    
    printf("%d\n",sum);
    return 0;
}

代码思路:本题采用异或的方式进行查找奇数个数的那个数,因为一个数异或自己,结果为0,继续异或自己则得到的结果还是自己,(0与任何数异或的结果就是那个被0异或的数),因为输入的数据中只有一个奇数个数的数,其它数据的个数都是偶数,将输入的全部数据进行异或,最终结果只能是出现次数为单数的那个数。

2、给定一个长度为n的数组nums ,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素,严格大于即不能有等于。
2.假设 nums[-1] = nums[n] = 负无穷小
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

牛客网【牛客网题号: NC107 寻找峰值】

示例:
输入:[2,4,1,2,7,8,4]
返回值:1
说明:48都是峰值元素,返回4的索引1或者8的索引5都可以
输入:[5,3,4,2,6]
返回值:0
说明:-1作为下标或者n下标位置都表示负无穷小, 则0号下标5是峰值,或者4号下标6也是峰值
int findPeakElement(int* nums, int numsLen ) {

}
int findPeakElement(int* nums, int numsLen ) {
    for (int i = 0; i < numsLen; i++) {
        if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1])
            return i;
    }
    if (nums[0] > nums[1])
        return 0;
    if (nums[numsLen - 1] > nums[numsLen - 2])
        return numsLen-1;
    return -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、付费专栏及课程。

余额充值