zoukankan      html  css  js  c++  java
  • 第三次博客

    C语言博客作业02--循环结构

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

    0.展示PTA总分(0----2)


    1.本章学习总结(2分)

    1.1 for循环语法

    (1)格式:

    for(初值表达式;条件表达式;步长表达式) 
    {
     循环体语句;//多条语句用大括号--复合语句
    }
    

    (2)流程图:

    (3) 注意:for里面语句之间是‘;’,不要在for语句中随意加分号

    (4)for语句中初值表达式只执行一次

    (5)循环中出现的值要注意初始值

    (6)例题:计算1+2+3+···+n

    #include<stdio.h>
    int main()
    {
      int i,n,num;
      scanf("%d",&n);
      sum=0;
      for(i=1;i<=n;i++)
     {
       sum=sum+i;
       printf("%d",sum);
     }
      return 0;
    }
    

    1.2 while、do while循环语法

    1.while循环

    (1)格式:

    while(表达式)
      循环体语句;
    

    (2)流程图:

    (3)当表达式的值为‘真’时,循环执行,直到表达式的值为‘假’时,循环中止并继续执行while的下一条语句

    (4)while语句中的表达式可以是任意合法的表达式,循环体语句只能是一条语句

    (5)for语句改写成while语句:

    表达式1;
    while(表达式2)
    {
      for的循环体语句;
      表达式3;
    }
    

    (6)当无法确定输入数据个数时,需要自己设计循环条件,可以用一个特殊的数据作为正常输入数据的结束标志

    (7)例:最佳情侣身高差

    #include <stdio.h>  
    int main () 
    {  
        int n;  
        char c;  
        float h;  
        scanf("%d", &n);  
        getchar(); 
        while (n--) //当n递减到0时,判断为‘假’,循环结束
        {  
            scanf("%c %f", &c, &h);  
            getchar();  
            if (c == 'F' )   
                printf("%.2f
    ", h * 1.09);  
            else  
                printf("%.2f
    ", h / 1.09);  
        }   
        return 0;  
    }  
    
    

    2.do while循环

    (1)格式:

    do
    {  
      循环体语句;
    }while(表达式);
    

    (2)流程图:

    (3)使用do while、while、for情况

    ·如果循环次数不明确,通常用while语句或do while语句

    ·如果事先给定了循环次数,首选for语句

    ·do while循环适合于先循环、后判断循环条件的情况

    (4)无论循环条件的值如何,至少会执行一次循环体

    (5)例题:统计一个整数的位数

    #include<stdio.h>
    int main()
    {
         int count=0,number;
         printf("Enter a number:");
         scanf("%d",&number);
         if(number<0)number=-number;
         do{
              number=number/10;
              count++;
         }while(number!=0);
         printf("%d
    ",count);
         return 0;
    }
    

    1.3 跳出循环相关语句breakcontinue

    2种区别,举例说明。

    (1)break:强制循环结束,应该和if语句配合使用,即条件满足时,才执行break跳出循环

    (2)continue:跳出循环体中continue后面的语句,继续下一次循环。一般也需要与if语句配合使用。

    (3)区别:break结束循环,continue跳过后面语句继续循环。

    break还用于swictch语句,continue只能用于循环。

    (4)流程图:

    for结构中break的作用:

    for结构中continue的作用:

    (5)例题举例:

    伪代码:
    #include <stdio.h>
    int main ()
    {
      do
      {
       if(t/9)
        {
          t--;
          continue;//执行到continue,会直接跳转到表达式
         }
        K;
        P;
       }while(表达式);
     
       while(表达式1)
       {
          for (1; 2; 3)
          {
            if(表达式2)
             {
    	    A;
    	    B;
    	    continue; //执行到continue,转去执行3
    	    C;
    	    break; //若执行到break,则终止 for 循环的所有内容,转而执行E
    	 }
    	 D;
          }
          E;
          continue; //此处continue执行完,执行表达式1
          F;
          break;//若执行到此处的break,则终止 while 循环,转而执行H
          G;
       }
       H;
       return 0;
     }
    

    1.4 循环嵌套(重难点)

    (1)使用嵌套时一定要分清内外层循环的功能是什么

    (2)例:

    计算1!+...+100!

    部分代码
     item=1;
     for(i=1;i<=100;i++)
     {
       for(j=1;j<=i;j++)
        {
          item*=j;
          sum+=item;
        }
     }
    

    判断素数

    要清楚判断素数的条件(书P74)

    判断m是否能被2~sqrt(m)或m/2或m-1整除

    /*部分代码*/
    for(m=2;m<=100;m++)//嵌套循环判断素数
    {
      n=sqrt(m);
      for(i=2;i<=n;i++)
      {
        if(m%i==0)
        break;
      }
      if(i>n)
       {
         printf();
         count++;
         if(count%10==0)
           printf();
       }
    }
    

    换硬币

    注意多层循环之间三种硬币的关系

    #include<stdio.h>
    int main()
    {
        int coin, five, two, one, total, count = 0;
        scanf("%d", &coin);
        for (five = coin / 5; five > 0; five--)
        {
            for (two = coin / 2; two > 0; two--)
            {
                for (one = coin; one > 0; one--)
                {
                    if (5 * five + 2 * two + one == coin)
                    {
                        total = five + two + one;
                        printf("fen5:%d, fen2:%d, fen1:%d, total:%d
    ", five, two, one, total);
                        count++;
                    }
                }
            }
        }
        printf("count = %d
    ", count);
        return 0;
    }
    

    2.编程技巧总结(2分)

    1.各种数列求和问题

    (1)当求解式子中有出现符号变化时,可引入flag来表示项的符号

    例:计算1-1/3+1/5-1/7+...共n项之和

    #include <stdio.h>
    int main()
    {
      int denominator,flag,i,n;
      dounle item,sum;
       printf("enter n:");
       scanf("%d",&n);
      /*执行循环前给变量赋初值*/
       flag=1;//flag表示第i项符号,初始为正
       denominator=1;
       sum=0;
      for(i=1;i<=n;i++)
     { 
         item=flag*1.0/denominator;
         sum=sum+item;
         flag=-flag;//改变符号
         denominator+=2;
     }
      printf("sum=%f
    ",sum);
    
     return 0;
    }
    

    (2)运用循环嵌套或自定义函数求解数列

    例:(选自pta)自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

    输入格式:

    输入第一行中给出非负整数 n(≤1000)。

    输出格式:

    在一行中输出部分和的值,保留小数点后八位。

    运用自定义函数:

    #include <stdio.h>
    double fact(int n)//自定义函数算n!
    {
       int i;
       double result=1;
    	
       for (i = 1; i <= n; i++)
       {
    	result *= i;
       }
    	return result;
    }
    double fact(int n);
    int main()
    {
        int m,j;
        
        double sum = 1.0;
        scanf("%d", &m);
        for (j= 1; j <= m; j++)
        {
    	sum += 1.0 / fact(j);
        }
         printf("%.8f", sum);
         return 0;
    }
    

    循环嵌套

    #include<stdio.h>
    int main()
    {
        int i,j,n;
        double sum = 1.0, s = 1.0;//如果阶乘定义成int类型,会超出上限
        scanf("%d",&n);
        for(i = 1; i <= n; i++)//求和
        {
           for(j = 1; j <= i; j++)//for循环嵌套求阶乘
        {
           s *= j;
        }
        sum += 1.0 / s;
        s = 1.0;
      }
      printf("%.8lf
    ",sum);
      return 0;
    }
    

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

    (1)字符转数字:通过与字母对应的ASCII码转换成数字

    或者使用atoi()函数可以将字符串转换为任意类型(整型、长整型、浮点型等)的数字。

    技巧:ASCII码在字符转换中运用广泛,除了字母转换为数字,还有大小写字母的转换,数字字符与数字间的转换

    #include <stdio.h>
    int main()
    {
         int i;
         char ch_lower,ch_upper;
    
         for(i=1;i<=6;i++)
          {
             scanf("%c",&ch_lower);
             if(ch_lower>='a'&&ch_lower<='z')
              {
               ch_upper=ch_lower-'a'+'A';
              }
             printf("%c->%c->%d
    ",ch_lower,ch_upper,ch_upper%10);
          }
       return 0;
    }
    
    # include <stdio. h>
    # include <stdlib. h>
    int main (void)
    {
        int num;
        char  ch = "100";
        num = atoi(ch);
        printf("The string 'str' is %s and the number 'num' is %d. 
    ",
                       ch, num);
    }
    

    (2)数字逆序:进行n%10;n/10循环,求出各位数字重新排列

    要注意循环结束的条件

    #include <stdio.h>
    int main ()
    {
       int x;
       scanf("%d",&x);
       int digit;
       int ret=0;
       while(x>0)//循环结束条件
       {
          digit=x%10;
          ret=ret*10+digit;
          x/=10;
       }
      printf(“逆序数值是 %d
    ”,ret);
      return 0;
    } 
    
    

    3.图形打印问题,观看超星平台的视频:图形打印,总结图形打印问题注意事项

    打印菱形

    #include<stdio.h>
    int main()
    {
      int i,j;
      for(i=0;i<7;i++)//从i=0开始计算第一行
      {
          if(i<=3)//前三行递增
          {
              for(j=0;j<5-i;j++)
                printf(" ");
              for(j=0;j<1+2*i;j++)
                printf("*");
          }
          if(i>3)//后四行递减
          {
              for(j=0;j<5-(6-i);j++)
                 printf(" ");
              for(j=0;j<1+2*(6-i);j++)
                printf("*");
          }
          printf("
    ");//每一行结束后
      }
        return 0;
    }
    

    注意事项:

    用到循环嵌套,要对各个循环所代表的功能清晰:外循环控制行数,内循环控制空格数以及‘*’个数

    可以将图形分为上下两半部分

    写程序前先观察图形每一行的具体空格数

    不要把各个循环以及循环中变量的初始值弄混

    4.四则运算,观看超星平台的视频:四则运算,总结四则问题注意事项

    模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

    输入格式:
    输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

    输出格式:
    在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

    #include<stdio.h>
    int main()
    {
        int i, sum, flag = 0;
        char op = '0';
    
        scanf("%d", &sum);
    
        while (op != '=')
        {
            scanf("%c", &op);
            if (op == '=')
                break;
            scanf("%d", &i);
            if (op == '+')
                sum = sum + i;
            else if (op == '-')
                sum = sum - i;
            else if (op == '*')
                sum = sum * i;
            else if (op == '/')
            {
                if (i != 0)
                    sum = sum / i;
                else
                    flag = 1;
            }
            else
                flag = 1;
        }
    
        if (flag == 1)
            printf("ERROR");
        else
            printf("%d
    ", sum);
    
        return 0;
    }
    

    注意事项:

    注意格式!!!

    计算时存在实数误差,注意使用float和double,否则个别特殊数据无法通过测试点

    注意精度的有效位

    3.PTA实验作业(6分)

    3.1 数列求和问题

    7-1 求交错序列前N项和 (15分)

    本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。

    输入格式:
    输入在一行中给出一个正整数N。

    输出格式:
    在一行中输出部分和的值,结果保留三位小数。

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

    思路:

    使用for循环,实现每次循环分母加二,分子加一

    设计变量表示加减符号的交替变化

    最后累加

    /*伪代码*/
      int denominator=1;
      int i,n;
      int flag=1;
      double sum=1;
      scanf(n);
      for (i = 2; i <= n; i++)
        {
            分母
    	正负符号
    	sum累加;
        }
    	printf(sum);
    

    3.1.2 代码截图

    3.2 图形打印问题

    (1)打印菱形

    3.2.1 数据处理

    思路:先用for循环行数递增,

    判断行数小等于三和大于三,分成两个部分计算

    再利用for循环‘ ’与‘*’递增

    //伪代码
    for(i;i<=7;i++)
    {
        if(i<=3)
        {
           for
           for
        }
        if(i>3)
         {
            for
            for
         }
    

    3.2.2 代码截图

    3.2.3 PTA提交列表及说明

    说明:只考虑*而没有考虑空格输出的情况

    下半部分循环中for语句的条件表达式没有判断清楚,和上半部分的不同

    在判断输出时程序不够简洁

    注意行数

    (2) 编程打印空心字符菱形

    3.2.1 数据处理

    思路:
    1、先画出实心菱形(把菱形分成上下俩部分,再分成正三角和倒三角 )

    2、 把输入的N(n层)带入循环

    3、 用if语句使菱形中心为空

    4、 利用ASCII码的加减 实现字母组成

    3.2.2 代码截图


    3.2.3 PTA提交列表及说明

    说明:不知道每行字母前以及同行字母间的空格个数如何计算

    运用嵌套时关系比较混乱

    字母的变化先增后减

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

    3.3.1 单步调试截图

    7-6 求幂级数展开的部分和


    3.3.2 代码截图


    3.3.3 PTA提交列表及说明

    没有注意自定义函数中对于a的判断条件,无限制条件导致运行超时

    没有考虑x<=1的情况导致测试点没过

  • 相关阅读:
    初识DataGridView 表格数据控件
    数据适配:DataAdapter对象概述
    数据适配 DataAdapter对象
    DataSet常用简单方法
    数据集DataSet
    DateReader读取数据
    Command操作数据
    【bzoj3886】[Usaco2015 Jan]Moovie Mooving 状态压缩dp+二分
    【bzoj1572】[Usaco2009 Open]工作安排Job 贪心+堆
    【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
  • 原文地址:https://www.cnblogs.com/qzmcflmf/p/13997223.html
Copyright © 2011-2022 走看看