C语言假期作业 DAY 03

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: C语言假期作业 DAY 03

目录

题目

一、选择题

1、已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; ,正确的调用语句是( )
2、请问下列表达式哪些会被编译器禁止【多选】( )

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

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

5、下列不能实现死循环的是( )

二、编程题

1:记负均正_牛客题霸_牛客网 (nowcoder.com)HJ97 记负均正

描述

输入描述:

输出描述:
2:旋转数组的最小数字_牛客题霸_牛客网JZ11 旋转数组的最小数字

描述

示例1

示例2

题解

一、选择题
1 、【答案解析】

2 、【答案解析】

3 、【答案解析】

4 、【答案解析】

5 、【答案解析】

二、编程题

1 、【答案解析】:

2、【答案解析】


题目


一、选择题


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、以下程序的输出结果为( )


9774e2116ba042ec98dd5da901841773.png


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

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

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

A: -6

B: 12

C: 0

D: -12


5、下列不能实现死循环的是( )

A: while(1){}
B: for( ; 1 ; ){}
C: do{}while(1) ;
D: for( ; 0 ; ){}

二、编程题


1:记负均正_牛客题霸_牛客网 (nowcoder.com)HJ97 记负均正

描述

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


0即不是正整数,也不是负数,不计入计算。如果没有正数,则平均值为0。


数据范围:  1≤n ≤2000  ,输入的整数都满足  ∣val∣≤1000


输入描述:

首先输入一个正整数n,

然后输入n个整数。


输出描述:

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


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

描述

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


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


要求:空间复杂度:O(1) ,时间复杂度: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>
#include<stdlib.h>
int main() {
    int n = 0;
    while (scanf("%d", &n) != EOF) {
        int i = 0;
        int sum = 0;
        float ava = 0.0f;
        int cnt1 = 0;//记录负数
        int cnt2 = 0;//记录除0后的数
        int cnt3 = 0;//记录0的个数
        int* arr = (int*)malloc(n * sizeof(int));
        for (i = 0; i < n; i++) {
            scanf("%d", &arr[i]);
        }
        for (i = 0; i < n; i++) {
            if (arr[i] < 0) {
                cnt1++;
            } else if (arr[i] > 0) {
                sum += arr[i];
                cnt2++;
            } else {
                cnt3++;
            }
        }
        if (cnt3 == n) {
            printf("%d 0.0", cnt1);
        } 
        else {
            ava = (double)sum / cnt2;
            printf("%d %.1f", cnt1, ava);
        }
        free(arr);
        arr = NULL;
    }
    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];
}



相关文章
|
7月前
|
C语言
[日常]C语言作业详解12_17(题型对应知识点)
[日常]C语言作业详解12_17(题型对应知识点)
72 0
|
7月前
|
算法 程序员 编译器
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
55 0
|
7月前
|
存储 Linux C语言
C语言初阶⑥(操作符详解)编程作业(算数转换)(下)
C语言初阶⑥(操作符详解)编程作业(算数转换)
40 1
|
7月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(下)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
43 1
|
7月前
|
存储 C语言 索引
C语言初阶⑥(操作符详解)编程作业(算数转换)(上)
C语言初阶⑥(操作符详解)编程作业(算数转换)
48 0
|
7月前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(上)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
43 0
|
7月前
|
存储 人工智能 搜索推荐
【C语言进阶】 假期测评①
【C语言进阶】 假期测评①
63 2
|
7月前
|
存储 安全 BI
【C语言进阶】假期测评②
【C语言进阶】假期测评②
71 1
|
7月前
|
存储 测试技术 C语言
【C语言进阶】 假期测评③
【C语言进阶】 假期测评③
77 1
|
7月前
|
存储 C语言
C语言进阶---------作业复习
C语言进阶---------作业复习