------ 知之博客 期待与您交流! -------
一 程序结构的分类
程序结构分为三类:
1)顺序结构
顺序结构是最简单的程序结构,它是由若干个一次执行的处理步骤组成的。
按照顺序依次执行A、B程序块。如图:
顺序结构
2)分支结构
根据给定的条件进行判断,由判断的结果决定执行两个分支中的一个分支。如图:当P为真时执行A程序块,否则执行B程序块。无论条件P是否成立,A和B程序块只能有一个被执行到,执行之后就离开了该选择结构。当B为空时,条件P为假时不执行任何操作。
分支结构
3)循环结构
又称为重复结构,给定条件成立时反复执行某一程序段。
C语言中主要的循环语句由三个:
(1) while循环语句
(2) do-while循环语句
(3) for循环语句
流程图如下:
循环结构
二 分支结构
1. if语句实现分支控制
一般形式(第一种形式):表达如果表达式为真,执行语句块1,否则不执行。
If(表达式)
{
语句块1;
}
后续语句;
原理:
先计算小括号中的表达式的值
真(1)
会执行大括号中的语句
假(0)
不会执行大括号中的语句
例一:猜数字游戏,输入一个数字,判断是不是5?如果是5打印“恭喜你”,如果不是5打印“很可惜”。
代码如下:
#include <stdio.h>
<pre name="code" class="cpp"> int main(int argc, const char * argv[]) {
//先定义变量
int num=0;
//提示用户输入一个数
printf("请输入一个数字:\n");
//接收用户输入的数
scanf("%d",&num);
//判断这个数是否等于5
if (num == 5) {
printf("恭喜你!\n");
}
//如果等于5 提示 恭喜你
printf("num =%d\n",num);
//如果不等于 5 提示很可惜
if (num != 5) {
printf("很可惜!\n");
}
return 0;
}
2. if…else…语句及嵌套
格式一(无嵌套):
if ... else .... 的分支结构
if(表达式){
语句块1;
//如果表达式为真,会执行此处的代码
}else{
//如果表达式为假了,会执行此处的代码
语句块2;
}
格式二(嵌套):
if ... else .... 的分支结构
if(表达式){
语句块1;
//如果表达式为真,会执行此处的代码
}else{
//如果表达式为假了,会执行此处的代码
语句块2;
}
例一的改进:
void test(){
int num=0; //先定义变量
printf("请输入一个数字:\n"); //提示用户输入一个数
scanf("%d",&num); //接收用户输入的数
//判断这个数是否等于5
// num == 5 为假可能是大于5,也可能是小于5
if (num == 5) {
printf("恭喜你!\n"); //如果等于了5,提示恭喜你
}else{
printf("很可惜!\n"); //否则提示很可惜
}
}
int main(int argc, const char * argv[]) {
//先定义变量
int num=0;
//提示用户输入一个数
printf("请输入一个数字:\n");
//接收用户输入的数
scanf("%d",&num);
//判断这个数是否等于5
// num == 5 为假可能是大于5,也可能是小于5
if (num == 5) {
printf("恭喜你\n");
}else{
//再判断,如果这个数大于5 提示大于5
if (num > 5) {
printf("大于5了\n");
}else{
//否则提示 小于5
printf("小于5了\n");
}
}
return 0;
}
例二:输入一个属于0-100的成绩,按0-59(E),60-69(D),70-79(C),80-89(B),90-100(A) 分成几等。
条件:
分数>=0&&分数<=59 E
分数>=60&&分数<=69 D
分数>=70&&分数<=79 C
分数>=80&&分数<=89 B
分数>=90&&分数<=100 A
分数<0||分数>100 不合法
代码如下:
#include <stdio.h>
int main(int argc, const char * argv[]) {
//定义变量,保存用户输入的分数
int score=0;
//提示用户输入一个分数
printf("请输入一个分数:\n");
//接收分数
scanf("%d",&score);
//校验分数是否合法(score<0||score>100)
if (score<0 || score > 100) {
printf("分数不合法!\n");
}else{
//当分数合法以后,再判断等级
if (score<=59) { //0-59 想反 60-100
printf("E\n");
}elseif(score<=69){ //60-69 70-100
printf("D\n");
}else if (score<=79){//70-79 80-100
//C
printf("C\n");
}else if(score<=89){//80-89 90-100
//B
printf("B\n");
}else{ //90-100
printf("A\n");
}
}
return 0;
}
3. Switch语句
格式:
switch(表达式){
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
case 常量表达式3: 语句3;
case 常量表达式4: 语句4;
case 常量表达式5: 语句5;
case 常量表达式6: 语句6;
default:
printf("其他");
}
例三:接受用户输入,控制台打印菜名
代码如下:
#include <stdio.h>
int main(int argc, const char * argv[]) {
//提示用户点菜,1-7
printf("本店开张,请点菜,请输入序号1-7\n");
//定义变量,接收用户输入的内容
int no;
//接收用户输入的内容
scanf("%d",&no);
if (no<1 || no > 7) {
printf("本店厨师还在写代码,还没时间更新菜谱\n");
return 0;
}
//判断(switch)
// 1 2 3 4 5
switch(no){
case 1: printf("玉米炒葡萄\n");
case 2: printf("月饼炒辣椒\n");
case 3: printf("爆炒妙脆角\n");
case 4: printf("番茄炒卤蛋\n");
case 5: printf("南瓜炒猪肝\n");
case 6: printf("苹果炒西瓜\n");
case 7: printf("天地无极\n");
}
return 0;
}
当输入结果4的时候,结果如下:
本店开张,请点菜,请输入序号1-7
4
番茄炒卤蛋
南瓜炒猪肝
苹果炒西瓜
天地无极
很明显不是我们想要的结果,那么问题出在哪里呢?首先我们了解一个概念:case穿透
某个case语句执行完成后,并没有结束,而直接向下执行其他的case语句这种现象就称之为case穿透
如何防止case穿透?
我们需要在每一个case语句结束之后,加上一句话:break; break 作用是结束switch语句。
例四:switch语句与if语句混合使用案例:实现简单的计算器
代码如下:
#include <stdio.h>
int main(int argc, const char * argv[]) {
//定义变量保存用户输入的两个值 运算结果 输入的符号
int num1,num2,op;
float result=0.0f;
//提示用户输入一个数
printf("请输入第一个数:\n");
//接收用户输入的第一个数
scanf("%d",&num1);
//提示输入运算符,然后在接收
printf("请选择运算符:0.+ 1.- 2.* 3./\n");
//提示输入运算符,然后在接收
scanf("%d",&op);
if (op<0 || op >3) {
printf("运算符不合法\n");
return 0;
}
//提示输入另外一个数,然后再接收
printf("请输入另外一个数:\n");
//接收用户输入的第一个数
scanf("%d",&num2);
//开始计算
//判断符号,进行计算
switch (op) {
case 0:
result = num1+num2;
break;
case 1:
result = num1-num2;
break;
case 2:
result = num1*num2;
break;
case 3:
result =num1/(float)num2;
}
printf("%d 和 %d运算的结果%.2f\n",num1,num2,result);
return 0;
}
三 循环结构
循环结构是程序中一种很重要的结构,其特点是,在给定条件成立是,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序称为循环体。循环结构简单来说就是:循环一次又一次的执行相同的代码块。
1. While循环
格式:
while(表达式) {
语句块;
}
例五 计算1+2+3+.....+100 的和
代码如下:
void test2(){
//计算1+2+3+.....+100 的和
//定义一个变量,存储当期执行的次数
int i=1,sum=0;
int n=0;
//假设从键盘上输入一个数,计算1+2+3+....+n 的和
printf("请输入一个数字:\n");
//从键盘上接受一个数
scanf("%d",&n);
while (i<=n) {
//用sum的值+i的值
sum = sum+i; //i = 1 sum = 1
//0+1, (0+1)+2
//让循环条件为假的控制
// i=i+1;
i++;
}
printf("1+2+3+....+%d=%d\n",n,sum);
}
int main(int argc, const char * argv[]) {
test2();
return 0;
}
使用循环的过程中一定要注意防止死循环的出现。
2. do-while循环
语法格式:
do{
//循环体
}while(条件);
注意点: do-while语句之后要有分号结束
例六 //1+2+3+....+100
代码如下:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int i=1,sum=0;
do{
//累加: 在上一次结果之上再加上某一个值
sum+=i;
i++;
}while (i<=100);
printf("sum =%d\n",sum);
return 0;
}
关于while和do while对比
1)当循环控制条件第一次判断不为假的时候while和 dowhile循环体执行的次数相同;
2)当循环控制条件第一次判断为假的时候while循环的循环体执行 0次,do while执行1次;
3. For循环
for循环使用的频率是比较高的,接下来我们就用一个实际例子来对for循环做详细介绍。
用for循环实现打印 1000次我爱你
构成循环有三个条件
1)控制条件 i<1000
2)循环体 printf("第%d次说:我爱你!\n",i+1);
3) 能够让控制条件为假的操作 i++
注意:
1、初始化语句只会被执行1次
2、当条件不满足的时候,循环就结束
代码如下:
for(int i=0;i<1000;i++){
printf("第%d次说:我爱你!\n",i+1);
}
如果控制条件没有定义的话,就有可能构成死循环,部分代码块如下:
//for语句的死循环
for(;;){
printf("班长喜欢凤姐!\n");
}
printf("\n");
例七 for循环的嵌套使用。打印以下图形
*
***
*****
*******
*********
***********
代码如下:
#include <stdio.h>
int main(int argc, const char *argv[]) {
//控制行数
for (int i=1; i<=6; i++) {
//控制空白
for (int j=0; j<=6-i; j++) {
printf(" ");
}
//控制 *
for (int k=0; k<2*i-1; k++) {
printf("*");
}
//打印回车
printf("\n");
}
return 0;
}
4. break和continue的区别
首先来看一个例子,根据这个例子找出break和continue的区别所在。
例八 把100~200之间的不能被3整除的数输出
#include <stdio.h>
int main(int argc, constchar * argv[]) {
//把100~200之间的不能被3整除的数输出
// i%3!=0
// i%3==0 continue;
for (int i=100; i<=200; i++) {
if (i%3==0) continue;
printf("%d\t",i);
}
printf("\n");
return 0;
}
运行结果为:
100 101 103 104 106 107 109 110 112 113
115 116 118 119 121 122 124 125 127 128
130 131 133 134 136 137 139 140 142 143
145 146 148 149 151 152 154 155 157 158
160 161 163 164 166 167 169 170 172 173
175 176 178 179 181 182 184 185 187 188
190 191 193 194 196 197 199 200
如果将例题中的continue换成break,那么运行结果为:
100 101
由此可见break和continue的区别是:break用于跳出当前的循环(结束当前的循环),continue 作用,结束本次循环的剩余的语句,继续下一次循环。