通过解决一个问题,来进入C++的学习:输入两个整数相加,并返回结果
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout << "a+b="<<a + b << endl;
return 0;
}
现在来逐行解释上面的程序:
第一行:#include <iostream> 这个表示引入头文件,这个和python中的import 用法是一样的,在python中如果要使用python语言自带的随机库,我们会通过import random来导入随机库,以便我们可以用到随机库中的方法。C++中的#include也一样,因为我们要用到输入输出,所以我们需要导入iostream头文件。
第二行:using namespace std;using是使用的意思,而namespace是命名空间的意思,std是standard标准的意思。在c++标准库中,所有的标识符都定义在名为std的命名空间中。
这个类似与python中的作用域,为了解决命名冲突的问题。比如python在全局作用域定义了变量name,在局部作用域中也可以定义name,只是在使用的时候,有特定的查找规则。
在c++中,使用namespace也可以解决全局命名冲突问题。记得要在末尾加上分号;
第三行:int main() c++源程序可以包含一个或者多个函数,其中有一个必须是main函数,操作系统通过调用main来运行c++程序。和python中定义函数有些许不同,c++中的函数包含以下几个部分:
1.返回类型(return type)
2.函数名(function name)
3.形参列表(parameter list,可以为空)
4.函数体(function body)
// int:返回类型;
//main:函数名;
//()形参列表未空;
//return 0 返回值;
//{}中包含的是函数体
int main(){
return 0;
}
我们写的main函数,参数列表是空的,且返回值必须是int整数类型,函数的最后一部分是函数体,由花括号{}包裹起来。
第四行:int a,b;定义两个整数变量a和b。因为python是在执行的时候动态的自动决定数据的类型,所有Python在定义变量的时候是不需要声明变量类型的。不过c++需要手动声明变量类型,否则会出现错误。这里需要的是两个整型,所以需要将变量a,b声明为int整型。
连续定义多个相同类型的变量,可以通过逗号隔开,也可以分开写:
int a;
int b;
第五行:cin >> a >> b; 表示从键盘输入两个整数类型的数,分别赋值给变量a和b,因为在定义这两个变量的时候,已经声明是整数类型了,所以在通过键盘输入的时候,也需要是整数类型。这个和python中的input函数类似,通过键盘接收输入,不过python中不管输入的是什么数据,都会自动转成字符串类型。
第六行:cout << “a+b=”<<a+b<<endl;cout表示输出,会输出<<后面的内容,endl表示换行。在python中通过print进行输出,print默认换行输出。
到此为止,我们已经将c++的一些基础用法介绍完毕,在通过c++去解决算法问题的时候,我们要关注的是算法思想本身,对于语法层面的研究要适可而止。
c++中的数据类型有以下几种:
int:整型,不同的整数类型取值范围如下:
类型名 | 类型 | 字节 | 表示范围 |
---|---|---|---|
int | 整型 | 4 | -2,147,483,648 ~2,147,483,647 |
unsigned int | 无符号整型 | 4 | 0~4,294,967,295 |
signed int | 有符号整型(与整型相同) | 4 | 2,147,483,648 ~ 2,147,483,647 |
short int | 短整型 | 2 | -32,768~ 32,767 |
unsigned short int | 无符号短整型 | 2 | 0~65,535 |
signed short int | 有符号短整型(与短整型相同) | 2 | -32,768~ 32,767 |
long int | 长整型 | 4 | -2,147,483,648 ~2,147,483,647 |
signed long int | 有符号长整型(与长整型相同) | 4 | -2,147,483,648 ~ 2,147,483,647 |
unsigned long int | 无符号长整型 | 4 | 0~4,294,967,295 |
整型值相互之间的大小规则如下:
长整型至少应该和整型一样长,而整型至少应该和短整型一样长。
char: 字符型
类型名 | 类型 | 字节 | 表示范围 |
---|---|---|---|
char | 字符型 | 1 | -128 ~127 |
unsigned char | 无符号字符型 | 1 | 0 ~255 |
signed char | 有符号字符型(与字符型相同) | 1 | -128 ~127 |
浮点型
类型名 | 类型 | 字节 | 表示范围 |
---|---|---|---|
float | 浮点型 | 4 | 3.4E +/- 38 (7位有效数字) |
double | 双精度型 | 8 | 1.7E +/- 308 (15位有效数字) |
long double | 长双精度型 | 10 | 1.2E +/- 4932 (19位有效数字) |
在c++中,我们通过cout和cin来进行输出和输入。
cout
1.cout是ostream类的对象,可以在屏幕上对指定数据进行输出。我们可以通过cout对象调用插入运算符”<<”和一些成员函数来输出信息,cout可以直接输出常量的值。将要输出的常量内容直接放在”<<”运算符后面即可
using namespace std;
int main(){
cout << 10 << endl;
return 0;
}
2.cout输出变量的值。在输出变量的值时,”<<”运算符会根据要输出的数据类型自动匹配正确的输出方式。这一点和python的print函数类似。
using namespace std;
int main(){
//定义一个字符类型
char a = 'c';
cout << a << endl;
return 0;
}
3.cout可以连续输出数据。比如:
using namespace std;
int main(){
char a = 'c';
int b = 20;
//连续输出数据
cout << a << " " << b<<endl;
return 0;
}
4.对于浮点数的输出,可以通过setprecision(int n)来设置数值精度;
using namespace std;
int main(){
float c = 3.14159;
cout << setprecision(3) << c <<endl;
return 0;
}
#输出
3.14
5.可以通过setw(int n)来设置域宽,默认右对齐
using namespace std;
int main(){
int a = 5;
int b = 6;
cout << a << setw(5) << b<<endl;
return 0;
}
#输出
5 6
6.可以通过setfill(char c) 用c变量中的字符来填充空白
using namespace std;
int main(){
int a = 5;
int b = 6;
//setfill不能放在b的后面,否则不生效
cout <<a << setw(5)<<setfill('a') << b<<endl;
return 0;
}
//输出
5aaaa6
进行这些操作时全部需要引入头文件#include <iomanip>
cin
cin是istream类的对象,用来从键盘上读取输入,和python中的input类似。cin从键盘中获取数据,然后通过提取运算符”>>”从流中提取数据,然后cin对象将这个数据发送到指定的地方。
using namespace std;
int main(){
int a ;
int b ;
//输入操作
cin >> a >> b;
return 0;
}
需要注意的是:
1.如果我只是输入3,这个时候3还在缓冲区内,不能被”>>”运算符提取,只有当我按下了回车键后,此时3才会被提取,然后传递给cin对象,再由cin对象将这个值放到变量a中去。
2.如果定义变量a是整型,此时如果输入的是其他类型,比如字符串,则提取操作就会失败。所以要注意输入的数据和定义的变量类型保持一致。
3.cin可以连续读入多个数据,不过在输入时,要将多个数据之间用空格隔开。
1.算术运算符
using namespace std;
int main(){
int a = 10;
int b = 3;
int c;
int d;
cout << a+b <<endl;
cout << a-b << endl;
cout << a*b <<endl;
//会直接舍弃掉余数
cout << a/b << endl;
//这里是直接求余数
cout << a%b << endl;
//先对a加1,然后再赋值给c
c = ++a;
//先赋值给d,然后再将b加1
d = b++;
cout << c << " " << d<<endl;
return 0;
}
#输出
13
7
30
3
1
11 3
2.赋值运算符
using namespace std;
int main(){
int a = 10;
int b = 3;
a += 2;
b += 3;
cout << a <<setw(3)<< b <<endl;
return 0;
}
3.关系运算符
using namespace std;
int main(){
int a = 10;
int b = 3;
bool c,d,e,f;
c = a > b;
d = a < b;
e = a == b;
f = a >= b;
//注意判断的结果要么是0要么是1
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;
return 0;
}
//输出
1
0
0
1
4.逻辑运算符
using namespace std;
int main(){
int a = 10;
int b = 3;
int i = 9;
bool c,d,e,f;
c = a > b && a>i;
d = a < b || b < i;
e = a == b && a > i;
f = a >= b || a == i;
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;
return 0;
}
//输出
1
1
0
1
1.if...else...
对条件进行判断,从而选择满足条件的分支执行程序。
1.单分支语句
using namespace std;
int main(){
int a;
cin >> a;
if (a>10){
cout << "大于10";
}else{
cout << "小于10";
}
return 0;
}
2.多分支语句
using namespace std;
int main(){
int a;
cin >> a;
if (a>20){
cout << "大于20";
}else if (a > 10) {
cout << "大于10";
}else{
cout << "小于10";
}
return 0;
}
3.if嵌套语句
using namespace std;
int main(){
int a;
int b;
cin >> a >> b;
if (a>20){
cout << "大于20";
}else{
if (b>30){
cout << "a大于20,b大于30";
}else{
cout << "a大于20,b不大于30";
}
}
return 0;
}
2.switch
switch也是一种常见的选择结构,一般和case搭配起来用。
和if不同,switch只能针对表达式的值来进行判断,而不能对数据的范围进行判断。需要注意的是switch语句在执行完一个case语句后,不会自动停止,需要加上break使其停止执行下一个case语句。
任务:根据分数来划分等级
using namespace std;
int main(){
int score;
int level;
cin >> score;
//这一行可以利用布尔值,来判断分数是哪个层级
level = (score<=60)*1 + (score>60 && score<=70)*2 +(score>70 && score<=80)*3 + (score>80 && score<=90)*4 + (score>90 &&score<=100)*5;
switch (level){
case 1:
cout<<"不及格"<<endl;
break;
case 2:
cout<<"及格"<<endl;
break;
case 3:
cout<<"良好"<<endl;
break;
case 4:
cout<<"优秀"<<endl;
break;
case 5:
cout<<"完美"<<endl;
break;
default:cout<<"分数有问题"<<endl;
}
return 0;
}
在c++中有以下几种循环语句:
1.while
while语句会对后面的条件语句进行判断,如果结果为真,则会反复执行{}中的语句,直到条件语句的结果为假。
using namespace std;
int main(){
int a = 1;
while (a<5){
cout << a<<endl;
a++;
}
return 0;
}
//输出
1
2
3
4
2.for
for循环的流程如下,括号中包括初始化,循环条件,以及循环更新:
using namespace std;
int main(){
//初始化:int i=0;
//循环条件:i<5;
//循环更新:i++
for (int i=0;i<5;i++){
cout << i << endl;
}
return 0;
}
3.do...while
和while循环不一样的地方在于,do...while会先执行一次大括号中的程序,然后再去执行while循环
using namespace std;
int main(){
int i=1;
do {
i++;
cout << i << endl;
}while (i<5);
return 0;
}
//输出
2
3
4
5
4.break
break指跳出所在的循环,这个和python中的break一致。
using namespace std;
int main(){
int i=1;
while (i<5){
if(i==2){
break;
}
cout <<i<<endl;
i++;
}
return 0;
}
//输出
1
5.continue
continue指跳过本次循环,直接进入下一次循环
using namespace std;
int main(){
int i=0;
while (i<5){
i++;
if(i==2){
continue;
}
cout <<i<<endl;
}
return 0;
}
//输出
1
3
4
5
1.标准函数
C++中定义一个函数的语法和python中的不一样,格式如下:
using namespace std;
//int:返回值类型
//test:函数名
//(int a,int b): 函数参数
//return a+b :函数返回值
int test(int a,int b){
return a+b;
}
int main(){
//函数调用
cout << test(1,2)<<endl;
return 0;
}
2.无返回值函数
using namespace std;
void test(int a,int b){
cout << a + b << endl;
}
int main(){
test(1,2);
return 0;
}
3.无参数函数
using namespace std;
void test(){
for(int i=0;i<5;i++){
cout << i << endl;
}
}
int main(){
test();
return 0;
}
4.参数值传递函数,在函数内部交换两个数,函数外面的数的值并不会交换
using namespace std;
void swap(int a,int b){
//交换变量的两个值
int temp;
temp = b;
b = a;
a = temp;
cout <<"swap:" << a <<" "<< b<< endl;
}
int main(){
int a = 5;
int b = 10;
swap(a,b);
cout << "main:"<<a <<" "<< b<< endl;
return 0;
}
//输出
swap:10 5
main:5 10
5.参数引用传递函数
引用传递可以直接修改从外面传进去的值,引用传递的原理就是传递的是指针,通过修改指针指向的值,就可以直接改变函数外部的值。
using namespace std;
//传递的是a,b变量的引用,即使在函数内部修改a,b的值,外面的也会受到影响
void swap(int &a,int &b){
int temp;
temp = b;
b = a;
a = temp;
cout <<"swap:" << a <<" "<< b<< endl;
}
int main(){
int a = 5;
int b = 10;
swap(a,b);
cout << "main:"<<a <<" "<< b<< endl;
return 0;
}
//输出
swap:10 5
main:10 5
1.定义
可以在定义的时候,对数组进行初始化,也可以不指定长度,定义数组语法如下:
using namespace std;
//指定长度和初始化数据,int表示数组中的元素都是整数类型
int a[5] = {0,1,2,3,4};
//不初始化数据,在main函数外,默认数中的数据均为0
int b[5];
//不指定长度
int c[] = {1,2,3,4};
int main(){
//在main中初始话数组,里面的元素的值会随机赋值,而不全是0
int c[5];
for (int i=0;i<5;i++){
cout << a[i] << endl;
}
cout << "================" << endl;
for (int i=0;i<5;i++){
cout << b[i] << endl;
}
cout << "================" << endl;
for (int i=0;i<5;i++){
cout << c[i] << endl;
}
return 0;
}
//输出
0
1
2
3
4
================
0
0
0
0
0
================
0
0
28
0
0
2.注意事项
在不是定义的时候,不能直接赋值
using namespace std;
int a[5] = {0,1,2,3,4};
int b[5];
int d[] = {1,2,3,4};
int main(){
//编译不通过
b = a;
return 0;
}
不同的数组变量之间不能互相赋值,这个和python不一样,python中列表的变量名可以互相赋值,但是c++的则不行
系统不会检查下标,在python中如果在列表中取值超过了列表的长度范围,则会报错,但是在c++中不会报错
using namespace std;
int a[5] = {0,1,2,3,4};
int b[5];
int d[] = {1,2,3,4};
int main(){
cout << a[100]<<endl;
return 0;
}
//输出
4774784
如果要定义的数组很大,可以在主函数main外面定义,如果在主函数内定义则会报错
1.定义
可以在定义时,对二维数组初始化
using namespace std;
int a[5][3] = {
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12},
{13,14,15}
};
int main(){
for (int i=0;i<5;i++){
for (int j=0;j<3;j++){
cout << a[i][j]<<" ";
}
}
return 0;
}
//输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2.将二维数组作为参数时,可以省略第1维的长度,但必须指定第2维的长度。
using namespace std;
//需要指定第二维的长度
void test(int a[][3]){
for (int i=0;i<5;i++){
for (int j=0;j<3;j++){
cout << a[i][j]<<" ";
}
}
}
int a[5][3] = {
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12},
{13,14,15}
};
int main(){
test(a);
return 0;
}
//输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
在设计程序的时候,我们有时候需要知道不止一个数据的数据项。比如游戏中的英雄,可能有血量,护盾,速度等数据,我们可以把这些数据组合在一起形成一个新的数据结构:结构体
using namespace std;
//定义英雄结构体
struct Hero{
int blood;
int number;
int speed;
};
int main(){
Hero a;
a.blood = 100;
a.number = 5;
cout << a.blood << endl;
cout << a.number << endl;
return 0;
}
//输出
100
5
为了方便,我们可以用typedef给结构体起一个小名。typedef的作用就是给原有的数据类型起一个别名。
using namespace std;
//给int整型起一个别名
typedef int Number;
Number c;
Number d;
//定义英雄结构体,起个别名H
typedef struct Hero{
int blood;
int number;
int speed;
}H;
int main(){
H a;
a.blood = 100;
a.number = 5;
c = 100;
d = 200;
cout << a.blood << endl;
cout << a.number << endl;
cout << c << endl;
cout << d << endl;
return 0;
}
//输出
100
5
100
200
▲
发表评论