上一篇介绍了C语言的一部分基础知识,今天我们来继续深入一点讲。
引入浮点数——float
做一个加减法计算器显然不能满足其他计算需求,比如我们生活中的东西并不总是用整数来衡量。我们有五毛钱,有半杯水,有随时都在变的速度,而且树苗也不是一下子从一个种子立马长到1,而是会经历中间一点一滴的成长。所以这个世界不是只有整数,还有小数,即C语言中的浮点数。延续之前的变量定义,我们在输入小数的时候,也需要先让机器明白数据的类型,所以我们需要显性地指出来:
float a;
float b;
这里假设我们要对两个数进行加法运算,同样地,我们需要输入函数scanf_s,但记不记得上一篇中我们说过对于整型类型的数据,scanf_s(“%d”,&a)里面是%d,那对于小数还是吗?显然不是,它有另外一个用%f,这里表示小数点后面有通常是6位的浮点数。其实整型和浮点数的类型还有很多,但我们不着急一个一个说,等到用到了自然会讲,因为就算讲了不用也会忘记。
scanf_s("%f",&a);
scanf_s("%f",&b);
像进行整数加减法一样,我们同样可以自己定义一个函数,不过这时候我们是对小数进行加减法。还记得函数名Add前面需要加返回类型吗?假如说我们要返回一个值给主调函数在这里通常指main函数,那么我们不妨将返回类型写上去。同样地,在函数名的后面需要对传入的参数先进行定义,如下:
float Add(float a,float b)
{
float c=a+b;
printf("%f\n",c);
}
但其实我们只是需要实现结果的打印,并不需要返回一个值给主调函数(main),所以我们可以直接用void,表示该函数没有返回值。即:
void Add(float a,float b)
{
float c=a+b;
printf("%f\n",c);
}
我们将上面的代码整合一下变成这样:
#include<stdio.h>//不要忘记包含头文件,不然scanf_s和printf函数都用不了
void Add(float a,float b)//该函数无返回值
{
float c=a+b;//除了a和b,它们的和通常也是小数,也要定义成float
printf("%f\n",c);
}
int main()
{
float a;
float b;
scanf_s("%f",&a);
scanf_s("%f",&b);
Add(a,b);//调用Add函数,这里要传进去参数
return 0;
}
注释符号://
如果足够细心,会发现这里我用了//这么个符号,是用来注释用的,注释方便自己以后和他人的阅读。
占位符:%d、%f
有没有发现scanf_s和printf函数的%后面跟着的d还是f也好基本都是一致的。其实这个叫占位符,不同的数据在输入也好输出也好都需要用到特定的占位符,就像数据需要分类一样,占位符也有区分。
下面是我在控制台输入1.1和1.2 之后它输出的结果,可以看到输出的结果2.3后面还有5个零,即6个小数点。
类似地,我们完善一下小数的减法:
void Sub(float a,float b)//该函数无返回值
{
float c=a-b;
printf("%f\n",c);
}
跟上面的加法写在一块就是
#include<stdio.h>//不要忘记包含头文件,不然scanf_s和printf函数都用不了
void Add(float a,float b)//加法函数,void表示该函数无返回值
{
float c=a+b;//除了a和b,它们的和通常也是小数,也要定义成float
printf("%f\n",c);
}
void Sub(float a,float b)//减法函数,void表示该函数无返回值
{
float c=a-b;
printf("%f",c);
}
int main()
{
float a;
float b;
scanf_s("%f",&a);
scanf_s("%f",&b);
Add(a,b);//调用Add函数,这里要传进去参数
Sub(a,b);//调用Sub函数,这里同样也要传进去参数
return 0;
}
来调试并运行一下:
printf格式化输出小数点后几位: .2f%
有时候这么多个0也不是办法,我们要是想要保留小数点后几位的话该如何做?既然printf函数都可以做到将整数和小数输出,保留小数这种小操作肯定不是什么大问题。这一步其实我们在对输出的数据进行格式化处理,让数据以我们想要的模样打印在控制台上,所以printf函数也叫格式化输出函数,它名字里的f其实就是format格式化的意思。那我们就选择保留两位小数吧。
printf("%.2f\n",c);
可以看到,只要在f的前面加一个小数点和我们想要保留的位数就可以实现,其实还挺好理解的,因为它刚好对应上"保留小数点后几位”好,话不多说,我们就来试一试:
#include<stdio.h>
void Add(float a, float b)
{
float c = a + b;
printf("%.2f\n", c);//格式化输出小数,保留小数点后两位
}
void Sub(float a, float b)
{
float c = a - b;
printf("%.2f\n", c);//格式化输出小数,保留小数点后两位
}
int main()
{
float a;
float b;
scanf_s("%f", &a);
scanf_s("%f", &b);
Add(a, b);
Sub(a, b);
return 0;
}
控制台:
printf函数中的换行符:\n
在说过的例子中,我们有很多次都用到了printf函数:
printf("Hello world\n");
printf("%d\n",c);
printf("%f\n",c);
printf("%.2f\n",c);
让上面所示,我们都在后面加了\n,其实这是一个换行符,可以让输出的数据在控制台更加整洁,也能理解为是printf函数格式化输出其中的一个本领,而且换行符不是一定在尾巴那里加,还能在中间任意位置,如下面的演示:
printf("Hello\nworld");
字符'A'和字符串"Hello world"
在上面我们可以看到这个函数可以输出的东西还真不少,除了像第一条Hello world的普通文本,还有对数据的格式化输出,但是有没有发现它们都需要用一个双引号包裹起来,其实这跟头文件里stdio.h是如何定义printf函数有关,我们说过函数名后面括号内填写传进去的参数,而很显然,这里传进去的是带有引号且引号里面有内容的参数。而在C语言中通常来说:用双引号包裹起来的内容叫字符串,比如“Hello world”用单引号包裹的叫字符,比如'A',在书写过程中,printf函数名后面跟着的是用双引号包裹起来的字符串,如果双引号里边有占位符,就用逗号隔开,后面写要替代占位符格式化输出的数据。比如我们也可以将上面计算结果的输出再变个花样:
printf("a+b的值是:%d\n",c);
printf("a+b的值是:%f\n",c);
printf("a+b的值是:%.2f\n",c);
接着我们用第三个输出格式在VS2022上调试并运行一下:
输出格式可以这么变着花样,这时候输入函数scanf_s可不乐意了,它说我也会!
scanf_s("a=%f",&a);
scanf_s("b=%f",&b);
它真的行吗?当我们尝试过后会发现并不奏效,控制台会出现下面的情况:
所有都乱套了。这说明输入函数并不能添加提示信息,那它这个工作就只好留给printf函数来做咯,所以我们可以改进成下面这样:
printf("a=");
scanf_s("%f",&a);
printf("b=");
scanf_s("%f",&b);
但其实没多大必要,一般较为复杂的信息才需要提示,比如游戏界面中通常都会有的菜单:
printf函数打印游戏界面菜单
我们可以利用字符串来打印一下:
printf("**********************");
printf("********0.play********");
printf("********1.exit********");
printf("**********************");
这会提示用户点击或者输入0时表示要玩,而输入1表示用户要退出游戏。
注:在VS2022或2019版本中放在一行中的任意位置,无需选中,按住Ctrl+C,便可以复制该行所有内容。
小数加减法计算器总结
#include<stdio.h>
void Add(float a, float b)//加法函数
{
float c = a + b;
printf("%.2f\n", c);
}
void Sub(float a, float b)//减法函数
{
float c = a - b;
printf("%.2f\n", c);
}
int main()
{
float a;
float b;
scanf_s("%f", &a);
scanf_s("%f", &b);
Add(a, b);
Sub(a, b);
return 0;
}