【c语言】初阶c语言常见编程题+思路+易错点

    • **scanf的用法**
    • 根据输入的数字打印*
    • 统计成绩
    • 改数字
    • 数9
    • 猜大小
    • 关机操作
    • The end

解题思路在代码的注释中

无论是巩固新学的编程知识,还是提高自己的编程思维,每天刷编程题目都是必不可少的。今天小编就带大家看一些最常见同时也很有趣的编程题,与此同时也会分享小编自己在编写代码的过程中遇到的一些问题以及解题思路,大家一起加油吧

scanf的用法

大家都知道,scanf在c语言中其实是一种很常见的函数,而由于十分常用,因此成为了c语言标准规定的库函数,若想要正常使用scanf函数,则必须要使用预处理指令引用相应的头文件,不然就会报错,不妨我们来试试:

#include int main(){int i = 0;scanf("%d", &i);printf("%d", i);return 0;}

其中的#include 是printf函数的头文件
输入上面的代码之后尝试运行就会发现出现了报错


那么怎么修复错误呢?只需要将它的头文件:
#define _CRT_SECURE_NO_WARNINGS1
像printf的头文件一样输入进去就ok了

注意:有些小伙伴即使添加这个头文件也可能会报错,这个时候不要着急,将上述的头文件最后的‘1’删掉就可以了

如果你不清楚在哪里能够查找其他函数的头文件,可以查看这个网站cplusplus官网

然而,普普通通的scanf函数肯定满足不了我们的需求,在现实生活中我们会发现有时候信息的输入不只有仅仅一组,就像玩游戏,一局玩完肯定还想再来一局,这个时候你发现这个游戏居然只能玩一次,肯定会想“这游戏也太坑爹了吧?”敲代码也是如此。那么我们怎么解决需要输入多组数据的问题呢?

接下来我们将用这个例题来分析怎么解决这个问题

根据输入的数字打印*

题目要求是根据你输入的数字来打印出相应个数的字符,而在生活中我们不很少只打印一行字符,可能会打印3、4行甚至更多,而每行的字符数量也会不一样,这就要求我们输入输出多次,那作为“一次性用品”的scanf应该怎么改用呢?

首先,题目要求的是打印多次,而在前期我们是怎么实现多次操作的?不就是利用循环语句嘛?而循环语句有“三步走”:

1. 条件判断2. 执行操作3. 控制变量增量

我们从题目要求可知,每当我们从键盘输入数字时打印字符。而这就是我们打印字符的条件。这个条件不同于我们简单的判断数的大小,而是“操作是否执行”,或者说是“输入是否结束”。知晓了判定条件,那么我们应当怎么利用循环语句进行判断呢?这个时候要了解EOF这个概念。

所谓EOF,就是End Of File的缩写,通常在文本的最后存在此字符表示资料结束

我们可以利用EOF来确定输入是否结束:

#define _CRT_SECURE_NO_WARNINGS#includeint main(){int a = 0;while (scanf("%d", &a) != EOF){while (a > 0){printf("*");a--;}printf("\n");}return 0;}

当输入没有停止,即scanf(“%d,&a)!=EOF时,while循环执行里面的命令

在刷题的过程中,小编一开始也为如何判断输入结束而发愁,但最多的反而是懵逼,因为刷的题太少了,也不知道问题的结症到底在哪里,做多了题目,回过头才发现我们写代码,最核心的是要弄清楚我们的需求和条件到底有哪些。如果我当时弄清楚这道题的条件,就算不知道EOF,也可以根据思维去查找相应的工具,而这也才是最根本的编程思维!!

统计成绩

题目:
要求输入n门学科的成绩,输出所有成绩的最大值、最小值和平均值

易错点:数据类型、scanf函数、for循环语句

#define _CRT_SECURE_NO_WARNINGS#include int main(){int i = 0;int n = 0;float max = 0.0f;//这是浮点数的初始化float min = 1e9;//这里min初始化很大是为了后面的if语句中和x做比较时更小float summery = 0.0f;scanf("%d", &n);for (i = 0; i < n; i++){float x = 0.0f;//每次循环后重新初始化xscanf("%f", &x);//每次循环后重新赋值xif (x > max)max = x;if (x < min)min = x;summery = summery + x;}float sum = summery / n;printf("%.2f %.2f %.2f", max, min, sum);//printf控制浮点数的小数点位数return 0;}
其中最重要的是float x的使用,利用x赋值max和min。

当然,也有叛逆的伙伴觉得太简单了,学完了数组就想用数组做,那就来点强度,下面是小编写的代码,虽然很丑bushi~

#define _CRT_SECURE_NO_WARNINGS#include int main(){int n = 0;int i = 0;static float min = 0.0f;//这里不初始化很大的值是因为后面的比较没有用到minstatic float max = 0.0f;float sum = 0.0f;scanf("%d", &n);float arr[20] = { 0 };//浮点数的初始化for (i = 1; i <= n; i++){scanf("%f",&arr[i - 1]);sum += arr[i-1];if (1 == i)//当i==1时,arr[i-1]还没有赋值,后面的比较数值就会出现问题{continue;}if (arr[i-1] > arr[i - 2])max = arr[i-1];else{float min = arr[i-1];}}sum = sum / n;if (0.0f == min)//如果输入的值一个比一个大,那么min一直没有赋值等于0.0fmin = arr[0];printf("%.2f %.2f %.2f", max, min, sum);return 0;}
从这道题也可以看出来,每道题都可以用不同的方式,不同的工具实现功能

改数字

题目:
输入一个数字,如果不同位的数字为基数,那么将这个基数改成1,数字为偶数,那么将这个偶数改成0
易错点:while循环语句、pow函数、if选择语句、%的使用

#define _CRT_SECURE_NO_WARNINGS#include #include //pow函数的头文件int main(){int n = 0;int i = 0;int sum = 0;scanf("%d", &n);while (n)//当n==0时,while自动跳出{int w = n % 10;if (0 == w % 2){w = 0;}else{w = 1;}sum = sum + w * pow(10, i);i++;n = n / 10;}printf("%d", sum);return 0;}
虽然这道题很简单,但是它对于while的使用是比较明确的,对于循环语句的“三步走”从头到尾都能看出来。

数9

题目:
输出从1~100中出现“9”的个数
易错点:for循环语句、/和%运算符的使用

#define _CRT_SECURE_NO_WARNINGS#include int main(){int i = 0;int m = 0;int n = 0;for (i = 1; i <= 100; i++){if (1 == (i % 10) / 9)//这种写法是为了防止误写成赋值“=”{m++;//每当个位数出现9,m+1}if ((i / 10) == 9){n++;//每当十位数出现9,n+1}}printf("%d", m+n);return 0;}
这道题看起来很简单,但是小编做的时候,结果却一直错误,调试过后才发现自己一直漏了一个知识点,就是%的被除数不能为0,不然它的结果一直都是0,这也导致小编从1~10,n一直在+1。其实我们大多时候都不知道自己到底有没有完全掌握知识,所以一定要多刷题,即使是简单的题也能考验你哦!

猜大小

题目:
电脑随机生成1~100的数字,通过输入数字来猜出随机生成的数字是多少
易错点:函数调用、while循环语句、switch分支语句

#define _CRT_SECURE_NO_WARNINGS#include #include //srend和rend函数的头文件#include //time时间戳的头文件void menu(){printf("####################\n");printf("###### 1.play ######\n");printf("###### 0.exit ######\n");printf("####################\n");}void game(){int input = 0;int res = rand()%100+1;//设置随机生成的数字在1~100printf("猜数字\n");while (1){scanf("%d", &input);if (input > res){printf("猜大了\n");}else if (input < res){printf("猜小了\n");}else{printf("数字正确\n");break;}}}int main(){srand((unsigned int)time(NULL));//给time函数空指针,并且将time的返回值强行转变成无符号,srand函数需要无符号整型起点int n = 0;inti = 0;do{printf("请选择:>\n");menu();scanf("%d", &n);switch (n){case 1:game();break;case 0:printf("游戏结束");break;default:printf("输入错误,请重新输入");}} while (i);return 0;}
这道题的思路其实是这样的:1.是否开始游戏?*根据输入判断是否进入game函数开始游戏(do-while和switch)2.生成随机数*使用time()调用时间戳,生成跟随时间变换的随机数*利用随时间变换的随机数生成变换的srand函数的起点*因为srand起点在变换,rand函数产生的数值也在变换,由此生成随机数3.输入数字4.判断输入的数字和随机产生的数字的大小

关机操作

题目:
写出让电脑关机的代码

#define _CRT_SECURE_NO_WARNINGS#include #include #include int main(){char arr[20] = { 0 };system("shutdown -s -t 60");//这里是将里面的代码传递给系统,执行关机操作again:printf("友情提示,你的电脑将在60秒后关机,请输入“我是猪”就取消关机!");scanf("%s", arr);if (strcmp(arr, "我是猪") == 0){system("shutdown -a");//这是撤回关机操作的代码}elsegoto again;//当代码执行到这里时强行使其返回到again:的位置return 0;}

ps:只要将源码Debug改成release就可以将这段代码直接发给你的好兄弟,不过小编还是要提醒一下,虽然这个代码可以整蛊人,但是如果因此不小心让好兄弟生气了,可千万别告诉他这是小编给你的

The end

其实回顾上一周,时间真的不知不觉的就溜走了,小编一边在学c语言,一边在学单片机,一天下来,往往是弄通了几个知识点,或者看完几节课,天就黑了,有时候一天都坐着,屁股疼的受不了,要不就是头疼。但是,当你真正的知道你想要走的路在哪里,知道你为何而活,你就能忍受人生中无数的挑战。这篇文章虽然没有很厉害的代码,也没有很通透的知识系统,但是上面所有的代码,都是我一道一道敲出来,一遍一遍去调试的,这并不是什么值得称道的,因为所有厉害的人都是这样过来的,所以我也希望在这条路上能够遇到更多相似的朋友,能够一起面对困难并且走下去!