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("
");
}
}
}
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
", 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
[2] pear
[3] orange
[4] grape
[0] exit
");
for (i = 1; i <= 5; i++)
{
输入选择
if (n == 0)
{
break;
}
switch (n)
{
case 1:printf("price = 3.00
"); break;
case 2:printf("price = 2.50
"); break;
case 3:printf("price = 4.10
"); break;
case 4:printf("price = 10.20
"); break;
default:printf("price = 0.00
");
}
}
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语句。