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

| 这个作业属于哪个班级 |


| ---- | ---- | ---- |
| 这个作业的地址 |
| 这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
| 姓名 | 黄静 |

0.展示PTA总分


1.本章学习总结

1.1 for循环语法

1.1.1 基本框架
for(表达式1;表达式2;表达式3) { 循环语句 }
1.1.2 知识点

  • 表达式1:初始动作
  • 表达式2:条件
  • 表达式3:每轮的动作
  • for中的每一个表达式都是可以省略的

1.2 while、do-while循环语法

1.2.1 基本框架

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

1.2.2 知识点

  • while循环语法
  • 当条件满足时,不断重复循环体内的语句
  • 条件成立是循环继续的条件
  • do-while循环语法
  • 执行一次循环体语句之后再判断循环条件
  • 满足条件才进行下一轮循环
  • 表达式最后要加分号

1.2.3 区别

循环类型 执行顺序 执行次数 适用情况
for循环 在循环顶部先判断是否满足循环条件 可以一次也不执行 适合固定次数和有范围的循环
while循环 在循环之前判断是否执行 可以一次也不执行 适用于循环次数未知,条件控制的循环
do-while循环 执行之后判断是否循环 循环至少执行一次 适用于循环次数未知,条件控制,需要先执行的循环

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

1.3.1 break

  • 跳出循环
  • 用于switch语句中

1.3.2 continue

  • 跳出循环这一轮剩下的语句,跳到循环开始,判断循环条件,进入新一轮循环

1.4 循环嵌套

1.4.1 嵌套类型

for语句与for语句形成嵌套,for语句也可与while,do-while语句相互嵌套,构成多重循环。
例如:

一:                        二:                                    三:                              四:
while()                          do                                         for()                        while()
{...                              {...                                          {...                        {...
      while()                        do                                              for()                      for()
        {...                           {                                                {...}                     {...}
             }                                   ...}while();                              ...                  ...
      ...                              }while();                                  }                          }
}

注意点:外循环一次,内循环一轮,内循环务必要注意是否有变量需要重置

1.4.2 嵌套错误

  • 并列for
  • 循环混乱或循环变量相同
  • 初值混乱,内循环务必要注意是否有变量需要重置

1.5 学习体会

  • 从循环开始,代码难度较之前来说增大了不少,尤其是循环嵌套,十分考验自己的逻辑思维能力,有些测试点都不知道是什么,为什么错
  • 看到较难的题目常常没有思路,甚至有些难题需要参考别人的思路与做法才能写出自己的代码,很多题目不是代码不会写,而是想不到思路
  • 因为代码越来越复杂,所以缩进与注释,大括号换行这些小细节非常重要
  • 有些经常遇见的编程技巧和题型可以直接记下来,防止突然想不起来或者花时间去思考

2 编程技巧总结

2.1 判断是否为素数

2.1.1 做法

  • 素数判断范围 [2,m-1]或[2,m/2]或[2,根号m]
  • 设flag,判断是否素数:flag=1,若循环中满足条件,flag=0,循环结束根据flag状态判断是否素数
  • 利用循环变量值判断

2.1.2 代码举例

if(m==1)//   1不是素数
{
      flag=0;//引入flag作为标志
}
for(i=2;i<=m/2;i++)//循环
{
      if(m%i==0)//不是素数
            {
               flag=0;//flag的值改为0
               break;
            }
}
if(flag=1)
{
   printf("yes\n");
}
else
{
   printf("no\n");
}

2.2 通过循环打印图形

2.2.1 做法

运用双重for的循环嵌套实现

2.2.2 代码举例

for(i=1;i<=n;i++)//控制图形的行数
{
      for(j=1;j<=n;j++)//控制每一行中的元素
            {
                  ...
            }
}

另外:还可以通过加绝对值的方式使代码精简
如:

for(i=1;i<=7;i++)
    {
        for(k=1;k<=abs(4-i);k++)
        {
            printf(" ");
        }
        for(j=1;j<=7-2*abs(4-i);j++)
        {
            printf("*");
        }
        printf("\n");
    }

2.3 max初值/min初值

2.3.1 做法

  • 输入的第一个数
  • 比输入数都小/大的数

2.3.2 代码举例
scanf("%d",&max);或scanf("%d",&min);//把第一个数赋给最大值/最小值

if(num > max)                                    if(num < min)
{                                                {
      max=num;//把更大的数赋给max                        min=num;//把更小的数赋给min
}                                                 }

2.4 统计整数位数

2.4.1 做法

  • 取最后一位数用取余 x=num%10;
  • 除去最后一位数用除法 x=num/10;
  • 需要计数用自增 count++;

2.4.2 代码举例

      count=0;//赋给初始值
      do{
            number=number/10;//每次除去一位数
            count++;//累计位数
        }while(number!=0);

注意:累加一定要先赋予初始值

2.5 交错数列实现方式

2.5.1 做法

  • **使用sign来实现正负号转变

2.5.2 代码举例

    for(i=1;i<=n;a +=1 ,b +=2)//循环求数列之和
    {
        sum+=a/b*sign;//求和
        sign=-sign;//使用sign实现正负转化
        i++;
    }

2.6 大小写字母的转化方式

2.6.1 做法

  • 小写转换为大写:定义一个字符型变量op,则op+'A'-'a'的结果即为大写
  • 大写转换为小写:定义一个字符型变量op,则op-'A'+'a'的结果即为小写

2.6.2 代码举例

  • 小写转换为大写:op=op+'A'-'a';
  • 大写转换为小写:op=op-'A'+'a';

2.7 字符转数字问题

2.7.1 做法 ch=ch-'0';

代码举例 scanf("%c",char); ch=ch-'0';

2.8 四则运算

2.8.1 做法

运用'+' '-' '*' '/'进行计算

2.8.2 代码举例

2.9 数字逆序

2.9.1 做法

  • 每分离一位数,就把这位数变为个位,之前的乘以十升为高位,以此类推

2.9.2 代码举例

do
{
	n = num % 10;//取最后一位数
	sum = sum * 10 + n;//组成新的数字
	num = num / 10;//去除最后一位		

}while(num != 0 );

注意:sum要给初始值 0;

3.PTA实验作业

3.1 数列求和问题

典例:题目详情

7-2 特殊a串数列求和 (20分)
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。

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

伪代码:

定义变量a(a的值),n(n个数),sum(计算并存储每一项的值),s(数列之和);
for (int i=1;i<=n;i++)
{
      下一项数表达式;//根据数列中前一项和后一项的关系得到下一个数的值
      s等于sum累加求和;
}
end for;
输出s的值;
return 0;//结束程序;

3.1.2 代码截图

代码如下:

3.1.3 PTA提交列表及说明

错误说明

* scanf输入格式错误,不小心把引号错误打在了&n号后面;

3.2 图形打印问题

7-5 打印菱形图形 (10分)
打印出如下图案(菱形)
*
***




***
 *

第一行图形符号前面有5个空格
输出格式:
以菱形的格式输出7行由乘号构成的图形,每个乘号占固定1位,第一行乘号前有5个空格。

3.2.1 数据处理

做法

运用循环嵌套的方法,分别控制行数与每行的元素,进行处理

  • 定义两个for循环中的变量i,j;
  • 第一个for循环 for (i = 1;i <= 7;i++)//控制行数,第一个大循环结束时换行
  • 将七行分为前四行和后三行
  • 第二,三,四,五个for循环for (j = 1;j <= 6 - i;j++)//输出空格的循环 for (j = 1;j <= 2 * i - 1;j++)//输出乘号的循环for (j = 1;j <= i - 2;j++)//输出空格的循环 for (j = 1;j <= 1 + 2 * (7 - i);j++)//输出乘号的循环
  • 进行for循环嵌套

3.2.2 代码截图

代码举例

3.2.3 PTA提交列表及说明


说明:我在编译器上有运行过,观察是否有错误。需要注意的是j的可取范围,需要找到正确的规律,还要注意第一行是五个空格开始。

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

< 7-8 换硬币 (20分)题目详情
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。
输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

3.3.1 单步调试截图

  • 由于我代码运行只输出最后一句count = 0;所以我怀疑数据未进入循环;于是进行printf调试,在每个for循环下设printf语句

    最后输出结果如图:

  • 发现没有i,j,k的值输出,说明在进入循环时就出了问题

  • 在循环上方找问题,发现money误用了double型

  • 改正后,在下方测试区测试,答案正确

3.3.2 代码截图

3.3.3 PTA提交列表及说明

说明:因为money定义为double类型使得money/2有小数;而我的初衷是希望将小数舍去,得到可取的最大整数,所以情况出错,没有循环内的值输出,我将类型改为int后,可以成功输出,答案正确。

posted @ 2020-11-22 17:27  栀夏~  阅读(298)  评论(0编辑  收藏  举报