C语言博客作业02--循环结构
这个作业属于哪个班级 |C语言--网络2011/2012 |
| ---- | ---- |
|这个作业的地址 |C博客作业00--循环结构 |
|这个作业的目标 |学习循环结构内容,包括for循环、while循环、循环嵌套 |
|姓名 |李兴果 |
[TOC]
#0.展示PTA总分
#1.本章学习总结
##1.1 for循环语法
for(表达式1;表达式2;表达式3)
{
执行代码块
}
执行过程:
第一步:执行表达式1,变量做初始化;
第二步:判断表达式2,若值为真,则执行for循环体中执行代码块,然后向下执行;若其值为假,则结束循环;
第三步:执行表达式3;
第四步:执行for循环中执行代码块后执行第二步;
第五步:循环结束,继续向下执行。
**注意:**for中分号一定要写
代码展示:
/*体验一下for循环,实现一个10以内的数之和的小程序。
运行结果为: 10以内数的和为:55 */
#include <stdio.h>
int main()
{
// 定义变量sum, num
int sum, num;
sum = 0;
for (num = 0; num <= 10; num++) //for循环条件与num的变化值
{
sum += num;
}
printf("1%d", sum);
return 0;
}
##1.2 while、do while循环语法
while(表达式)
{
代码块
}
注意:
1、while中表达式一般是关系表达或逻辑表达式,当表达式的值为假时不执行循环体,反之则循环体一直执行。
2、在循环体中要改变循环变量的值,否则会出现死循环。
3、循环体如果包括有一个以上的语句,则必须用括起来,组成复合语句。
代码展示:
/*用while循环实现100以内所有整数之和。
运行结果为: 100以内所有整数之和为:5050*/
#include <stdio.h>
int main()
{
int i, sum = 0;
i = 1;
while (i <= 100)
{
sum = sum + i++;
}
printf("%d\n", sum);
return 0;
}
##1.3 跳出循环相关语句break\continue
break:中断循环
注意:
1、break不能用在单独的if-else语句中,需要在循环中使用。
2、在多层循环中,一个break语句只跳出当前循环
代码展示:
/*找出0-50之间的所有素数,所谓素数就是只能被1和它本身整除的数字,比如:7,13,23等。*/
#include <stdio.h>
int main()
{
int m, n;
for(m=2; m<=50; m++)
{
for(n=2; n<m; n++)
{
if(m%n==0)
break;
}
if(m == n)
printf("%d ", m);
}
return 0;
}
##countinue语句:
1.continue语句的作用是结束本次循环开始执行下一次循环。
1.break语句与continue语句的区别是:
break是跳出当前整个循环,continue结束本次循环开始下一次循环。
代码展示:
/*计算1到20之间不能被3整除的数字之和。
运算结果为: sum=147 */
#include <stdio.h>
int main()
{
int i, sum;
for(i=1, sum=0; i<=20; i++)
{
if( i%3==0 ) //不能被3整除这个条件如何写呢?
{
continue; //应该用哪个循环结束语句呢?
}
sum += i;
}
printf("sum=%d\n", sum);
return 0;
}
##while、do-while和for三种循环在具体的使用上是有区别的:
1.在知道循环次数的情况下更适合使用for循环;
2.在不知道循环次数的情况下适合使用while或者do-while循环,如果有可能一次都不循环应考虑使用while循环,如果至少循环一次应考虑使用do-while循环。
3.while,do-while和for循环之间是可以相互转换的.
代码展示:
/*使用循环计算1-2+3-4+5-6+…-100的值
运行结果为: sum=-50 */
#include <stdio.h>
int main()
{
int sum = 0; //定义计算结果变量sum
int i = 1; //定义循环数字变量i
int flag = 1; //定义符号状态变量flag
//使用while循环
while(i<=100)
{
//sum=sum+flag*i;
//flag=-flag;
i++;
}
i = 1; //重新初始化变量i
//do-while循环
do{
//sum=sum+flag*i;
// flag=-flag;
i++;
}while(i<=100);
i = 1; //重新初始化变量i
//使用for循环
for(i=1;i<=100;i++)
{
sum=sum+flag*i;
flag=-flag;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
##1.4 循环嵌套
注:一个父循环可以有多个子循环
多重循环中,外层循环为父循环,内层循环为子循环,父循环一次,子循环需要全部执行完,直到跳出循环。父循环再进入下一次,子循环继续执行
代码展示:
/*使用双重循环实现输出正三角形
*
***
*****
*******
*/
#include <stdio.h>
int main()
{
int i, j, k;
for(i=1; i<5; i++)
{
for(j=i;j<5;j++)
{
printf(" "); //输出空格
}
for(k=0;k<2*i-1;k++)
{
printf("*"); //每行输出的*号
}
printf("\n"); //每次循环换行
}
return 0;
}
##学习体会:
循环这一章节的语法运用,大大解决了很多循环重复做的问题,使得代码运行更快更准。
循环的语法简单易懂,但在难度较高的题目上自己就可能没有思维去做,需要训练代码思维,简单的题目会做,一稍微就卡死了(呜呜呜)
在循环语法中一些括号分号的小细节也特别的重要,有时候容易粗心而导致错误
有时候的嵌套循环在运行时凭个人肉眼也看不出它的运行方式,需要个人去单步调试理解
#2.编程技巧总结
##各种数列求和问题
(1)scanf吸收换行符
scanf(" %c",&c); //%c前面加空格,过滤回车
scanf("%d\n",&n); //使用\n过滤回车
getchar()来读取一次回车符号,每次接受一个字符,多余字符放在缓冲区,等待下一次调用getchar接收
fflush(stdin)的函数,可以用来清空缓冲区
(2)判断素数条件:
除了 1 和它本身以外,不能被任何整数整除的数
思路1) :把 m 被 2 ~ m/2 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数
思路2):m需被 2 ~ 根号m 之间的每一个整数去除,如果 m 不能被 2 ~ 根号m 间任一整数整除,m 是素数
思路3):m被2~m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数
范围:
[2,m-1]
[2,m/2]
[2,根号m]
引入flag作为素数标志
flag=1
若循环满足条件,flag=0
结束后根据flag状态判断
(3)阶乘累加
求i的阶乘直接调用fact(i)
即:sum=sum+fact(i)
计算过程中阶乘值与累加和非常大相关变量和函数类型都定义为double
- 置item初值为1,保证每次阶乘都从1开始连乘
##字符如何转数字、数字逆序问题等
(1)字符转数字:
- 把数字9转换成字符,然后输出字符‘9’
可以使用强制类型转换
int a=9;
char b;
b=(char)a;
printf("%c",b);
输出的结果就是9。
在要转换的变量面前加括号,括号里面填要转换的字符
比如输入数字字符ch='8'输出只要ch=ch- '0' printf(“%d”,ch)输出就是数字8了
(2)大写字母转小写字母:
ch=ch-'a'+'A'
注:字符和数字在内存里都是以ASCII码形式存储的。
减去'0',就是减去字符'0'的ASCII码,字符'0'的ASCII码是30,所以减去'0'也就是减去30,然后就得到字符对应的数字了。
##* 二进制转十进制:
sum = sum * 2 + (ch - '0')
##图形打印问题
1.等腰三角形打印
(1)应先着手分析,查找规律
行号 空格 星号
1 0 5
2 1 3
3 2 1
行数:n=(输入数字 + 1)/2
空格与行数的关系:空格数=行数-1
星号:行数*2-1
##四则运算
#include<stdio.h>
int main()
{
int x, y, z;
char c;
scanf("%d%c%d", &x, &c,&y);
switch (c)
{
case '+':
z = x + y;
break;
case '-':
z = x - y;
break;
case '*':
z = x * y;
break;
case '/':
z = x / y;
break;
default:
printf("erro!");
break;
}
printf("%d", z);
return 0;
}
##求成绩最高分初值
max初值:
1.输入的第一个数
2.比输入数都小的数
min的初值:
1.输入的第一个数
2.比输入数都大的数
##求平均值:
考虑除数为0情况
if(num!=0)
avg=total/num;
else avg=0;
##逆序问题:
num=num*10+新的个数
while(n != 0)
{
count= n%10; //得到最小位
printf("%d\n",count);//输出最小位
n /=10;//丢弃最小位
}
x%10,分离一位
x=x/10,为下一次分离做准备
#3.PTA实验作业
##3.1 数列求和问题
3.1.1 流程图或伪代码介绍思路
int main()
{
int n;
double sum = 0;//定义变量sum为double型,题目要求保留小数位
输入一个正整数n;
for (定义double型i=1; i 小于等于 n; i自增1)
{
sum += i / (2 * i - 1) * pow(-1, i + 1);/前面是分数的函数,后面判断符号,奇数与偶数/
}
printf("保留三位小数", sum);
return 0;
}
3.1.2 代码截图
3.1.3 PTA提交列表及说明
- 没有判断好正负号问题
##3.2 图形打印问题
3.2.1 数据处理
- 定义两个变量i,j;
- 第一个for (i = 1;i < 7;i++),控制行数,当循环结束时则换行,换到7为止
- 分i大于3和i小于3的情况
3.2.2 代码截图
3.2.3 PTA提交列表及说明
- 没有分类好情况,条件判断错误
- 输出格式不符合题目要求
##3.3 自选一题,介绍printf调试如何检查错误
3.3.1 单步调试截图
3.3.2 代码截图
3.3.3 PTA提交列表及说明
- 在输出时候格式判断错误