C语言循环控制结构

1.循环控制结构与循环语句
(1)当型循环。
参考文档

Created with Raphaël 2.2.0 开始 P A 结束 yes no

当条件P成立时,反复执行A操作,直至条件P不成立时循环结束。
(2)直到型循环
参考文档

Created with Raphaël 2.2.0 开始 A P 结束 yes no

先执行A操作,再判断P是否成立,若条件P成立(为真),则反复执行A操作,直达P不成立。
2.三种常见的循环语句
1.while语句
当型循环
while (循环语句)
{
语句序列
}
2.do while 语句
直到型循环
do
{
语句序列
}while(循环语句);
先执行一次循环体,然后判断是否继续。
3.for语句
for(初始化表达式;循环控制表达式;增值表达式)
{
语句序列
}
等价于
while(循环控制表达式)
{
语句序列
增值表达式;
}
3.常见循环体的应用
(1)计数循环
累加、累乘
(2)嵌套循环(Nestes Loop)
循环体里面包含着另外一个循环。
嵌套循环时,先由外层循环进入内层循环,并在内层循环终止之后接着执行外层循环,再由外层循环进入内层循环之中,当外层循环全部终止时,程序才结束。
编写累加求和程序的关键在于寻找累加项的规律。通常,累加项比较复杂或者前后项无关时,需要单独计算每个累加项。而当累加项前后之间有关系时,则可以根据累加项的前后项相互推算。
(3)条件控制的循环
猜数游戏。

#include
#include
#include//将函数time()所需要的头文件time.h包含到程序中
int main()
{
     
    int magic;
    int guess;
    int ret;
    char reply;
    int counter = 0;
    srand(time(NULL)); //为函数rand()设置随机数种子
    magic = rand()  % 100 +1;
    do{
     
    do{
     
        printf("Please guess a magic number:");
        ret = scanf("%d",&guess);
        while(ret != 1)
        {
     
            while(getchar() != '\n');//清除缓存区里的非法字符,getchar返回值为int型,如果不是结束符,就向下一个位置读取,直达清理完缓冲区
            printf("Please guess a magic number:");
            ret = scanf("%d",&guess);
        }
        counter++;
        if(guess > magic)
        printf("WRONG! Too high!\n");
        else if(guess < magic)
        printf("WRONG! Too low!\n");
        else
        printf("RIGHT!\n");
        }while(guess != magic && counter<=10);
         printf("counter=%d\n",counter);
        printf("Do you want to continue(Y/N)");
        scanf(" %c",&reply);

    }while(reply = 'Y');
        return 0;
}

4.流程的转移控制
(1) goto 语句
goto语句为无条件转向语句,它既可以向下跳转也可以向上跳转。一般形式为:
goto 语句标号;
通常与if合并使用,就比如
if(表达式) goto 语句标号;
说实话,尽量不用goto语句
(2)break 语句
break 除了退出switch语句之外,还可以退出while,do-while和for语句的循环体。当遇到break时,将立即终止循环。一般形式为:
while(表达式1)
{
if(表达式2)
break;
}
(3)continue语句
continue与break都是对循环内部的控制,只是二者控制效果不一样。break是直接跳出循环体,continue是直接跳过continue之后尚未完成的语句,进行下一次循环。
5.穷举法编程实例
韩信点兵。
6.结构化程序设计的核心思想
基本思想归纳下来为3个要点:
(1)采用顺序、选择和循环三种基本结构作为程序设计的基本单元。只有一个出入口,无不可达语句,无死循环。
(2)尽量不适用goto语句。
(3)逐步向下(Top-down),逐步求精(Stepwise refinement)
7.常用的程序调试与排错方法
按照Brian W. Kernihan 和 Rob Pike 的观点,除为了取得推栈轨迹和一两个变量的值之外,尽量不要排错系统,因为人们很容易再复杂数据结构和控制流的细节中迷失方向,有时以单步运行遍历程序的方式还不如努力思考,并辅之以再关键位置增设打印语句和测试代码,后者的效率更高。
使用调试工具,盲目地东翻西找不可能有效率,毕竟任何工具都不可能代替我们自己的思考。
程序的排错第一步就是找出错误的根源,然后才能对症下药。排错是一种技艺,就像解题或者侦破一个杀人案,不要忽视程序运行的错误结果,他常常会提供许多线索。
(1)缩减输入数据,设法找到导致失败的最小输入。
(2)采用注释的办法切掉一些代码,然后减少代码有关区域,再调试。
(3)采用增量测试(Incremental Testing)
8.类型溢出
C语言提供的类型都有取值范围。当赋值超过这个值的时候,就会产生数据溢出,得到错误的结果。

你可能感兴趣的:(c语言)