zoukankan      html  css  js  c++  java
  • C语言博客作业02循环结构 Li

    这个作业属于哪个班级 C语言--网络2011/2012
    这个作业的地址 C博客作业00--循环结构
    这个作业的目标 学习循环结构内容,包括for循环、while循环、循环嵌套
    姓名 李兴果

    0.展示PTA总分

    1.本章学习总结


    1.1 for循环语法

    for(表达式1;表达式2;表达式3)
    {
    执行代码块
    }
    

    执行过程:
    第一步:执行表达式1,变量做初始化;

    第二步:判断表达式2,若值为真,则执行for循环体中执行代码块,然后向下执行;若其值为假,则结束循环;

    第三步:执行表达式3;

    第四步:执行for循环中执行代码块后执行第二步;

    第五步:循环结束,继续向下执行。
    注意:for中分号一定要写
    代码展示:

    /*体验一下for循环,实现一个10以内的数之和的小程序。
    运行结果为: 10以内数的和为:55  */
    #include <stdio.h>
    int main()
    {
        // 定义变量sum, num
        int sum, num;
        sum = 0;
        for (num = 0; num <= 10; num++) //for循环条件与num的变化值
        {
            sum += num; 
        }
        printf("1%d", sum);
        return 0;
    }
    

    1.2 while、do while循环语法

    while(表达式)
    {
    代码块
    }
    

    注意:
    1、while中表达式一般是关系表达或逻辑表达式,当表达式的值为假时不执行循环体,反之则循环体一直执行。

    2、在循环体中要改变循环变量的值,否则会出现死循环。

    3、循环体如果包括有一个以上的语句,则必须用{}括起来,组成复合语句。
    代码展示:

    /*用while循环实现100以内所有整数之和。
    运行结果为: 100以内所有整数之和为:5050*/
    #include <stdio.h>
    int main()
    {
        int i, sum = 0;
        i = 1;
        while (i <= 100)  
        {
            sum = sum + i++;
        }
        printf("%d\n", sum);
        return 0;
    }
    

    1.3 跳出循环相关语句break\continue

    break:中断循环
    注意:
    1、break不能用在单独的if-else语句中,需要在循环中使用。

    2、在多层循环中,一个break语句只跳出当前循环
    代码展示:

    /*找出0-50之间的所有素数,所谓素数就是只能被1和它本身整除的数字,比如:7,13,23等。*/
    #include <stdio.h>
    int main()
    {
        int m, n;
        for(m=2; m<=50; m++)
        {
    		for(n=2; n<m; n++)
            {
                if(m%n==0)
                break;
    		}	
            if(m == n) 
                printf("%d  ", m);
    	}
    	return 0;    
    }
    

    countinue语句:

    1.continue语句的作用是结束本次循环开始执行下一次循环。
    1.break语句与continue语句的区别是:
    break是跳出当前整个循环,continue结束本次循环开始下一次循环。
    代码展示:

    
    /*计算1到20之间不能被3整除的数字之和。
    运算结果为: sum=147 */
    #include <stdio.h>
    int main()
    {
        int i, sum;
        for(i=1, sum=0; i<=20; i++)
        {
            if( i%3==0   )    //不能被3整除这个条件如何写呢?
            {
                continue;          //应该用哪个循环结束语句呢?
            }                  
            sum += i;
        }
        printf("sum=%d\n", sum);
        return 0;    
    }
    

    while、do-while和for三种循环在具体的使用上是有区别的:

    1.在知道循环次数的情况下更适合使用for循环;

    2.在不知道循环次数的情况下适合使用while或者do-while循环,如果有可能一次都不循环应考虑使用while循环,如果至少循环一次应考虑使用do-while循环。

    3.while,do-while和for循环之间是可以相互转换的.
    代码展示:

    /*使用循环计算1-2+3-4+5-6+…-100的值
    运行结果为: sum=-50 */
    #include <stdio.h>
    int main()
    {
       int sum = 0;  //定义计算结果变量sum
        int i = 1;    //定义循环数字变量i
        int flag = 1; //定义符号状态变量flag
        
        //使用while循环
        while(i<=100)
        {
            //sum=sum+flag*i;
            //flag=-flag;
            i++;
            
        }
    
        i = 1;  //重新初始化变量i
        
        //do-while循环
        do{
            //sum=sum+flag*i;
           // flag=-flag;
            i++;
            
        }while(i<=100);
    
        i = 1;  //重新初始化变量i
        
        //使用for循环
        for(i=1;i<=100;i++)
        {
            sum=sum+flag*i;
            flag=-flag;
            i++;
        }  
        printf("sum=%d\n",sum); 
        
        return 0;    
    }
    

    1.4 循环嵌套

    注:一个父循环可以有多个子循环
    多重循环中,外层循环为父循环,内层循环为子循环,父循环一次,子循环需要全部执行完,直到跳出循环。父循环再进入下一次,子循环继续执行
    代码展示:

    /*使用双重循环实现输出正三角形
       *
      ***
     *****
    *******
    */
    #include <stdio.h>
    int main()
    {
        int i, j, k;
        for(i=1; i<5; i++)
        {
            for(j=i;j<5;j++)  
            {
                printf(" ");    //输出空格
            }
            for(k=0;k<2*i-1;k++) 
            {
                printf("*");   //每行输出的*号
            }
            printf("\n");     //每次循环换行
        }
        return 0;
    }
    

    学习体会:

    循环这一章节的语法运用,大大解决了很多循环重复做的问题,使得代码运行更快更准。
    循环的语法简单易懂,但在难度较高的题目上自己就可能没有思维去做,需要训练代码思维,简单的题目会做,一稍微就卡死了(呜呜呜)
    在循环语法中一些括号分号的小细节也特别的重要,有时候容易粗心而导致错误
    有时候的嵌套循环在运行时凭个人肉眼也看不出它的运行方式,需要个人去单步调试理解

    2.编程技巧总结

    各种数列求和问题

    (1)scanf吸收换行符
    scanf(" %c",&c); //%c前面加空格,过滤回车
    scanf("%d\n",&n); //使用\n过滤回车
    getchar()来读取一次回车符号,每次接受一个字符,多余字符放在缓冲区,等待下一次调用getchar接收
    fflush(stdin)的函数,可以用来清空缓冲区
    (2)判断素数条件:
    除了 1 和它本身以外,不能被任何整数整除的数
    思路1) :把 m 被 2 ~ m/2 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数
    思路2):m需被 2 ~ 根号m 之间的每一个整数去除,如果 m 不能被 2 ~ 根号m 间任一整数整除,m 是素数
    思路3):m被2~m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数
    范围:
    [2,m-1]
    [2,m/2]
    [2,根号m]
    引入flag作为素数标志
    flag=1
    若循环满足条件,flag=0
    结束后根据flag状态判断
    (3)阶乘累加
    求i的阶乘直接调用fact(i)
    即:sum=sum+fact(i)
    计算过程中阶乘值与累加和非常大相关变量和函数类型都定义为double

    • 置item初值为1,保证每次阶乘都从1开始连乘

    字符如何转数字、数字逆序问题等

    (1)字符转数字:

    • 把数字9转换成字符,然后输出字符‘9’
      可以使用强制类型转换
    int a=9;
    
    char b;
    
    b=(char)a;  
    
    printf("%c",b);
    

    输出的结果就是9。
    在要转换的变量面前加括号,括号里面填要转换的字符
    比如输入数字字符ch='8'输出只要ch=ch- '0' printf(“%d”,ch)输出就是数字8了
    (2)大写字母转小写字母:
    ch=ch-'a'+'A'

    注:字符和数字在内存里都是以ASCII码形式存储的。
    减去'0',就是减去字符'0'的ASCII码,字符'0'的ASCII码是30,所以减去'0'也就是减去30,然后就得到字符对应的数字了。

    * 二进制转十进制:

    sum = sum * 2 + (ch - '0')

    图形打印问题

    1.等腰三角形打印



    (1)应先着手分析,查找规律
    行号 空格 星号
    1  0  5
    2 1 3
    3 2  1

    行数:n=(输入数字 + 1)/2
    空格与行数的关系:空格数=行数-1
    星号:行数*2-1

    四则运算

    #include<stdio.h>
    int main()
    {
        int x, y, z;
        char c;
        scanf("%d%c%d", &x, &c,&y);
        switch (c)
        {
        case '+':
            z = x + y;
            break;
        case '-':
            z = x - y;
            break;
        case '*':
            z = x * y;
            break;
        case '/':
            z = x / y;
            break;
        default:
            printf("erro!");
            break;
        }
        printf("%d", z);
        return 0;
    }
    

    求成绩最高分初值

    max初值:
    1.输入的第一个数
    2.比输入数都小的数
    min的初值:
    1.输入的第一个数
    2.比输入数都大的数

    求平均值:

    考虑除数为0情况
    if(num!=0)
    avg=total/num;
    else avg=0;

    逆序问题:

    num=num*10+新的个数

    while(n != 0)
          {
           count= n%10; //得到最小位
    
           printf("%d\n",count);//输出最小位
    
                n /=10;//丢弃最小位
          }
    

    x%10,分离一位
    x=x/10,为下一次分离做准备

    3.PTA实验作业

    3.1 数列求和问题

    3.1.1 流程图或伪代码介绍思路

    int main()
    {
    int n;
    double sum = 0;//定义变量sum为double型,题目要求保留小数位
    输入一个正整数n;
    for (定义double型i=1; i 小于等于 n; i自增1)
    {
    sum += i / (2 * i - 1) * pow(-1, i + 1);/前面是分数的函数,后面判断符号,奇数与偶数/
    }
    printf("保留三位小数", sum);
    return 0;
    }

    3.1.2 代码截图

    3.1.3 PTA提交列表及说明

    • 没有判断好正负号问题

    3.2 图形打印问题


    3.2.1 数据处理

    • 定义两个变量i,j;
    • 第一个for (i = 1;i < 7;i++),控制行数,当循环结束时则换行,换到7为止
    • 分i大于3和i小于3的情况
      3.2.2 代码截图

    3.2.3 PTA提交列表及说明

    • 没有分类好情况,条件判断错误
    • 输出格式不符合题目要求

    3.3 自选一题,介绍printf调试如何检查错误

    3.3.1 单步调试截图

    3.3.2 代码截图

    3.3.3 PTA提交列表及说明

    • 在输出时候格式判断错误
  • 相关阅读:
    PHPsession实现用户登陆功能
    asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现
    OpenSSL 下载和私钥证书、CERTIFICATE证书生成
    Java byte[] 转C# byte[]
    如何在Etherscan.io 部署ETH以太坊智能合约 如何在15分钟内创建你的加密货币
    JavaScript 关于金额、数字验证的正则表达式
    web api .net C# mvc API返回XML文档的解析并取值
    C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密
    C#常用的图片处理方法-图片剪切、图片压缩、多图合并代码
    BitMap 图片格式与Base64Image格式互转方法
  • 原文地址:https://www.cnblogs.com/lixinggio/p/13970771.html
Copyright © 2011-2022 走看看