C语言零基础入门—8.习题解析
我们这节课讲解上一节布置的五道练习题。
01- 打印题
1.1 题目回顾
请利用之前所讲的知识打印出一个五角星,具体图形如下
类似即可。
1.2 源代码展示
#include<stdio.h>
void main(){
printf("***************************** n");
printf(" * n");
printf(" * * n");
printf(" * * * * * * n");
printf(" * * n");
printf(" * * n");
printf(" * * n");
printf(" * * * n");
printf(" * * * * n");
printf(" * * n");
printf("***************************** n");
}
1.3 解析
1.3.1 思路
- 使用 输出函数 在代码中排列出五角星的形状,然后就能输出了。
1.3.2 知识点
- 这里边有一个小知识点就是 转义字符
1.3.3 转义字符
- 我们在往计算机中输入的时候有一些符号没法输入,比如:换行符,引号等。为什么说没法输入呢?
- 换行符号:也就是我们的回车键(enter键)。
- 我们想让计算机按照一定格式输出的时候,总不能让他输出在一行吧(如果输出在一行的话我们这个五角星就没法而得到了)。
- 那么我们也不能在输出格式控制的地方敲一个回车吧,这样做的效果只能让我们的代码换个行,真实输出的时候并没有回车。
- 所以我们计算机中定义了一种特殊的字符 转义字符 它的作用就是实现一些特殊的作用,就比如我们在输出函数控制格式的地方写一个
n
就表示这个地方应该换一行。
- 双引号:有一些时候我们输出的内容需要用双引号包括起来。
- 但是如果我们直接用双引号来表示,就像这样子
printf(" "公众号:小小猿笔记" ");
那么就会报错,因为C语言规定的双引号有着特定的作用的,用双引号包围着的字符串才能输出,而且双引号匹配的时候是从左到右两个两个进行匹配的,那么(见下图)1处的两个双引号匹配成功,2处的双引号匹配成功,然后,就把那些文字暴露在双引号之外了。怎么解决呢?
- 但是如果我们直接用双引号来表示,就像这样子
-
- 这时候就用到了转义字符,我们把双引号这样写
printf(" " 公众号:小小猿笔记 " ");
意思就是在输出的时候,不要把双引号按照C语言指定的作用进行对待,仅仅把它当作一个普通的双引号进行输出即可。正常输入如下:
- 这时候就用到了转义字符,我们把双引号这样写
- 总结:转义字符就是把一些被C语言定义了特殊含义的字符,还原它本身的作用,不被C语言处理。格式是前边加上一个斜杠 。
- 常见的转义字符如下:只用记住常见的几个即可。
1.3.4 点评
- 是不是觉得这个代码很狗血吧,哈哈哈。
- 其实我们应该要能想到这种方式的,因为我说过要用之前学过的知识点的,我们前边学的很基础,然后看到这个图形并没有什么规律我们找不到明显的函数对应,所以要想到用输出函数进行拼接。
- 我们能够想到用输出函数就很不错了,因为换行我们之前没讲过。
02- 计算题
2.1 题目回顾
:请编写程序:根据我们今年交的基友的个数(x),再根据交基友的 年增长率(r%)。
计算出我们4年后的一年中可以交到多少个基友(totle)。
注意:
需要从键盘输入x与r,然后输出结果totle。
要有文字提示。
结果要是整数(向上取整) 具体执行图如下。
2.2 源代码展示
#include<stdio.h>
void main(){
int x=0;
printf("请输入今年基友的数量 x :n");
scanf("%d",&x);
printf("请输入交基友的年增长率 r % :n");
float r=0.0;
scanf("%f",&r);
printf("n");
float num = x*(r+1);
num = num*(r+1);
num = num*(r+1);
int totle = num*(r+1) + 1;
printf("4年后的一年中可以交到%d个基友n",totle);
}
2.3 解析
2.3.1 题目挖掘
- 首先我们看到题目是明显的计算题,我么可以根据 今年初始数据x,以及增长率r%,根据公式
第二年 = x + x*r
计算出明年的数据。 - 其次我们要注意的是他要求计算四年后的,因此要这个公式四次。
- 我们的增长率为
r%
,所以 r 是一个小数,x也需要从键盘输入。 - 要有文字提示,我们选择使用 输出函数 进行文字提示,(强烈建议不要在输入函数的格式控制处写上提示信息,下一题可见他的利害关系)
- 结果要是整数(向上取整),这是个新知识点。
2.3.2 思路
- 我们使用输出函数进行提示性文字,然后利用输入函数得到需要的数值,多次利用公式计算数值,在对结果进行向上取整。
2.3.3 知识点
- 这里的一个新知识点是向上取整
- 我们先来举一个例子,我们在c语言中运行一下代码:
#include<stdio.h>
void main(){
int i = 3;
int j = 3/2;
printf("%d n",j);
}
得到的结果如下:
为什么不是1.5呢???
- 这就是取整的一个例子,当把小数类型变成整数类型的时候,C语言默认把小数部分去掉,只留下整数部分。这就是取整。又因为是只保留的整数部分小于原来带有小数的数值(比如:3<3.2),因此又叫向下取整。所以,C语言是默认的向下取整。
2.3.4 点评
03- 输入格式
3.1 题目回顾
:请大家按照如下输入格式,指明如何输入a=6 , b=11 , x=3.14, y=6.66 , a='A' , c2='b'。
出现如下所示,表示成功
3.2 输入展示
这种在输入的同时控制格式,实在是gou的很,如果你自己有亲身的实验,我相信你肯定都要崩溃的。
3.3 解析
- 其实这一题没有太大的意义,我只是想借这个题提醒一下大家,千万不要在scanf函数中指定太多花里胡哨的格式,简单的格式像输入ab的时候就可以了,其他的别乱来,因为就算有的时候输入没有出错提示,但是输入也是错的。(这个错误怎么发现你往下看)
- 我就简单说下
scanf("%f%f",&x,&y);
输入的时候中间可以用空格隔开,但是这个之后紧接着就要输入Ab而不能有回车是因为,接下来的scanf需要匹配的是%c,回车符也会被他匹配到,所以不能有回车,并且两个%c%c
之间也不能有空格(因为空格也算是%c类型)。 - 如何判断自己是否输入正确的方法,赋值下边的代码使用就知道有无错误。
#include<stdio.h>
void main(){
int a,b;
float x,y;
char c1,c2;
scanf("a=%d,b=%d",&a,&b);
printf("%d %d,%f %f,%c %cn",a,b,x,y,c1,c2);
scanf("%f%f",&x,&y);
printf("%d %d,%f %f,%c %cn",a,b,x,y,c1,c2);
scanf("%c%c",&c1,&c2);
printf("%d %d,%f %f,%c %cn",a,b,x,y,c1,c2);
}
最好的方法就是,输入的同时观察输出。这对于新手来说也是一种调试手段
- 正确的实例
- 错误的示例
04-输出题
4.1 题目回顾
:请大家说出以下程序执行的结果,并说明原因。
4.2 结果展示
4.3 解析
4.3.1 题目分析
- 我们根据题目可以看出定义了两个整数 c1,c2。两个字符a,b。这是很正常的操作,但是输出的时候我们发现 把整数类型按照 字符类型(%c)输出,把字符类型 按照整数类型(%d)进行输出。而且竟然都有输出了。
4.3.2 原理讲解
- 我们之前在讲计算机存储的时候说过计算机内部存储的都是0/1串,意思就是说不管我们定义了什么类型的数据,最终都会把他转化成0/1组成的字符串,然后才存到计算机内部的。
- 当然,取的时候先把0/1串取出来,然后根据我们指定的类型把0/1串转化为我们指定类型的数据。
4.3.3 存储过程
- 首先,当我们的c1,c2定义出来之后,计算机会把97,98化为二进制存入计算机,然后变量名c1,c2分别指向97,98在内存中的位置。同理字符A,B根据ASCII码转化为二进制存放在计算机中,变量名a,b分别指向A,B在内存中的位置。
- 当我们输出c1,c2的时候,先根据c1,c2变量名指向的内存地址取出97,98在内存中的0/1串,然后根据输出格式发现要把这两个0/1串转化成字符类型,因此他就去找ASCII码表发现97,98对应的ASCII码值是a,b。然后就输出了a,b。
- 当我们输出a,b的时候,先根据a,b变量名指向的内存地址取出A,B在内存中的0/1串,然后根据输出格式发现要把这两个0/1串转化成整数类型,因此他就直接把二进制的0/1串转化为十进制的整数65,66。输出即可。
- ASCII码表部分如下:
05-加密
5.1 题目回顾
:请编程序将“China”进行加密
密码规律是:
用原来的字母后面第4个字母代替原来的字母。
例如:字母“A”后面第4个字母是“E”,用“E”代替“A”。因 此,“China”应译为“Glmre”。
要求:
请编一程序,用赋初值的方法使c1,c2,c3,c4,c5 这5个变量的值分别为'C','h','i','n','a',
经过运算,使cl,c2,c3,c4,c5分别变为'G','l','m','r','e'。
分别用printf函数输出改变前,用putchar函数输出改变后的这5个字符。
结果如下图所示:
5.2 代码展示
#include<stdio.h>
void main(){
char c1,c2,c3,c4,c5;
c1 = 'C' , c2 = 'h' , c3 = 'i' , c4 = 'n' ,c5 = 'a';
int a1,a2,a3,a4,a5;
a1 = (int)c1 + 4;
a2 = (int)c2 + 4;
a3 = (int)c3 + 4;
a4 = (int)c4 + 4;
a5 = (int)c5 + 4;
printf("原始数据:");
printf("%c%c%c%c%c n",c1,c2,c3,c4,c5);
printf("加密后的数据:");
putchar(a1);
putchar(a2);
putchar(a3);
putchar(a4);
putchar(a5);
printf("n");
}
5.3 解析
5.3.1 题目挖掘
- 题目的大致意思就是用每一个字母后边第四位代替本来的字母,以达到加密的目的。
- 而且初始字符为China。
- 并且规定使用printf输出China,使用putchar输出加密的字符。
- 这里有一个新的知识点—类型的强制转换
5.3.2 强制转换
- 就是把不同的类型之间进行转换。
- 我们前边也用到过,比如:整数按照字符输出。这是在输出控制的地方进行转换。
- 我们还有一种强制专函就是 用
(int)
方式,比如:
- 这个比较简单,就是在要强制转换的数据或者变量名前边加上括号内要强转的类型即可。
5.3.3 思路
- 我们知道字符在计算机中存储是先找ASCII码表,找到字符对应的ASCII数值(整数),然后再把这个数值转化为二进制的0/1串存储在计算机中。所以我们去观察ASCII码表。
- 我们发现字母的存储都是有规律的大写A~Z对应的数值是65~90,小写字幕a~z对应的数值是97~122。所以我们就有了思路了:把China存进计算机之后(存进去是0/1串),按照整数类型把他取出(得到的是整数),加上4,再把它转化成字符类型。就实现了加密的效果了。
- 流程如下:
5.3.4 原理分析
这是我们最后一次分析存储过程了,以后在遇到这种问题就当作大家都会了
公众号:小小猿笔记