C++学习之路【1】:标C数据结构和算法
流程控制指程序执行的顺序,包括三大结构:顺序结构、分支结构、循环结构。
图灵提出流程控制的概念,认为所有的程序可以通过三大结构设计出来。
顺序结构
从上到下,顺序执行各条语句
分支结构
有些代码可执行不执行,有选择的执行某些代码
if 分支结构
满足条件执行,不满足条件不执行
if(逻辑表达式){
语句1;
}
如果逻辑表达式为真,就执行语句1;如果逻辑表达式为假就不执行语句1。
逻辑表达式:布尔值,可以作为布尔值的数据都可以放到圆括号中
通过判断逻辑表达式的真假,决定是否执行某一语句块
if(逻辑表达式){
语句1;
}else{
语句2;
}
如果逻辑表达式为真,就执行语句1;如果逻辑表达式为假就执行语句2。
逻辑表达式:布尔值,可以作为布尔值的数据都可以放到圆括号中
通过判断逻辑表达式的真假,从两个语句块中选择一个语句块来执行
#include<stdio.h>
int main(void){
printf("请输入一个整数a:");
int a;
scanf("%d\n", &a);
if(a > 5){
printf("a的值大于5\n");
}
if(a < 10){
printf("a的值小于10\n");
}else{
printf("a的值大于等于10\n");
}
return 0;
}
if - else if - else if - … - else 结构
// 具有多个判断条件
// 具有可能多个条件都为假,所有代码都不执行
int a = 10;
if(a > 50){
printf("a大于50\n");
}else if(a > 30){
printf("a大于50\n");
}else if(a > 20){
printf("a大于20\n");
}
// 加上else,前面所有条件都不成立时,执行else内容
if(a > 50){
printf("a大于50\n");
}else if(a > 30){
printf("a大于50\n");
}else if(a > 20){
printf("a大于20\n");
}else{
printf("a小于等于20\n");
}
判断闰年:
从键盘输入年份,闰年/平年
年份可以被4整除但是不能被100整除
或者可以被400整除
#include<stdio.h>
int main(void){
pintf("请输入需要查询的年份:");
int year;
scanf("%d\n", &year);
if(year % 4 == 0 && year % 100 != 0){
printf("你查询的年份是闰年");
}else if(year % 400 == 0){
printf("你查询的年份是闰年");
}else{
printf("你查询的年份是平年");
}
return 0;
}
switch分支
switch只能是整数匹配
匹配成功,从当前语句向下执行,直到遇到break语句结束分支
#include<stdio>
int main(void){
printf("请输入季节编号(1/2/3/4):");
int season;
scanf("%d", &season);
switch(season){
case 1:
printf("spring(春天)\n");
break;
case 2:
printf("summer(夏天)\n");
break;
case 3:
printf("autumn(秋天)\n");
break;
case 4:
printf("winter(冬天)\n");
break;
default:
printf("输入不合规,请重新输入\n");
break;
}
return 0;
}
//100 S; 90-99 A; 80-89 B; 70-79 C; 60-69 D; <60 E
//安全检查,如果分数不在0-100之间 —— 结束
#include<stdio.h>
int main(void){
printf("请输入你的成绩:\n");
int score;
scanf("%d\n", &score);
if(score < 0 || score > 100){
printf("你输入的分数有误,请重新输入分数(0-100)\n");
break;
}
switch(score / 10){
case 10:
printf("你的成绩为S\n");
break;
case 9:
printf("你的成绩为A\n");
break;
case 8:
printf("你的成绩为B\n");
break;
case 7:
printf("你的成绩为C\n");
break;
case 6:
printf("你的成绩为D\n");
break;
defaulf:
printf("你的成绩为E\n");
break;
}
return 0;
}
循环结构
循环语句可以让一组语句反复多次执行
for循环
for(表达式1;表达式2;表达式3){
循环体4;
}
执行顺序,先执行表达式1,该语句只会执行一次,
然后执行表达式2,表达式2为逻辑表达式,运算结果为布尔值,为真或为假
表达式2为假的时候,结束for循环
表达式2为真的时候,执行循环体4,然后执行表达式3
[1][2 4 3][2 4 3][2 4 3][2 4 3][2 4 3]…
表达式1 - 把开始数字赋值给循环变量的语句 - 循环变量初始化
逻辑表达式2 - 描述循环变量和结束数字间关系的逻辑表达式 - 循环条件
表达式3 - 把循环变量从前一个数字变成后一个数字 - 变化过程
int i = 0;
for(i = 0; i < 5; i++){
printf("i = %d\n", i);
}
/*
[1] i = 0;
[2] i = 0 -> i < 5 -真
[4] printf(0);
[3] i++; -> i = 1
------
[1] i = 1;
[2] i = 1 -> i < 5 -真
[4] printf(1);
[3] i++; -> i = 2
...
最终的结果为输出:0 1 2 3 4
将重复的代码执行了5次
在循环的过程中,随着循环发生变化的变量叫做循环变量
*/
for循环小括号里的每条语句都可以省略(分号不能少)
如果省略小括号中间的逻辑表达式就表示逻辑表达式永远为真,这种for循环不能正常结束,它叫做死循环
在C99规范里可以在循环小括号里临时声明循环变量
这种循环变量只能在循环里使用,循环一旦结束就不能使用了
如果循环只有一条语句,可以省略花括号
#include<stdio.h>
int main(void){
//形式1
int i = 0;
for(i = 0; i < 5; i++){
printf("i = %d", i);
}
//省略表达式1 - 形式2
int j = 0;
for( ; j < 5; j++){
printf("j = %d", j);
}
//省略表达式3 - 形式3
int k = 0;
for( ; k < 5; ){
printf("k = %d", k);
k++; //将循环变量的变化过程放到循环体中
}
//省略表达式2 - 形式4
for( ; ; ){
printf("今天很开心\n");
} //死循环
//形式5 - break
int h = 0;
for(;;){
printf("h = %d", h);
h++;
if(h > 5)
break
}
//形式6 - C99 - 可以在表达式1定义初始化循环变量
for(int m = 0; m < 5; m++){
print("m = %d", m);
}
//形式7 - contunue关键字 - 结束本次循环,继续下次循环
int z = 0;
for(z = 0; z < 5; z++){
if(z == 3){
continue; //执行该语句后,直接跳转到表达式3执行 - z++
printf("hello,continue\n"); // 不执行
}
print("z = %d", z); //0 1 2 4,无3和hello continue
}
return 0;
}
可以在循环中使用break;语句随时终止循环的执行
一旦执行break;语句之后循环里的一切语句都不再执行,包括循环变量也不再变化
死循环都必须使用break;语句结束
循环中可以使用continue,语句直接跳转到循环大括号的末尾,中间的语句这次循环就不执行了
goto也是流程控制语句,它可以跳转到对应语句去执行,尽量不要使用goto语句(见文末详解)
循环的嵌套:
//打印10行20列*
#include<stdio.h>
int main(void){
int i, j;
for(i = 0; i < 10; i++){ //0-9,循环10次
//printf("********************");
//替换
for(j = 0; j < 20; j++){ //0-19,循环20次
print("*");
}
print("\n");
}
return 0;
}
//输出0-100之间的所有奇数
#include<stdio.h>
int main(void){
int i;
for(i = 1; i < 100; i++){
if(i%2){ //i对2取余后为非零则输出i
print("%d ", i);
}
}
return 0;
}
while循环
while循环 - 简单/简易版本的for循环(理解)
while (条件表达式){
循环体;
}
条件表达式,运算的结果为布尔值;如果条件为真,则运行循环体代码。
#include<stdio.h>
int main(void){
int i = 0; //1.循环变量初始化
while(i < 5){ //2.循环条件
printf("i = %d\n", i); //4.循环体
i++; //3.循环变量变化过程
}
return 0;
}
求1-100相加的和:
//求1-100相加的和
#include<stdio.h>
int main(void){
int i = 1;
int sum = 0;
while(i <= 100){
sum = sum + i;
i++;
}
printf("sum = %d\n", sum)
return 0;
}
do-while循环
do {
循环体;
} while (条件表达式);
条件表达式的运算为布尔值,即真和假
#include<stdio.h>
int main(void){
while(0){ //不会执行hello world
printf("hello world\n");
}
int i = 0;
// do-while循环是至少执行一次的while循环
do{
printf("i = %d", i); //0,1,2,3,4
i++;
}while(i < 5);
return 0;
}
【goto - 到标号处运行】
#include<stdio.h>
int main(void){
printf("1\n");
goto label; //直接跳转至label的位置上运行
printf("2\n");
printf("2\n");
printf("2\n");
label:
printf("3\n");
printf("3\n");
printf("3\n");
// 输出1、3、3、3
return 0;
}
【空语句( ; )】
#include<stdio.h>
int main(void){
; //空语句 - 表示一条语句 - 执行一个分号
//分号起到了结束语句的作用
//延时
printf("1\n");
int i = 90000000;
while(i--); // i--,非0,真;0,假;
// 执行语句为空语句,do nothing - 消耗时间
printf("2\n");
//避免
int j = 0;
for(j = 0; j < 5; j++); //省略花括号,执行语句为空语句
printf("j = %d\n", j); // j = 5
return 0;
}