一、基础知识
1、注释
单行注释:// 描述信息 多行注释: /* 描述信息 */
2、常量
#define 宏常量: #define 常量名 常量值 (通常在文件上方定义,表示一个常量) const修饰的变量: const 数据类型 常量名 = 常量值 (通常在变量定义前加关键字const,修饰该变量为常量,不可修改)
3、 标识符命名规则
标识符不能是关键字,标识符只能由字母、数字、下划线组成,第一个字符必须为字母或下划线,标识符中字母区分大小写
二、数据类型
1、整形
short(短整型) 2字节 int(整型) 4字节 long(长整形) Windows为4字节,Linux为4字节(32位),8字节(64位) long long(长长整形) 8字节
2、sizeof()函数
可以查看统计数据类型所占内存大小(数据所占的字节数)
3、浮点型
单精度 ffloat 4字节 7位有效数字 双精度 double 8字节 15~16位有效数字
4、字符型
语法结构:char a='b' 注意:在显示字符型变量时,用单引号将字符括起来,不要用双引号;单引号内只能有一个字符,不可以是字符串
5、字符串型
语法:char a[]="hello world" 注意:c语言风格的字符串要用双引号括起来
6、c++风格字符串
string 变量名 = "字符串值"
注意:头文件要加入 #include
7、布尔类型bool
true — 真(本质是1) false — 假(本质是0)
8、数据的输入
语法:cin >> 变量 注意:>> 原为右移运算符,在c++进行了重载,用与输出包含在头文件 #include 中,可于后面学到运算符重载了解
三、算术运算符
1、基本运算符:
+、-、*、/、%(取余,只有整数可以进行此运算)、++(自增运算符,有前置和后置区别)、–(自减运算符,也有前置和后置区别) 总结:前置递增先对变量进行++,再计算表达式,后置递增相反
2、赋值运算符
共有以下几个:=、+=、-=、*=、/=、%= +=:a+=b即a = a + b;其他几个相同
3、比较运算符
**!=:不等于 <=:小于等于 >=:大于等于 >:大于 <:小于 注意:真”用数字“1”来表示, “假”用数字“0”来表示
4、逻辑运算符
!:非(加上之后真值与原本相反) &&:且(同真则真,其余为假) ||:或(有真则真,无真则假)
四、程序流程结构
C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
1、顺序结构
按照代码的顺序从前往后执行,不发生任何跳转
2、选择结构
(1)多行格式的if语句
if(条件)
{
条件满足执行的语句
}
else
{
不满足上述条件执行的语句
}
示例:
int max = 0;
int a = 5, b = 10;
if (a > b)
{
max = a;
}
else
{
max = b;
}
(2)多条件的if语句
if(条件1)
{
满足条件1执行的语句
}
else if(条件2)
{
满足条件2执行的语句
}
else
{
上述条件都不满足执行的语句
}
示例:
int score;
cin >> score;
if (score > 90)
{
cout << "优秀" << endl;
}
else if (score > 60)
{
cout << "及格" << endl;
}
else
{
cout << "不及格" << endl;
}
(3)条件嵌套的if语句
if (条件1)
{
if(条件2)
{
满足条件1且满足条件2执行的语句
}
else
{
满足条件1不满足条件2执行的语句
}
}
else
不满足条件1执行的语句
示例:
int score;
cin >> score;
if (score >= 60)
{
if (score >= 90)
{
cout << "优秀" << endl;
}
else if (score >= 70)
{
cout << "良好" << endl;
}
else
{
cout << "及格" << endl;
}
}
else
{
cout << "不及格" << endl;
}
(4)三目运算符 语法:表达式1 ? 表达式2 :表达式3 解释:如果表达式1结果为真,执行表达式2,并返回表达式2的结果;如果表达式1结果为假,执行表达式3,并返回表达式3的结果 示例:
int a = 2, b = 3, c = 0;
c = a > b ? a : b;
cout << c;
(5)switch语句
switch(表达式)
{
case 结果1:执行语句;break;
case 结果2:执行语句;break;
...
default:执行语句;break;
}
注意:switch语句中表达式类型只能是整型或者字符型;case里如果没有break,那么程序会一直向下执行
与if语句比,对于多条件判断时,switch的结构清晰,执行效率高,缺点是switch不可以判断区间 示例:
int score;
cin >> score;
switch (score)
{
case(10):
cout << "满分" << endl;
break;
case(9):
case(8):
case(7):
cout << "优秀" << endl;
break;
case(6):
case(5):
cout << "合格" << endl;
break;
default:
cout << "不合格" << endl;
break;
}
3、循环结构
(1)while语句 语法:
while(循环条件)
{
循环语句
}
如果循环条件为真,则循环语句会一直执行 示例:
int i = 0;
while(i<5)
{
cout << "第" << i + 1 << "次" << endl;
++i;
}
(2)do…while语句 语法:
do
{
循环语句
}
while(循环条件)
实例:
int i = 0;
do
{
cout << "第" << i + 1 << "次" << endl;
++i;
} while (i < 5);
与while语句不同的是,本语句会先执行一次,再去判断是否满足条件 (3)for语句 语法:
for(起始表达式;条件表达式;末尾循环体)
{
循环语句;
}
示例:
for (int i = 0; i < 5; i++)
{
cout << "第" << i +1<< "次执行" << endl;
}
4、跳转语句
(1)break语句 用于跳出选择结构或者循环结构 使用时机 [1]出现在switch条件语句中,作用是终止case并跳出switch
int score;
cin >> score;
switch (score)
{
case(10):
cout << "满分" << endl;
break;
case(9):
case(8):
case(7):
cout << "优秀" << endl;
break;
case(6):
case(5):
cout << "合格" << endl;
break;
default:
cout << "不合格" << endl;
break;
}
[2]出现在循环语句中,作用是跳出当前的循环语句 示例:
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
break;
}
cout << "第" << i +1<< "次执行" << endl;
}
int i = 0;
while(i<5)
{
if (i == 2)
{
break;
}
cout << "第" << i +1<< "次执行" << endl;
++i;
}
[3] (2)continue语句 在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
for (int i = 0; i < 5; i++)
{
if (i == 3)
{
continue;
}
cout << i << endl;
}
(3)goto语句 可以无条件跳转语句 语法: goto 标记;
cout << "1" << endl;
goto FLAG;
cout << "2" << endl;
cout << "3" << endl;
cout << "4" << endl;
FLAG:
cout << "5" << endl;
五、数组
数组就是一个集合,里面存放了相同类型的数据元素 特点:数组中的每个数据元素都是相同的数据类型,数组是由连续的内存位置组成的
1、一维数组
(1)定义方式
数据类型 数组名[ 数组长度 ];
数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
数据类型 数组名[ ] = { 值1,值2 ...};
int score[10];
score[0] = 100;
score[1] = 99;
score[2] = 85;
cout << score[0] << endl;
cout << score[1] << endl;
cout << score[2] << endl;
int score2[10] = { 100, 90,80,70,60,50,40,30,20,10 };
cout << score2[0] << endl;
cout << score2[1] << endl;
for (int i = 0; i < 10; i++)
{
cout << score2[i] << endl;
}
int score3[] = { 100,90,80,70,60,50,40,30,20,10 };
for (int i = 0; i < 10; i++)
{
cout << score3[i] << endl;
}
数组中下标是从0开始索引,数组名的命名规范与变量名命名规范一致,不要和变量重名 (2)一维数组名 一维数组名称的用途: 可以统计整个数组在内存中的长度
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << sizeof(arr) << endl;
cout << sizeof(arr[0]) << endl;
cout << sizeof(arr) / sizeof(arr[0]) << endl;
可以获取数组在内存中的首地址
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "数组首地址为: " << (int)arr << endl;
cout << "数组中第一个元素地址为: " << (int)&arr[0] << endl;
cout << "数组中第二个元素地址为: " << (int)&arr[1] << endl;
(3)冒泡排序法
int arr[9] = { 4,2,8,0,5,7,1,3,9 };
for (int i = 0; i < 9 - 1; i++)
{
for (int j = 0; j < 9 - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
2、二维数组
二维数组的定义方式:
数据类型 数组名[ 行数 ][ 列数 ];
数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};
int arr[2][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr[i][j] << " ";
}
cout << endl;
}
int arr2[2][3] =
{
{1,2,3},
{4,5,6}
};
int arr3[2][3] = { 1,2,3,4,5,6 };
int arr4[][3] = { 1,2,3,4,5,6 };
(1)二维数组名 查看二维数组所占内存空间;获取二维数组首地址
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
cout << sizeof(arr) << endl;
cout << sizeof(arr[0]) << endl;
cout << sizeof(arr[0][0]) << endl;
cout << sizeof(arr) / sizeof(arr[0]) << endl;
cout << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
cout << arr << endl;
cout << arr[0] << endl;
cout << arr[1] << endl;
cout << &arr[0][0] << endl;
cout << &arr[0][1] << endl;
二维数组名就是这个数组的首地址;对二维数组名进行sizeof时,可以获取整个二维数组占用的内存空间大小 示例:
int scores[3][3] =
{
{1,1,1},
{2,2,2},
{3,3,3},
};
string names[3] = { "张三","李四","王五" };
for (int i = 0; i < 3; i++)
{
int sum = 0;
for (int j = 0; j < 3; j++)
{
sum += scores[i][j];
}
cout << names[i] << "同学总成绩为: " << sum << endl;
}
六、函数
将一段经常使用的代码封装起来,减少重复代码 语法:
返回值类型 函数名 (参数列表)
{
函数体语句
return表达式
}
示例:
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
1、函数调用
语法:函数名(参数) 示例:
int add(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
int main() {
int a = 10;
int b = 10;
int sum = add(a, b);
cout << "sum = " << sum << endl;
a = 1;
b = 1;
sum = add(a, b);
cout << "sum = " << sum << endl;
return 0;
}
2、值传递
所谓值传递,就是函数调用时实参将数值传入给形参;值传递时,如果形参发生,并不会影响实参
void swap(int num1, int num2)
{
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
int temp = num1;
num1 = num2;
num2 = temp;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
}
int main() {
int a = 10;
int b = 20;
swap(a, b);
cout << "main中的 a = " << a << endl;
cout << "main中的 b = " << b << endl;
system("pause");
return 0;
}
3、函数的常见样式
[1]无参无返
void test01()
{
cout << "this is test01" << endl;
}
[2]有参无返
void test02(int a)
{
cout << "this is test02" << endl;
cout << "a = " << a << endl;
}
[3]无参有返
int test03()
{
cout << "this is test03 " << end;
return 11;
}
[4]有参有返
int test04(int a, int b)
{
cout << "this is test04 " << endl;
int sum = a + b;
return sum;
}
4、函数的声明
函数的声明可以多次,但是函数的定义只能有一次
int max(int a, int b);
int max(int a, int b);
int max(int a, int b)
{
return a > b ? a : b;
}
5、函数的分文件编写
函数分文件编写一般有4个步骤
1、创建后缀名为.h的头文件 2、创建后缀名为.cpp的源文件 3、在头文件中写函数的声明 4、在源文件中写函数的定义 示例:
#include<iostream>
using namespace std;
void swap(int a, int b);
#include "swap.h"
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
#include "swap.h"
int main() {
int a = 100;
int b = 200;
swap(a, b);
system("pause");
return 0;
}
七、结构体
1、定义和使用
语法:
struct 结构体名
{
结构体成员列表
};
通过结构体创建变量的方式有三种: 1、struct 结构体名 变量名 2、struct 结构体名 变量名 = { 成员1值 , 成员2值…} 3、定义结构体时顺便创建变量 示例: 方式一:struct student stu1; 方式二:struct student stu2 = { "李四",19,60 }; 方式三:
struct student
{
string name;
int age;
int score;
}stu3;
注意:定义结构体时的关键字是struct,不可省略;创建结构体变量时,关键字struct可以省略;结构体变量利用操作符 ‘’.’’ 访问成员
2、结构体数组
语法:struct 结构体名 数组名[元素个数] = { {} , {} , ... {} } 示例:
struct student arr[3]=
{
{"张三",18,80 },
{"李四",19,60 },
{"王五",20,70 }
};
3、结构体指针
利用操作符 ->可以通过结构体指针访问结构体属性
struct Student
{
string name;
int age;
};
int main()
{
Student s = { "xiaoming",18 };
Student* p = &s;
cout << p->name <<"\t"<< p->age << endl;
return 0;
}
4、结构体中嵌套结构体
结构体中的成员可以是另一个结构体
struct Student
{
string name;
int age;
};
struct Teacher
{
string name1;
int age1;
Student s;
};
int main()
{
Teacher t;
t.name1 = "laoshi";
t.age1 = 25;
t.s.name = "xiaoming";
t.s.age = 18;
cout << t.name1 << endl << t.age1 <<endl<< t.s.name <<endl<< t.s.age << endl;
return 0;
}
5、结构体做函数参数
将结构体作为参数向函数中传递 传递方式有两种: 1、值传递
struct Student
{
string name;
int age;
};
void print(Student p)
{
cout << p.name <<endl<< p.age << endl;
}
int main()
{
Student s;
s = { "xiaoming",18 };
print(s);
return 0;
}
2、地址传递
struct Student
{
string name;
int age;
};
void print(Student *p)
{
cout << p->name <<endl<< p->age << endl;
}
int main()
{
Student s;
s = { "xiaoming",18 };
Student* p = &s;
print(p);
return 0;
}
注意:如果不想修改主函数中的数据,用值传递,反之用地址传递
6、结构体中 const使用场景
用const来防止误操作
struct Student
{
string name;
int age;
};
void print(const Student *p)
{
cout << p->name <<endl<< p->age << endl;
}
int main()
{
Student s;
s = { "xiaoming",18 };
Student* p = &s;
print(p);
return 0;
}
|