控制流

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:
}