C博客作业02--循环结构
这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业00--循环结构 |
这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
0.展示PTA总分
单循环:
循环嵌套:
1.本章学习总结
1.1 for循环语法
- 基本形式:
for ( 表达式1; 表达式2; 表达式3)
{
循环体语句;
}
-
执行流程:先执行表达式1,再判断表达式2,若为“真”,则执行循环体语句,然后执行表达式3,继续循环,若为“假”,则结束循环。
-
表达式1:赋值,对循环变量赋初值
表达式2:条件,给出循环继续的条件
表达式3:单次循环结束后需要执行的语句
-
特点:先判断再执行且知道循环次数
-
应用:
- 数列求和:求交错序列前N项和
1.2 do-while循环语法
-
基本形式:
do { 循环体语句; }while ( 表达式 );
-
执行流程:进入循环时,先执行循环体中的语句,若表达式的值为“真”,则继续循环,直到表达式的值为“假”,结束循环。
-
特点:
- 先循环后判断且至少会执行一次
1.3 while循环语法
-
基本形式:
while ( 表达式 ) { 循环体语句; }
-
执行流程:当为“真”时循环执行,直到表达式的值为“假”循环中止
-
特点:
-
初始化是在循环体外,循环条件判断是在while()中进行,而变量的更新是在{ }中进行更新
-
先判断后循环可能一次都不执行
-
-
应用:
1.4 for,do-while,while循环比较:
-
for循环与while循环
- for循环:指定了循环次数,当然也可以用while语句;while循环****:如果没有指定**循环次数,而是由某一项的值来控制循环
-
for循环和while循环都是循环前判断条件,只有条件满足时才会进入循环。如果一开始条件就不满足,则循环一次都不执行
-
do-while循环与while循环
-
若初始情况不满足循环条件时:while 循环一次都不会执行,do-while 循环不管任何情况都至少执行一次
-
当循环需要执行两次以上时运行效果相同
-
1.5 跳出循环相关语句break\continue
当循环结构中出现多个循环条件时,可以由循环语句中的表达式和break语句共同控制
-
break语句:强制循环结束,循环提前结束,不再执行循环体中位于其后的其他语句。break语句应该和if语句配合使用,即条件满足时,才执行break跳出循环break可以跳出循环,但是break只能跳出break当前所在的这层循环
-
continue语句:跳过循环体中continue后面的语句,继续下一次循环
-
区别:
-
break语句用于结束循环,break 语句只能用在循环体内和 switch 语句体内
-
continue语句只是跳过后面的语句继续循环且只能用于循环结构
-
- 应用:
解析:
a | b |
---|---|
1 | 1 |
2 | 4 |
3 | 7 |
4 | 10 |
5 | 13 |
解析:
i | 输出的图形 |
---|---|
1 | # |
2 | * |
3 | # |
4 | * |
5 | # |
1.6 循环嵌套
-
要注意外层循环和内层循环的条件初始化
应用:
解析:
m i j 55 1 3 1 2 4 但j<=i此语句不成立,则跳出循环。
解析:
4*5=20
学习体会
通过本章学习,代码明显变得更长、更复杂,需要思考的要更多,需要对每种循环类型结构的熟悉并合理运用。对于我来说,刷pta的时候,循环确实有点困难,循环嵌套也好难,写一题要写好久...需要思考:如何设置循环条件,循环内结束条件等等...当然,我的预习和复习工作确实做的不太好,接下来需要加强。还有就是一些平常打代码需要记忆的,要记得滚瓜烂熟,比如:累乘,判断素数等等...
2. 编程技巧总结
-
造scanf函数吸收空格和换行符:scanf(" %c",&c)(%c前面有一个空格)
因为空格和换行也是字符,在读入一个字符时要注意不可以随意的输入空格和换行符,因为输入一串字符,getchar一次只能接收一个字符,scanf函数中的一个%c也只能接收一个字符,剩下的要放在键盘缓冲区中,等待下一个getchar或者scanf的读入。
-
二进制转十进制:sum = sum * 2 + (op - '0')
例如:二进制1111(正数)第二位: 2×1+1=3 第三位:3×2+1=7 第四位:7×2+1=15
-
大小写字符转换:ch=ch-'a'+'A'
-
数列求和问题:
- 交错序列的数列:需要输入
int t=-1
并在for循环中t=-t
,实现正负交替
- 交错序列的数列:需要输入
-
图形打印:需要列表采用枚举法、列表找规律,找到数与数之间的表达式
例如:
-
四则运算: 采用switch-case语法
while ((c = getchar()) != '=') { scanf("%d", &num2); if (c == '/' && num2 == 0)//除法分母为0 { printf("ERROR\n"); return 0; } switch (c) { case '+':sum = num1 + num2; break; case '-':sum = num1 - num2; break; case '*':sum = num1 * num2; break; case '/':sum = num1 / num2; break; default:printf("ERROR\n"); return 0; //非法运算符 }
需要注意的是:分母为零的情况和非法运算符的情况
-
判断素数:能否被2~根号m之间的数整除
for(m=2;m<=100;m++) { if(m是素数) printf("%d",m); }
-
pta打印九九口诀表:等号右边数字占4位、左对齐
printf("%d*%d=%-4d", line, row, line * row);
“%-4d”
3. PTA实验作业
3.1 数列求和问题:特殊a串数列求和
3.1.1 介绍思路
- 数据表达:
int a,n;//题目要求给两个不超过9的正整数a和n
int sum;//计算所有数的和
int item;//表示每个数的值
-
数据处理:
首先要保证a和n小于等于9的情况下进入循环,在循环体中需要累加,然后输出。
3.1.2 代码截图
3.1.3 PTA提交列表及说明
说明:一开始我也不知道自己错在哪里,然后仔细看了题目和自己的代码发现应该在第17行的printf("s= %d",sum);
中s后应该要有一个空格。
3.2 图形打印问题:打印菱形图形
3.2.1 数据处理
-
数据表达:
int row;//控制行数 int starNum;//控制"*"个数
-
伪代码:
for(row=0;row<7;row++)
{
if(row<=3)//前三行
{
for(空格条件)
printf(" ");
for(星星条件、关系式)
printf("*");
}
if(row>3)//后三行
{
for(空格条件)
printf(" ");
for(星星条件、关系式)
printf("*");
}
printf("\n");
}
3.2.2 代码截图
3.2.3 PTA提交列表及说明
说明:
- 关系式找错关系输出的空格和星星不符合题目要求
- 注意换行和空格个数
- 打错变量名称
3.3 介绍printf调试如何检查错误:求n以内最大的k个素数以及它们的和
3.3.1 单步调试截图
-
int→double:
-
count未初始化:
-
调试过程:
3.3.2 代码截图
3.3.3 PTA提交列表及说明
说明:
- 一开始判断素数的条件输入错误,而且把%打成&,导致运行的时候一直出错(下次提交pta之前要自己运行一遍!养成习惯!)
printf("%d", sum);
写在if条件外面,应该紧接在“=”后面- count没有初始化==0,且
if (count >= k || i <= 2)
这个条件中少了i<=2
这个给条件 - 因为
m = sqrt(i);
开方后可能为小数,但本题应该是没影响的,但是编译器有提示将int m;
改成double m;
3.3.3 测试数据
输入 | 输出 |
---|---|
12 6 | 11+7+5+3+2=28 |
100 20 | 97+89+83+79+73+71+67+61+59+53+47+43+41+37+31+29+23+19+17+13=1032 |
988 23 | 983+977+971+967+953+947+941+937+929+919+911+907+887+883+881+877+863+859+857+853+839+829+827=20797 |
1000 10 | 997+991+983+977+971+967+953+947+941+937=9664 |
3.4 课堂派测试和互动总结
解析:因为1和n是整型, 1/n默认是int型,所以只对结果的小数取整数部分,结果就不对。
(其余题目已在其他版块放置)