C语言博客作业02--循环结构
这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业00--循环结构 |
这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
姓名 | 骆梦钒 |
0.展示PTA总分(0----2)
1.本章学习总结(2分)
1.1 for循环语法
(1)格式:
for(初值表达式;条件表达式;步长表达式)
{
循环体语句;//多条语句用大括号--复合语句
}
(2)流程图:
(3) 注意:for里面语句之间是‘;’,不要在for语句中随意加分号
(4)for语句中初值表达式只执行一次
(5)循环中出现的值要注意初始值
(6)例题:计算1+2+3+···+n
#include<stdio.h>
int main()
{
int i,n,num;
scanf("%d",&n);
sum=0;
for(i=1;i<=n;i++)
{
sum=sum+i;
printf("%d",sum);
}
return 0;
}
1.2 while、do while循环语法
1.while循环
(1)格式:
while(表达式)
循环体语句;
(2)流程图:
(3)当表达式的值为‘真’时,循环执行,直到表达式的值为‘假’时,循环中止并继续执行while的下一条语句
(4)while语句中的表达式可以是任意合法的表达式,循环体语句只能是一条语句
(5)for语句改写成while语句:
表达式1;
while(表达式2)
{
for的循环体语句;
表达式3;
}
(6)当无法确定输入数据个数时,需要自己设计循环条件,可以用一个特殊的数据作为正常输入数据的结束标志
(7)例:最佳情侣身高差
#include <stdio.h>
int main ()
{
int n;
char c;
float h;
scanf("%d", &n);
getchar();
while (n--) //当n递减到0时,判断为‘假’,循环结束
{
scanf("%c %f", &c, &h);
getchar();
if (c == 'F' )
printf("%.2f
", h * 1.09);
else
printf("%.2f
", h / 1.09);
}
return 0;
}
2.do while循环
(1)格式:
do
{
循环体语句;
}while(表达式);
(2)流程图:
(3)使用do while、while、for情况
·如果循环次数不明确,通常用while语句或do while语句
·如果事先给定了循环次数,首选for语句
·do while循环适合于先循环、后判断循环条件的情况
(4)无论循环条件的值如何,至少会执行一次循环体
(5)例题:统计一个整数的位数
#include<stdio.h>
int main()
{
int count=0,number;
printf("Enter a number:");
scanf("%d",&number);
if(number<0)number=-number;
do{
number=number/10;
count++;
}while(number!=0);
printf("%d
",count);
return 0;
}
1.3 跳出循环相关语句breakcontinue
2种区别,举例说明。
(1)break:强制循环结束,应该和if语句配合使用,即条件满足时,才执行break跳出循环
(2)continue:跳出循环体中continue后面的语句,继续下一次循环。一般也需要与if语句配合使用。
(3)区别:break结束循环,continue跳过后面语句继续循环。
break还用于swictch语句,continue只能用于循环。
(4)流程图:
for结构中break的作用:
for结构中continue的作用:
(5)例题举例:
伪代码:
#include <stdio.h>
int main ()
{
do
{
if(t/9)
{
t--;
continue;//执行到continue,会直接跳转到表达式
}
K;
P;
}while(表达式);
while(表达式1)
{
for (1; 2; 3)
{
if(表达式2)
{
A;
B;
continue; //执行到continue,转去执行3
C;
break; //若执行到break,则终止 for 循环的所有内容,转而执行E
}
D;
}
E;
continue; //此处continue执行完,执行表达式1
F;
break;//若执行到此处的break,则终止 while 循环,转而执行H
G;
}
H;
return 0;
}
1.4 循环嵌套(重难点)
(1)使用嵌套时一定要分清内外层循环的功能是什么
(2)例:
计算1!+...+100!
部分代码
item=1;
for(i=1;i<=100;i++)
{
for(j=1;j<=i;j++)
{
item*=j;
sum+=item;
}
}
判断素数
要清楚判断素数的条件(书P74)
判断m是否能被2~sqrt(m)或m/2或m-1整除
/*部分代码*/
for(m=2;m<=100;m++)//嵌套循环判断素数
{
n=sqrt(m);
for(i=2;i<=n;i++)
{
if(m%i==0)
break;
}
if(i>n)
{
printf();
count++;
if(count%10==0)
printf();
}
}
换硬币
注意多层循环之间三种硬币的关系
#include<stdio.h>
int main()
{
int coin, five, two, one, total, count = 0;
scanf("%d", &coin);
for (five = coin / 5; five > 0; five--)
{
for (two = coin / 2; two > 0; two--)
{
for (one = coin; one > 0; one--)
{
if (5 * five + 2 * two + one == coin)
{
total = five + two + one;
printf("fen5:%d, fen2:%d, fen1:%d, total:%d
", five, two, one, total);
count++;
}
}
}
}
printf("count = %d
", count);
return 0;
}
2.编程技巧总结(2分)
1.各种数列求和问题
(1)当求解式子中有出现符号变化时,可引入flag来表示项的符号
例:计算1-1/3+1/5-1/7+...共n项之和
#include <stdio.h>
int main()
{
int denominator,flag,i,n;
dounle item,sum;
printf("enter n:");
scanf("%d",&n);
/*执行循环前给变量赋初值*/
flag=1;//flag表示第i项符号,初始为正
denominator=1;
sum=0;
for(i=1;i<=n;i++)
{
item=flag*1.0/denominator;
sum=sum+item;
flag=-flag;//改变符号
denominator+=2;
}
printf("sum=%f
",sum);
return 0;
}
(2)运用循环嵌套或自定义函数求解数列
例:(选自pta)自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。
输入格式:
输入第一行中给出非负整数 n(≤1000)。
输出格式:
在一行中输出部分和的值,保留小数点后八位。
运用自定义函数:
#include <stdio.h>
double fact(int n)//自定义函数算n!
{
int i;
double result=1;
for (i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
double fact(int n);
int main()
{
int m,j;
double sum = 1.0;
scanf("%d", &m);
for (j= 1; j <= m; j++)
{
sum += 1.0 / fact(j);
}
printf("%.8f", sum);
return 0;
}
循环嵌套
#include<stdio.h>
int main()
{
int i,j,n;
double sum = 1.0, s = 1.0;//如果阶乘定义成int类型,会超出上限
scanf("%d",&n);
for(i = 1; i <= n; i++)//求和
{
for(j = 1; j <= i; j++)//for循环嵌套求阶乘
{
s *= j;
}
sum += 1.0 / s;
s = 1.0;
}
printf("%.8lf
",sum);
return 0;
}
2.字符如何转数字、数字逆序问题等
(1)字符转数字:通过与字母对应的ASCII码转换成数字
或者使用atoi()函数可以将字符串转换为任意类型(整型、长整型、浮点型等)的数字。
技巧:ASCII码在字符转换中运用广泛,除了字母转换为数字,还有大小写字母的转换,数字字符与数字间的转换
#include <stdio.h>
int main()
{
int i;
char ch_lower,ch_upper;
for(i=1;i<=6;i++)
{
scanf("%c",&ch_lower);
if(ch_lower>='a'&&ch_lower<='z')
{
ch_upper=ch_lower-'a'+'A';
}
printf("%c->%c->%d
",ch_lower,ch_upper,ch_upper%10);
}
return 0;
}
# include <stdio. h>
# include <stdlib. h>
int main (void)
{
int num;
char ch = "100";
num = atoi(ch);
printf("The string 'str' is %s and the number 'num' is %d.
",
ch, num);
}
(2)数字逆序:进行n%10;n/10循环,求出各位数字重新排列
要注意循环结束的条件
#include <stdio.h>
int main ()
{
int x;
scanf("%d",&x);
int digit;
int ret=0;
while(x>0)//循环结束条件
{
digit=x%10;
ret=ret*10+digit;
x/=10;
}
printf(“逆序数值是 %d
”,ret);
return 0;
}
3.图形打印问题,观看超星平台的视频:图形打印,总结图形打印问题注意事项
打印菱形
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<7;i++)//从i=0开始计算第一行
{
if(i<=3)//前三行递增
{
for(j=0;j<5-i;j++)
printf(" ");
for(j=0;j<1+2*i;j++)
printf("*");
}
if(i>3)//后四行递减
{
for(j=0;j<5-(6-i);j++)
printf(" ");
for(j=0;j<1+2*(6-i);j++)
printf("*");
}
printf("
");//每一行结束后
}
return 0;
}
注意事项:
用到循环嵌套,要对各个循环所代表的功能清晰:外循环控制行数,内循环控制空格数以及‘*’个数
可以将图形分为上下两半部分
写程序前先观察图形每一行的具体空格数
不要把各个循环以及循环中变量的初始值弄混
4.四则运算,观看超星平台的视频:四则运算,总结四则问题注意事项
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
#include<stdio.h>
int main()
{
int i, sum, flag = 0;
char op = '0';
scanf("%d", &sum);
while (op != '=')
{
scanf("%c", &op);
if (op == '=')
break;
scanf("%d", &i);
if (op == '+')
sum = sum + i;
else if (op == '-')
sum = sum - i;
else if (op == '*')
sum = sum * i;
else if (op == '/')
{
if (i != 0)
sum = sum / i;
else
flag = 1;
}
else
flag = 1;
}
if (flag == 1)
printf("ERROR");
else
printf("%d
", sum);
return 0;
}
注意事项:
注意格式!!!
计算时存在实数误差,注意使用float和double,否则个别特殊数据无法通过测试点
注意精度的有效位
3.PTA实验作业(6分)
3.1 数列求和问题
7-1 求交错序列前N项和 (15分)
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留三位小数。
3.1.1 流程图或伪代码介绍思路
思路:
使用for循环,实现每次循环分母加二,分子加一
设计变量表示加减符号的交替变化
最后累加
/*伪代码*/
int denominator=1;
int i,n;
int flag=1;
double sum=1;
scanf(n);
for (i = 2; i <= n; i++)
{
分母
正负符号
sum累加;
}
printf(sum);
3.1.2 代码截图
3.2 图形打印问题
(1)打印菱形
3.2.1 数据处理
思路:先用for循环行数递增,
判断行数小等于三和大于三,分成两个部分计算
再利用for循环‘ ’与‘*’递增
//伪代码
for(i;i<=7;i++)
{
if(i<=3)
{
for
for
}
if(i>3)
{
for
for
}
3.2.2 代码截图
3.2.3 PTA提交列表及说明
说明:只考虑*而没有考虑空格输出的情况
下半部分循环中for语句的条件表达式没有判断清楚,和上半部分的不同
在判断输出时程序不够简洁
注意行数
(2) 编程打印空心字符菱形
3.2.1 数据处理
思路:
1、先画出实心菱形(把菱形分成上下俩部分,再分成正三角和倒三角 )
2、 把输入的N(n层)带入循环
3、 用if语句使菱形中心为空
4、 利用ASCII码的加减 实现字母组成
3.2.2 代码截图
3.2.3 PTA提交列表及说明
说明:不知道每行字母前以及同行字母间的空格个数如何计算
运用嵌套时关系比较混乱
字母的变化先增后减
3.3 自选一题,介绍printf调试如何检查错误
3.3.1 单步调试截图
7-6 求幂级数展开的部分和
3.3.2 代码截图
3.3.3 PTA提交列表及说明
没有注意自定义函数中对于a的判断条件,无限制条件导致运行超时
没有考虑x<=1的情况导致测试点没过