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来实现判断输入是否为二进制字符。