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

| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业02--循环结构 |
| 这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
| 姓名 | 吴慧敏 |
注:有关内容摘抄自菜鸟教程

🌟0.我的PTA总分展示


🌟1.本章学习总结

1.1 for循环语法

一般情况下,如果题目中指定了循环次数,用for循环更清晰,循环的四个组成部分一目了然。

  • for循环流程图如下所示:

    注意:注意for语句括号中三个部分均是语句,用分号“;”隔开。
  • 案例

    正确示范代码:
#include <math.h>
int main()
{
    int n,i,sum,result;
    sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        sum=sum+pow(2,i);
    }
    printf("result = %d",sum);
    return 0;
}

这里运用了for循环,累加法和pow函数。
注意:sum要记得初始化。

1.2 while、do while循环语法

1.2.1while循环:循环次数不确定时多用while,while的循环体语句只能是一条。

  • while循环流程图如下所示:

    注意:while 循环的关键点是循环可能一次都不会执行。当条件为 false 时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。
  • 案例:

正确示范代码:(请教他人的代码)

1.2.2do while循环:其循环体语句也只能是一条。

  • do while循环流程图如下所示:

    注意:do while循环先执行循环体,后判断循环条件。所以无论循环条件的值如何,至少会执行一次循环体。
  • 案例:

正确示范代码:

注意scanf("%d", &input);放在了循环体语句中,作用为重新给input赋值;此外,i和j记得要初始化。

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

1.3.1break语句

  • break语句强制循环结束,不再执行循环体中位于其后的循环语句。
  • break的两种用法:1.在循环中使用。2.它可用于终止 switch 语句中的一个 case。
  • break的流程图:

    注意:如果使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。

1.3.2continue语句

  • continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环。
  • continue只用于循环。
  • continue的流程图:

    注意:continue 会跳过当前循环中的代码,强迫开始下一次循环。
    区别:1.continue只用于循环 2.break语句强制循环结束,continue语句的作用是跳过循环体中continue后面的语句,继续下一次循环。
    实例
  • 用break时:
#include <stdio.h>
 
int main ()
{
   /* 局部变量定义 */
   int a = 10;

   /* while 循环执行 */
   while( a < 20 )
   {
      printf("a 的值: %d\n", a);
      a++;
      if( a > 15)
      {
         /* 使用 break 语句终止循环 */
          break;
      }
   }
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
  • 用continue时:
#include <stdio.h>
 
int main ()
{
   /* 局部变量定义 */
   int a = 10;

   /* do 循环执行 */
   do
   {
      if( a == 15)
      {
         /* 跳过迭代 */
         a = a + 1;
         continue;
      }
      printf("a 的值: %d\n", a);
      a++;
     
   }while( a < 20 );
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19'

1.4 循环嵌套

嵌套循环为大循环中嵌套了小循环,需要注意的是,对嵌套循环初始化时,一定要分清内外层循环。
案例

(参考他人代码后)我的答案:

#include<stdio.h>
int main()
{
	int i;
	int j;
	for (i = 1; i <= 7; i++)//行变化
	{
		if (i <= 4)//上半部分
		{
			for (j = 1; j <= 6 - i; j++)
			{
				printf(" ");//行中空格的输出
			}
			for (j = 1; j <= 2*i - 1; j++)
			{
				printf("*");//行中*的输出
			}
			printf("\n");
		}
		else//下半部分
		{
			for (j = 1; j <= i - 2; j++)
			{
				printf(" ");//行中空格的输出
			}
			for (j = 1; j <= 15 - 2*i; j++)
			{
				printf("*");//行中*的输出
			}
			printf("\n");
		}
		

	}

	return 0;
}

学习体会

通过这一周的学习,我发现自己的代码量还是少得可怜,解题思路还未建立,总是在拿到一个题目时不知所措,当然,这也是在提醒我一定要多刷代码,形成自己的解题思路和增加解题经验。

🌟2.编程技巧总结

  • 各种数列求和问题
    A.求交错序列前N项和
    例题:
    计算序列 1+2/3+3/5+4/7+5/9+6/11+... 的前N项之和
#include <stdio.h>
int main()
{
	int i;//循环变量
	int n;//到第几个数
	double sum;//总值
	scanf("%d", &n);
	flag = 1;
	sum = 0;
	for (i = 1; i <= n; i++)
	{
		sum = sum + flag*i * 1.0 / (2 * i - 1);
	}
	printf("%.3f", sum);
	return 0;
}

B.计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和

#include <stdio.h>
int main()
{
	int i;//循环变量
	int n;//到第几个数
	int flag;//实现交错
	double sum;//总值
	scanf("%d", &n);
	flag = 1;
	sum = 0;
	for (i = 1; i <= n; i++)
	{
		sum = sum + flag*i * 1.0 / (2 * i - 1);
		flag = -flag;//实现交错
	}
	printf("%.3f", sum);
	return 0;
}
==注意:==实现交错序列求和时要引用flag实现正负号之间的转换。

c.计算阶乘之和
例题:
计算1!+2!+...100!

#include <stdio.h>
int main()
{
   int i,j;
   double item,sum;
   sum=0;//总值
   for(i=1;i<=100;i++)
   {
      item=1;//保证每次阶乘都是1开始连乘
      for(j=1;j<=i;j++)
      {
        item=item*j;//实现阶乘
        sum=sum+item;
      }
}
printf("%d",sum);
return 0;
}
  • 字符如何转数字、数字逆序问题等
    A.字符如何转数字:
    ch=ch-'0';
    B.输出逆序数
    代码:
#include <stdio.h>
int main()
{
	int n;//输入的数
	int m;
	scanf("%d", &n);
	m = 0;
	while (n > 0)
	{
		m = m * 10 + n %10;//取一位逐渐递进
		n = n / 10;//除去以取的一位数
	}
	printf("%d", m);
	return 0;
}

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

上半部分行数到第4行,需要分别找到行i与空格k以及星号z的关系,下半部分同样。后用for循环解题。

#include<stdio.h>
int main()
{
	int i;
	int j;
	for (i = 1; i <= 7; i++)
	{
		if (i <= 4)
		{
			for (j = 1; j <= 6 - i; j++)
			{
				printf(" ");
			}
			for (j = 1; j <= 2*i - 1; j++)
			{
				printf("*");
			}
			printf("\n");
		}
		else
		{
			for (j = 1; j <= i - 2; j++)
			{
				printf(" ");
			}
			for (j = 1; j <= 15 - 2*i; j++)
			{
				printf("*");
			}
			printf("\n");
		}
		

	}

	return 0;
}
#include <stdio.h>

int main()
{
    int A,B;
    scanf("%d %d",&A,&B);
    int x = A+B;
	int y = A-B;
	int m = A*B;
	int n = A/B;
    printf("%d + %d = %d\n",A,B,x);
    printf("%d - %d = %d\n",A,B,y);
    printf("%d * %d = %d\n",A,B,m);
    printf("%d / %d = %d\n",A,B,n);
    return 0;
}
  • 自增运算符:
    前置++:先自增一
    前置--:先自减一
    后置++:后加一
    后置--:后减一
    = :赋值
    == 等于,注意判断相等

🌟3.PTA实验作业

3.1 数列求和问题

  • 7-2 特殊a串数列求和 (20分)

3.1.1 流程图介绍思路

3.1.2 代码截图

3.1.3 PTA提交列表及说明


说明

  • 一开始,以为aa是指两个a字母并排,导致部分正确;后来认识到aa指的是一个数,即要写成sum = sum*10+a*i;

3.2 图形打印问题

7-5 打印菱形图形 (10分)

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循环嵌套
  • i控制的为行数,使其从第一行一直到最后一行。
  • j控制的是空格和*。
  • i和j均为int类型。

3.2.2代码截图


3.2.3 PTA提交列表及说明


说明:(此题是参考他人作业写出)

  • 此题类型为循环嵌套,用了一个大循环和四个小循环。*
  • 在大循环中分为两部分:1-4行和5-7行。
  • 在两个小循环中,第一个for作用是输出空格;第二个for作用是输出*。

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

  • 7-7 jmu-c-二进制转10进制 (20分)

3.3.1 单步调试截图





3.3.2 代码截图

3.3.3 PTA提交列表及说明


说明:1.不清楚二进制转十进制该怎么转导致的错误。解法:用二进制字符减去'0',decimal = decimal * 2 + (binary-'0');
2.通过应用flag来实现判断输入是否为二进制字符。

posted @ 2020-11-22 22:45  蓝胖子WHM  阅读(153)  评论(0编辑  收藏  举报