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


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

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

    我的专栏C语言基础语法(超详细)_☆光之梦☆的博客-CSDN博客(这个专栏里的平均文章质量分是95噢,基本全都是高质量文章,本博主将会长期更新c语言的语法知识,初学c语言的朋友们,可以收藏订阅一下,收藏绝对不亏噢)

    目录

    一、交换两个变量的值

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

    坑货(1)❗❗❗

    坑货(2)❗❗❗

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

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

    【方案1】

    【方案2】

     五、计算阶乘

    【方案1】

    【方案2】 

    六、计算平均数

    七、猜数游戏(经典)

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

    需要掌握的知识点

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

    方案2(700——007)  

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


    下列是:C语言水平测试题(1)

    大家冲鸭!

    一、交换两个变量的值

    核心代码:

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

    1. #include
    2. int main()
    3. {
    4. int a = 5;
    5. int b = 6;
    6. //新建第三方变量
    7. int t;
    8. printf("原来:a = %d,b = %d\n",a,b);
    9. //交换两个变量的值
    10. t = a;
    11. a = b;
    12. b = t;
    13. printf("现在:a = %d,b = %d\n",a,b);
    14. return 0;
    15. }

    二、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+个位,就得到了结果。

    代码示例:

    1. #include
    2. int main()
    3. {
    4. int a;
    5. int ge,shi,bai;
    6. printf("请输入一个三位数:");
    7. scanf("%d",&a);
    8. ge = a %10;
    9. shi = a % 100 / 10;
    10. bai = a / 100;
    11. //printf("ge=%d,shi=%d,bai=%d\n",ge,shi,bai);
    12. printf("%d\n",ge*100+shi*10+bai);
    13. return 0;
    14. }

    注:

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

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

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

    【方案1】

    1. #include
    2. int main(){
    3. // 方案1
    4. int a,b;
    5. printf("请输入两个整数:");
    6. scanf("%d %d",&a,&b);
    7. int max = b;
    8. if(a > b){
    9. max = a;
    10. }
    11. printf("大的那个是%d\n",max);
    12. return 0;
    13. }

    【方案2】

    1. #include
    2. int main(){
    3. // 方案2
    4. int a,b;
    5. printf("请输入两个整数:");
    6. scanf("%d %d",&a,&b);
    7. int max = 0;
    8. if (a > b){
    9. max = a;
    10. } else {
    11. max = b;
    12. }
    13. printf("大的那个是%d\n",max);
    14. return 0;
    15. }

     tips:

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

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

    • 有效范围两端的数据

    • 特殊的倍数等个位数;

    • 10

    • 0

    • 负数

     五、计算阶乘

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

    变量:

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

    【方案1】

    1. #include
    2. int main()
    3. {
    4. int n;
    5. scanf("%d",&n);
    6. int fact = 1;
    7. int i = 1;
    8. while(i <= n){
    9. fact *= i;
    10. i++;
    11. }
    12. printf("%d!=%d\n",n,fact);
    13. return 0;
    14. }

    【方案2】 

    1. #include
    2. int main()
    3. {
    4. int n;
    5. scanf("%d",&n);
    6. int fact = 1;
    7. int i = 1;
    8. for(i = 1; i <= n; i++){
    9. fact *= i;
    10. }
    11. printf("%d!=%d\n",n,fact);
    12. return 0;
    13. }

    算法小套路

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

    六、计算平均数

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

    实现思路:

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

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

    算法

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

    2. 读入 number;

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

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

    代码实现:

    1. #include
    2. int main()
    3. {
    4. int number;
    5. int sum = 0;//求和
    6. int count = 0;//统计输入的个数
    7. printf("请输入要计算平均数的数:");
    8. scanf("%d",&number);
    9. while(number != -1){
    10. sum += number;
    11. count++;
    12. scanf("%d",&number);
    13. }
    14. printf("%f\n",1.0*sum/count);//将结果转化成浮点数
    15. return 0;
    16. }

    七、猜数游戏(经典)

    猜数游戏

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

    核心重点是循环的条件

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

    步骤

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

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

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

    4. counti 递增(加一);

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

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

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

    需要掌握的知识点

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

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

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

    代码实现:

    1. #include
    2. int main()
    3. {
    4. srand(time(0));
    5. int number = rand()%100;//生成一个100以内的随机数
    6. int count = 0;//统计猜数的次数
    7. int a = 0;//用户输入的数
    8. printf("我已经想好了一个1到100之间的数。");
    9. do{
    10. printf("请猜猜这个1到100之间的数:");
    11. scanf("%d",&a);
    12. count++;
    13. if (a > number){
    14. printf("你猜的数大了。");
    15. } else if (a < number){
    16. printf("你猜的数小了。");
    17. }
    18. } while(a != number);
    19. printf("太好了,你用了%d次就猜到了答案。\n",count);
    20. return 0;
    21. }

     为什么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)  

    代码示例:

    1. #include
    2. int main()
    3. {
    4. //用户要输入的数
    5. int x;
    6. x = 12345;//007 7 700 7
    7. //定义一个变量用来保存依次取出的数
    8. int digit;
    9. //定义一个变量用来保存逆序输出的结果
    10. int ret = 0;
    11. while(x > 0){
    12. //依次取出最后一位数
    13. digit = x % 10;
    14. //原来的结果往左移动一位加上新的digit
    15. ret = ret * 10 + digit;
    16. printf("x=%d,digit=%d,ret=%d\n",x,digit,ret);
    17. //x去除一位
    18. x /= 10;
    19. }
    20. printf("%d",ret);
    21. return 0;
    22. }

    方案2(700——007)  

    代码示例:

    1. #include
    2. int main()
    3. {
    4. //用户要输入的数
    5. int x;
    6. //scanf("%d",&x);
    7. x = 700;//007
    8. //定义一个变量用来保存依次取出的数
    9. int digit;
    10. //定义一个变量用来保存逆序输出的结果
    11. int ret = 0;
    12. while(x > 0){
    13. //依次取出最后一位数
    14. digit = x % 10;
    15. printf("%d",digit);
    16. //原来的结果往左移动一位加上新的digit
    17. ret = ret * 10 + digit;
    18. //x去除一位
    19. x /= 10;
    20. }
    21. return 0;
    22. }

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

    (1)if 语句 忘了大括号

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

    (2)在 if 后面加分号

    (3)错误使用==和=

    (4)输入中文符号

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

    (6);老丢

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

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

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

  • 相关阅读:
    iOS基础介绍(二)
    UVA 11054 Gergovia的酒交易 Wine trading in Gergovia
    【AutoAugment】《AutoAugment:Learning Augmentation Policies from Data》
    为什么面对读博大家都那么悲观?
    【Java基础】java.lang包中不能被继承的类
    中远通在创业板IPO过会:前三季度收入11亿元,罗厚斌为董事长
    信息安全技术
    【linux命令讲解大全】051.Linux Awk脚本语言中的字段定界符和流程控制
    C#:实现杨辉三角算法​(附完整源码)
    分布式 ID 的实现方案——Java全栈知识(13)
  • 原文地址:https://blog.csdn.net/qq_72707720/article/details/133777340