第三次作业

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

0.展示PTA总分


1.本章学习总结

1.1 for循环语法

  • 格式:
for(表达式1;表达式2;表达式3)
{
     循环体语句
}
  • 表达式1只执行一次
  • 表达式1:初值表达式 表达式2:条件表达式 表达式3:步长表达式
  • 先计算表达式1,再判断表达式2,若为真则计算表达式3并执行循环体语句,后继续进行表达式2的判断。
  • 适用于有指定次数的循环
  • 例题:
    计算交错序列 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);//1.0不可省略
		flag = -flag;
	}
	printf("%.3f", sum);
	return 0;
}

1.2 while、do while循环语法

while格式:

while(表达式)
{
   循环体语句
}
  • 只有一个判断表达式,可为任意合法表达式
  • 适用于未知循环次数

do while格式:

do{
  循环体语句
}
  • 其会先进行一次循环体语句后再进行判断,后执行方式与while语句一样。
  • 两者都需要另加进行初始化部分,并且循环体语句中必须包含能改变循环体条件真假性的操作。
  • 例题:
    给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
    代码展示:
#include <stdio.h>
#include <math.h>
int main()
{
	int a;//输出的数字
	int n;
	int i;//判断变量
	int sum1;//单个数值
	int sum2;//总值
	sum1 = 0;
	sum2 = 0;
	i = 1;//要在外部先进行初始化
	scanf("%d %d", &a, &n);
	while (i <= n)
	{
		sum1 = sum1 + a * pow(10,i-1);
		sum2 = sum1 + sum2;
		i++;//改变i进行判断
	}
	printf("s = %d", sum2);
	return 0;
}

目前所写的题目一般都会偏向于使用for和while语句,do while语句在题目的适用较少,do while和while语句是可以进行互换的,选择哪种取决于自己。

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

  • break语句用于循环语句中,可结束循环。
  • continue语句用于循环语句中,只跳过语句,但是继续循环。
  • break还可还可用于switch语句中,continue只能用于循环。
  • break例子:

代码1:

#include <stdio.h>
int main()
{
	int number ;
	int flag = 1;//初始化flag
	for (number = 1; number <= 5; number++)
	{
		flag++;//此处与下面代码的区别缺失break;
		flag++;
	}
	printf("%d", flag);
	return 0;
}

代码2:

#include <stdio.h>
int main()
{
	int number ;
	int flag = 1;//初始化flag
	for (number = 1; number <= 5; number++)
	{
		flag++;
		break;
		flag++;
	}
	printf("%d", flag);
	return 0;
}

代码1输出数为11,代码2输出数为2。
代码2的break直接跳过了其后面的所有表达式,并结束循环。

  • continue例子:
    代码:
#include <stdio.h>
int main()
{
	int number;
	int flag = 1;//初始化flag
	for (number = 1; number <= 5; number++)
	{
		flag++;
		if (number == 5)
		{
			continue;//区别于上面代码的break
		}
		flag++;
	}
	printf("%d", flag);
	return 0;
}

与break例子中代码1对比,代码1输出结果为11,代码2输出结果为10,其跳过了后面的flag++,跳出外面继续进行循环。

1.4 循环嵌套

  • 格式:
for(表达式1;表达式2;表达式3)
{
   for(表达式1;表达式2;表达式3)
   {
         循环语句
   }
         循环语句
}
//也可替换为do while 和while类型
  • 大循环嵌套小循环
  • 可实现复杂循环类型
  • 例题:
    计算1!+2!+...+n!
    代码:
#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;
}

学习体会

写了pta里面单循环和循环嵌套题目,总结了一些方法,首先是要理清循环的思路,从哪里开始,并且是要怎么循环,循环里面是否会有还需要一层或者多层循环,理清思路后,开始构思代码,用哪只循环语句写更快,以及中间循环变量是如何改变,是否需要用一些判断语句来限制特殊特殊情况,如果是循环嵌套还要考虑里面一些特殊的量变化,之后就是码代码的问题,过程可能需要自己调试测数据来找到错误。

2.编程技巧总结

1. 字符如何转数字
例:

#include <stdio.h>
int main()
{
	char c1;//字符数据1
	char c2;//字符数据2
	scanf("%c %c", &c1, &c2);
	printf("%d %d %d", c1,c2,c1-c2);
	return 0;
}
  • 'c1'-'c2'=这种格式输出的数也为数字,例如'9'-'8'=1。

2. 小写字母换大写字母
例:

#include <stdio.h>
int main()
{
	char ch;
	scanf("%c", &ch);//输入小写字母
	ch = ch - 'a' + 'A';
	printf("%c", ch);
	return 0;
}
  • ch=ch-'a'+'A'的作用即为将小写字母变为大写字母。

3. 各种数列求和问题

  • 求交错序列前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;
}
  • 计算交错序列 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;
}

计算序列和看是否需要需要交错序列,若为交错序列则需要实现交错,需要引入一个变量来实现交错替换。

  • 计算阶乘之和
    例题:
    计算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;
}

4. 图形打印问题
例:

行(i) 空格(k) 星号(z)
1 3 1
2 2 3
3 1 5
4 0 7
5 1 5
6 2 3
7 3 1
上半部分行数到第4行,需要分别找到行i与空格k以及星号z的关系,下半部分同样。后用for循环解题。
#include <stdio.h>
int main()
{
	int i;//行数
	int k;//空格数
	int z;//星号数
	//上半部分输出部分
	for (i = 1; i <= 4; i++)
	{
		for (k = 1; k <= 4 - i; k++)//k=4-i为上部分k与i关系
		{
			printf(" ");
		}
		for (z = 1; z <= 2 * i - 1; z++)//z=2*i-1为上部分z与i关系
		{
			printf("*");
		}
		printf("\n");//换行要求
	}
	//下半部分输出部分
	for (i = 5; i <= 8; i++)
	{
		for (k = 1; k <= i - 4; k++)//k=i-4为下部分k与i关系
		{
			printf(" ");
		}
		for (z = 1; z <= 15 - 2 * i; z++)//z=15-2*i为下部分z与i关系
		{
			printf("*");
		}
		printf("\n");//换行要求
	}
	return 0;
}

5. 输出逆序数
代码:

#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;
}

3.PTA实验作业

3.1 数列求和问题

题目:给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和

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

伪代码:
scanf("%d %d",&a,&n)//输入a和n的值
i=1
while(i<=n)
{  
   sum1=sum1+a*pow(10,i-1)//单个数的值
   sum2=sum2+sum1;//总值
   i++  
}
end while

3.1.2 代码截图

3.1.3 PTA提交列表及说明

3.2 图形打印问题

3.2.1 数据处理

  • 数据表达:int number(行数) char ch(输入的第一个字母) int j(输出前面空格) int k(输出后面空格) int m(中间行数)
  • 数据处理:
    上半部分先用i的for循环,其中嵌套j的循环,输出前面空格。
    后用if的判断语句是否为第一行,若是则只输出一个字母并换行。
    之后再用k的循环来输出后面的空格并输出字母。
    在循环结束时对ch进行变化。
    下半部分重复类似上面的操作。

3.2.2 代码截图

3.2.3 PTA提交列表及说明

3.3龟兔赛跑

3.3.1 单步调试截图

3.3.2 代码截图

3.3.3 PTA提交列表及说明

posted @ 2020-11-22 08:34  稶郗  阅读(192)  评论(1编辑  收藏  举报