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

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

0.展示PTA总分

单循环:

循环嵌套:

1.本章学习总结

1.1 for循环语法

  • 基本形式:
for ( 表达式1; 表达式2; 表达式3)
	{
             循环体语句;
	}

  • 执行流程:先执行表达式1,再判断表达式2,若为“真”,则执行循环体语句,然后执行表达式3,继续循环,若为“假”,则结束循环。

  • 表达式1:赋值,对循环变量赋初值

    表达式2:条件,给出循环继续的条件

    表达式3:单次循环结束后需要执行的语句

  • 特点:先判断再执行且知道循环次数

  • 应用:

    • 数列求和:求交错序列前N项和

1.2 do-while循环语法

  • 基本形式:

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

  • 执行流程:进入循环时,先执行循环体中的语句,若表达式的值为“真”,则继续循环,直到表达式的值为“假”,结束循环。

  • 特点:

    • 先循环后判断且至少会执行一次

1.3 while循环语法

  • 基本形式:

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

  • 执行流程:当为“真”时循环执行,直到表达式的值为“假”循环中止

  • 特点:

    • 初始化是在循环体外,循环条件判断是在while()中进行,而变量的更新是在{ }中进行更新

    • 先判断后循环可能一次都不执行

  • 应用:

1.4 for,do-while,while循环比较:

  • for循环与while循环

    • for循环指定了循环次数,当然也可以用while语句;while循环****:如果没有指定**循环次数,而是由某一项的值来控制循环
  • for循环和while循环都是循环前判断条件,只有条件满足时才会进入循环。如果一开始条件就不满足,则循环一次都不执行

  • do-while循环与while循环

    • 初始情况不满足循环条件时:while 循环一次都不会执行,do-while 循环不管任何情况都至少执行一次

    • 当循环需要执行两次以上时运行效果相同

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

当循环结构中出现多个循环条件时,可以由循环语句中的表达式和break语句共同控制

  • break语句:强制循环结束,循环提前结束,不再执行循环体中位于其后的其他语句。break语句应该和if语句配合使用,即条件满足时,才执行break跳出循环break可以跳出循环,但是break只能跳出break当前所在的这层循环

  • continue语句:跳过循环体中continue后面的语句,继续下一次循环

  • 区别:

    • break语句用于结束循环,break 语句只能用在循环体内和 switch 语句体内

    • continue语句只是跳过后面的语句继续循环且只能用于循环结构

  • 应用:

解析:

a b
1 1
2 4
3 7
4 10
5 13

解析:

i 输出的图形
1 #
2 *
3 #
4 *
5 #

1.6 循环嵌套

  • 要注意层循环和层循环的条件初始化

    应用:

    ​ 解析:

    m i j
    55 1 3
    1 2 4

    但j<=i此语句不成立,则跳出循环。

    解析:4*5=20

学习体会

通过本章学习,代码明显变得更长、更复杂,需要思考的要更多,需要对每种循环类型结构的熟悉并合理运用。对于我来说,刷pta的时候,循环确实有点困难,循环嵌套也好难,写一题要写好久...需要思考:如何设置循环条件,循环内结束条件等等...当然,我的预习和复习工作确实做的不太好,接下来需要加强。还有就是一些平常打代码需要记忆的,要记得滚瓜烂熟,比如:累乘,判断素数等等...

2. 编程技巧总结

  • 造scanf函数吸收空格和换行符:scanf(" %c",&c)(%c前面有一个空格)

    因为空格和换行也是字符,在读入一个字符时要注意不可以随意的输入空格和换行符,因为输入一串字符,getchar一次只能接收一个字符,scanf函数中的一个%c也只能接收一个字符,剩下的要放在键盘缓冲区中,等待下一个getchar或者scanf的读入。

  • 二进制转十进制:sum = sum * 2 + (op - '0')

    例如:二进制1111(正数)第二位: 2×1+1=3 第三位:3×2+1=7 第四位:7×2+1=15

  • 大小写字符转换:ch=ch-'a'+'A'

  • 数列求和问题:

    • 交错序列的数列:需要输入int t=-1并在for循环中t=-t,实现正负交替
  • 图形打印:需要列表采用枚举法、列表找规律,找到数与数之间的表达式

    例如:

  • 四则运算: 采用switch-case语法

    while ((c = getchar()) != '=')
        {
            scanf("%d", &num2);
            if (c == '/' && num2 == 0)//除法分母为0
            {
                printf("ERROR\n");
                return 0;
            }
            switch (c)
            {
            case '+':sum = num1 + num2; break;
            case '-':sum = num1 - num2; break;
            case '*':sum = num1 * num2; break;
            case '/':sum = num1 / num2; break;
            default:printf("ERROR\n");
                return 0;    //非法运算符 
            }
    

    需要注意的是:分母为零的情况和非法运算符的情况

  • 判断素数:能否被2~根号m之间的数整除

    for(m=2;m<=100;m++)
    {
       if(m是素数)
         printf("%d",m);
    }
    
  • pta打印九九口诀表:等号右边数字占4位、左对齐

    printf("%d*%d=%-4d", line, row, line * row); “%-4d”

3. PTA实验作业

3.1 数列求和问题:特殊a串数列求和

3.1.1 介绍思路

  • 数据表达:
 int a,n;//题目要求给两个不超过9的正整数a和n
 int sum;//计算所有数的和
 int item;//表示每个数的值
  • 数据处理:

    首先要保证a和n小于等于9的情况下进入循环,在循环体中需要累加,然后输出。
    

3.1.2 代码截图

3.1.3 PTA提交列表及说明

说明:一开始我也不知道自己错在哪里,然后仔细看了题目和自己的代码发现应该在第17行的printf("s= %d",sum);s后应该要有一个空格

3.2 图形打印问题:打印菱形图形

3.2.1 数据处理

  • 数据表达:

    int row;//控制行数
    int starNum;//控制"*"个数
    
  • 伪代码:

 for(row=0;row<7;row++)
  {
      if(row<=3)//前三行
      {
          for(空格条件)
            printf(" ");
          for(星星条件、关系式)
            printf("*");
      }
      if(row>3)//后三行
      {
          for(空格条件)
            printf(" ");
          for(星星条件、关系式)
            printf("*");
      }
      printf("\n");
  }

3.2.2 代码截图

3.2.3 PTA提交列表及说明

说明:

  • 关系式找错关系输出的空格和星星不符合题目要求
  • 注意换行和空格个数
  • 打错变量名称

3.3 介绍printf调试如何检查错误:求n以内最大的k个素数以及它们的和

3.3.1 单步调试截图

  • int→double:

  • count未初始化:

  • 调试过程:

3.3.2 代码截图

3.3.3 PTA提交列表及说明

说明:

  • 一开始判断素数的条件输入错误,而且把%打成&,导致运行的时候一直出错(下次提交pta之前要自己运行一遍!养成习惯!)
  • printf("%d", sum);写在if条件外面,应该紧接在“=”后面
  • count没有初始化==0,且if (count >= k || i <= 2) 这个条件中少了i<=2 这个给条件
  • 因为m = sqrt(i); 开方后可能为小数,但本题应该是没影响的,但是编译器有提示将int m; 改成double m;

3.3.3 测试数据

输入 输出
12 6 11+7+5+3+2=28
100 20 97+89+83+79+73+71+67+61+59+53+47+43+41+37+31+29+23+19+17+13=1032
988 23 983+977+971+967+953+947+941+937+929+919+911+907+887+883+881+877+863+859+857+853+839+829+827=20797
1000 10 997+991+983+977+971+967+953+947+941+937=9664

3.4 课堂派测试和互动总结

解析:因为1和n是整型, 1/n默认是int型,所以只对结果的小数取整数部分,结果就不对。

(其余题目已在其他版块放置)

posted @ 2020-11-22 10:49  GGGa-Yi  阅读(202)  评论(0编辑  收藏  举报