第三次作业
这个作业属于哪个班级 | [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进行变化。
下半部分重复类似上面的操作。