c语言中两个数的简单计算器(C探索之旅)
内容简介
1、第一部分第五课:简易计算器
2、第一部分第六课预告:控制流程,随心所至
简易计算器
上一课《【C 探索之旅】第一部分第四课:内存,变量和引用》中,我们已经学习了挺重要的内存的概念,变量的知识,对引用这个C 中常用的技术也有了初步的了解。
我 们在上一课开头处用一个小小计算器的存储技术引出内存的概念。其实我们的电脑兄也是一个计算器,只不过高端大气上档次了很多,不然怎么会被称为 computer呢?英语中compute这个词,正是《计算》的意思,而加上r就构成了名词。computer就是“计算机”。(复论学好英语对编程的 帮助)。
所以,电脑不仅能储存数据,还能进行很复杂的计算。
这一课我们就来聊聊计算。
请求用户输入信息
上一课中,我们学习了如何在控制台(console)中显示变量的值。现在我们来做相反的事情:请求用户为我们的程序提供输入,以存储到内存中。
如果以后你还会搞错,不要跟别人说你是看谢什么恩铭的文章学的。开个玩笑~
其他变量
当然了,上面提到的知识点,也可用于其他变量类型,例如:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "您叫什么?" << endl;
string userName("无名氏"); // 在内存中申请一个string类型的抽屉
cin >> userName; // 将用户输入的数据赋值给userName
cout << "PI的值是多少?" << endl;
double piValue(-1.); // 在内存中申请一个double类型的抽屉
cin >> piValue; // 将用户输入的数据赋值给piValue
cout << "您叫" << userName<< " ,您认为PI的值是" << piValue << endl;
return 0;
}
这次我想不需要给出什么解释了吧,自己运行此程序试试吧。
空格的问题
测试下上面的程序,是不是发现有点小问题?
假如我们如下运行:
您叫什么?
Isaac Newton
PI的值是多少?
您叫Isaac,您认为PI的值是0
很奇怪是吗?程序并没有请求我们输入PI的值,而是将PI的值改为了0。而且Newton不见了。哦,no,牛顿不见了,咋办?小苹果都不知道该往谁头上掉了(小编你可以了...)
要说原因,这是空格的问题。当用户按下回车时,程序会把用户输入在控制台的数据拷贝到内存的"抽屉"中,但是它会在第一个空格或回车符处停住。当用户输入的是数值时,并没有问题,因为数值里没有空格。
但是当输入的是字符串(string)时,可能会有空格。这样,电脑就会在第一个单词结尾处截断,毕竟电脑也是挺呆萌的。这样,在上例中,程序就会以为Newton是PI的值。
所以,我们须要截取所有一整行,而不是第一个单词。那就要用到getline函数了。
我们将 cin >> userName 用getline函数替换,如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "您叫什么?" << endl;
string userName("无名氏"); // 在内存中申请一个string类型的抽屉
getline(cin, userName); // 将用户输入的整一行放入userName这个抽屉
cout << "PI的值是多少?" << endl;
double piValue(-1.); // 在内存中申请一个double类型的抽屉
cin >> piValue; // 将用户输入的数据赋值给piValue
cout << "您叫 " << userName<< " ,您认为PI的值是 " << piValue << endl;
return 0;
}
我们看到cin和userName还是在那里,只不过这次它们是作为getline的参数被使用了。
这次,运行程序后,就没有问题了:
您叫什么?
Isaac Newton
PI的值是多少?
3.14
您叫Isaac Newton, 您认为PI的值是3.14
首先请求PI的值
假如我么首先使用cin >> 然后才使用getline呢?比如我们先请求用户输入PI的值,然后再请求用户输入名字。
你会发现程序又出问题了。程序并没有向用户请求输入名字,而且输出了随便什么东西。
为了解决这个问题,我们须要在cin >>之后使用cin.ignore()
如下所示:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "PI的值是多少?" << endl;
double piValue(-1.); // 在内存中申请一个double类型的抽屉
cin >> piValue; // 将用户输入的数据赋值给piValue
cin.ignore();
cout << "您叫什么?" << endl;
string userName("无名氏"); // 在内存中申请一个string类型的抽屉
getline(cin, userName); // 将用户输入的整一行放入userName这个抽屉
cout << "您叫 " << userName<< " ,您认为PI的值是 " << piValue << endl;
return 0;
}
如果我们混合使用>>和getline,记得须要在cin >> 语句之后用cin.ignore()。这是一个规则,要记住。
改变变量的值
要进行运算,我们离不开变量。
首先,我们来看看如何改变变量的值吧。我们用=(等号)来进行数值的改变。假设我有一个int型的变量,我想要改变它的值,我首先写这个int型变量的名称,后面跟一个=号,再接新的数值。这就是变量的赋值。例如:
int number(0); // 在内存中申请一个抽屉,存放一个int类型变量,叫number,初始值为0
number = 5; // 将number的值改为5
我们也可以直接把一个变量的值赋给另一个变量:
int a(4), b(5); // 定义两个变量
a = b; // 将变量b的值赋给a
上面两句程序做了什么呢?
首先,我们定义了两个int变量,分别取名为a和b,也就是在内存中申请了两个抽屉,初始值分别是4和5。
接着 a = b; 这句话将b的值赋给a,也就是用5代替了a原先的值4,如下图所示:
#include <iostream>
using namespace std;
int main()
{
int a(4), b(5); // 定义两个变量
cout << "a的值是 : " << a << ", b的值是 : " << b << endl;
cout << "赋值!" << endl;
a = b; // 将b的值赋给a
cout << "a的值是 : " << a << ", b的值是 : " << b << endl;
return 0;
}
运行,输出:
a的值是 : 4, b的值是 : 5
赋值!
a的值是 : 5, b的值是 : 5
b的值并没有改变,在赋值时,只有等号左边的值(称为左值)会改变,等号右边的值(右值)不会改变。这也不是说赋值运算中的这两个变量是一样的,只是它们的值相等而已。
这是个好的开始,但是要称得上一个最基本的计算器,我们还缺点什么。是的,缺运算符。
最基础的计算器
我们从最基本的运算符开始介绍,首先是加法运算符:
例如:
#include <iostream>
using namespace std;
int main()
{
int result(0), a(5), b(8);
result = a b;
cout << "5 8 = " << result<< endl;
return 0;
}
运行,输出:
5 8 = 13
给出基础的运算符的表:
运算 | 符号 | 用例 |
---|---|---|
加法 | result = a b; | |
减法 | - |
|
乘法 | * |
|
除法 | / |
|
取模 | % |
|
上表中前面四个运算符都好理解,但是最后一个"取模"是什么意思呢?小学数学老师好像没有教我啊。
取模就是除法运算的延伸。因为例如整数除法,我们有除不尽的时候,就会多出点"边角料",这个边角料就是模了,其实就是余数。
因此,假如 13 / 4 等于 3 余 1 (因为 3 乘以4,再加1等于13)
那么1就是13 / 4 的模。
13 % 4 就等于1
有了这么多运算符,我们就可以组合出复杂一些的运算啦,例如:
result = ((a b) * c ) - d;
常变量
这标题有点奇怪,不是吗?
什么叫常变量?要么常量,要么变量。
好吧,常变量就是不能改变的变量。
要声明常变量,我们使用const关键字。const是constant的缩写,表示"恒定的"。用const声明的变量不可在之后的程序中被更改,不然程序运行会报错。
只 要适合用const的地方,都尽量用const。因为我们不但可以避免一些程序的错误(比如防止修改我们不想要其值改变的变量),而且const变量使得 编译器更加有效率(因为const变量,编译器之后就不会再去检查它的值有没有被改变了,不会再去重复取它的值,因为知道其值不能被改变)。
const用法如下:
string const password("wAsTZsaswQ"); // 密码
double const pi(3.14); // PI的值
unsigned int const maxLifePoint(100); // 生命值的最大取值
下一课中,我们还会再聊const这个关键字。
缩略形式
程序员是很勤劳的,但是他们又是很会偷懒的。
会偷懒和偷懒不一样,偷懒是贬义,会偷懒是褒义。会偷懒是指我们如果可以用更简便的方法来完成某事,尽量不用原先复杂冗余的形式。因为这样可以节省开销,降低程序复杂度。
我们就来看看几个运算符的缩略形式吧。
在编程中,很多时候,我们需要将变量进行减1的运算,或者加1的运算。一般我们会这样写:
int a(4);
a = a 1; // 使a增加1
但是不觉得 a = a 1; 写起来有点重复吗?写了两次a诶,不能忍啊。
因此我们可以用自增运算符来完成同样的操作。
自增运算
自增运算符是
也就是在变量名后跟
例如:
int a(4);
a ;
cout << "a的值是 : " << a << endl;
运行,输出:
a的值是 : 5
自减运算
自减运算就是将变量的值减1啦。
int a(4);
a--;
之后a的值变为3。
自增运算符和自减运算符,有不同的摆放位置,不一定放在变量名后面,也可以放在变量名前面。作用有所不同。
a ; // 先使用a的值,再对a进行加1操作
a; // 先对a进行加1操作,再使用a的值
例如:
int b(0), a(2);
b = a ;
cout << "a的值是 : " << a << " , b的值是 : " << b << endl;
b = a;
cout << "a的值是 : " << a << " , b的值是 : " << b << endl;
运行,输出:
a的值是 : 3 , b的值是 : 2
a的值是 : 4 , b的值是 : 4
为什么呢?
因为第一次的时候,我们使用 b = a ; 是先将a的值赋给b,然后再对a进行加1操作。这句结束后,a的值变为3,b的值是2
接着,我们使用b = a; 是先将a的值加1,再将a的值赋给b。所以a的值首先变为4,再赋值给b,因此b的值为4。
要记忆也很容易,假如是a 的形式,由于变量名在左边,所以先使用变量,再进行之后的 操作;假如是 a的形式,由于 符号在先,因此先进行自增操作,再使用变量。
其他运算符
其他运算符就是基础运算符(加,减,乘,除,取模)与等号的结合使用了:
=, -=, *=, /= et %=
例如:
#include <iostream>
using namespace std;
int main()
{
double number(5.3);
number = 4.2; // number现在等于 9.5
number *= 2.; // number现在等于 19
number -= 1.; // number现在等于 18
number /= 3.; // number现在等于 6
return 0;
}
更多数学运算
也许你觉得不够过瘾,毕竟我们只是做了一些很基础的运算。
那么如果你要进行比如开平方根这样的运算,该如何做呢?
我们需要引入一个C 的标准库:数学库,是cmath
#include <cmath>
在这个头文件里,包含了很多数学计算相关的函数。如下表(没有列全):
函数名称 | 符号 | 函数 | 用例 |
---|---|---|---|
平方根 | sqrtx | sqrt() | result = sqrt(x); |
正弦值 | sin(x) | sin() |
|
余弦值 | cos(x) | cos() |
|
正切值 | tan(x) | tan() |
|
指数 | ex | exp() |
|
次方 | ab | pow() |
|
自然对数 | lnx | log() |
|
以10为底的对数 | log10x | log10() |
|
绝对值 | |x| | fabs() |
|
向下取整 | ⌊×⌋ | floor() |
|
向上取整 | ⌈×⌉ | ceil() |
|
总结
-
为了请求用户输入数据,我们使用如下格式:cin >> variable,之后用户输入的数据就储存在variable变量中。
-
不要搞混了标准输入和标准输出运算符的方向:cin >> 是标准输入,cout <<是标准输出。
-
在C 中,我们可以做很多基本的运算:加,减,乘,除,等等。例如:result = a b
-
const变量是一旦定义就不能修改其值的变量(记得,不是常量)。我们用关键字const来声明。
-
为了一个变量能够进行加一运算,我们可以用自增运算符 ,variable 。还有一个自减运算符--,variable--,进行减一运算。
-
如果你要进行更复杂的数学运算,例如计算平方根,那么需要引入C 的标准数学库,就是cmath。使用方法: #include <cmath> 之后你就可以用标准数学库中的各种函数了,例如计算平方根:result = sqrt(100);
第一部分第六课预告
今天的课就到这里,一起加油吧!
下一课我们学习:控制流程,随心所至
ProgrammerLeague
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com