当前位置:   article > 正文

c++入门基础(基础语法)

c++入门

目录

1、初识c++

1.1第一个程序

1.1.1Hello world

 1.1.2运行结果

1.2注释

2、数据类型

2.1数据类型

2.3标识符命名规则

2.2变量

2.4常量

2.5输入输出流

2.6关键字

3、运算符

3.1算术运算符

3.2关系运算符

3.3逻辑运算符

3.4位运算符

4、程序流程结构

4.1顺序结构

4.2选择结构(分支结构)

4.2.1if-else语句

4.2.2switch语句

4.2.3多条件的if分支结构

4.3循环结构

4.3.1for循环

4.3.2while循环

3.3.3do...while循环

 3.3.4嵌套循环

4.4三目运算符

4.5跳转语句

5、数组

5.1一维数组

5.2二维数组

 5.3数组增删改查

 6排序

6.1桶排序

6.2选择排序

6.3冒泡排序

7、字符串

7.1c++字符串输入总结

7.2 字符串处理函数

8、函数

9、指针

9.1一维指针

9.2const修饰

9.3二维数组

9.4指针与数组、函数

10、结构体

10.1结构体概念与定义

10.2结构体数组

10.3结构体指针

10.4结构体嵌套(含数组)

10.5结构体作函数参数

11、查找 

1、二分查找


1、初识c++

编写一个C++程序,总共包含4个步骤

  • 创建项目
  • 创建文件
  • 编写代码
  • 运行程序

1.1第一个程序

dev安装

1.1.1Hello world

  1. #include<iostream> //头文件:输入输出
  2. using namespace std; //使用标准命名空间
  3. int main() { //主函数:程序入口
  4. cout << "Hello world" << endl; //输出: Hello world
  5. return 0; //程序出口
  6. }

 1.1.2运行结果

1.2注释

作用:在代码中加一些说明和解释,方便自己或其他程序员阅读代码

两种格式:

1、单行注释: / /  相关描述 

通常放在某行代码的上方,或者某一条语句的末尾,对该行代码说明

2、多行注释: / * 相关描述 * / 

通常放在一段代码的上方,对该段代码做整体说明

注:编译器在编译代码时,注释不会执行,会忽略注释的内容

2、数据类型

2.1数据类型

数据类型
类型关键字
布尔型bool
字符型char
整型int
浮点型float
双精度浮点型double
无类型void
宽字符型wchar_t
数据类型占用空间大小
类型位(n个字节)范围
char1-128 到 127 或者 0 到 255
int4-21 4748 3648 到 21 4748 3647
float47位有效数字
double815~16位有效数字
unsigned char10 到 255
signed char1-128 到 127
unsigned int40 到 42 9496 7295
signed int4-21 4748 3648 到 21 4748 3647
short int2-3 2768 到 3 2767
unsigned short int20 到 6 5535
signed short int2-3 2768 到 3 2767
long int8-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int8-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int80 到 18,446,744,073,709,551,615
long double16
wchar_t2或41个宽字符

一个字节 = 8bit = 8 个位

一些基本类型可以使用一个或多个类型修饰符进行修饰:

  • signed 符号型
  • unsigned 无符号型
  • short 短型
  • long 长型

字符型

作用:存单个字符

语法: char  ch = '单个字符' ;        如:   char  ch = 'p' ;  

注: 1、用单引号将字符括起来,不要用双引号   

         2、单引号内只能有一个字符,不可以是字符串

字符串型

作用:存多个字符组成的字符串

语法:   string   str = "字符串"       如:    string  str = "abc123";   

布尔型(bool)

作用:布尔数据类型代表真或假的值

bool类型只有两个值:

  • true -- 真(本质是1)
  • false -- 假(本质是0)


2.3标识符命名规则

即变量、常量、函数的命名规则:

  1. 标识符只能由字母、数字、下划线组成
  2. 第一个字符必须为字母或下划线,不能是数字
  3. 标识符中字母区分大小写
  4. 标识符不能是关键字

正确命名:abc_、a1、c3、_t 、Char 、 int4  等

错误命名:int、4ab、long、"abc"  等

大写字母和小写字母是不同的,因为 C++ 是大小写敏感的。所以Char可以当作变量使用。

2.2变量

变量:

1 变量代表一个有名字的、具有特定属性的一个存储单元;

2 变量用来存放数据,也就是存放变量的值;

3 变量的值可以改变;

4 变量有特定的类型,类型决定了存储单元的大小和变量值的范围,运算符可应用于变量上

语法: 数据类型    变量命  =  初始值 ;

注:每个变量名都是唯一,不能重命名。

2.4常量

作用:用于记录程序中不可更改的数据

两种方式:

1、宏定义:# define  常量名 常量值

  • 位于头文件后,主函数前。

2、const修饰的变量: const   数据类型   变量 = 常量值

  •   修饰该变量为常量,不可修改。

        

2.5输入输出流

输出:cout

  1. cout << 变量1;
  2. cout << 变量 1 << 变量2 << 变量3;
  3. cout << "字符串";

输出:cin

  1. cin >> 变量1;
  2. cin >> 变量1 >> 变量2 >> 变量3;

2.6关键字

3、运算符

新手主要学习一下三种运算符:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符(新手不学)

3.1算术运算符

符号描述示例(a = 5,  b = 2)结果
+把两个操作数相加a + b7
-把两个操作数相减a - b3
*把两个操作数相乘a * b10
/把两个操作数相除,取整a / b2
%把两个操作数相除,取余(取模)a % b1
++自增运算符,整数值增加 1a++  、++a5、6
--自减运算符,整数值减少 1b--、 --b 2、1

注:

  • 只有整型变量可以进行取模运算
  • 在除法运算中,除数不能为0

a++:先赋值,后自增

++a:先自增,后赋值

a--、--a 同理

3.2关系运算符

符号描述示例(a=5、b=2、c=2)结果
==

判断两个操作数的值是否相等,如果相等则条件为真。

a==b、b==c假、真
!=

判断两个操作数的值是否不相等,如果不相等则条件为真。

a != b、b != c真、假
>判断左操作数的值是否大于右操作数的值,如果是则条件为真。a>b、b>c真、假
<判断左操作数的值是否小于右操作数的值,如果是则条件为真a<b、b<c假、假
>=判断左操作数的值是否大于或等于右操作数的值,如果是则条件为真。a>=b、b>=c真、真
<=判断左操作数的值是否大于或等于右操作数的值,如果是则条件为真。a<=b、a<=c假、假
  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. int a = 5;
  5. int b = 2;
  6. int c = 2;
  7. if(a==b){
  8. cout<<"a等于b"<<endl;
  9. }else{
  10. cout<<"a不等于b"<<endl;
  11. }
  12. if(a!=b){
  13. cout<<"a不等于b"<<endl;
  14. }else{
  15. cout<<"a等于b"<<endl;
  16. }
  17. if(a>=b){
  18. cout<<"a大于或等于b"<<endl;
  19. }else{
  20. cout<<"a不大于或不等于b"<<endl;
  21. }
  22. return 0;
  23. }

3.3逻辑运算符

符号描述示例结果
&&a && b如果a和b都为真,则结果为真,否则为假。
||a || b如果a和b有一个为真,则结果为真,二者都为假时,结果为假。
!a如果a为假,则!a为真; 如果a为真,则!a为假。

3.4位运算符

(后续更新)

4、程序流程结构

三大基本结构:

  1. 顺序结构:程序按照顺序一次执行,不发生跳转
  2. 选择结构:判断条件是否满足,执行相应的程序
  3. 循环结构:判断条件是否满足,对某段程序重复执行
三大结构流程图

4.1顺序结构

如上图所示。

4.2选择结构(分支结构)

4.2.1if-else语句

  1. 语法1
  2. if( 条件 ){
  3.    执行语句1
  4. }else{
  5.    执行语句2
  6. }
  7. 语法2
  8. if(  条件1 ){
  9.     执行语句1
  10. }else if( 条件2 ) {
  11.     执行语句2
  12. }else{
  13.     执行语句n
  14. }
  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a=93,b=45;//a:语文成绩 b:数学成绩
  5. if(a>=60){
  6. cout<<"语文成绩及格"<<endl;
  7. }else{
  8. cout<<"语文成绩不及格"<<endl;
  9. }
  10. if(a<60){
  11. cout<<"语文成绩不及格"<<endl;
  12. }else if(a>=60 && a<70){
  13. cout<<"语文成绩及格"<<endl;
  14. }else if(a>=70 && a<90){
  15. cout<<"语文成绩良"<<endl;
  16. }else{
  17. cout<<"语文成绩优秀"<<endl;
  18. }
  19. return 0;
  20. }

4.2.2switch语句

注意:

  • switch语句中表达式数据类型只能是整型或者字符型
  • case里如果没有break,那么程序会一直向下执行

总结:与if语句比,对于多条件判断时,switch的结构清晰,执行效率高,缺点是switch不可以判断区间

  1. switch(变量)
  2. {
  3. case 条件1: //条件为:变量的值 整形:1、2、... 字符型:'a'、'f'、...
  4. 执行语句1;
  5. break; //执行完这一种情况后不会再执行下面的语句,即跳出switch
  6. case 条件2:
  7. 执行语句2;
  8. break;
  9. case 条件3:
  10. 执行语句3;
  11. break;
  12. default:执行语句4; //如果上面条件都不满足,就执行语句4
  13. }
  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a;
  5. cin>>a;
  6. switch(a){
  7. case 1:
  8. cout<<"一技能"<<endl;
  9. break;
  10. case 2:
  11. cout<<"二技能"<<endl;
  12. break;
  13. case 3:
  14. cout<<"三技能"<<endl;
  15. break;
  16. default:
  17. cout<<"输入错误"<<endl;
  18. }
  19. return 0;
  20. }

4.2.3多条件的if分支结构

4.3循环结构

c++中有三种循环,

for循环:一边用于已知循环次数

while循环:未知循环次数

do...while循环:第一次不用进行条件判断

4.3.1for循环

语法:

for(表达式1;表达式2;表达式3){    // 表达式2为真继续循环,否则结束循环

                循环体语句;

       }

其中:

表达式1:初始条件     

表达式2:循环条件     

表达式3:初始条件变化

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a;
  5. cout<<"请输入:";
  6. cin>>a;
  7. for(int i=1; i<=a; i++){ // i从1开始,i每次循环自增1,当大于a时结束循环
  8. cout<<"第"<<i<<"次"<<endl;
  9. }
  10. return 0;
  11. }

 

4.3.2while循环

语法:

while( 循环条件 ){    // 条件为真继续循环,否则结束循环

        循环体语句

}

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a;
  5. cout<<"请输入:";
  6. cin>>a;
  7. while(a>=0){
  8. cout<<"第"<<a<<"次"<<endl;
  9. --a;
  10. }
  11. return 0;
  12. }

 ​​​​

3.3.3do...while循环

语法:

do{

        循环体语句

}while( 循环条件);

注:该循环与while循环有区别,这是先循环一次,再进行判断  

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a;
  5. cout<<"请输入:";
  6. cin>>a;
  7. do{
  8. cout<<a<<endl;
  9. --a;
  10. }while(a>=0);
  11. return 0;
  12. }

 3.3.4嵌套循环

在某循环体中再嵌套一层循环。

一个变量相当于输出一个点,一个循环相当于输出一条线,双重循环相当于输出一个平面,三重循环相当于输出一个立体图形

语法:由for、while、do...while循环,其中两个或以上的组合

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. for(int i=1; i<=6; i++){
  5. for(int j=1; j<=6; j++){
  6. cout<<"*"<<" ";
  7. }
  8. cout<<endl;
  9. }
  10. return 0;
  11. }

4.4三目运算符

语法:表达式1 ? 表达式2 :表达式3 

解释:

  • 当表达式1的值为真,执行表达式2,并返回表达式2的结果;
  • 当表达式1的值为假,执行表达式3,并返回表达式3的结果。
  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a=10,b=20,c;
  5. c=a>b ? a:b; // a>b为假,所以c=b
  6. cout<<a<<" "<<b<<" "<<c;
  7. return 0;
  8. }

4.5跳转语句

符号描述
break
  1. 在switch条件语句中,终止case并跳出switch
  2. 在循环语句中,跳出当前的循环
  3. 在嵌套循环中,跳出最近的内层循环
continue不执行下面的语句,回到前面。在循环中时,跳过剩下的程序不再执行,重新开始下一轮循环。
goto无条件跳到指定位置。

注意:continue并不会终止整个循环,而break会跳出循环

 goto语句示例:

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. cout << "aaaaaa" << endl;
  5. goto THIS;
  6. cout << "bbbbbbb" << endl;
  7. cout << "ccccccc" << endl;
  8. THIS:
  9. cout << "VVVVVVV" << endl;
  10. return 0;
  11. }

 注意:不建议使用goto语句,容易造成程序流程混乱

5、数组

定义:是一个集合,存放相同数据类型的数据元素。

特点:数组中的每个元素都是相同的数据类型,内存是连续的。

5.1一维数组

语法:   数据类型    数组名称 [ 数组大小 ]      

  1. int a[5] = {1, 2, 3, 4,5 };    //全部初始化
  2. int a[5] = { 0 };     // 用0初始化全部数据
  3. int a[ ] = {1, 2, 9, 11 ,78 };     // 不指定数组长度
  4. int a[5] = {12};      //第一个元素为12,其它为0
  5. char ch[3] = {'c', 'e', '%'};

 注:数组中下标是从0开始索引

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a[10];
  5. a[0] = 10;
  6. a[1] = 9;
  7. a[2] = 25;
  8. //根据下标输出
  9. cout << a[0] << endl;
  10. cout << a[1] << endl;
  11. cout << a[2] << endl;
  12. int a2[10] = { 10, 9,8,7,6,5,4,3,2,1 };
  13. //循环输出
  14. for (int i = 0; i < 10; i++)
  15. {
  16. cout << a2[i] << endl;
  17. }
  18. return 0;
  19. }

 获取数组大小及地址

&:取地址符号

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
  5. cout << "整个数组所占内存空间为: " << sizeof(a) << endl;
  6. cout << "每个元素所占内存空间为: " << sizeof(a[0]) << endl;
  7. cout << "数组的元素个数为: " << sizeof(a) / sizeof(a[0]) << endl;
  8. //以通过数组名获取到数组首地址
  9. cout << "数组首地址为: " << (int *)a << endl;
  10. cout << "数组中第一个元素地址为: " << (int *)&a[0] << endl;
  11. cout << "数组中第二个元素地址为: " << (int *)&a[1] << endl;
  12. return 0;
  13. }

5.2二维数组

语法:   数据类型   数组名[ 行数 ] [ 列数 ]   

          

  1. int  a[2][3];
  2. int b[2][3] = { {1,2,3}, {4,5,6 } };
  3. int c[ ][3] = {1,2,3};     //只写列上元素,行自动生成

学生成绩 :

姓名语文数学英语
张三899598
李四797856
王五909993
  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int scores[3][3] ={
  5. {89,95,98},
  6. {79,78,56},
  7. {90,99,93},
  8. };
  9. string names[3] = { "张三","李四","王五" };
  10. for (int i=0; i<3;i++){
  11. int sum=0;
  12. for (int j=0; j<3; j++){
  13. sum+=scores[i][j];
  14. }
  15. cout << names[i] << "总分为: " << sum << endl;
  16. }
  17. return 0;
  18. }

 

初始化只有一列:

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int arr[2][3] = { 1,2,3 };
  5. for (int i = 0; i < 2; i++) {
  6. for (int j = 0; j < 3; j++) {
  7. cout << arr[i][j] << " ";
  8. }
  9. cout << endl;
  10. }
  11. return 0;
  12. }

  1. // 这两种方法是一样的
  2. char a[6] = {'h', 'e', 'l', 'l', 'O','\0'};
  3. char b[] = "hello";

 5.3数组增删改查

求字符数组的长度:  strlen( 数组名 )   

  •  按值删除
  • 按下标删除
  • 某元素,插入某个位置
  • 修改某个位置的值 
  • 查找某个元素的位置
  • 找某下标的值
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main() {
  5. char arr[10]={'0','d','2','p','t','z','+','7'};
  6. cout<<"初始值(字符):"<<endl;
  7. for(int i=0;i<strlen(arr);i++){
  8. cout<<arr[i]<<" ";
  9. }
  10. cout<<endl<<endl;
  11. //按值删除
  12. char a;
  13. cout<<"需要删除的值:";
  14. cin>>a;
  15. for(int i=0; i<strlen(arr); i++){
  16. if( arr[i]==a){
  17. for(int j=i;j<10-1;j++){
  18. arr[j]=arr[j+1];
  19. }
  20. }
  21. }
  22. cout<<"按值删除后:"<<endl;
  23. for(int i=0;i<strlen(arr);i++){
  24. cout<<arr[i]<<" ";
  25. }
  26. cout<<endl<<endl;
  27. //按下标删除
  28. int b;
  29. cout<<"要删除元素的下标:";
  30. cin>>b;
  31. for(int i=b;i<strlen(arr);i++){
  32. arr[i]=arr[i+1];
  33. }
  34. cout<<"按下标删除后:"<<endl;
  35. for(int i=0;i<strlen(arr);i++){
  36. cout<<arr[i]<<" ";
  37. }
  38. cout<<endl<<endl;
  39. //增:插入某个位置
  40. int index;
  41. char ch;
  42. cout<<"要插入的位置、值(空格隔开):";
  43. cin>>index>>ch;
  44. for(int i=strlen(arr);i>=index;i--){
  45. arr[i+1]=arr[i];
  46. }
  47. arr[index]=ch;
  48. for(int i=0;i<strlen(arr);i++){
  49. cout<<arr[i]<<" ";
  50. }
  51. cout<<endl<<endl;
  52. //改:修改某个位置的值
  53. int index2;
  54. char ch2;
  55. cout<<"要改的位置、值(空格隔开):";
  56. cin>>index2>>ch2;
  57. arr[index2]=ch2;
  58. for(int i=0;i<strlen(arr);i++){
  59. cout<<arr[i]<<" ";
  60. }
  61. cout<<endl<<endl;
  62. //查:查找某个元素的位置
  63. char ch3;
  64. cout<<"要查找的元素:";
  65. cin>>ch3;
  66. for(int i=0;i<strlen(arr);i++){
  67. if(arr[i]==ch3){
  68. cout<<i<<" ";
  69. }
  70. }
  71. cout<<endl<<endl;
  72. //查:查找某下标的值
  73. int index3;
  74. cout<<"某下标的值:";
  75. cin>>index3;
  76. cout<<arr[index3];
  77. cout<<endl<<endl;
  78. return 0;
  79. }

 6排序

6.1桶排序

思想:在已知数据范围的情况下,分配相应范围大小的数组空间。遍历所有数据,遇到对应下标时,计数增一。

桶排序动画视频

  1. #include<iostream>
  2. #define N 20 //宏定义,数组最大下标为N-1
  3. using namespace std;
  4. int main() {
  5. int arr[N]={0};
  6. int a,n;
  7. printf("(数据范围0~%d) 数据个数n:",N);
  8. cin>>n;
  9. printf("输入n个数据(空格隔开):");
  10. for(int i=0;i<n;i++){
  11. cin>>a;
  12. ++arr[a];
  13. }
  14. int num;
  15. for(int i=N-1;i>=0;i--){ //输出
  16. num=arr[i];
  17. for(int j=num;j>0;j--){ //对于的元素有几个
  18. cout<<i<<" ";
  19. }
  20. }
  21. }

6.2选择排序

思想:

  1. 在待排序的一组数据中,选出最小(最大)的一个数与第一个位置的数交换。
  2. 然后在剩下的数中,再找最小(最大)的数与第二个位置的数交换位置。
  3. 依次类推直到第 n-1 个元素与第 n 个元素交换位置,选择排序结束。

  1. //从小到大排序
  2. #include <iostream>
  3. using namespace std;
  4. int main(){
  5. int arr[5]={7,2,8,3,1};
  6. int min,index;
  7. for(int i=0;i<5-1;i++){
  8. min=arr[i]; //设当前值为最小值
  9. index=i; //设当前下标为最小下标
  10. for(int j=i+1;j<5;j++){ // 从i的下一个开始比较
  11. if(min>arr[j]){
  12. min=arr[j]; //更新最小值
  13. index=j; //更新最新下标
  14. }
  15. }
  16. if(index != i){ //下标不为i,即找到新的最小值
  17. arr[index]=arr[i];
  18. arr[i]=min;
  19. }
  20. }
  21. for(int i=0;i<5;i++){ //输出
  22. cout<<arr[i]<<" ";
  23. }
  24. return 0;
  25. }

6.3冒泡排序

思想:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这一趟比较完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。(排好序的数不再进行比较)
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

如:气泡在水中上浮时,气泡越来越大

冒泡排序动画视频 

 基本解法:

  1. //从小到大
  2. #include <iostream>
  3. using namespace std;
  4. int main(){
  5. int arr[200]={};
  6. int a,n;
  7. cout<<"输入n:";
  8. cin>>n;
  9. for(int i=1;i<=n;i++){ //逐个存入数组
  10. cin>>a;
  11. arr[i]=a;
  12. }
  13. int temp;
  14. for(int i=1;i<=n-1;i++){
  15. for(int j=1;j<=n-i;j++){
  16. if(arr[j]>arr[j+1]){
  17. temp=arr[j];
  18. arr[j]=arr[j+1];
  19. arr[j+1]=temp;
  20. }
  21. }
  22. }
  23. for(int i=1;i<=n;i++){ //输出
  24. cout<<arr[i]<<" ";
  25. }
  26. return 0;
  27. }

 优化程序:

  1. //从小到大
  2. #include <iostream>
  3. using namespace std;
  4. int main(){
  5. int arr[200]={};
  6. int a,n;
  7. cout<<"输入n:";
  8. cin>>n;
  9. for(int i=1;i<=n;i++){ //逐个存入数组
  10. cin>>a;
  11. arr[i]=a;
  12. }
  13. int temp,flag;
  14. for(int i=1;i<=n-1;i++){
  15. flag=0; //0:未移动 1:移动
  16. for(int j=0;j<=n-i;j++){
  17. if(arr[j]>arr[j+1]){
  18. flag=1;
  19. temp=arr[j];
  20. arr[j]=arr[j+1];
  21. arr[j+1]=temp;
  22. }
  23. }
  24. if(!flag){ //每一趟没被移动,说明数列有序
  25. break;
  26. }
  27. }
  28. for(int i=1;i<=n;i++){ //输出
  29. cout<<arr[i]<<" ";
  30. }
  31. return 0;
  32. }

7、字符串

  1. char a[1000];
  2. strlen(a);

7.1c++字符串输入总结

 直接输出string类型,须加<string>

分为:cin、getchar和scanf、cin.get()、gets、cin.getline()、getline

1、cin:  接收字符串时,遇“空格”、“TAB”、“回车”都结束

  1. char a[20];
  2. cin>>a;
  3. cout<<a;
  4. //遇到空格、回车键结束

2、scanf:  接收字符串时,遇“空格”、“TAB”、“回车”都结束

      getchar:   接收一个字符

  1. char ch2[20]; // 字符数组
  2. scanf("%s", ch2);
  3. printf("%s\n", ch2);
  4. getchar(); // 用完 scanf 后,清除缓冲区 
  5. /* 注:scanf读取字符时遇到空格和回车符时都会停止读取,
  6. 此时输入缓冲区还剩一个\n,如果不清除,会影响下一次的输入*/

3、 cin.get():  接收字符串时, 可以接收空格

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. char ch;
  5. cin.get(ch); //获取一个字符
  6. cout<<ch<<endl;
  7. getchar(); //清除缓存区
  8. char ch2[20];
  9. cin.get(ch2,10); //获取字符串,存入ch2中,限制长度为10-1=9
  10. cout<<ch2;
  11. return 0;
  12. }

4、gets():  接收字符串时, 可以接收空格 

  1. char ch1 [20]; // 字符数组
  2. gets(ch1);  // 输入 不能写成ch1=gets();
  3. puts(ch1);   // 输出

5、cin.getline():接收字符串时,可以接收空格并输出 

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. char m[20];
  5. cin.getline(m,4); //存入m,限制长度为4个字符,第5个位置存\0
  6. cout<<m<<endl;
  7. return 0;
  8. }
  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. char m2[20];
  5. cin.getline(m2,5,'a'); //存入m,限制长度为4个字符,第5个位置存\0, 遇到字符a停止
  6. cout<<m2<<endl; //当输入123abcde时,输入123
  7. return 0;
  8. }

6、getline() :  接收字符串时,可以接收空格并输出,需包含头文件“  #include<cstring>  ” 

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main(){
  5. string str;
  6. getline(cin, str);//用于string字符串类型,存入带空格的字符串
  7. cout <<"str= "<< str << endl;
  8. char a[10];
  9. cin.getline(a, 6);//用于字符数组类型,存入带空格的字符串
  10. cout <<"a= "<< a;
  11. }

7.2 字符串处理函数

头文件:#iclude<cstring>

strcpy(s1,s2)、strcmp(s1,s2)、strlen(s1)、strcat(s1,s2)、strlwr(s1)、strupr(s1)

 1、strcpy(s1, s2)

说明:把字符串s2拷贝到s1,即s1的数据变成了s2的数据

注意:必须保证s1的内存空间大于或等于s2

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main(){
  5. char str1[] = "123";
  6. char str2[] = "abc";
  7. cout<<strcpy(str1,str2);
  8. }
  9. //输出结果:abc

 2、strcmp(s1, s2)

说明:按照ASCII码顺序,s1和s2中的每个字符进行比较,

注意:当遇到某个字符不等时结束判断

返回值:比较结果。

  • 字符串1=字符串2,返回值=0;
  • 字符串1>字符串2,返回值>0,即 1;
  • 字符串1<字符串2,返回值<0,即 -1。
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main(){
  5. char str1[] = "123456";
  6. char str2[] = "123456";
  7. char str3[] = "a23456";
  8. cout<<strcmp(str1,str2)<<" "<<strcmp(str1,str3);
  9. }
  10. //输出结果为: 0 -1

3、strlen(s1)

作用:求字符数组或字符串的长度

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main(){
  5. char str1[] = "123";
  6. char str2[] = "abcabc";
  7. cout<<strlen(str1)<<" "<<strlen(str2);
  8. }
  9. //输出结果:3 6

 4、strcat(s1, s2)  

作用:把s2拼接到s1后面

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main(){
  5. char s1[] = "123";
  6. char s2[] = "abc";
  7. cout<<strcat(s1,s2);
  8. }
  9. //输出结果:123abc

5、strlwr(s1)  大写转小写

6、strupr(s1) 小写转大写

8、函数

作用: 将一段经常使用的代码封装起来,减少重复代码

  1. 返回值类型 函数名 (数据类型 变量1, 数据类型 变量2){
  2. 函数体语句;
  3. return 表达式;
  4. }
  1. #include<iostream>
  2. using namespace std;
  3. //1、 无参无返
  4. void test1(){
  5. cout<<"无参无返"<<endl;
  6. }
  7. //2、 有参无返
  8. void test2(int a){
  9. cout<<"有参无返"<<endl;
  10. cout<<"a="<<a<< endl;
  11. }
  12. //3、无参有返
  13. int test3(){
  14. cout<<"无参有返"<<endl;
  15. return 10;
  16. }
  17. //4、有参有返
  18. int test4(int num1, int num2){ //此处num1、num2为形式参数,即形参
  19. cout<<"有参有返 "<<endl;
  20. int sum=num1+num2;
  21. return sum;
  22. }
  23. int main(){
  24. int a=10,b=20;
  25. test1();
  26. test2(a);
  27. cout<<test3()<<endl;
  28. int sum;
  29. sum=test4(a,b); //此处a、b为实际参数,即实参
  30. cout<<sum<<endl;
  31. return 0;
  32. }
  • 形参数据改变时,实参不会改变。
  • 形参和实参可以同名,也可以不同名

9、指针

语法:  数据类型  * 指针变量  

指针所占内存:32位电脑占4字节,64位电脑占8字节。所有数据量类型都一样。

9.1一维指针

示例:

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a = 10;
  5. int *p;
  6. p=&a; //a的地址
  7. int *q=&a; //a的值 *q可以改变对应变量的值
  8. cout<<"(地址)a:"<<&a<<endl;
  9. cout<<"(地址)p: "<<p<<endl;
  10. cout<<"(值)*p:"<<*p<<endl;
  11. cout<<"(值)*q:"<<*q<<endl;
  12. //以下是错误案例
  13. int *t;
  14. *t=a;
  15. cout<<"*t"<<*t<<endl;
  16. cout<<"t"<<t<<endl;
  17. return 0;
  18. }

 输出时可以简单的理解成:* 号取值,& 号取地址

9.2const修饰

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int a = 10;
  5. int b = 10;
  6. //const修饰的是指针,指针指向可以改,值不可以更改
  7. const int * p1 = &a;
  8. p1 = &b; //正确
  9. //*p1 = 100; 报错
  10. //const修饰的是常量,指针指向不可以改,值可以更改
  11. int * const p2 = &a;
  12. //p2 = &b; //错误
  13. *p2 = 100; //正确
  14. //const既修饰指针又修饰常量
  15. const int * const p3 = &a;
  16. //p3 = &b; //错误
  17. //*p3 = 100; //错误
  18. return 0;
  19. }

9.3二维数组

9.4指针与数组、函数

指针与数组:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  6. int *p = arr;//指向首元素
  7. for (int i = 0; i < 10; i++)
  8. {
  9. cout << *p<< endl;
  10. p++;
  11. }
  12. return 0;
  13. }

指针与函数:

  传地址会改变实参的值,穿值不改变  

  1. #include<iostream>
  2. using namespace std;
  3. void s1(int a, int b){
  4. int temp=0;
  5. temp = a;
  6. a = b;
  7. b = temp;
  8. }
  9. void s2(int *a, int *b){
  10. int temp = *a;
  11. *a = *b;
  12. *b = temp;
  13. }
  14. int main(){
  15. int a = 10;
  16. int b = 20;
  17. //值传递
  18. s1(a, b);
  19. cout<<"传值后:"<<a <<" "<<b<<endl;
  20. //地址传递
  21. s2(&a, &b);
  22. cout<<"传地址后:"<<a<<" "<<b<<endl;
  23. return 0;
  24. }

10、结构体

10.1结构体概念与定义

结构体就像excel表格一样,可以存不同类型的元素。数组只能存一种类型的元素。

语法:

struct  结构体名{
    结构体成员列表 
}; 

struct是关键字不能省略。 

结构体的使用有三种方式:

  1. #include<iostream>
  2. using namespace std;
  3. struct student{
  4. //成员列表
  5. string name; //姓名
  6. int age; //年龄
  7. int math; //数学
  8. int chinese; //语文
  9. }stu3; // stu3是单独定义的一个对象
  10. int main() {
  11. //方法一
  12. struct student stu1; //struct 关键字可以省略
  13. stu1.name = "小码";
  14. stu1.age = 18;
  15. stu1.math = 120;
  16. stu1.chinese=135;
  17. cout<<"姓名:"<<stu1.name<<" 年龄:"<< stu1.age <<" 数学:"<<stu1.math<<" 语文:"<<stu1.chinese<<endl;
  18. //方法二
  19. struct student stu2 = { "小明",19,116,129 };
  20. cout<<"姓名:"<<stu2.name<<" 年龄:"<< stu2.age <<" 数学:"<<stu2.math<<" 语文:"<<stu2.chinese<<endl;
  21. //方法三
  22. stu3.name = "小花";
  23. stu3.age = 18;
  24. stu3.math = 130;
  25. stu3.chinese=140;
  26. cout<<"姓名:"<<stu3.name<<" 年龄:"<< stu3.age <<" 数学:"<<stu3.math<<" 语文:"<<stu3.chinese<<endl;
  27. return 0;
  28. }

10.2结构体数组

  1. #include<iostream>
  2. using namespace std;
  3. struct student{
  4. //成员列表
  5. string name; //姓名
  6. int math; //数学
  7. int chinese; //语文
  8. };
  9. int main() {
  10. struct student arr[3]={
  11. {"张三",146,80},
  12. {"李四",119,90},
  13. {"王五",120,53}
  14. };
  15. for (int i=0;i<3;i++){
  16. cout<<"姓名:"<<arr[i].name
  17. <<" 数学:"<<arr[i].math
  18. <<" 语文:"<<arr[i].chinese
  19. <<endl;
  20. }
  21. return 0;
  22. }

10.3结构体指针

  1. #include<iostream>
  2. using namespace std;
  3. struct student{
  4. string name; //姓名
  5. int math; //数学
  6. int chinese; //语文
  7. };
  8. int main(){
  9. student stu1 = {"周杰伦",132,149}; //一个对象
  10. struct student *p = &stu1;
  11. p->chinese = 80;
  12. cout<<"姓名:"<<p->name
  13. <<" 数学:"<<p->math
  14. <<" 语文:"<<p->chinese
  15. <<endl<<endl;;
  16. student stu2[2] = { //对象数组
  17. {"小明",112,150},
  18. {"小美",123,97,}
  19. };
  20. student (*q)[2]; //结构体数组指针
  21. q=&stu2;
  22. q[1]->math=150;
  23. for (int i=0;i<2;i++){
  24. cout<<"姓名:"<<q[i]->name
  25. <<" 数学:"<<q[i]->math
  26. <<" 语文:"<<q[i]->chinese
  27. <<endl;
  28. }
  29. return 0;
  30. }

10.4结构体嵌套(含数组)

嵌套时也可以使用数组。

  1. #include<iostream>
  2. #define N 40
  3. using namespace std;
  4. struct student{ //学生
  5. string name; //姓名
  6. int math; //数学
  7. int chinese; //语文
  8. };
  9. struct school{ //班
  10. string teacher; //班主任
  11. string grade; //年级
  12. student students[N]; //一个班N个人
  13. };
  14. int main(){
  15. school class1;
  16. class1.grade="二年级三班";
  17. class1.teacher="马冬梅";
  18. class1.students[0].name="小明";
  19. class1.students[0].chinese=98;
  20. class1.students[0].math=130;
  21. class1.students[1].name="小红";
  22. class1.students[1].chinese=118;
  23. class1.students[1].math=123;
  24. for (int i=0;i<2;i++){
  25. cout<<"年级:"<<class1.grade
  26. <<" 班主任:"<<class1.teacher
  27. <<" 姓名:"<<class1.students[i].name
  28. <<" 语文:"<<class1.students[i].chinese
  29. <<" 数学:"<<class1.students[i].math
  30. <<endl;
  31. }
  32. return 0;
  33. }

10.5结构体作函数参数

传值的时候不改变实参的值,穿地址会修改实参的值。

  1. #include<iostream>
  2. using namespace std;
  3. struct student{ //学生
  4. string name; //姓名
  5. int math; //数学
  6. int chinese; //语文
  7. };
  8. //传值 不可修改数据
  9. void s1(student stu){
  10. stu.name="小伦";
  11. cout<<"第一次:";
  12. cout<<"姓名:"<<stu.name
  13. <<" 数学:"<<stu.math
  14. <<" 语文:"<<stu.chinese
  15. <<endl;
  16. }
  17. //传地址 可修改数据
  18. void s2(student *stu){
  19. stu->name="小伦";
  20. }
  21. int main(){
  22. student stu={"小明",98,77};
  23. //传值
  24. s1(stu);
  25. cout<<"第二次:";
  26. cout<<"姓名:"<<stu.name
  27. <<" 数学:"<<stu.math
  28. <<" 语文:"<<stu.chinese
  29. <<endl;
  30. s2(&stu);
  31. cout<<"第三次:";
  32. cout<<"姓名:"<<stu.name
  33. <<" 数学:"<<stu.math
  34. <<" 语文:"<<stu.chinese
  35. <<endl;
  36. return 0;
  37. }

11、查找 

1、二分查找

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. int arr[]={1,2,4,6,8,9,13,15};
  5. int left=0;
  6. int right=7;
  7. int mid,flag=0,a;
  8. cout<<"输入需要查找的值:";
  9. cin>>a;
  10. while (left<=right){
  11. mid=(left+right)/2;
  12. if (arr[mid]>a){
  13. right=mid-1;
  14. }else if(arr[mid]<a){
  15. left=mid+1;
  16. }else{
  17. cout<<"索引:"<< mid<<endl;
  18. flag=1;
  19. break;
  20. }
  21. }
  22. if(flag==0){
  23. cout<<"查无此数!"<<endl;
  24. }
  25. return 0;
  26. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/1008175
推荐阅读
相关标签
  

闽ICP备14008679号