C语言:选择+编程(每日一练Day4)

2023-11-11

选择题:

题一:

1、设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )


A: n=0;while(ch=getchar()!='\n')n++;     B: n=0;while(getchar()!='\n')n++;
C: for(n=0;getchar()!='\n';n++);       
      D: n=0;for(ch=getchar();ch!='\n';n++);

答案解析:      

        对于for循环,其中第一项初始化表达式只执行一次,因此ch只从输入流中取一个字符,之后就再不会取字符,因此会死循环。

题二:

2、运行以下程序后,如果从键盘上输入 65 14<回车> ,则输出结果为( )
int main()
{
        int m, n;
        printf("Enter m,n;");
        scanf("%d%d", &m,&n);

while(m!=n)            //1

{

        while(m>n) m=m-n; //2
        while(n>m) n=n-m; //3
}
        printf("m=%d\n",m);
        return 0;
}

A: 3    B: 2    C: 1    D: 0

答案解析:

        此题技巧是耐心,考查while循环和循环嵌套的理解,初值m=65,n=14;循环1判断m!=n为真,来到循环2判断m>n为真,执行m=m-n;直到m=9,n=14;循环2结束来到循环3判断n>m为真,执行n=n-m;直到m=9,n=5;循环3结束回到循环1,如此往复直到m==n时,循环结束。

题三:

3、若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是( )
#include <stdio.h>
int main()
{
        char c;
        int v0=0,v1=0,v2=0;
do
{
        switch(c=getchar())
        {
        case'a':case'A':
        case'e':case'E':
        case'i':case'I':
        case'o':case'O':
        case'u':case'U':v1 += 1;
        default:v0+= 1;v2+=1;
        }
}while(c!='\n');
        printf("v0=%d,v1=%d,v2=%d\n",v0,v1,v2);
        return 0;
}

A: v0=7,v1=4,v2=7           B: v0=8,v1=4,V2=8

C: v0=11,v1=4,v2=11       D: v0=12,v1=4,v2=12

答案解析:

        代码switch语句中没有break,则每次找到入口进入后,顺序执行到代码块结束为止。例如当c为'A'时,从case 'A'进入,先后执行v1+=1;v0+=1;v2+=1;,而当c为'p'时,从default进入,先后执行v0+=1;v2+=1;,容易看出最终v0和v2是相等的。

题四:

4、如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】( )
int gcd(char x,char y)
{
        int min = x < y ? x : y;
        for (min = 0; min > 0; min--)
        if (x % min = 0 && y % min = 0)
        return min;
}

A: 参数类型不对 B: 循环变量min初值不对 C: 判断等于的符号不对 D: 返回类型不对

答案解析:
         1.函数实参是int,形参用char不对,会发生截断丢失数据;2.min在for循环开始时更新为0,不再是两个形参中的较小值;3.判断是否整除的时候误将==写成=赋值运算符;4.函数最终要返回一个int值,返回值类型没问题,但是这里要强调一个选项中没写出的问题,如果是牛客网上的题,会报编译错误,说该函数不是在所有情况下都有返回值,只有在if条件成立的情况下有返回值,一般在vs上这种情况能通过,编译器会给一个默认的返回值。

题五:

5、执行下面的程序段,语句3的执行次数为( )
for(i = 0; i <= n-1; i++) // (1)
for(j = n; j > i; j--) // (2)
state; // (3)

A: n(n+2)/2    B: (n-1)(n+2)/2    C: n(n+1)/2   D: (n-1)(n+2)

答案解析:        

        外循环有n次,当i=0,内循环为n次,当i=1,内循环为n-1次,当i=2时,内循环为n-2次,以此类推,总次数为n+(n-1)+(n-2)+......+2+1,就是个等差数列,等于n(n+1)/2。

编程题:

题一:错误的集合

 645. 错误的集合 - 力扣(LeetCode)

示例:

输入:nums = [1,2,2,4]

输出:[2,3]

 思路一:

        排序法:由于题目没有说明数组是否有序,所以需要我们自己将数组排序,才能去遍历;同时需要知道的是returnSize是指返回数组元素的个数。

第一步:使用qsort()函数将数组排序成升序

第二步:返回值数组开辟动态内存空间,否则在出函数时会释放;

第三步:定义一个数来记录数组的前一个数

第四步:遍历数组:相同记录为num[0],数组当前元素-前一个元素值大于一说明中间的就是缺的元素num[1];

第五步:如果最后一个元素不等于长度,说明最后一个就是缺的元素。

int my_cmp(const void* p1,const void* p2)
{
    return *(int*)p1 - *(int*)p2;
}

int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
    //将数组进行升序排序
    qsort(nums,numsSize,4,my_cmp);
    //returnSize为返回数组元素个数
    *returnSize = 2;
    //开辟动态内存空间,否则在出函数时会释放
    int* num = (int*)malloc(sizeof(int)*2);
    //定义数组的前一个数
    int front = 0;
    //遍历数组
    for(int i = 0; i < numsSize;i++ )
    {
        //相同记录为num[0]
        if(nums[i] == front)
        {
            num[0] = nums[i];
        }
        //数组当前元素-前一个元素值大于一说明中间的就是缺的元素
        else if(nums[i] - front > 1)
        {
            num[1] = nums[i]-1;
        }
            front = nums[i];
    }
    //最后一个元素不等于长度,说明最后一个就是缺的元素
    if(nums[numsSize-1] != numsSize)
    {
        num[1] = numsSize;
    }
     return num;
}

 思路二:

        使用标记的方式就可以找出重复的数字,数组中出现过哪个数字就把对应数字作为下标在对应位置1,表示已经标记出现过,如果哪个数据对应位已经置1,则表示就是重复的数字。有了重复的数字,拿 [1, n] 的总和减去去掉重复数据的数组总和就是丢失的数据。 其实使用标记法时出现的数字对应位每次 ++ ,则最后出现0次的就是丢失,出现2次的就是重复的,这样的方式也可以,不过需要多次遍历。

int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
    *returnSize = 2;
    //遍历nums数组,将其中数据对应的位置1, 哪一位如果已经重置过则意味着数据重复了
    int *arr = (int *)calloc(numsSize + 1, sizeof(int));//申请numsSize个整形空间,并初始化为0
    int *ret = (int *)calloc(*returnSize, sizeof(int));//申请2个整形空间,并初始化为0
    int cur_sum = 0, old_sum = 0;

    for (int i = 0; i < numsSize; i++) {
        if (arr[nums[i]] == 1) 
        { //这个数字在上边数组的对应位置已经置过1了,则重复
            ret[0] = nums[i];//找到重复的数字
        } 
        arr[nums[i]] = 1; //将标记数组的对应数据位置1
        old_sum += i + 1; // 1~n的求和
        cur_sum += nums[i]; //当前数组中的数据求和(多了一个重复的,少了一个丢失的)
    } 
    ret[1] = old_sum - (cur_sum - ret[0]);//原始总和,减去去掉重复后的当前总和就是丢失的数字
    free(arr);

    return ret;
}

题二:密码检查 

密码检查_牛客题霸_牛客网 (nowcoder.com)

示例1

输入:

1
CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR

输出:

YES

思路一:

        暴力的不能再暴力的方法:

第一步:创建输入密码数量的n,和字符串arr

第二步:for循环遍历,创建用于记录密码的字符是否正确count,顺便求字符串长度;

第三步:判断字符串长度是否合法;

第四步:遍历一遍字符串,格式正确就记录count

第五步:最后将字符串长度与count比较,相同“YES”,反之“NO”。

int main() 
{
    int n = 0;
    scanf("%d",&n);
    //字符串长度限制
    char arr[100] = {0};
    //密码个数
    for(int j = 0;j < n;j++)
    {
        scanf("%s",arr);
        //用于记录密码的字符是否正确
        int count =0;
        //字符串长度
        int sz = strlen(arr);
        //是否符合长度要求
        if(sz >= 8 && sz <= 100)
        {
            //遍历一遍字符串,格式正确就记录
            for(int i = 0;i < sz;i++)
            {
                if(arr[i] >= 'A' && arr[i] <='Z'||
                arr[i] >= 'a' && arr[i] <='z' ||
                arr[i] >= '0' && arr[i] <='9')
                {
                    count++;
                }
            }
        }
        //长度对比
        if(sz == count)
        {
            printf("YES\n");
        }
        else 
        {
            printf("NO\n");
        }
    }
    
    return 0;
}

 本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                              

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言:选择+编程(每日一练Day4) 的相关文章

随机推荐

  • 软件测试入门基础

    软件工程的四条基本原则 采取适宜的开发模型 采用合适的设计方法 提供高质量的工程支持 重视开发过程的管理 什么是软件测试 软件测试就是在软件投入运行前 对软件需求分析 设计规格说明和编码实现的最终审查 为什么要进行软件测试 软件测试就是为了
  • 深圳地区高校福利来啦!7月5日华为云开发者沙龙门票限时免费领取!

    7月5日华为云开发者沙龙深圳站开启报名 华为云专家现场手把手教你如何快速实现AI应用开发并赠送价值298元CSDN会员卡 了解行业趋势进行技术储备 高校教师 学生免费参会 报名地址 https huiyi csdn net activity
  • 谷歌浏览器关闭安全模式, 访问 http网站

    设置 隐私设置和安全性 安全 选择 不保护
  • Redis 7 第三讲 数据类型 进阶篇

    位图 bitmap 1 理论 由0和1 状态表现的二进制位的bit 数组 说明 用String 类型作为底层数据结构实现的一种统计二值状态的数据类型 位图本质是数组 它是基于String 数据类型的按位操作 该数组由多个二进制位组成 每个二
  • 基于Mahout实现协同过滤推荐算法的电影推荐系统

    1 Mahout介绍 Apache Mahout 是 Apache Software Foundation ASF 旗下的一个开源项目 提供一些可扩展的机器学习领域经典算法的实现 旨在帮助开发人员更加方便快捷地创建智能应用程序 经典算法包括
  • 实践是检验程序员的唯一标准01:用户不想跟你说话并向你扔出一张图片 - 图片上传组件开发【思路篇】...

    温馨提示 这里除了一些幼稚的小组件啥也没有温馨提示 续 这是一个新的系列 写一些实际开发中遇到的一些常用的功能 想法笨拙 代码乱套 写在前面 图片上传 作为web端一个常用的功能 在不同的项目中有不同的需求 在这里实现一个比价基本的上传图片
  • 【python基于mysql数据库实现无页面学生信息管理系统】

    python基于mysql数据库实现无页面学生信息管理系统以及简单操作mysql 前言 一 分步讲解 0 创建两张数据表 1 大概思路 2 首先连接数据库 3 查看所有学生成绩信息 4 查看所有学生个人信息 5 查看指定学生成绩信息 6 添
  • ORM中对于外键关联的处理

    根据侧重点的不同可以分为两类 一是侧重子表 即CRUD操作主要是针对子表进行的 例如书中所举的例子album 是子表 artist是主表 class AlbumMapper 1 Mapper实现的对象初始化 public Album fin
  • EXTJS2.2组件Combobox下拉框获取数据

    1 获取数据 var dataPath 远程连接 var genderStore new Ext data JsonStore proxy new Ext data HttpProxy method POST url tHarvestTab
  • 前端随笔(五)————浅谈React工程化

    1 什么是React 用于构建用户界面的 JavaScript 库 React官方文档 严格意义上来说 React并非框架 而是一个JS库 常用库 react 库 react dom 库 React具有如下特点 声明式 组件化 跨平台开发
  • 华为鸿蒙到底是不是安卓系统套了个壳?

    余承东在2月份宣布 鸿蒙将于4月份全面上线 果然没有食言 华为鸿蒙2 0来了 首批升级机型名单包括 Mate X2 Mate40以及P40系列 需要注意的是这次上线的鸿蒙OS依旧只是开发者测试版 还不是正式版本 另外花粉们必须前往官网申请加
  • C语言之冒泡排序、快速排序法、希尔排序法

    众所周知编程排序方法众多而且程序的好坏就取决于算法的使用 下面是博主现在会的几种排序方法希望对大家有所帮助 希尔排序法 Author Stylle Date 2020 11 14 15 52 03 LastEditors Stylle La
  • Java - 根据文件绝对路径,来删除文件

    目录 一 根据文件绝对路径 来删除文件 参考链接 一 根据文件绝对路径 来删除文件 import org springframework web multipart MultipartFile import java io IOExcept
  • Base64编码与解码 ——Python实现

    文章目录 1 引言 2 Base64简介 3 预习知识 3 1 字节 3 2 二进制 与字节 3 3 ASCII码 3 Base64编码 3 1 个人理解 3 2 代码实现 4 Base64解码 4 1 个人理解 4 2 代码实现 1 引言
  • RocketMQ订阅关系一致性分析

    RocketMQ的消费者 在订阅topic的时候需要遵循 订阅关系一致性 原则 即 一个消费者分组 group 下的所有消费者实例的处理逻辑必须一致 一旦订阅关系不一致就会导致消费混乱 甚至消息丢失 对大多数分布式应用来说 一个group下
  • malloc()与calloc区别

    http blog csdn net firecityplans article details 4490124 Both the malloc and the calloc functions are used to allocate d
  • 【Java】——脱敏工具

    一 枚举类 在枚举中配置要脱敏的类型 正数或者倒数 从第n位 到 n m位 package com base infrastructure common enums The enum Desensitize type 例如 asc true
  • 跳板(trampoline)实现原理

    1 基础知识 1 1 虚拟内存 虚拟内存到物理内存之间的映射 从上面的图中可以得出一些结论 无论是物理内存还是虚拟内存的管理都是以页为单位来进行管理的 并且一般情况下二者的尺寸保持一致 操作系统为每个进程建立一张进程页表mmu 页表记录着虚
  • 基于MATLAB的低通滤波器设计

    基于MATLAB的低通滤波器设计 在信号处理中 滤波器是经常使用的工具 而在MATLAB中 我们可以使用设计滤波器的函数designfilt 和其它专用类型的函数实现 本文将带你学习如何设计一个简单的低通滤波器 并提供相应的代码 低通滤波器
  • C语言:选择+编程(每日一练Day4)

    选择题 题一 1 设变量已正确定义 以下不能统计出一行中输入字符个数 不包含回车符 的程序段是 A n 0 while ch getchar n n B n 0 while getchar n n C for n 0 getchar n n