4、程序流程结构
C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
-
顺序结构:程序按顺序执行,不发生跳转
-
选择结构:依据条件是否满足,有选择的执行相应的功能
-
循环结构:依据条件是否满足,循环多次执行某段代码
4.1选择结构
4.1.1if语句
作用:执行满足条件的语句
if语句的三种形式
-
单行格式if语句
-
多行格式if语句
-
多条件的if语句
-
单行格式if语句:if(条件){条件满足执行的语句}
#include<iostream> using namespace std; int main() { //选择结构-单行if语句 /* 用户输入分数,如果分数大于600,视为考上一本大学,在屏幕上输出 1、用户输入分数 2、打印用户输入的分数 3、判断是否大于600,如果大于输出 */ int score = 0; cout << "请输入考生分数: " << endl; cin >> score; cout << "您输入的分数为: " << score << endl; //注意事项,if条件后面不要加分号 if (score > 600) { cout << "恭喜您考上了一本大学" << endl; } system("pause"); return 0; }
-
多行格式if语句:if(条件){条件满足执行的语句}else{条件不满足执行的语句}
#include<iostream> using namespace std; int main() { int score = 0; //选择结构-多行if语句 /* 用户输入分数,如果分数大于600,视为考上一本大学 1、用户输入分数 2、打印用户输入的分数 3、判断是否大于600,如果大于输出"恭喜您考上一本大学" 小于输出"请再接再厉" */ cout << "请输入您的分数: " << endl; cin >> score; cout << "您输入的分数为: " << score << endl; if (score > 600) { cout << "恭喜您考上一本大学" << endl; } else { cout << "请再接再厉" << endl; } system("pause"); return 0; }
-
多条件的if语句:if(条件){条件1满足执行的语句}else if(条件2){条件2满足执行的语句}.....else{都不满足执行的语句}
#include<iostream> using namespace std; int main() { //选择结构-多条件if语句 /* 用户输入分数,如果分数大于600,视为考上一本大学 分数大于500,视为考上二本大学 分数大于400,视为考上三本大学 分数小于400,是为考上职专 1、用户输入分数 2、打印用户输入的分数 */ int score = 0; cout << "请输入您的分数: " << endl; cin >> score; cout << "您输入分数为: " << score << endl; if (score > 600) { cout << "恭喜您考上一本大学!" << endl; } else if (score > 500) { cout << "恭喜您考上二本大学!" << endl; } else if (score > 400) { cout << "恭喜您考上三本大学!" << endl; } else { cout << "恭喜您考上职专!" << endl; } system("pause"); return 0; }
-
嵌套型if语句
#include<iostream> using namespace std; int main() { //选择结构-嵌套型if语句 /* 用户输入分数,如果分数大于600,视为考上一本大学 分数大于500,视为考上二本大学 分数大于400,视为考上三本大学 分数小于400,视为未考上本科 在一本分数中,如果大于700,考入北大,大于650,考入清华,大于600,考入人大 1、用户输入分数 2、打印用户输入的分数 3、判断 */ int score = 0; cout << "请输入您的分数: " << endl; cin >> score; cout << "您输入分数为: " << score << endl; if (score > 600) { cout << "恭喜您考上一本大学!" << endl; if (score > 700) { cout << "您能考入北京大学" << endl; } else if (score > 650) { cout << "您能考入清华大学" << endl; } else { cout << "您能考入人民大学" << endl; } } else if (score > 500) { cout << "恭喜您考上二本大学!" << endl; } else if (score > 400) { cout << "恭喜您考上三本大学!" << endl; } else { cout << "未考上本科,请再接再厉!" << endl; } system("pause"); return 0; }
-
三只小猪
#include<iostream> using namespace std; int main() { //有三只小猪ABC,请分别输入三只小猪的体重,并且判断哪只最重 //1、创建三只小猪的体重变量 int num1 = 0; int num2 = 0; int num3 = 0; //2、请用户输入三只小猪的体重 cout << "请输入小猪A的体重" << endl; cin >> num1; cout << "请输入小猪B的体重" << endl; cin >> num2; cout << "请输入小猪C的体重" << endl; cin >> num3; cout << "小猪A的体重为: " << num1 << endl; cout << "小猪B的体重为: " << num2 << endl; cout << "小猪C的体重为: " << num3 << endl; //3、判断哪只最终 if (num1 > num2)//A>B { if (num1 > num3)//A>C { cout << "小猪A最重" << endl; } else//A<C { cout << "小猪C最终" << endl; } } else //B>A { if (num2 > num3)//B>C { cout << "小猪B最重" << endl; } else { cout << "小猪C最重" << endl; } } system("pause"); return 0; }
4.1.2三目运算符
作用:通过三目运算符实现简单的判断
语法:表达式1?表达式2=表达式3
解释:
如果表达式1的值为真,执行表达式2,并返回表达式2的结果;
如果表达式1的值为假,执行表达式3,并返回表达式3的结果;
#include<iostream> using namespace std; int main() { //三目运算符: 表达式1?表达式2:表达式3 //创建三个变量a b c //将a和b作比较,将变量大的值赋值给c int a = 10; int b = 20; int c = 0; c = (a > b ? a : b ); cout << "c= " << c << endl; //在C++中三目运算符返回的是变量,可以继续赋值 (a > b ? a : b) = 100; cout << "a=" << a << endl; cout << "b=" << b << endl; system("pause"); return 0; }
4.1.3Switch语句
作用:执行多条件分支语句
语法:
switch(表达式) { case 结果1:执行语句;break; case 结果2:执行语句;break; ...... default:执行语句;break; }
#include<iostream> using namespace std; int main() { /*switch语句 给电影进行打分 10~9经典 8~7非常好 6~5一般 5以下烂片 1、提示用户给电影打分 2、用户开始进行打分 3、根据用户输入的分数来提示用户最后的结果 */ int score = 0; cout << "请您给电影打分: " << endl; cin >> score; cout << "您打的分数为: " << score << endl; switch (score) { case 10: cout << "您认为是经典电影" << endl; break;//表示退出当前分支 case 9: cout << "您认为是经典电影" << endl; break; case 8: cout << "您认为是非常好电影" << endl; break; case 7: cout << "您认为是非常好电影" << endl; break; case 6: cout << "您认为是一般电影" << endl; break; case 5: cout << "您认为是一般电影" << endl; break; default: cout << "您认为是烂片" << endl; break; } /* if和switch的区别 switch的缺点,判断的时候只能是整型或者字符型,不可以是一个区间 switch的优点,结构清晰,执行效率高 */ system("pause"); return 0; }
当没有break时
有break
注意1:switch语句中表达式类型只能是整型或者字符型
注意2:case里如果没有break,那么程序就会一直向下执行
总结:
switch的缺点,判断的时候只能是整型或者字符型,不可以是一个区间 switch的优点,结构清晰,执行效率高
4.2循环结构
4.2.1while循环语句
作用:满足循环条件,执行循环语句
语法:while(循环条件){循环语句}
解释:只要循环条件的结果为真,就执行循环语句
#include<iostream> using namespace std; int main() { /* while循环 在屏幕上打印0~9这10个数字 */ int num = 0; //while()中填入循环条件 //在写循环时一定要避免死循环 while(num<10) { cout << "num=" << num << endl; num++; } system("pause"); return 0; }
注意:在执行循环语句时,必须提供跳出循环的出口,避免死循环
while循环练习案例:猜数字
案例描述:系统随机生成一个1到100的数字,玩家进行猜测,如果猜错,提示玩家过大还是过小,如果猜对恭喜玩家胜利,并且退出小游戏。
#include<iostream> using namespace std; #include<ctime>//time系统时间头文件包含 int main() { /* 1、系统生成随机数 2、玩家进行猜测 3、判断玩家的猜测 猜对 退出游戏 恭喜玩家获得胜利 猜错 提示猜的结果过大或者过小 重新返回第二步,重新猜测 rand()%100表示生成0~99随机数 rand()%100 + 1表示生成1~100随机数 */ srand((unsigned int)time(NULL));//添加随机数种子 作用:利用当前系统时间生成随机数,防止每次随机数都一样 int num = rand() % 100 + 1;//生成随机数 //cout << "num=" << num << endl; //cin >> num; int val = 0; while (1) { cin >> val; //猜错 提示猜的结果过大或者过小 重新返回第二步,重新猜测 if (val > num) { cout << "猜测过大" << endl; } else if (val < num) { cout << "猜测过小" << endl; } else { cout << "恭喜您获得胜利" << endl; break;// break可以利用该关键字退出当前循环 } } system("pause"); return 0; }
4.2.2do...while循环语句
作用:满足循环条件,执行循环语句
语法:do{循环语句}while(循环条件);
do...while 和while区别在于do...while会先执行一次循环语句,再判断条件 while是先判断条件,满足条件之后再执行循环语句
#include<iostream> using namespace std; int main() { /* while循环语句 int num = 0; while (num < 10) { cout << "num=" << num << endl; num++; } */ int num = 0; do { cout << "num= " << num << endl; num++; } while (num<10); //do...while 和while区别在于do...while会先执行一次循环语句,再判断条件 //while是先判断条件,满足条件之后再执行循环语句 system("pause"); return 0; }
水仙花数
案例描述:水仙花数是一个三位数,它的每个位上的数字的3次幂之和等于本身 例如:1^3+5^+3^3=153
请利用do...while语句,求出所有三位数中的水仙花数
解析:
-
将所有的三位数进行输出(100~999)
-
在所有的三位数中找到水仙花数
水仙花数 153 int
获取个位数 153%10=3 对数字取模于10可以获取个位数
获取十位数 153/10=15 15%10=5 先整除于10得15在对10取模,得到十位数
获取百位数 153/100=1 直接整除于100,获取百位
#include<iostream> using namespace std; int main() { /* 案例描述:水仙花数是一个三位数,它的每个位上的数字的3次幂之和等于本身 例如:1^3+5^+3^3=153 */ //1、打印所有的三位数 int num = 100; do { //2、在打印的三位数中找到水仙花数 int a = 0; //个位 int b = 0; //十位 int c = 0; //百位 a = num % 10; //获取个位数 b = num / 10 % 10; //获取十位数 c = num / 100; //获取百位数 if (a*a*a + b*b*b + c*c*c == num)//如果是水仙花数才打印 注:需要是==,一个=是赋值,两个==是等于 { cout << "num= " << num << endl; } num++; } while (num < 1000); system("pause"); return 0; }
四位数中的水仙花数:
#include<iostream> using namespace std; int main() { //拓展 //1、打印所有的四位数 int num = 1000; do { //2、在打印的四位数中找到水仙花数 int a = 0; //个位 int b = 0; //十位 int c = 0; //百位 int d = 0; //获取千位 a = num % 10; //获取个位数 b = num / 10 % 10; //获取十位数 c = num / 100%10; //获取百位数 d = num / 1000; //获取千位数 if (a*a*a*a + b*b*b*b + c*c*c*c + d*d*d*d == num)//如果是水仙花数才打印 注:需要是==,一个=是赋值,两个==是等于 { cout << "num= " << num << endl; } num++; } while (num < 10000); system("pause"); return 0; }
4.2.3for循环语句
作用:满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;末尾循环体){循环语句;}
#include<iostream> using namespace std; int main() { //for循环 //从数字0打印到数字9 /* 1、先执行 int i=0; 2、在执行i<10; 3、然后执行输出语句cout << "i= " << i << endl; 4、再然后执行i++; 5、在执行i<10; 1 2 3 4 2 3 4 2 3 4 6、然后执行输出语句cout << "i= " << i << endl; 7、再然后执行i++; 直到i≥10退出循环 */ for (int i = 0; i < 10; i++)//注意:末尾循环体没有分号 { cout << "i= " << i << endl; } system("pause"); return 0; }
注意:for循环中的表达式,要用分号进行分隔
while、do...while、for都是开发中常用的循环语句,for循环结构比较清晰,比较常用
敲桌子:
案例:从1开始数到100,如果数字个位含有7,或者数字十位含有7,或者该数字是7的倍数,我们打印敲桌子,其余数字直接打印输出。
#include<iostream> using namespace std; int main() { /* 1、先输出1~100这些数字 2、从这些数字中找到特殊数字,改为敲桌子 特殊数字 7的倍数 %7=0 个位有7 %10=7 十位有7 /10=7 */ for (int i = 1; i <= 100; i++) { if (i % 7 == 0 || i % 10 == 7 || i / 10 ==7 ) //切记是双等号==,一个等号=表示赋值,两个等号==是等于 { cout << "敲桌子" << endl; } //没必要写else if 利用 || 或运算符即可 /* else if (i % 10 == 7) { cout << "敲桌子" << endl; } else if (i / 10 == 7) { cout << "敲桌子" << endl; }*/ else { cout << "i= " << i << endl; } } system("pause"); return 0; }
4.2.4嵌套循环
作用:在循环体中在嵌套一层循环,解决一些实际问题
例如我们想在屏幕中打印如下图片,就需要利用嵌套循环
#include<iostream> using namespace std; int main() { //利用嵌套循环实现星图 //打印一行星图 //外层执行一次,内层执行一周 //外层循环 for (int i = 0; i < 10; i++) { //内层循环 for (int j = 0; j < 10; j++) { cout << "* "; } cout << endl;//for循环外换行任意键继续 } system("pause"); return 0; }
练习:乘法口诀表
案列:利用嵌套循环,实现九九乘法表
#include<iostream> using namespace std; int main() { /* 9行 9列 i=1;i<=9 j=1 列数* 行数 = 结果 i*j 列数<=行数 j<=i */ for (int i = 1; i <= 9; i++) { //cout << i << endl; for (int j = 1; j <=i; j++) { int num = i * j; cout << i << "*" << j << "="<< num << " "; //难点:j<=i cout << i << "*" << j << "="<<num << " " 输出为i*j=num } cout << endl; } system("pause"); return 0; }
4.3跳转语句
4.3.1break语句
作用:用于跳出选择结构或者循环结构
break的使用时机:
-
出现在switch语句中,作用是终止case并跳出switch
-
出现在循环语句中,作用是跳出当前循环语句
-
出现在嵌套循环中,跳出最近的内层循环语句
#include<iostream> using namespace std; int main() { //1、出现在switch语句中 /* cout << "请选择副本难度" << endl; cout << "1、简单" << endl; cout << "2、困难" << endl; cout << "3、地狱" << endl; int select = 0; cin >> select; switch (select) { case 1: cout << "您选择的是普通难度" << endl; break; case 2: cout << "您选择的是困难难度" << endl; break; case 3: cout << "您选择的是地狱难度" << endl; break; default: break; }*/ //2、出现在循环语句中 /*for (int i = 0; i < 10; i++) { //如果i=5,退出循环,不在打印 if (i == 5) { break;//退出循环 } cout << i << endl; }*/ //3、出现在嵌套循环语句中 for (int i = 0; i < 10; i++) { cout << "* "; for (int j = 0; j < 10; j++) { if (j == 5) { break;//退出内层循环 } cout << "* "; } cout << endl; } //cout << endl; 不需要 system("pause"); return 0; }
4.3.2continue语句
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
#include<iostream> using namespace std; int main() { //continue语句 /*法一 for (int i = 0; i <= 100; i++) { //如果是奇数才输出,偶数不输出 if (i % 2 == 1) { cout << i << endl; //可以筛选条件,执行到此就不在向下执行,执行下一次循环 //break会退出循环 } } */ //法二 for (int i = 0; i <= 100; i++) { //如果是奇数才输出,偶数不输出 if (i % 2 == 0) { continue; //可以筛选条件,执行到此就不在向下执行,执行下一次循环 //break会退出循环 } cout << i << endl; } system("pause"); return 0; }
注意:continue并没有使整个循环终止,而break会跳出循环
4.3.3goto语句
作用:可以无条件跳转语句
语法:goto标记;
解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置
不太推荐使用
#include<iostream> using namespace std; int main() { //goto语句 cout << "1、xxxxxx" << endl; cout << "2、xxxxxx" << endl; goto FLAG; cout << "3、xxxxxx" << endl; cout << "4、xxxxxx" << endl; cout << "5、xxxxxx" << endl; FLAG: cout << "6、xxxxxx" << endl; cout << "7、xxxxxx" << endl; system("pause"); return 0; }
在程序中不太建议使用,以免程序混乱,不利于阅读
5、数组
5.1概述
所谓数组,就是一个集合,里面存放了相同类型的数据元素
特点一:数组的每个数据元素都是相同的数据类型
特点二:数组是由连续的内存位置组成的
5.2一维数组
5.2.1一维数组定义方式
一维数组定义的三种方式:
-
数据类型 数组名[ 数组长度 ];
-
数据类型 数组名[数组长度 ] = {值1,值2,值3……};
-
数据类型 数组名[ ] = {值1,值2,值3,……};
#include<iostream> using namespace std; int main() { //1、数据类型 数组名[ 数组长度 ]; int arr[5]; //给数组中的元素赋值 arr[0] = 0; arr[1] = 10; arr[2] = 20; arr[3] = 30; arr[4] = 40; //访问数据元素 数组元素的下表是从0开始的 /* cout << arr[0] << endl; cout << arr[1] << endl; cout << arr[2] << endl; cout << arr[3] << endl; cout << arr[4] << endl; */ //2、数据类型 数组名[数组长度 ] = {值1,值2,值3……}; //如果在初始化数据的时候,没有全部填写完,会用0来填补剩余数据 int arr2[5] = { 0,10,20 }; /* cout << arr2[0] << endl; cout << arr2[1] << endl; cout << arr2[2] << endl; cout << arr2[3] << endl; cout << arr2[4] << endl; */ //利用循环的方式输出数组中的元素 /*for (int i = 0; i < 5; i++) { cout << arr2[i] << endl; }*/ //3、数据类型 数组名[ ] = {值1,值2,值3,……}; //定义数组的时候,必须有初始长度,后面有数据的时候可以自动识别长度 int arr3[] = { 90,80,70,60,50,40,30,20,10,0 }; for (int i = 0; i < 10; i++) { cout << arr3[i] << endl; } system("pause"); return 0; }
总结1:数组名的命名规范与变量名命名规范一致,不要和变量重名
总结2:数组下标是从0开始索引的
5.2.2一维数组数组名
一维数组名称的用途:
-
可以统计整个数组在内存中的长度 sizeof(arr) sizeof(arr[i])
-
可以获取数组在内存中的首地址
#include<iostream> using namespace std; int main() { /* 一维数组名称的用途: 可以统计整个数组在内存中的长度 可以获取数组在内存中的首地址 */ int arr[] = { 90,80,70,60,50,40,30,20,10,0 }; cout << "整个数组占用的空间为: " << sizeof(arr) << endl; cout << "第一个元素占用的空间为: " << sizeof(arr[0]) << endl; cout << "数组中元素的个数为: " << sizeof(arr) / sizeof(arr[0]) << endl; cout << "数组首地址为: "<< (int)arr << endl; //输出的是16进制的数,看不懂没关系,可以在前面加 (int) cout << "数组中第一个元素的地址为: " << (int)&arr[0] << endl; cout << "数组中第二个元素的地址为: " << (int)&arr[1] << endl; cout << "数组中第三个元素的地址为: " << (int)&arr[2] << endl; cout << "数组中第四个元素的地址为: " << (int)&arr[3] << endl; //arr=100 错误 数组名是常量,不可以进行赋值操作 system("pause"); return 0; }
练习案例1:五只小猪称体重
案例描述:
在一个数组中记录了五只小猪的体重,如:int arr[]={300,350,200,400,250}
找出并打印最重的小猪体重
#include<iostream> using namespace std; int main() { //1、创建五只小猪体重的数组 int arr[] = { 300,350,200,400,250 }; //2、从数组中找到最大值 int max = 0;//先设定一个最大值为0 for (int i = 0; i < 5; i++) { if (arr[i] > max)//如果访问的数组中的元素比我认定的最大值还大,更新最大值 { max = arr[i]; } } //3、打印最大值 cout << "最重的小猪体重为: " << max << endl; system("pause"); return 0; }
练习案例2:数组元素逆置
案例描述:请声明一个5个元素的数组,并且将元素逆置。
(如原数组元素为:1,3,2,5,4 ;逆置后输出结果为4,5,2,3,1)
#include<iostream> using namespace std; int main() { //实现元素逆置 //1、创建数组 int arr[] = { 1,3,2,5,4 }; cout << "数组逆置前: " << endl; for (int i = 0; i < 5; i++) { cout << arr[i] << endl; } /* 2、实现逆置 记录起始下标的位置 记录结束下标的位置 起始下标与结束下标元素互换 起始位置++ 结束位置-- 循环执行start++ end--,直到start>=end为止 */ int start = 0;//起始下标 int end = sizeof(arr) / sizeof(arr[0])-1;//结束下标 while (start < end) { //实现元素互换 int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; //下标更新 start++; end--; } cout << "数组逆置后: " << endl; for (int i = 0; i < 5; i++) { cout << arr[i] << endl; } system("pause"); return 0; }
5.2.3冒泡排序
作用:最常用的排序算法,对数组内元素进行排序
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一个相邻元素做同样的工作,执行完毕后,找到第一个最大值。
-
重复以上步骤,每次比较次数-1,直到不需要比较
将数组{4,2,8,0,5,,1,3,9}