C语言笔试训练【第三天】

大家好,我是纪宁。

今天是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);
数组传参实际上传递的是数组首元素的地址,在函数内部,可以通过数组首元素的地址找到整个数组元素,而数组名就是数组首元素的地址,而函数的第二个参数类型是一级整形指针,所以要将变量d的地址传过去。

注意:不能采用 &数组名 的形式进行数组传参,那样会将整个数组的地址传过去,解引用后也找到的是整个数组,而不是数组元素。

所以这道题选 A

核心知识点:指针初级 函数传参

第二题

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

这里又考察到了const 修饰指针变量的知识。const 修饰指针变量,若const 在 *左边,则说明指针指向的内容不能变,若const 在 * 右边,则说明指针的指向不能变。

那么就很好判断了,const 在 *c 的前面,所以 *c 不能改变,A被禁止编译;const在*d的前面,所以*d不能改,指针变量e中,const在*后面,所以e的指向不能改;指针变量f const既在*左边,又在*右边,所以指针的指向和指针指向的内容都不能改变。

这道题选 A B C D

第三题

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

cpp 复制代码
#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: * * *

这道题目需要注意的一点就是:变量i 为全局变量,在函数prt 中改变了变量 i 的值,所以 main 函数里面的循环只进行一次。所以这道题选 D

第四题

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

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

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

此题考查的是赋值运算符的右结合性,即先算右边的。a+=a-=a*a 可以转化为a=a+(a-=a*a),a-=a*a的值为 -6,并且 a 的值也变为了 -6,所以 a+=-6 就等于 -12,所以选 D

第五题

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

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

while 循环括号里的表达式为真,则循环进行;for 循环的第二个表达式,也是 for 循环是否进行的判断条件;do...while循环中括号里的表达式也是循环是否进行的条件。

1 为真,0为假,所以 D 不能实现死循环,所以选 D

记负均正

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

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

输入描述:首先输入一个正整数n,然后输入n个整数;输出描述:输出负数的个数,和所有正整数的平均值。

示例

输入:11 1 2 3 4 5 6 7 8 9 0 -1 输出:1 5.0

输入:3 0 0 0 输出:0 0.0

cpp 复制代码
#include <stdio.h>
#include<stdlib.h>
int main() {
    int n = 0, count1 = 0, count2 = 0, i = 0;
    double ave = 0, sum = 0;
    scanf("%d", &n);
    int* arr = (int*)malloc(sizeof(int) * n);
    if (arr == NULL)
        perror("malloc fail");
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
        if (arr[i] < 0)
            count1++;
        else if (arr[i] == 0)
            count2++;
        else
            sum += arr[i];
    }
    if (count2 == n || count1 == n)
        ave = 0;
    else
        ave = sum * 1.0 / (n - count1 - count2);
    printf("%d %.1lf", count1, ave);
    return 0;
}

此题需要注意的点是要好好读题,0不算正数,在判断的时候要单独考虑,并且不参与计算平均值。当全是0或者全是负数的时候还要单独考虑一下输出结果,否则就会出现除数为 0 而得不到运算结果。

旋转数组的最小数字

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

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

示例

输入:[3,4,5,1,2] 返回 -1

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

这道题如果要求最小数字确实不难,难就难在要求时间复杂度 O(logN),而二分查找的时间复杂度就是 O(logN),所以这道题采用二分查找的方法。

这个题主要分析三种旋转情况 [1, 2, 3, 4, 5],使用中间值与右端进行比较。

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

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

  3. 中间小于右边 [5, 1, 2, 3, 4], 这种情况下,最小数字则在左半边,也有可能就是中间值,所以right = mid。

cpp 复制代码
int minNumberInRotateArray(int* nums, int numsLen ) {
    int left=0,right=numsLen-1,mid=0;
    while(left<right)
    {
         mid=(left+right)/2;
         if(nums[left]<nums[right])
         {
            return nums[left];//未旋转
         }
         else if(nums[mid]>nums[right])
         {
            left=mid+1;
         }
         else if(nums[mid]<nums[right])
         {
            right=mid;
         }
         else
         {
            right--;
         }
    }
    return nums[left];
}
相关推荐
DdddJMs__1352 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
汤米粥5 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
Fuxiao___6 分钟前
不使用递归的决策树生成算法
算法
冰淇淋烤布蕾8 分钟前
EasyExcel使用
java·开发语言·excel
我爱工作&工作love我11 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
拾荒的小海螺14 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
马剑威(威哥爱编程)39 分钟前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
娃娃丢没有坏心思40 分钟前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归