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

0.展示PTA总分

1 .单循环结构

2 .嵌套循环

1.本章学习总结

1.1 学习内容总结

for循环

	for (i = 1; i <= N; i++)
        {
          ......
        }

由初值表达式、条件表达式、步长表达式、循环体语句组成。

while循环

while (x!=0)
		{
			if (x > 0) {
				i=i+1;
			}
			if(x<0)
			{
				j=j+1;
			}
			scanf("%d", &x);
		}

由循环条件、循环体语句组成。循环体语句内要有改变条件的机会。

do-while循环

do
{
<循环体语句>
}
while(<循环条件>);

while与do-while的区别:while先判断后循环,do-while先循环后判断

break与continue

break结束所在的循环,continue跳过下面的循环语句,重新循环,即结束一次循环,进入下一次循环,而不是退出循环。

循环嵌套

顾名思义,即一个循环语句内使用另一个循环语句。需要注意变量的改变,避免内外循环对变量两次赋值,导致死循环。

for (i = 1; i <= N; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%-4d", j, i, j * i);
			if (j == i)
			{
				printf("\n");
			}
		}
	}

1.2 本章学习体会

随着知识的深入和拓展,C语言开始展现它的难度了,诸如循环嵌套、函数和数据类型都需要自己有着深刻的理解。同时这些新知识教给我解决问题的新方法,让我的代码更简洁,更实用。还有遇到难题时,问同学或者百度是个解决问题的捷径,但是这条捷径会让自己的思考能力减弱,丧失解决问题的勇气,所以说遇见难题,还是要靠自己去解决,这样才能真正进步。

代码量统计:802行(每个程序减去两行大括号)

2. PTA实验作业

2.1 c04--嵌套循环 7-6 水仙花数

2.1.1 伪代码

#include<stdio.h>  
#include<math.h>
int main()
{
定义变量N,n(限定循环范围),s(计算各个数的n次方之和)。i,j,k,I,J(循环用变量)
输入N;
计算n,i;
for (i; i < n; i++)
	{
		s = 0;
		I = i;
		while (I > 0)
		{
			计算s
		}
		if (s == i)//判断是否为水仙花数
		{
			printf("%d\n", i);
		}
	}
	
	return 0;
}

2.1.2 代码截图

2.1.3 造测试数据

输入数据 输出数据 说明
7 1741725、4210818、9800817、9926315 最大N

2.1.4 PTA提交列表及说明

部分正确:运行超时
原因及解决方法:在计算s是使用了pow函数,导致运行超时,将pow函数改为for循环。

2.2 c04--嵌套循环 7-8 查询水果价格

2.2.1 伪代码

#include<stdio.h>  
#include<math.h>
int main()
{
   定义变量n(用户选择),i(循环次数)
printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");

	for (i = 1; i <= 5; i++)
	{
                输入选择
		if (n == 0)
		{
			break;
		}
		switch (n)
		{
		case 1:printf("price = 3.00\n"); break;
		case 2:printf("price = 2.50\n"); break;
		case 3:printf("price = 4.10\n"); break;
		case 4:printf("price = 10.20\n"); break;
		default:printf("price = 0.00\n");
		}
	}
	return 0;
}

2.2.2 代码截图

2.2.3 造测试数据

输入数据 输出数据 说明
6 price = 0.00 n不在0~4之间

2.2.4 PTA提交列表及说明

部分正确:输入大于4的数无输出
原因及解决方法:未考虑n>4的情况。在switch内添加一个default来处理n>4的情况。

2.3 c04--嵌套循环 7-9 单词长度

2.3.1 伪代码

#include <stdio.h>
#include <math.h>

int isPrice(int i);
int main()
{
	char c;
	int s = 0;
	int flag = 1;//判断是否为第一次输出

	while (1)
	{
		c = getchar();
		if (c == ' ' && s != 0 && flag == 1)
		{
			printf("%d", s);
			s = 0;
			flag = 0;
			continue;
		}
		if (c == ' ' && s != 0)
		{
			printf(" %d", s);
			s = 0;
			continue;
		}
		if (c == ' ')
		{
			continue;
		}
		if (c == '.' && s == 0)
		{
			break;
		}
		if (c == '.' && s != 0&&flag==1)
		{
			printf("%d", s);
			flag = 0;
			break;
		}
		if (c == '.' && s != 0)
		{
			printf(" %d", s);
			break;
		}
		s++;
	}

	return 0;
}

2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明
ABC. 3 一个单词
ABC . 3 多处空格

2.3.4 PTA提交列表及说明

部分正确:一个单词多输出一个空格。
原因及解决方法:当只有一个单词时,遇到'.'会执行

if (c == '.' && s != 0)
		{
			printf(" %d", s);
			break;
		}

所以输出错误。
利用flag将第一次输出另外执行,即

if (c == '.' && s != 0&&flag==1)
		{
			printf("%d", s);
			flag = 0;
			break;

3. 代码互评

题目:c04--嵌套循环 求n以内最大的k个素数以及它们的和

同学代码

自己代码

1.对于中间加号的输出,我的代码是让加号与数据一起输出,而这份代码选择加号与数据分开输出。
2.对于素数的判断,两份代码都以n的平方根为循环临界。我的代码多写了对i不是素数的情况的处理,这有点多余。
3.这份代码总的来说比较简洁。

题目:c04--嵌套循环 求n以内最大的k个素数以及它们的和

同学代码

自己代码

#include <stdio.h>
#include <math.h>

int isPrice(int i);
int leapYear(int x);
int date(int x, int y, int z);
int date(int x, int y, int z);
int main()
{
	int x, y, z,t,s=0;
	char c1, c2;
	scanf("%d%c%d%c%d", &x, &c1, &y, &c2, &z);
	
	if (date(x, y, z))
		s++;
	if (date(x, z, y))
		s++;
	if (date(y, x, z))
		s++;
	if (date(y, z, x))
		s++;
	if (date(z, x, y))
		s++;
	if (date(z, y, x))
		s++;
	if (s == 0)
	{
		printf("Invalid Date!");
	}
	else printf("%d", s);

	return 0;
}

int leapYear(int x)
{
	if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0)
	{
		return 1;//闰年返回1
	}
	else
	{
		return 0;
	}
}


int date(int x, int y, int z)
{
	int year;
	int month;
	int day;
	year = x;
	month = y;
	day = z;
	
		if (month > 12)
			return 0;
		if (day > 31)
			return 0;
		if (month <= 12)
		{
			switch (month)
			{
			case 1:
				if (day <= 31)
					return 1;
				else return 0;
			case 2:
				if (leapYear(year))
				{
					if (day > 29)
						return 0;
					else return 1;
				}
				else
				{
					if (day > 28)
						return 0;
					else return 1;
				}
			case 3:
				if (day <= 31)
					return 1;
				else return 0;
			case 5:
				if (day <= 31)
					return 1;			
				else return 0;
			case 7:
				if (day <= 31)
					return 1;
				else return 0;
			case 8:
				if (day <= 31)
					return 1;
				else return 0;
			case 10:
				if (day <= 31)
					return 1;
				else return 0;
			case 12:
				if (day <= 31)
					return 1;
			default:
				if (day <= 30)
					return 1;
				else return 0;
			}
		}
	
}

1.这份代码使用了数组,大大减少了代码量,不需要像我一样使用switch语句。

posted @ 2019-10-20 20:57  极仙  阅读(305)  评论(2编辑  收藏  举报