C语言常见题目 过关斩将(1)C语言的那些坑题,你可知道?

2023-10-12 05:44

本文主要是介绍C语言常见题目 过关斩将(1)C语言的那些坑题,你可知道?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我的个人主页☆光之梦☆的博客_CSDN博客-C语言基础语法(超详细)领域博主

欢迎各位 👍点赞 ⭐收藏 📝评论

特别标注:本博主将会长期更新c语言的语法知识,初学c语言的朋友们,可以收藏订阅一下我的<C语言基础语法>专栏。 关注博主,学习不迷路哦

目录

一、交换两个变量的值

二、C语言细节考察题(坑题❗)

坑货(1)❗❗❗

坑货(2)❗❗❗

三、逆序的三位数(难题)

四、两个数比较大小(常考)

【方案1】

【方案2】

 五、计算阶乘

【方案1】

【方案2】 

六、计算平均数

七、猜数游戏(经典)

八、数的逆序输出(本文最难)

需要掌握的知识点

方案1(700——7, 007——7)  

方案2(700——007)  

九、学习路上遇到的常见错误(坑❗)


一、交换两个变量的值

核心代码:

t = a;
a = b;
b = t;

#include <stdio.h>int main()
{int a = 5;int b = 6;//新建第三方变量 int t;printf("原来:a = %d,b = %d\n",a,b);//交换两个变量的值 t = a;a = b;b = t;printf("现在:a = %d,b = %d\n",a,b);return 0;
}

二、C语言细节考察题(坑题❗)

注:前方有坑,不要见坑就跳噢

坑货(1)❗❗❗

写出以下代码执行后,t1和t2的值,以空格隔开:

int a=14;

int t1 = a++;

int t2 = ++a;

怎么样?算完了吗?你应该没有跳进这个坑吧(希望你没跳进去,如果掉坑了,肯定就是你算的太快了)?

来吧,接下来

让我们揭晓答案

答案:14 16

答案解析:

正如我们所知,a一开始的值是14

执行完第一个表达式:int t1 = a++;                这时 t1的值是14

相信这一步,大家应该都知道(这么简单,你当我是三岁小孩啊)

但接下来,才是重头戏(毕竟主角往往是最后出场的嘛)

这里注意哦 这时a的值是15,不是14噢

接着我们执行第二个表达式:int t2 = ++a

这时 t2 的值是 16        a的值也是16

坑在哪呢?如果我们在执行完第一条语句 int t1 = a++; 

把a 和t1 一样当成 14

这样我们就很容易把 t2 算成 15

就容易出错啦(不过这个坑比较小,如果你细心一点,你慢一点,不要算太快就不太会掉坑)

所以正确的答案是:14 16

坑货(2)❗❗❗

写出以下表达式的结果,结果之间间隔一个空格:

6 + 5 / 4 - 2  

2 + 2 * (2 * 2 - 2) % 2 / 3  

10 + 9 * ((8 + 7) % 6) + 5 * 4 % 3 * 2 + 3 

1 + 2 + (3 + 4) * ((5 * 6 % 7 / 8) - 9) * 10

小提示:先括号,再从左到右乘除,最后加减

不要看这道题觉得很简单,就大意噢

轻敌的话,它可是会让你后悔的❗

答案:5 2 44 -627

答案解析:

这道题做错了,一看就是你轻敌了,大意了吧

做太快了吧,不好好检查一遍就交卷吧

6 + 5 / 4 - 2                               从左到右                       7 - 2

2 + 2 * (2 * 2 - 2) % 2 / 3          先括号     2+2*2%2/3  再从左到右       2+0/3         2

10 + 9 * ((8 + 7) % 6) + 5 * 4 % 3 * 2 + 3                       10 + 27 + 4 + 3

1 + 2 + (3 + 4) * ((5 * 6 % 7 / 8) - 9) * 10    3 + 7 * (2/8-9)* 10    3 + 7 * (0-9)* 10         3-630

三、逆序的三位数(难题)

逆序的三位数

程序每次读入一个正三位数,然后输出逆序的数字。注意,当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7

提示:用%10可以得到个位数,用/100可以得到百位数...。将这样得到的三个数字合起来:百位100+十位10+个位,就得到了结果。

代码示例:

#include <stdio.h>int main()
{int a;int ge,shi,bai;printf("请输入一个三位数:");scanf("%d",&a);ge = a %10;shi = a % 100 / 10;bai = a / 100;//printf("ge=%d,shi=%d,bai=%d\n",ge,shi,bai);printf("%d\n",ge*100+shi*10+bai);return 0;
}

注:

关系运算符的结果只有0和1

所有的关系运算符的优先级比算术运算的低,但是比赋值运算的高

四、两个数比较大小(常考)

【方案1】

#include <stdio.h>int main(){// 方案1 int a,b;printf("请输入两个整数:");scanf("%d %d",&a,&b);int max = b;if(a > b){max = a;}printf("大的那个是%d\n",max);return 0;
}

【方案2】

#include <stdio.h>int main(){// 方案2int a,b;printf("请输入两个整数:");scanf("%d %d",&a,&b);int max = 0;if (a > b){max = a;} else {max = b;}printf("大的那个是%d\n",max);return 0;
}

 tips:

测试数据(测试所编写的代码或者方法有没有问题)

测试程序常使用边界数据,如

  • 有效范围两端的数据

  • 特殊的倍数等个位数;

  • 10

  • 0

  • 负数

 五、计算阶乘

n!=1×2×3×4×..×n 写一个程序,让用户输入,然后计算输出 n!

变量:

显然读用户的输入需要一个 int 的 n,然后计算的结果需要用一个变量保存,可以是 int 的 factor,在计算中需要有一个变量不断地从 I 递增到 n,那可以是 int 的 

【方案1】

#include <stdio.h>int main()
{int n;scanf("%d",&n);int fact = 1;int i = 1;while(i <= n){fact *= i;i++;}printf("%d!=%d\n",n,fact);return 0;
}

【方案2】 

#include <stdio.h>int main()
{int n;scanf("%d",&n);int fact = 1;int i = 1;for(i = 1; i <= n; i++){fact *= i;}printf("%d!=%d\n",n,fact);return 0;
}

算法小套路

做求和的程序时,记录结果的变量应该初始化为 0,而做求积的变量时,记录结果的变量应该初始化为

六、计算平均数

需求:让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入的数字的个数和平均数

实现思路:

只需要每读到一个数,就把它加到一个累加的变量里,到全部数据读完,再拿它去除读到的数的个数就可以了

一个变量记录累加的结果,一个变量记录读到的数的个数

算法

  1. 初始化变量 sum 和 count 为 0;

  2. 读入 number;

  3. 如果 number 不是 -l,则将 number 加入 sum,并将 count.加 l,回到2;

  4. 如果 number 是 -l,则计算和打印出 sum/count (注意换成浮点来计算)

代码实现:

#include <stdio.h>int main()
{int number;int sum = 0;//求和 int count = 0;//统计输入的个数printf("请输入要计算平均数的数:");scanf("%d",&number);while(number != -1){sum += number;count++;scanf("%d",&number);}printf("%f\n",1.0*sum/count);//将结果转化成浮点数 return 0;
}

七、猜数游戏(经典)

猜数游戏

需求:让计算机来想一个数,然后让用户来猜用户每输入一个数,就告诉它是大了还是小了,直到用户猜中为止,最后还要告诉用户它猜了多少次。 因为需要不断重复让用户猜,所以需要用到循环

核心重点是循环的条件

人们往往会考虑循环终止的条件

步骤

  1. 计算机随机想一个数,记在变量 number 里;

  2. 一个负责计次数的变量 count 初始化为 0;

  3. 让用户输入一个数字 a;

  4. counti 递增(加一);

  5. 判断 a 和 number 的大小关系,如果 a 大,就输出“大”;如果 a 小就输出“小”;

  6. 如果 a 和 number:是不相等的(无论大还是小),程序转回到第 3 步;

  7. 否则,程序输出“猜中”和次数,然后结束。

需要掌握的知识点

随机数 每次召唤 rand( ) 就得到一个随机的整数

随机产生一个100以内的数:rand( )%10

注:玩这个小游戏,只要你认真玩,那么最多你猜7次就能猜中 

代码实现:

#include <stdio.h>int main()
{srand(time(0));int number = rand()%100;//生成一个100以内的随机数int count = 0;//统计猜数的次数 int a = 0;//用户输入的数printf("我已经想好了一个1到100之间的数。");do{printf("请猜猜这个1到100之间的数:");scanf("%d",&a);count++;if (a > number){printf("你猜的数大了。");} else if (a < number){printf("你猜的数小了。");}} while(a != number);printf("太好了,你用了%d次就猜到了答案。\n",count);return 0;
}

 为什么100以内的数猜7次就够了?

2的7次方为128,使用二分法完全可以取到100内的任意整数

用二分法,例如第一次:100中猜50第二次:若大了,1~50中猜25第三次:若小了,26~50中猜38第四次:若小了,39~50中猜45第五次:若大了,39~45中猜42第六次:若大了,39~41中猜40第七次:若大了就是39,若小了就是41。

八、数的逆序输出(本文最难)

输入一个正整数,输出逆序的数

如:

【情况1】

输入:700        输出:7

输入:007        输出:7

【情况2】

输入:700        输出:007

注:想做出这题需要先掌握下列知识(否则就是鸡蛋碰石头哦)

需要掌握的知识点

整数的分解

整数的分解 一个整数是由 1 至多位数字组成的,如何分解出整数的各个位上的数字,然后加以计算

  • 对一个整数做%10 的操作,就得到它的个位数;

  • 对一个整数做/10 的操作,就去掉了它的个位数;

  • 依此类推。

当 x > n 时

1234 % 10                保留末尾一位数 4

1234 % 100              保留末尾二位数 34

1234 / 10                  去掉末尾一位数 123

1234 / 100                去掉末尾二位数 12

当 x < n

1 % 10 1                 小取余大 余小本身

5 % 10 5                 小取余大 余小本身

6 % 10 6                 小取余大 余小本身

1 / 10 0                 被除数比除数小 答案为0

5 / 10 0                 被除数比除数小 答案为0

6 / 10 0                 被除数比除数小 答案为0

方案1(700——7, 007——7)  

代码示例:

#include <stdio.h>int main()
{//用户要输入的数 int x;x = 12345;//007	7		700		7 //定义一个变量用来保存依次取出的数int digit;//定义一个变量用来保存逆序输出的结果int ret = 0;while(x > 0){//依次取出最后一位数 digit = x % 10;//原来的结果往左移动一位加上新的digit ret = ret * 10 + digit;printf("x=%d,digit=%d,ret=%d\n",x,digit,ret);//x去除一位 x /= 10; }printf("%d",ret);return 0;
}

方案2(700——007)  

代码示例:

#include <stdio.h>int main()
{//用户要输入的数 int x;//scanf("%d",&x);x = 700;//007//定义一个变量用来保存依次取出的数int digit;//定义一个变量用来保存逆序输出的结果int ret = 0;while(x > 0){//依次取出最后一位数 digit = x % 10;printf("%d",digit);//原来的结果往左移动一位加上新的digit ret = ret * 10 + digit;//x去除一位 x /= 10; }return 0;
}

九、学习路上遇到的常见错误(坑❗)

(1)if 语句 忘了大括号

解决方法:永远在 if 和 else 后面加上大括号,即使当时后面只有一条语

(2)在 if 后面加分号

(3)错误使用==和=

(4)输入中文符号

(5)scanf()里面忘记加&

(6);老丢

(7)scanf()里面忘记加& printf()里面加了&

各位学习C语言的初学者,如果有问题随时都可以来问我,我会随时为您解答!欢迎大家与我一起学习,互相进步。

创作不易,👍 +⭐ +📝(一键三连) 是对博主最大的鼓励与支持哦。

这篇关于C语言常见题目 过关斩将(1)C语言的那些坑题,你可知道?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验