C++菜鸟教程 - 从入门到精通 第二节
一.上节课的补充(数据类型)
1.前言
继上节课,我们主要讲解了输入,输出和运算符,我们现在来补充一下数据类型的知识
上节课遗漏了这个知识点,非常的抱歉
顺便说一下,博主要上高中了,更新会慢,2-4周更新一次
对了,正好赶上中秋节,小编跟大家说一句:中秋节快乐!
2.int类型
上节课,我们其实只用了int类型
int类型,是整数类型,它们存贮的是整数,不能存小数(浮点数)
定义变量的方式很简单
int a; //定义一个变量,初始值为0,可以在后面对其进行赋值
a=5; //将a赋值为5
int b=7; //定义一个变量,初始值为7,可以在后面改变其值
这里要注意了,int类型的存储数值是有上限的,一旦超过上限,这个数值就会变成随机数
int存储上限:2^31 - 1 = 2147483647
int会占用4个字节
_____________________________________________________________________________
顺便把内存的事讲了
我们来说说内存的事
字节: 存储信息的基本单位Byte => B
位: 信息存储的最小单位 bit => b
一位就是一个二进制
1TB=1024GB
1GB = 1024MB
1MB = 1024KB
1KB = 1024B
1B = 8bit
你可能会问,为什么"进率"是1024呢?
请看:
1024 512 256 128 64 32 16 8 4 2 1
1024 = 2的10次方这回就没有问题了吧
再来讲讲CPU,硬盘,内存
CPU 内存 硬盘
硬盘: 容量大, 速度慢
永久存在的
内存: 容量一般, 速度较快
断电信息就没了
CPU: 容量极小, 速度极快
OK?
_____________________________________________________________________________
好了,我们说回数据类型
3.long long类型
long long类型,是长整数类型,它们存贮的也是整数,不能存小数(浮点数)
long long类型和int类型的区别:很简单,long long储存上限比int大不少
long long 类型占用8个字节
long long a=3;
long long b;
b=7;
和int类型的复制方式没什么区别,我就不做赘述
4.char类型
char,是字符类型(不是字符串),可以存储单个字符(不能存储多个!)
char类型较小,只占用1个字节
char c='b';
char s;
s='1';
一定注意,字符旁边是单引号,不要加双引号,否则就会报错!
5.string类型
string,是字符串类型,可以存储任意个字符(没有上限!)
想用string,需要先导入<string>头文件
#include <string>
然后就可以了
#include <string>
string a="1a2b3c4d";
string b;
b="XYZ";
这里又和char不一样,字符串两边是双引号,大家不要弄混了哈!
字符串也能相加!
你没听错,string类型可以做加法运算(only 加法)
#include <iostream> //头文件
#include <string>
using namespace std; //命名空间
string a,b; //变量
int main(){
a="ABCD"; //为变量赋值
b="EFG";
a+=b; //加法运算开始! 同a=a+b
cout<<a; //检验结果
return 0;
}
这总会有用,就是比较少
6.float类型
float类型是浮点类型,用于存储浮点数(小数)
float,占4个字节,小数部分最大存储上限为7位
float a=1.25;
float b;
b=7.6;
在c++14中,输出float数会直接自动将其化为最简输出(1.250000 化为1.25)
float c=1.2500000;
cout<<c;
//这里c输出的是1.25
7.double类型
double类型,也是浮点类型,但是它小数部分最大存储上限为15位,默认用这个
它占8个字节,被称为双精度浮点类型,float是单精度浮点类型
double a=3.4;
double b;
b=4.333;
C++14中,double类型也是直接自动将其化为最简输出
8.bool类型
这就是布尔类型了,只有true和false两种状态
条件表达式的返回值就是bool类型
bool只占一个字节,较少
bool b=true;
bool c;
c=false;
9.来做题
温度转换
题目描述
编一程序,将摄氏温度换为华氏温度。公式为:f=9/5*c+32。其中f为华氏温度,c是 摄氏温度。
输入
输入一行,只有一个整数c
输出
输出只有一行,包括1个实数。(保留两位小数)
样例输入
50
样例输出
122.00
题目分析
已知,转换公式为 f=9/5*c+32
根据样例输入输出可知,c是int类型,f是float类型,只需设置好变量,再将公式带入,完成!
保留两位小数用iomanip中的setprecision()函数即可
代码
#include <iostream>
#include <cstdio>
#include <iomanip> //这里面有保留小数的函数
using namespace std;
int c; //设置变量
double f;
int main(){
cin>>c; //输入摄氏度
f=9*1.0/5*c+32; //直接套入公式
cout<<fixed<<setprecision(2)<<f<<endl; //输出f
return 0; //完结撒花
}
OK,我们继续.
二.我们来讲if语句
1.if-如果
关于if语句的使用,我们上节课讲题的时候已经提到过,这里再来说一下
if(条件表达式){
要执行的代码(一行或多行);
}
if语句会判断你给它的条件表达式,若为true,这执行里面的代码,否则直接跳过
这里先不做例题,下文会做的.
很简单吧,要是有什么问题评论区问我,我详细回答
2.if...else-如果否则
else,英文是否则的意思,在c++中也是如此
if(条件表达式){
要执行的代码;
}
else{ //不用写条件表达式
要执行的代码;
}
上文说了,if语句会判断你给它的条件表达式,若为false,不执行里面的代码(直接跳过)
else语句会在if语句判定为false后执行它里面的语句
举个例子
看这个代码:
if(1+2==4){
cout<<"1+2=4";
}
else{
cout<<"1+2≠4";
}
来看if语句,很显然,1+2不等于4,判定为false,执行else中的语句
输出"1+2≠4"
例题-旅游计划
题目描述
期末考试结束了,小华语文、数学、英语三门功课分别考了x、y、z分,小华的家长说,如果小华三门功课的平均分在90分或者90分以上,那么就去北京旅游,如果在90分以下,那么就去南京玩。
请从键盘读入小华三门功课的成绩,编程计算出小华暑期旅游的目的地,如果去北京,则输出“beijing”,如果去南京,则输出“nanjing”。(只要输出双引号中间的拼音,不要输出双引号)
输入
三个整数,代表小华三门功课的考试成绩。
输出
按题目要求输出小华旅游的目的地。
样例输入
90 95 91
样例输出
beijing
题目分析
该题可以使用if...else语句,先计算出三科平均分,再进行判断,若大于等于90,则输出"beijing"
若小于90,则输出"nanjing".
代码
#include <iostream> //头文件,不用多说
#include <cstdio>
using namespace std; //命名空间
int x,y,z; //三科成绩,x,y,z变量(建议使用题中说的变量名称)
int main(){
cin>>x>>y>>z; //输入三科成绩
if((x+y+z)/3>=90) cout<<"beijing"<<endl; //进行判断(x+y+z)/3>=90 是条件表达式(算出平均数再比较是否大于等于90,若是,输出"beijing")
else cout<<"nanjing"<<endl; //若三科平均分低于90,则输出"nanjing"
return 0; //结束程序
}
3.if...else if...else-多分支语句
else if 语句里面是可以写条件的,顺序就是:if不成立,看第一个else if ,第一个else if不成立,看第二个else if...... 以此类推,直到else语句
注意,else if 必须与if搭配使用,没有if的话是不能用的
总结一下,一个if语句后面可以加无限多个else if语句,可以用else语句作为这一套if判断的末尾(也可以没有)
来个题-三角形的分类
题目描述
给定三个角度 a,b 及 c。请判断这三个角在平面上能组成什么样的三角形:
- 如果不能组成三角形,输出
Error
- 如果能组成等边三角形,输出
Equilateral
- 如果能组成等腰直角三角形,输出
Isosceles right
- 如果能组成等腰三角形,输出
Isosceles
- 如果能组成直角三角形,输出
Right
- 如果能组成不等边三角形,输出
Scalene
输入格式
- 第一行:第一个角的角度
a
- 第二行:第二个角的角度
b
- 第三行:第三个角的角度
c
输出格式
根据题目要求输出对应的文字
数据范围
- 1≤a,b,c≤180
样例数据
输入
60
60
60
输出
Equilateral
题目分析
上过小学的都知道,三角形的内角和等于180度,否则无法构成三角形(能否组成三角形的因素)
我们来逐一解决 (不会的赶紧记概念呀)
- 如果不能组成三角形,输出
Error 判断三角形内角和即可
- 如果能组成等腰直角三角形,输出
Isosceles right 有一个角是直角,且其余两角均为45度
- 如果能组成直角三角形,输出
Right 有一个直角,但组不成等腰直角三角形即为直角三角形
- 如果能组成等边三角形,输出
Equilateral 这个就简单了,三角均等于60度即可
- 如果能组成等腰三角形,输出
Isosceles 也很easy,有两个角度数相等
- 如果能组成不等边三角形,输出
Scalene 以上条件均不满足,就是左边这位了
代码
#include <iostream>
#include <cstdio>
using namespace std;
int a,b,c; //变量
int main(){
cin>>a;
cin>>b; //输入三个角的度数
cin>>c;
if(a+b+c==180){ //内角和=180度,否则构不成三角形
if(a==90 or b==90 or c==90){ //有一个角是直角(直角三角形,等腰直角三角形)
if(a==45 or b==45 or c==45) cout<<"Isosceles right"; //判断是否是等腰直角三角形
else cout<<"Right"; //若不是等腰直角三角形,就是直角三角形
}
else if(a==60 and b==60 and c==60) cout<<"Equilateral"; //判断是否是等边三角形(正三角形)
else if(a==b or a==c or b==c) cout<<"Isosceles"; //判断是否是等边三角形(有两条边相等)
else cout<<"Scalene"; //否则就是不等边三角形
}
else cout<<"Error"; //无法组成三角形的情况
return 0;
}
好了,明白了吗,不明白在评论区提问,随时欢迎!
三.for循环
for,是遍历循环,主要作用是遍历数组.
for循环讲解
for(int i=1;i<=100;i++){
cout<<i<<endl;
}
这个代码的作用是,依次输出1-100的这些数.
来重点讲一下int i=1;i<=n;i++这块代码
int i=1 就是设置一个变量为1(也可以是其他数,从这个数开始)
i<=n 假设输入了一个变量n,这里就可以用了(灵活性很高嘛).
当然了,可以直接输入数(就像上文代码一样)
i++ 就是i做自增,自增是什么,看 C++菜鸟教程 - 从入门到精通 第一节
就比如int i=1;i<=100;i++
就是i一开始是1,每次循环做一次自增(自身+1),一直到它不再<=100(或着说>100)
编程求1*2*3*...*n
题目描述
编程求1*2*3*...*n
输入
输入一行,只有一个整数n(1<=n<=10)
输出
输出只有一行(这意味着末尾有一个回车符号),包括1个整数。
样例输入
5
样例输出
120
题目分析
这个题很简单,只需先输入n,再循环n次,进行乘法运算即可,只要熟练掌握了for循环的知识点就好
还需要利用for循环中遍历的特性,使那个"Ⅰ",每次+1,就能很轻松的乘出来
代码
#include <iostream>
#include <cstdio>
using namespace std;
int n,d=1; //d的初始值必须为1,若为0,无法进行乘法运算
int main(){
cin>>n; //输入n
for(int i=1;i<=n;i++){ //for遍历,循环n次
d*=i; //i其实就是次数,每次都会+1,用d直接*=i即可
}
cout<<d; //完成了,可喜可贺
return 0;
}
怎么样,for循环,好用吗?
四.for循环嵌套
一个for循环中有另一个for循环,即为for循环的嵌套,总循环次数为第一个for循环次数*第二个for循环次数
这有一个题
题目描述
N!=1*2*...*N;
例5!=1*2*3*4*5=120.
编程求1!+2!+3!+...+N!.
输入
输入一行,只有一个整数n (1<=n<=10)
输出
输出只有一行(这意味着末尾有一个回车符号),包括1个整数。
样例输入
3
样例输出
9
!,阶乘的意思,5的阶乘就是从1乘到5(1*2*3*4*5),其他数的阶乘也是如此
题目分析
使用循环嵌套,第一次for循环N次,第二次for循环第一次循环的"Ⅰ"次
第二次for循环中,求"Ⅰ"的阶乘,进入第一次循环后,用新变量进行累加
代码
只给你们第二重循环代码,其余自己写,下节课公布答案!
for(int j=1;j<=i;j++){
c*=j;
}
c是自定义的变量,代表一个数的阶乘