《C语言假期作业学习笔记》—Day03

请乘理想之马

挥鞭从此起程

路上春色正好

天上太阳正晴 

                                                                       ——希望疫情早日结束,所有美好如约而至!

 Day03

一、选择题

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) ;
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
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: * * *

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

A: -6

B: 12

C: 0

D: -12  

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

二、编程题

T1:记负均正_牛客题霸_牛客网HJ97 记负均正

描述

首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。

0即不是正整数,也不是负数,不计入计算

数据范围:  ,输入的整数都满足 

输入描述:

本题有多组输入用例。

首先输入一个正整数n,
然后输入n个整数。

输出描述:

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

示例1

输入:

5
1 2 3 4 5
10 
1 2 3 4 5 6 7 8 9 0

输出:

0 3.0
0 5.0

示例2

输入:

3
0 0 0

输出:

0 0.0

T2:旋转数组的最小数字_牛客题霸_牛客网JZ11 旋转数组的最小数字

描述

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

数据范围:1 \le n \le 100001≤n≤10000,数组中任意元素的值: 0 \le val \le 100000≤val≤10000

要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)

示例1

输入:[3,4,5,1,2]

返回值:1

示例2

输入:[3,100,200,3]

返回值:3 

题解:

一、选择题

1
答案解析:
正确答案: A
参数 a 是指针,要接收地址, BD 错误。参数 b 可以接收的是 char* ,而 &c 的类型是 char(*)[10] C 错误
2
答案解析:
正确答案: ABCD
如果 const 位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量; *c *d 不能变。 如果 const 位于 * 的右侧,则 const 就是修饰指针本身,即指针本身是常量; e f 不能变。
3
答案解析:
正确答案: A
全局变量 i ,在 main() 中修改为 5 ,第一次在 prt() 中执行循环输出三次 '*' i 被修改为 8 ,回到 main() 中第二次调用 prt() 时,i<8 为假,循环结束没输出,执行一次 print("\t") ,再次回到主函数后 i++ 变为 9 i<=8 为假,循环结束 ;
4
答案解析:
正确答案: D
a+=a-=a*a 等价于 a=a+(a=a-a*a) ,即先计算 a=a-a*a ,所以此时 a 的值为 3-3*3=-6 ,再计算 -6+(-6)=-12 赋值给 a ,所以a 的值为 -12 ,也就是整个表达式的值,所以应选择 D
5
答案解析:
正确答案: D
只有条件为真时才进行循环, ABC 1 为真, D 0 为假
二、编程题
1 、【答案解析】:
这道题其实通过 scanf 捕捉数据即可,统计负数个数,以及正数格式,并且在统计正数个数的过程中求取正数总和,最后计算得出平均数即可。需要注意的是所有数字中0 是不统计在内的。
#include <stdio.h>
int main()
{
	int n;
	while (~scanf("%d", &n)) 
	{
		int count1 = 0, count2 = 0, tmp;
		float sum = 0;
		for (int i = 0; i < n; i++) 
		{
			scanf("%d", &tmp);
			if (tmp < 0) 
			{
				count1++; //统计负数个数
			}
			else if (tmp > 0) 
			{
				sum += tmp; //正数求和
				count2++; //统计大于0的正数个数,这样是因为题目说明0不算在内
			}
		}
		printf("%d %.1lf\n", count1, sum / count2);
	}
	return 0;
}

2、【答案解析】: 暴力破解:遍历数组找出最小值即可 更优思想:采用二分查找,这个题主要分析三种旋转情况 [1, 2, 3, 4, 5],使用中间值与右端进行比较。

1. 中间大于右边 [3, 4, 5, 1, 2],这种情况下,最小数一定在右边;则left = middle + 1

2. 中间等于右边 [1, 0, 1, 1, 1], 这个是[0, 1, 1, 1, 1] 旋转过来的,这时候需要缩小范围 right--;,注意不能是 left++,因为是非降序数组,所以要缩小右边范围,把较小值向右推,符合我们的判断规则。

3. 中间小于右边 [5, 1, 2, 3, 4], 这种情况下,最小数字则在左半边;则right = middle

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen)
{
	if (rotateArrayLen == 0) return 0;
	int left = 0, right = rotateArrayLen - 1, mid;
	if (rotateArray[right] > rotateArray[left]) return rotateArray[0];
	while (left < right) 
	{
		mid = left + (right - left) / 2;
		if (rotateArray[mid] > rotateArray[right]) left = mid + 1;
		else if (rotateArray[mid] == rotateArray[right]) right--;
		else right = mid;
	}
	return rotateArray[left];
}

后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                ——By 作者:新晓·故知

《C语言假期作业学习笔记》之内容采用动态管理即若学习到多解、优解等将会进行更新,敬请读者斧正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值