生活中我们会面临 各种各样的选择,用计算机解决问题的过程也是如此,需要进行判断和选择的情况是很多的。
目录
(一)判断:
? ? ? ? ? ?if语句:
1. if语句的三种形式:
2. if语句---单分支语句:
3. if...else语句---双分支结构?:
4. if...else if...else语句---多分支结构:?
5. if语句的嵌套:?
switch语句:
1. C语言中的switch语句:
2. switch语句的一般形式:
3. 执行流程:
4. 在使用switch语句时应注意以下几点:
5.实例:
6.嵌套switch语句:
(二)循环
? ? ? ? ? ?while循环:
?do...while循环:
?while与do...while语句的比较:
1. while语句:
2. do...while语句:?
3. 比较:
?for循环:
?break语句:
?continue语句:
?几种循环的比较:
?循环的嵌套:
(一)判断:
? ? ? ? ? ?if语句:
1. if语句的三种形式:
形式 | 结构 | if语句 | 单分支结构 | if...else语句 | 双分支结构 | if...else if...else语句 | 多分支结构 |
2. if语句---单分支语句:
if(表达式)
??{
?????语句块
?}
/*如果表达式的值为真,则执行语句块,如果不为真,则跳过语句块。*/
#include <stdio.h>
int main()
/*int main有返回值,int main返回int类型的数据*/
int a;
/*定义一个整数变量a*/
scanf("%d",&a);
/*&是取地址,scanf读取变量的时候,参数需要的是变量的实际内存地址,%d是占位符,占的就是a的位*/
if(a>0)
{
printf("%d是正数.\n",a);
/*"\n"是转义字符,表示换行*/
}
}
3. if...else语句---双分支结构?:
if(表达式)
{
? ?语句块1
}
else
{
? ?语句块2
}
/*如果表达式的值为真,则执行语句块1,如果不为真,则跳过语句块1,执行语句块2。*/
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
int a = 100;
/* 检查布尔条件 */
if( a < 20 )
{
/* 如果条件为真,则输出下面的语句 */
printf("a 小于 20\n" );
}
else
{
/* 如果条件为假,则输出下面的语句 */
printf("a 大于 20\n" );
}
printf("a 的值是 %d\n", a);
return 0;
}
4. if...else if...else语句---多分支结构:?
- 用于对多个条件进行判断,从而进行多种不同的处理。
- 语法格式:
if(表达式1)? {? 语句块1? }
else if(表达式2){? 语句块2? }
else if(表达式3){? 语句块3? }
...
else if(表达式n)? {? 语句块3? }
else? {? 语句块m? }
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
int a = 100;
/* 检查布尔条件 */
if( a == 10 )
{
/* 如果 if 条件为真,则输出下面的语句 */
printf("a 的值是 10\n" );
}
else if( a == 20 )
{
/* 如果 else if 条件为真,则输出下面的语句 */
printf("a 的值是 20\n" );
}
else if( a == 30 )
{
/* 如果 else if 条件为真,则输出下面的语句 */
printf("a 的值是 30\n" );
}
else
{
/* 如果上面条件都不为真,则输出下面的语句 */
printf("没有匹配的值\n" );
}
printf("a 的准确值是 %d\n", a );
return 0;
}
5. if语句的嵌套:?
- if语句的嵌套是指在if语句中又包含一个或多个if语句。
- 临近原则:else和if成对出现,并且总是与最近的未配对的if配对。
- 如果使用嵌套语句的话,在if后面使用{ }将要执行的语句括起来,避免代码程序混乱。
- 在if语句中嵌入if..else语句
? ? ? ?语法格式:
if(表达式1) { ?? ?if(表达式2) 语句1 ?? ?[else 语句2]? }?
? ? ? ? a)语法格式:
if(表达式1) { ?? ?if(表达式2) 语句1 ?? ?[else 语句2]? }? else 语句3?
? ? ? ?b)实例:
#include <stdio.h>
int main()
{
int x,y;
printf("please input x:");
scanf("%d",&x);
if(x!=0){
if(x<0)
y=-1;
else
y=1;
}
else
y=0;
printf("x=%d,y=%d\n",x,y);
return 0;
}
? ? ? ?a)语法格式:
if(表达式1) {语句1 }? else? { ?? ?if(表达式2) 语句2? ?? ?[else 语句3]? }?
? ? ? b)实例:?
#include <stdio.h>
int main()
{
int x,y;
printf("please input x:");
scanf("%d",&x);
if(x<0)
y=-1;
else
if(x==0) y=0;
else y=1;
printf("x=%d,y=%d\n",x,y);
return 0;
}
- ?在if子句和else子句中分别嵌入if...else语句
? ? ? ? ?语法格式:
if(表达式1)? { ?? ?if(表达式2) 语句1? ?? ?[else 语句2]? }? else { ?? ?if(表达式3) 语句3 ?? ?[else 语句4]? ?}
switch语句:
1. C语言中的switch语句:
- 在实际问题中常常需要用到多分支的选择,例如:在学生成绩分类中分为:优秀,良好,中等,及格。又例如在人口统计分类中分为:老,中,青,少,儿童。
- 当问题分支较多时,使用if语句来实现将会使程序冗长且可读性低。
- switch语句是多分支条件判断语句,它能够根据表达式的值从多个分支中选择一个执行的分支。
2. switch语句的一般形式:
switch(表达式) { ?? ?case 常量表达式1: 语句块1;break; ?? ?case 常量表达式2: 语句块2;break; ?? ?...... ?? ?case 常量表达式n: 语句块n;break; ?? ?default: 语句块n+1? ?}?
3. 执行流程:
- 首先计算表达式的值?
- 与各个case后的常量表达式的值比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。
- 如表达式的值与所有case后常量表达式均不相同,则执行default后的语句。
4. 在使用switch语句时应注意以下几点:
- 表达式的值为整数,字符,枚举类型。
- 常量表达式的值必须互不相同,否则会出现分支矛盾的现象。
- case后面的常量表达式只起标号作用,而不起条件判断作用,即“只是开始执行处的入口标号“。一般情况下需用break语句跳出switch语句。
- 语句块可以是一条语句,或复合语句,可以不用花括号{}。
- 各个case和default出现的先后次序,并不影响执行结果,习惯上将default子句放在switch的末尾。
- 多个case标号可共用一组执行语句。
switch(表达式) { ?? ?case 常量表达式1:? ?? ?case 常量表达式2:? ?? ?case 常量表达式3: 语句1;break; ?? ?case 常量表达式4: 语句2;break; ?? ?......
5.实例:
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
char grade = 'B';
switch(grade)
{
case 'A' :
printf("很棒!\n" );
break;
case 'B' :
case 'C' :
printf("做得好\n" );
break;
case 'D' :
printf("您通过了\n" );
break;
case 'F' :
printf("最好再试一下\n" );
break;
default :
printf("无效的成绩\n" );
}
printf("您的成绩是 %c\n", grade );
return 0;
}
6.嵌套switch语句:
- 即可以在一个switch语句内使用另一个switch语句。即使内部和外部switch的case常量包含共同的值,也没有矛盾。
- 语法格式:
switch(表达式1) {
case 常量表达式1:
语句1;
switch(表达式2) {
case 常量表达式2:
语句2;
break;
case 常量表达式3:
}
break;
case 常量表达式4:
}
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
switch(a) {
case 100:
printf("这是外部 switch 的一部分\n");
switch(b) {
case 200:
printf("这是内部 switch 的一部分\n");
}
}
printf("a 的准确值是 %d\n", a );
printf("b 的准确值是 %d\n", b );
return 0;
}
(二)循环
? ? ? ? ? ?while循环:
while(表达式)
{
? ? ? 语句
}
/*“语句”就是循环体。循环体可以是一个简单的语句,可以是复合语句(用花括号括起来的若干语句)。表达式的值为“真”时,就执行循环体语句;为“假”时,就不执行循环语句,退出循环。*/
?do...while循环:
do
{
? ? 语句
}while(表达式);
/*do...while语句的特点是,先无条件地执行循环体,然后判断循环条件是否成立。*/
- 实例:用do...while语句循环求1+2+3+...+100
#include <stdio.h>
int main()
{
int i=1,sum=0;
do
{
sum=sum+i;
i++;
}while(i<=100);
printf("sum=%d\n",sum);
return 0;
}
?while与do...while语句的比较:
1. while语句:
#include <stdio.h>
int main()
{
int i,sum=0;
printf("please enter i,i=?");
while(i<=10)
{
sum=sum+i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
2. do...while语句:?
#include <stdio.h>
int main()
{
int i,sum=0;
printf("please enter i,i=?");
scanf("%d",&i);
do
{
sum=sum+i;
i++;
}while(i<=10);
printf("sum=%d\n",sum);
return 0;
}
3. 比较:
? ? 当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同;否则,二者结果不相同(指二者具有相同的循环体的情况)。
?for循环:
for(表达式1;表达式2;表达式3)
? ? ?语句
/*表达式1只求解了一次。表达式2是循环的条件,它决定了是否重复执行循环体语句。如果重复执行的话,不仅语句重复执行,而且表达式3也重复执行。如果表达式2为真,那么就会重复执行表达式3和语句,直到表达式2为假,才退出循环。*/
#include <stdio.h>
int main()
{
int i=1;sum=0;
for(i=1;i<=100;i++)
sum=sum+i; //实现迭代
printf("%d\n",sum);
return 0;
}
? ? ? ? a)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意,省略表达式1时,其后的分号不能省略。如:
i=1;
for(? ;i<=100;i++)
sum=sum+i;
? ? ? ?b)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。
for(i=1;? ;i++)
? ? ?sum=sum+i;?
? ? ? ?c)表达式3也可以省略,但应另外设法保证循环正常结束。如:
for(i=1;i<=100;? )
{
? ?sum=sum+i;
? ?i++;
}?
? ? ? ?d)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。在这种情况下,完全等同于while语句。可见for语句比while语句功能强,除了可以给出循环条件外,还可以赋初值,使循环变量自动增值等。如:
i=1;
for(? ;i<=100;? )
{
? ? ?sum=sum+i;
? ? ?i++;
}
? ? ? ? e)3个表达式都可省略,即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体。例如:
for(? ;? ;? ;);?
? ? ? ? f)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:
for(i=1,sum=0;i<=100;i++)
? ? ?sum=sum+i;?
? ? ? ?g)表达式2?一般是关系表达式(如i<=100)或逻辑表达式(如a<b&&x<y),但也可以是整数表达式或字符表达式,只要其值为非0,就执行循环体。如:
for(x=10;x;x--)
? ? ?sum=sum+x;
?break语句:
- 作用:break语句可以使流程跳出switch结构,还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。
- 注意:break语句只能用于循环语句和switch语句之中,而不能单独使用。
- 语法格式:
break;
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
int a = 10;
/* while 循环执行 */
while( a < 20 )
{
printf("a 的值: %d\n", a);
a++;
if( a > 15)
{
/* 使用 break 语句终止循环 */
break;
}
}
return 0;
}
?continue语句:
- 作用:结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
- continue语句只结束本次循环,而非终止整个循环。break语句结束整个循环,不再判断执行循环的条件是否成立。
- 实例:把100~200范围内不能被3整除的数输出
#include <stdio.h>
int main()
{
int n;
for(n=100;n<=200;n++)
{
if(n%3==0)
continue;
printf("%d",n);
}
printf("\n");
return 0;
}
?几种循环的比较:
- 3种循环都可以用来处理同一问题,一般情况下它们可以互相代替。
- 用while和do...while循环时,循环变量初始化的操作应在while和do...while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。
- 在while和do...while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i++,或i=i+1等)。for循环可以在表达式3中包含是循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环完成的,用for循环都能实现。
- while循环,do...while循环循环和for循环都可以用break语句跳出循环,用continue语句结束本次循环。
?循环的嵌套:
- 循环的嵌套是指一个循环体内又包含另一个完整的循环结构。3种循环(while循环,do...while循环循环和for循环)可以互相嵌套。
- while循环中嵌套while循环语句的语法:
while()
{? ...
? while(...)
? {...}
? ...
}
- while循环中嵌套do...while循环语句的语法:
while(...)
{? ...
? do
? {...}while(...);
? ...
}
- do...while循环中嵌套do...while循环语句的语法:
do
{? ...
? do
? {...}while(...);
? ...
}while();
- do...while循环中嵌套for循环语句的语法:
do
{? ...
? for( ; ; )
? {...}
}while(...);
for( ; ;)
{
? for( ; ;)
? {...}
}
for( ; ;)
{? ...
? while(...)
? {...}
? ...
}
|