C语言基础练习——Day05

2024-03-12 02:04
文章标签 语言 基础 练习 day05

本文主要是介绍C语言基础练习——Day05,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

选择题

编程题

数字在升序数组中出现的次数

整数转换


选择题

1、如下程序的功能是

#include <stdio.h>
int main()
{char ch[80] = "123abcdEFG*&";int j;puts(ch);for(j = 0; ch[j] != '\0'; j++){if(ch[j] >= 'A' && ch[j] <= 'Z')ch[j] = ch[j] + 'e' - 'E';}puts(ch);return 0;
}
  • A 测字符数组ch的长度
  • B 将数字字符串ch转换成十进制数
  • C 将字符数组ch中的小写字母转换成大写
  • D 将字符数组ch中的大写字母转换成小写
答案:D
💡

解析:

在ASCII中,大写字母和小写字母相差32,故有'e'-'E'为32,而在条件判断语句的条件中,只有当数组元素为大写字母才会进入分支,故字符数组中的每一个大写字母都会加上32,即转化为其对应的小写字母

2、对于代码段,下面描述正确的是

t=0;
while(printf("*"))
{t++;if (t<3)break;
}
  • A 其中循环控制表达式与0等价
  • B 其中循环控制表达式与'0'等价
  • C 其中循环控制表达式是不合法的
  • D 以上说法都不对
答案:B
💡

解析:

printf(“*”)函数调用的返回值是字符串中字符的个数,即为1。所以while后面的条件恒为真,所以循环控制表达式与'0'是等价的(字符'0'不是0)

3、以下程序运行时,若输入 1abcedf2df<回车> 输出结果是

#include <stdio.h>
int main()
{char ch;while((ch = getchar()) != '\n'){if(ch % 2 != 0 && (ch >= 'a' && ch <= 'z'))ch = ch 'a' + 'A';putchar(ch);}printf("\n");return 0;
}
  • A 1abcedf2df
  • B 1ABCEDF2DF
  • C 1AbCEdf2df
  • D 1aBceDF2DF
答案:C
💡

解析:

程序首先考虑ch的ASCII 码值是不是奇数,再看是不是小写字母,同时满足时被改为大写字母

4、下列条件语句中,功能与其他语句不同的是

  • A if(a) printf("%d\n",x); else printf("%d\n",y);
  • B if(a==0) printf("%d\n",y); else printf("%d\n",x);
  • C if (a!=0) printf("%d\n",x); else printf("%d\n",y);
  • D if(a==0) printf("%d\n",x); else printf("%d\n",y);
答案:D
💡

解析:

除了D选项以外,其他都是a==0时输出ya!=0时输出x

5、(多选题)我们知道C语言的 break 语句只能跳出离它最近的一层循环,可是有时候我们需要跳出多层循环,下列跳出多层循环的做法正确的是

  • A 将程序写成函数用return结束函数,便可跳出循环
  • B 修改外层循环条件例如
for( int i = 0 ; i < MAX1 ; i ++ )
{for( int j = 0 ; j < MAX2 ; j ++ ){if(condition){i = MAX1;break;}}
}
  • C 在外层循环设置判断条件例如
for( ; symbo != 1 && condition2; )
{for( ; symbo != 1 && condition3; ){if(condition1)symbol = 1;}
}
  • D 在外层循环后面加入break例如
for( ; condition2; )
{for( ; condition3; ){if(condition1)symbol = 1;}if(symbol == 1)break;
}
答案:ABCD
💡

解析:

当循环被封装到函数中时,因为return语句可以结束函数的继续执行,故可以跳出循环;对于B选项来说,因为第一层循环满足i<MAX1时才会继续执行,而在if中,讲MAX1的数值给了ibreak,首先会推出内层循环,其次因为i等于MAX1导致第一个循环也结束执行,所以跳出循环;对于C选项来说,if语句中将symbol的值改为了1,导致两层循环的判断条件都为假,从而跳出循环;对于D选项来说,break在外层循环,可以跳出该层循环,同时直接终止所有内层循环执行

编程题

数字在升序数组中出现的次数

题目链接:数字在升序数组中出现的次数_牛客题霸_牛客网 (nowcoder.com)

描述
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数

数据范围:0≤ n≤1000,0≤ k≤100,数组中每个元素的值满足0≤ val≤100
要求:空间复杂度 O(1),时间复杂度 O( logn)

思路解析:

第一种思路,通过双指针法进行求解,一个指针left从数组的左侧向中间寻找,另一个指针right从数组的右侧向中间寻找,当两个指针各自遇到了等于数值k时,计数器各加1,但是这个方法存在一个问题,如果数组中只有一个数据时,并且这个数据等于k,那么left指针会加1次,right指针也会加1次导致多次计算,使用在循环判定时,不要使用等于,将二者相等作为退出循环条件,此时再出现上面的情况时,只需要单独计数器加1即可

第二种思路,使用二分查找算法进行求解,因为题目给定的数组是一个非降序的数组,但是二分查找算法不可以直接查找存在大量重复数值的数组,使用此题不能通过二分查找直接找等于k的数值。那么此题如何使用二分算法求解,可以考虑下面的思路:通过二分查找算法找到k值的边界值的下标,包括上界下标和下界下标,两个界限下标的差值即为等于k出现的次数,可以考虑使用k+0.5k-0.5来作为边界值,具体思路如下:

参考代码

第一种方法

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型一维数组 * @param numsLen int nums数组长度* @param k int整型 * @return int整型*/
int GetNumberOfK(int* nums, int numsLen, int k ) {int left = 0;int right = numsLen - 1;int count = 0;while (left < right) {if(nums[left] == k){count++;}if(nums[right] == k){count++;}left++;right--;}if(left == right && nums[left] == k){count++;}return count;
}

第二种方法

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型一维数组 * @param numsLen int nums数组长度* @param k int整型 * @return int整型*/
//二分查找
int BinarySearch(int* nums, int numsLen, double k)
{int left = 0;int right = numsLen - 1;while (left <= right) {int mid = (left + right) / 2;if(nums[mid] > k){right = mid - 1;}else if (nums[mid] < k) {left = mid + 1;}}//返回 left 而不是 midreturn left;
}
int GetNumberOfK(int* nums, int numsLen, int k ) {return BinarySearch(nums, numsLen, k+0.5)-BinarySearch(nums, numsLen, k-0.5);
}

整数转换

题目链接:面试题 05.06. 整数转换 - 力扣(LeetCode

整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。
示例1:
输入:A = 29 (或者0b11101), B = 15(或者0b01111)
输出:2

示例2:
输入:A = 1,B = 2
输出:2

提示:
A,B范围在[-2147483648, 2147483647]之间

思路解析:

本题可以考虑使用异或操作找出两个数值之间不同的位置,根据异或的特点,两个数存在相异的位置时异或结果为1,接着因为整数的比特位个数在力扣上是32位,故可以考虑右移i位与1相与,如果结果为1,那么说明是不同的位置,否则是相同的位置,记录不同的位置即可

参考代码

/** @lc app=leetcode.cn lang=c** 整数转换*/// @lc code=startint convertInteger(int A, int B){int ret = A^B;int count = 0;for(int i = 0; i < 32; i++){if((ret >> i) & 1 == 1){count++;}}return count;
}
// @lc code=end

这篇关于C语言基础练习——Day05的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/799805

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

C语言 将“China”译成密码

将“China”译成密码,密码规律是:用原来的字母后面的第4个字母代替原来的字母。例如,字母“A”后面的第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。编译程序用付赋初值的方法使c1,c2,c3,c4,c5这五个变量的值分别为“C”,“h”,“i”,“n”,“a”,经过运算,使c1,c2,c3,c4,c5分别变成“G”,“l”,“m”,“r”,“e”。分别用put

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级

[FPGA][基础模块]跨时钟域传播脉冲信号

clk_a 周期为10ns clk_b 周期为34ns 代码: module pulse(input clk_a,input clk_b,input signal_a,output reg signal_b);reg [4:0] signal_a_widen_maker = 0;reg signal_a_widen;always @(posedge clk_a)if(signal_a)