第八次课-----顺序结构和选择结构
一、算法的基本结构
算法:解决问题的方法(结构)
计算从1开始加到10的结果
算法一:1+2+3+4+5+6+7+8+9+10=55
算法二:(1+10)*10/2=55
算法的三种基本结构:顺序结构、选择结构(分支结构)和循环结构。
二、顺序结构:按语句书写的先后顺序依次执行的结构。
1.复合语句:由大括号{}中的0个或多个声明和语句列表共同构成。
int main(void)
{
int a = 0;
int b = 0;
a = 5;
b = 4;
{
int a = 6;//变量声明
printf("%d\n",a);//这个a的值是6,和前面的a不是同一个
a++;//自增表达式语句
printf("%d\n",a);//函数调用语句
++b;
}
printf("%d\n", a);//这个a的值是5
printf("%d\n",b);
return 0;
}
注意:
1>复合语句不以分号;作为结束符,即最后的}后面不加分号。
2>在复合语句中可以定义变量,但仅在复合语句中有效,即作用域是{}括起来的部分。
指出下列程序的错误。
int main(void)
{
int b = 0;
b = 4;
{
int a = 6;
printf("%d\n",a);
a++;
printf("%d\n",a);
++b;
};//错误,不能加;
printf("%d\n", a);//错误,a没有定义
printf("%d\n",b);
return 0;
}
三、选择结构(分支结构):根据条件判断来选择执行哪一条语句。
选择结构的语句有:if条件语句和switch多路分支语句。
1.if语句
if(条件表达式)
语句1;
执行过程:如果条件表达式的值为真,则执行语句1,否则不执行语句1。
demo:输入a和b的值,判断并输出最大值
int main(void)
{
int a = 0;
int b = 0;
int max = 0;
printf("请依次输入a和b的值:");
scanf("%d%d",&a,&b);
max = a;
if(max < b)
max = b;
printf("max:%d\n",max);
return 0;
}
注意:if条件语句中的语句1不是只有一条语句的意思,可以是多条语句用{}括起来的复合语句。
int main(void)
{
int a = 0;
int b = 0;
int max = 0;
printf("请依次输入a和b的值:");
scanf("%d%d",&a,&b);
max = a;
if(max < b)
{
max = b;
printf("a < b \n");
}
printf("max:%d\n",max);
return 0;
}
2.if...else语句
if(条件表达式)
语句1;
else
语句2;
执行过程:如果条件表达式的值为真,则执行语句1,否则执行语句2。
demo:输入a和b的值,判断并输出最大值
int main(void)
{
int a = 0;
int b = 0;
int max = 0;
printf("请依次输入a和b的值:");
scanf("%d%d",&a,&b);
if(a < b)
max = b;
else
max = a;
printf("max:%d\n",max);
return 0;
}
3.if...else if语句
if(条件表达式1)
语句1;
else if(条件表达式2)
语句2;
else if(条件表达式3)
语句3;
....
else
语句n;
执行过程:依次判断条件表达式的值,当某个值为真时,则执行相应的语句,然后跳出整个if语句之外,继续执行后面的程序。如果所有的表达式都为假,则执行语句n,然后继续执行后面的程序。
demo:输入成绩分数,并判断该成绩属于哪个等级
int main(void)
{
int score = 0;
printf("请输入成绩:");
scanf("%d",&score);
if (score >= 0 && score <= 100)
{
if(score >= 90)
printf("A+\n");
else if(score >= 80)
printf("A\n");
else if(score >= 70)
printf("B+\n");
else if(score >= 60)
printf("B\n");
else
printf("不合格\n");
}
else
printf("请输入合法的成绩!");
return 0;
}
4.if语句嵌套:当if语句中的执行语句又是if语句时,则形成了if语句嵌套。
if(条件表达式)
if语句;
或者
if(条件表达式)
if语句;
else
if语句;
demo:修改下面的程序使程序:输入a和b的值,判断最大值是否大于100,是则输出最大值。
int main(void)
{
int a = 0;
int b = 0;
printf("请依次输入a和b的值:");
scanf("%d%d",&a,&b);
if(a < b)
if(b > 100)
printf("max:%d\n",b);
else
if(a > 100)
printf("max:%d\n",a);
return 0;
}
注意:C语言规定,else总是与它前面最近的为配对的if配对。
所以修改后应为:
int main(void)
{
int a = 0;
int b = 0;
printf("请依次输入a和b的值:");
scanf("%d%d",&a,&b);
if(a < b)
{
if(b > 100)
printf("max:%d\n",b);
}
else
{
if(a > 100)
printf("max:%d\n",a);
}
return 0;
}
demo:输入a、b、c的值,判断并输出最大值
int main(void)
{
int a = 0;
int b = 0;
int c = 0;
int max = 0;
printf("请依次输入a、b、c的值:");
scanf("%d%d%d", &a, &b,&c);//
if (a > b)
{
if (a > c)
max = a;
else
max = c;
}
else//b > a
{
if (b > c)
max = b;
else
max = c;
}
printf("max:%d\n", max);
return 0;
}
5.switch多路分支语句
switch(表达式)//1
{
case 常量表达式1:语句1(集合);
case 常量表达式2:语句2(集合);
...
case 常量表达式n:语句n(集合);
default:语句n+1;
}
执行过程:首先计算表达式的值,与常量表达式i进行比较,如果与其中一个常量表达式i的值相等,就执行其后的语句直到遇到break语句才结束switch语句,如果case后无break语句,则继续执行随后所有的case后的语句。如果没有找到与表达式的值相匹配的常量表达式,则执行default后的语句n+1。
demo:输入数字1-7,并输出显示对应的星期
int main(void)
{
int week = 0;
printf("今天星期几:");
scanf("%d", &week);//1---'1'
switch (week)//week是表达式
{
case 1:printf("今天是星期一\n"); break;
case 2:printf("今天是星期二\n"); break;
case 3:printf("今天是星期三\n"); break;
case 4:printf("今天是星期四\n"); break;
case 5:printf("今天是星期五\n"); break;
case 6:printf("今天是星期六\n"); break;
case 7:printf("今天是星期天\n"); break;
default:printf("输入数据有误!\n");
}
return 0;
}
注意:
1>switch后面括号中的表达式可以是整型、字符型和枚举型。
2>在case后的各常量表达式的值不能相同
3>在case后,允许有多个语句,可以不用 {}括起来,而整个switch结构一定要有一 对{}
4>各case和default语句的先后顺序可以改 变,不影响程序执行结果。
demo:指出以下程序的错误
int main(void)
{
float week = 0;
printf("今天星期几:");
scanf("%f", &week);
switch (week);//week不能是浮点型,
//不能有;,缺少{
case1:printf("今天是星期一\n"); break;//case 后面要空格
case 2:printf("今天是星期二\n"); break;
case 3:printf("今天是星期三\n"); break;
case 4:printf("今天是星期四\n"); break;
case 5:printf("今天是星期五\n"); break;
case 6:printf("今天是星期六\n"); break;
case 7:printf("今天是星期天\n"); break;
default:printf("输入数据有误!\n");
//缺少}
return 0;
}
6.条件运算符和条件运算表达式: (?:)
表达式1 ? 表达式2 :表达式3
求值过程:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为条件表达式的值.
demo:输入a、b的值,判断并输出最大值
int main(void)
{
int a = 0;
int b = 0;
int max = 0;
printf("请依次输入a和b的值:");
scanf("%d%d",&a,&b);
max = a>b?a:b;
printf("max:%d\n",max);
return 0;
}