控制流
1.1 else-if语句:
if(表达式)
语句1;
else
语句2;
其中else部分是可选的,可有可无。该语句进行执行时首先计算表达式的值,如果结果为真,则执行 语句1,如果为假,并且该语句含有else部分,则执行语句2。
其次,if语句后面只能有一个语句,如果要使用多条语句(复合语句),必须使用{};使用大括号有 百利而无一害。当然if语句也可以有多种形式,例如
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
……
else
语句;
其中的表达式将进行一次求职值,一但表达式为真则执行相对应语句,并终止整个语句的执行。
1.2 举例说明if语句的用法
折半查找 ;
在折半查找时,首先将输入值 x与数组v的中间 元素进行比较。如果x小于中间元素的值,则在该数组 的前半部分查找;否则,在该数组的后半部分进行查找。在这两种情况下,下一步都是将X与所选部分的 中间元素进行比较。这个过程一直进行下去,直到找到指定的值或查找范围为空。
2.2 switch语句;
多路判定语句,他测试表达式是否与一些常量整数值中的某一个值匹配,并执行相应的分支动作。
switch(表达式)
{
case 常量表达式:语句序列
case 常量表达式:语句序列
……
default:语句序列
}
每一个分支都由一个或多个整数值常量或常量表达式标记,如果某个分支与表达式的值匹配,则从该 分支开始执行。如果所有的表达式都不能匹配成功,则执行default分支或者不执行任何动作。
2.2 统计各个数字,空白符及其他所有字符出现的次数;
#include <stdio.h> #include <stdlib.h> int main() { int letter = 0, digital = 0, space = 0, other = 0, i; char c; printf("请输入一些字符:");/*这里删除scanf("%c",&c); */ while ((c = getchar()) != '\n') { if (c >= '0'&&c <= '9') i = 0; //数字 else if ((c >= 'a'&&c <= 'z') || (c >= 'A'&&c <= 'Z')) i = 1; //字母 else if (c == ' ') i = 2; //空格,这里用== else if (32<c<48 || 57<c<65 || 90<c<97 || 122<c<127) i = 3; //其他字符 switch (i) { case 0:digital++; break; case 1:letter++; break; case 2:space++; break; case 3:other++; break; } } printf("数字有%d个,字母有%d个,空格有%d个,其他字符有%d个。\n", digital, letter, space, other); system("pause"); return 0; }
switch语句中,case的作用只是一个标号,因此某个分支执行结束之后程序将进入下一个分支继续执行,除非在程序中显式的跳转。使用break或return语句;break可以强制控制从while,for,do循环语句中跳出。并且在正常情况下为了防止直接进入下一个分支执行,每个分支后必须以一个break语句结束。尽量减少从一个分支直接进入下一个分支执行的用法。最后在default后加上break降低错误的可能性。
3.1 while循环与for循环;
while(表达式)
语句;
for(循环语句);
for(表达式1;表达式2;表达式3)
{
语句;
}
for循环语句中的表达式都可以省略,但是分号不能省略,可以有形式
for(;;)
{
……
};是一个无线循环语句,借助break,return语句才能结束;
3.2.1 编写atoi函数将字符串数字转换为对应的数字;
#include <stdio.h> #include <stdlib.h> int my_atoi(char s[10]) { int ret = 0; int flag = 1; char *p = s; if (*p == '-') { flag = -1; } if (*p == '+' || *p == '-') { p++; } while (*p != '\0') { if (*p <= '9' && *p >= '0' && *p !=' ') { ret = ret * 10 + *p - '0'; p++; } else p++; } return flag*ret; } int main() { char input[10]; gets(input); int ret = my_atoi(input); printf("%d\n", ret); system("pause"); return 0; }
3.2.2 打印输出9*9乘法口诀表
#include <stdio.h> int main() { int i, j; for (i = 1; i<10; i++) { for (j = 1; j <= i; j++) { printf("%d*%d=%2d ", i, j, i*j); } printf("\n"); } system("pause"); return 0; }
当然,while,for都可以进行嵌套循环,两者也可以放在一起进行嵌套循环;
4.1 do-while循环;
该循环在循环体执行一次后测试终止条件,循环体至少执行一次。
语法形式:
do
语句
while(表达式);
5.1 break语句与continue语句;
break语句课用于从switch,佛如,do-while等循环中提前退出;
continue语句与break是相关联的,continue适用于for,while,do-while语句开始下一次循环的执行。在while,do-while语句中,continue语句的执行意味着立即执行测试部分;在for语句中则意味着使控制转移到递增循环变量部分。continue只用于循环语句,不用于switch语句。
例如处理数组a中的非负元素,则跳过
for(i0;i<len;i++) { if(a[i]<0) continue; …… }
6.1 goto语句 ;
goto语句可以一次跳出2层或多层循环,这种情况下使用goto可以达到目的;例如下面的程序:
for(……) { for(……) { …… if(disaster) goto error; } error: }