C语言题目强化-DAY03

本文详细解读C语言中的选择题和编程题,涉及函数调用、数组与指针、编译限制,以及如何处理负数计数和正整数平均值。还介绍了旋转数组中寻找最小值的算法。
摘要由CSDN通过智能技术生成


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


一、选择题

1、已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; ,正确的调用语句是( )
A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d);

正确答案:A
答案解析i:nt fun(char b[10], int *a);函数第一个参数为数组,因此实参应该是数组c,第二个参数为int*的指针,因此实参应该是&d。

2、请问下列表达式哪些会被编译器禁止【多选】( )

int a = 248, b = 4;
int const *c = 21;
const int *d = &a;
int *const e = &b;
int const * const f = &a;

A: *c = 32; B: *d = 43 C: e=&a D: f=0x321f

正确答案:ABCD
答案解析

int a = 248, b = 4;
int const *c = 21;			//*c有const修饰,所以*c不可更改,所以A选项错误。
const int *d = &a;			//*d有const修饰,所以*d不可更改,所以B选项错误。
int *const e = &b;			// e有const修饰,所以e不可更改,所以C选项错误。
int const * const f = &a;	 f有const修饰,*f有const修饰,所以f和*f不可更改,所以D选项错误。

3、以下程序的输出结果为( )

#include <stdio.h>
int i;
void prt()
{
	for (i = 5; i < 8; i++)
	printf("%c", '*');
	printf("\t");
}
int main()
{
	for (i = 5; i <= 8; i++)
	prt();
	return 0;
}

A: *** B: *** *** *** *** C: *** *** D: * * *

正确答案:A
答案解析:i是全局变量,i在main函数中调用赋初值为5,进入prt()函数后进入零一循环,重新赋初值为5,循环3次后返回main函数后,i已经为9了,条件判断为假,循环结束,因此打印三个*。

4、下面代码段的输出是( )

int main()
{
	int a=3;
	printf("%d\n",(a+=a-=a*a));
	return 0;
}

A: -6 B: 12 C: 0 D: -12

正确答案:D
答案解析:第一步:a=a-(a*a)=3-9=-6;第二步:a=a+a=-6-6=-12。

5、下列不能实现死循环的是( )
A: while(1){} B: for(;1;){} C: do{}while(1); D: for(;0;){}

正确答案:D
答案解析:条件表达式,非0为真,0为假,D选项条件为0,始终为假,进入不了循环。

二、编程题

1、首先输入要输入的整数个数n ,然后输入n 个整数。输出为n 个整数中负数的个数,和所有正整数的平均值,
结果保留一位小数。
注意: 0 即不是正整数,也不是负数,不计入计算; 本题有多组输入用例。
输入描述:首先输入一个正整数n ,然后输入n 个整数。

输出描述:输出负数的个数,和所有正整数的平均值。

牛客网【牛客网题号: HJ97 记负均正】

示例:
输入: 5
1 2 3 4 5
10
1 2 3 4 5 6 7 8 9 0
输出: 0 3.0
0 5.0

#include<stdio.h>
int main()
{
	int n = 0;
	int i = 0;
	int input = 0;
	scanf("%d", &n);
	int count_negative = 0;			//计数负数
	int count_positive = 0;			//计数正数
	float sum_positive = 0;			//求和正数
	float average_positive = 0;		//正数平均数
	while (i < n)
	{
		scanf("%d", &input);
		if (input < 0)				//如果为负数,count_negative++
			count_negative++;
		if (input > 0)				//如果为正数,加到sum_positive上,count_positive++
		{
			sum_positive += input;
			count_positive++;
		}
		i++;
	}
	if (count_positive != 0)								//如果正数的个数不为0,正常求平均数
		average_positive = sum_positive / count_positive;
	else													//如果正数的个数为0,正数的平均数置为0
		average_positive = 0;
	printf("%d %.1lf", count_negative, average_positive);
	return 0;
}

2、有一个长度为 n 的非降序数组,比如[1,2,3,4,5] ,将它进行旋转,即把一个数组最开始的若干个元素搬到数组
的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2] ,或者[4,5,1,2,3] 这样的。请问,给定这样一个旋转数组,求数
组中的最小值。
数据范围: 1≤n≤10000 ,数组中任意元素的值: 0≤val≤10000

牛客网【牛客网题号: JZ11 旋转数组的最小数字】

示例:
输入:[3,4,5,1,2]
返回值:1

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 */
 #include<stdlib.h>
 int compar(const void*e1,const void*e2)
 {
    return (*(int*)e1-*(int*)e2);
 }
int minNumberInRotateArray(int* nums, int numsLen ) {
    // write code here
    qsort(nums,numsLen,4,compar);
    return nums[0];
}

代码思路:
排序求最小值:一、冒泡排序;二、qsort()函数排序,最小值放在首元素位置,最后返回首元素即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一直学不会编程的小徐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值