• 【C语言基础】循环


    while循环

    scanf函数的返回值:scanf函数返回成功读取的项数,即在scanf(“%d%d”,&a,&b);如果a,b都能按指定格式输入,且被读取成功,则返回2,如果只有一个被读取成功,返回1,如果都没有被读取,返回值为0,如果遇到错误或者end of file,返回值为EOF。

    根据用户从键盘输入的整数进行求和:

    #include
    int main(){
    int num,stat,sum=0;
    printf("please enter number(q to end):");
    while(scanf("%d",&num)==1){
      sum=sum+num;
      printf("please enter number again(q to end):");
    }
    printf("sunm=%d\n",sum);
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    代码说明:在上述程序中,while循环的条件式stat==1,stat接受scanf的返回值,程序在每次循环完成以后,都会对num进行赋一个新值,这些新值会和sum进行求和。

    while语句

    while语句的格式:

    while(判断语句){
    执行代码
    }
    
    • 1
    • 2
    • 3

    在屏幕上打印出1~100个数字

    #include
    int main(){
    int i=1;
    while(i<=100){
      printf("%d\t",i);
      i++;
    }
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    break

    #include
    int main()
    {
        int i=1;
        while(i<=10){
            printf("%d\t",i);
            if(i==3){
                printf("progream end\n");
                break;
            }
            i++;
            }
         
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    break:在循环中的作用,循环只要遇到break就会永久停止所有的循环。

    continue

    #include 
    int main(){
    int i = 1;
    while(i<=10){
    if(i == 5){
    continue;
    }
    printf("%d\t", i);
    i++;
    }
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    continue:终止本次循环,进行下一次循环入口的判断。

    用关系运算符和表达式比较

    运算关系符:

    在while和if语句中,其中只要是条件判断为真,那么就会执行代码块里面的内容,如果不为真,就不会执行。在C语言中,一般而言,所有的非零值都视为真,只有0被视为假。关系表达式为真,求值得1;关系表达式为假,求值得0。

    在编程中,表示真或假的变量被称为布尔变量(Boolean variable),所以_Bool是C语言中布尔变量的类型名。_Bool类型的变量只能储存1(真)或0(假)。

    不确定循环和计数循环

    在创建一个重复执行固定次数的循环中涉及了3个行为:
    1.必须初始化计数器;
    2.计数器与有限的值作比较;
    3.每次循环时递增计数器。

    for循环

    语法

    for(1;2;3){
      循环语句;
    }
    
    • 1
    • 2
    • 3
    式1:初始化部分,用于初始化循环变量
    式2:条件判断部分,用于判断循环什么式结束
    式3:调整部分,用于循环的调整
    
    • 1
    • 2
    • 3

    打印1~100的数字:

    #include
    int main(){
    int i;
    for(i=1;i<=100;i++){
      printf("%d\t",i);
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    使用递减运算来设计递减计数器:

    #include
    int main()
    {
        int i;
        for(i=100;i>0;i--){
            printf("%d\t",i);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    #include
    int main(void)
    {
    int num=0;
    for(printf("Keep entering numbers!\n");num!=6;)
    scanf("%d",&num);
    printf("That's the one I want!\n");
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其他赋值运算符:+=,-=,*=,/=,%=

    运算符等价式子
    scores += 20scores = scores + 20
    dimes -= 2dimes = dimes - 2
    bunnies *= 2bunnies = bunnies * 2
    time /= 2.73time = time / 2.73
    reduce %= 3reduce = reduce % 3

    逗号运算符

    逗号运算符扩展了for循环的灵活性,以便在循环头中包含更多的表达式。

    打印一类邮件资费:在撰写本书时,邮资为首重40美分/盎司,续重20美分/盎司,可以在互联网上查看当前邮资。

    #include
    int main(void)
    {
    const int FIRST_OZ = 46;// 2013邮资
    const int NEXT_OZ = 20;// 2013邮资
    int ounces,cost;
    printf("ounces cost\n");
    for(ounces=1,cost=FIRST_OZ;ounces<=16;ounces++,cost+=NEXT_OZ){
    // ounces=1,cost=FIRST_OZ;ounces<=16;ounces++,cost+=NEXT_OZ
    // 对ounces和cost赋值运算
    // 判断ounces是否小于16
    // ounces自增,cost加上20在付给cost
    printf("%5d  $%4.2f\n",ounces,cost/100.0);
    }
    printf("**************************************\n");
    // 上述代码由while循环实现:
    ounces=1;
    cost=FIRST_OZ;
    printf("ounces cost\n");
    while(ounces<=16){
        printf("%5d  $%4.2f\n",ounces,cost/100.0);
        cost+=NEXT_OZ;
        ounces++;
    
    }
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    出口条件循环:do while

    while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。

    #include
    int main(void)
    {
    const int secret_code=13;
    int code_entered;
    do
    {
    printf("To enter the triskaidekaphobia therapy club,\n");
    printf("please enter the secret code number: ");
    scanf("%d",&code_entered);
    } while(code_entered!=secret_code);
    printf("Congratulations! You are cured!\n");
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    下面是do while循环的通用形式:

    do
    statement
    while ( expression );
    
    • 1
    • 2
    • 3

    如何选择使用哪一种循环?首先,确定是需要入口条件循环还是出口条件循环。通常,入口条件循环用得比较多,有几个原因。其一,一般原则是在执行循环之前测试条件比较好。其二,测试放在循环的开头,程序的可读性更高。另外,在许多应用中,要求在一开始不满足测试条件时就直接跳过整个循环。

    假设需要一个入口条件循环,用for循环还是while循环?这取决于个人喜好,因为二者皆可。要让for循环看起来像while循环,可以省略第1个和第3个表达式。例如:

    for ( ; test ; )
    与下面的while效果相同:
    while ( test )
    
    • 1
    • 2
    • 3

    要让while循环看起来像for循环,可以在while循环的前面初始化变量,并在while循环体中包含更新语句。例如:

    初始化;

    while ( 测试 )
    {
    其他语句
    更新语句
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    与下面的for循环效果相同:

    for ( 初始化 ;测试 ; 更新 )
    其他语句
    
    • 1
    • 2

    一般而言,当循环涉及初始化和更新变量时,用for循环比较合适,而在其他情况下用while循环更好。对于下面这种条件,用while循环就很合适:

    while (scanf("%ld", &num) == 1)
    
    • 1

    对于涉及索引计数的循环,用for循环更适合。例如:

    for (count = 1; count <= 100; count++)
    
    • 1

    嵌套循环

    嵌套循环(nested loop)指在一个循环内包含另一个循环。嵌套循环常用于按行和列显示数据,也就是说,一个循环处理一行中的所有列,另一个循环处理所有的行。

    使用函数返回值的循环实例

    #include
    double power(double n, int p); // ANSI函数原型
    int main(void)
    {
    double x,xpow;
    int exp;
    printf("Enter a number and the positive integer power");
    printf(" to which\nthe number will be raised. Enter q");
    printf(" to quit.\n");
    while(scanf("%lf%d",&x,&exp)==2)
    {
    xpow = power(x, exp);// 函数调用
    printf("%.3g to the power %d is %.5g\n",x,exp,xpow);
    printf("Enter next pair of numbers or q to quit.\n");
    }
    printf("Hope you enjoyed this power trip -- bye!\n");
    return 0;
    }
    double power(double n, int p)// 函数定义
    {
    double pow=1;
    int i;
    for(i=1;i<=p;i++)
    pow *= n;
    return pow;// 返回pow的值
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    goto语句

    例如:一次跳出两层或多层循环。
    多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

    goto语言真正适合的场景如下:

    for(...)
      for(...)
     {
        for(...)
       {
          if(disaster)
            goto error;
       }
     }
      …
    error:
    if(disaster)
        // 处理错误情况
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    编程练习

    计算 n的阶乘。

    #include
    int main(){
        int n,i,num;
        printf("请输入n的值:");
        scanf("%d",&num);
        i=1;
        n=1;
        while (i<=num)
        {
            n=n*i;
            i++;
        }
        printf("%d的阶乘%d!\n",num,n);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    计算 1!+2!+3!+……+10!

    #include
    int main(){
        int n,i;
        int sum1=1;
        int sum2=0;
        for(i=1;i<=10;i++){
            for(n=1;n<=i;n++){
                sum1=sum1*n;
                printf("sum1=%d\t",sum1);
            }
            sum2=sum2+sum1;
            printf("\n");
            printf("sum2=%d\t",sum2);        
        }
        printf("\n");
        printf("sum=%d\n",sum2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    编写一个程序

    创建一个包含26个元素的数组,并在其中储存26个小写字母。然后打印数组的所有内容。

    #include
    int main()
    {
        // A对应ascll为41,a为97
        int a;
        char zimu[25];
        for(a=0;a<=25;a++){
            zimu[a]=(char)(a+97);
        }
        for(a=0;a<=25;a++){
            printf("%c\n",zimu[a]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用嵌套循环,按下面的格式打印字符:

    $
    $$
    $$$
    $$$$
    $$$$$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #include
    int main(){
        int i,j,n;
        printf("请输入打印的层数:");
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            for(j=1;j<=i;j++){
                printf("$");
            }
            printf("\n");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用嵌套循环,按下面的格式打印字母:

    F
    FE
    FED
    FEDC
    FEDCB
    FEDCBA

    #include
    int main(){
        int i,j,n,n1;
        // A=65,a=97
        n1=1;
        printf("请输入打印的层数:");
        scanf("%d",&n);
        for(i=n;i>=0;i--){
            for(j=n-1,n1=0;j>=i;j--){
                printf("%c",j+65);
                n1=n1-1;
            }
            if(n1==0){
                continue;
            }
            printf("\n");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    使用嵌套循环,按下面的格式打印字母:

    A
    BC
    DEF
    GHIJ
    KLMNO

    #include
    int main(){
        int i,j,n,n1;
        // A=65,a=97
        n1=0;
        printf("请输入打印的层数:");
        scanf("%d",&n);
        for(i=0;i<n;i++){
            for(j=0;j<=i;j++){
                printf("%c",n1+65);
                n1=n1+1;
            }
            printf("\n");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:

    A
    ABA
    ABCBA
    ABCDCBA
    ABCDEDCBA

    #include
    int main(){
        int i,j,n,n1,n2;
        // A=65,a=97
        n1=0;
        printf("请输入打印的层数:");
        scanf("%d",&n);
        for(i=0;i<n;i++){
            for(j=0;j<=i;j++){
                printf("%c",j+65);
                n1=j+65;
                // printf("%d",n1);
            }
            for(j=0;j<i;j++){
                printf("%c",n1-j-1);
            }
            printf("\n");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    编写一个程序

    打印一个表格,每一行打印一个整数、该数的平方、该数的立方。要求用户输入表格的上下限。使用一个for循环。

    #include
    int main(){
    int i;
    int max,min;
    printf("entr max:");
    scanf("%d",&max);
    fflush(stdin);
    printf("enter min:");
    scanf("%d",&min);
    for(i=min;i<=max;i++){
    printf("原值=%d,平方=%d,立方=%d\n",i,i*i,i*i*i);
    }
    return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    编写一个程序

    把一个单词读入一个字符数组中,然后倒序打印这个单词。提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下标。

    #include
    #include
    int main(){
    int i;
    int max,min;
    char char1[40];
    printf("enter char:");
    scanf("%s",char1);
    min=strlen(char1);
    for(i=min;i>=0;i--){
    printf("%c",char1[i]);
    }
    printf("\n");
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    编写一个程序

    要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。

    #include
    int main(){
    float max,min;
    printf("entr two float number:");
    while(scanf("%f %f",&min,&max)==2){
        printf("%.2f*%.2f=%.2f\n",max,min,min*max);
        printf("entr two float number:\n");
    }
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    修改上面代码,使用一个函数返回计算的结果

    #include
    float cheng(float max,float min){
        return (max*min);
    }
    int main(){
    float max,min;
    printf("entr two float number:");
    while(scanf("%f %f",&min,&max)==2){
        printf("%.2f*%.2f=%.2f\n",max,min,cheng(max,min));
        printf("entr two float number:\n");
    }
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    编写一个程序

    要求用户输入一个上限整数和一个下限整数,计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入的上限整数小于下限整数为止。程序的运行示例如下:
    Enter lower and upper integer limits: 5 9
    The sums of the squares from 25 to 81 is 255
    Enter next set of limits: 3 25
    The sums of the squares from 9 to 625 is 5520
    Enter next set of limits: 5 5
    Done

    #include
    int main(){
        int a,max,min,sum;
        printf("Enter lower and upper integer limits:");
        while (scanf("%d %d",&min,&max)==2)
        {
            if(min>=max){
                break;
            }
            sum=0;
            a=min;
            while(a<=max){
                sum=sum+a*a;
                a++;
            }
            printf("The sums of the squares from %d to %d is %d\n",min*min,max*max,sum);
            printf("Enter lower and upper integer limits:");
        }
        printf("Done\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    C++学习之路-异常(exception)
    遍历的几种方式
    嵌入式驱动初级-字符设备驱动基础
    基于matlab的SVR回归模型
    【Andriod】adb调试安卓手机时连接真机或模拟器的3种方法,你知道么?
    结构模式匹配(Structural Pattern Matching)(一)匹配序列
    Vue3+elementplus搭建通用管理系统实例八:通用表格实现中
    网站域名被墙是什么原因?有什么解决方法?
    模拟实现vue3.x中的计算属性
    SimpleITK使用——4. 奇怪的问题
  • 原文地址:https://blog.csdn.net/qq_42355866/article/details/126044565