C语言程序设计第五次作业——循环结构(1)
一:改错题
先将源程序(有错程序)复制粘贴到Devc++中如图
进行第一次编译发现有错误信息(1)如图:
发现代码第13行中误将“;”写成“,”且“()”后有“;”存在
将“,”改为“;”,“()”后的“;”删除
进行第二次编译寻找错误,发现编译正确如图
现进行运行指令,按输入样例1输入数据发现并不符合预期如图:
返回源程序再次寻找错误,发现错误(2)for后没有“{}”
现在“for()”后添加“{}”
进行编译,运行指令,按输入样例1输入发现运行结果仍不符合题意如图:
发现错误(3):fahr定义为int型,而输出却是浮点型
将“%3.0f”改为“%3d”
进行编译,运行,按输入样例1输入,发现仍不符合预期如图:
对照题目,发现错误(4),赋值语句错误
原题意设应为celsius = 5×(f-32)/9
改正为如图:
进行编译,运行指令,按输入样例1进行输入发现仍不符合预期如图:
错误原因:原题设为每次循环,华氏度的温度增加2,而在源代码的for语句中,每次循环华氏度只增加1.
改正方法:将循环后华氏度的增量改变为+2
进行编译运行发现样例1符合题意如图:
进行编译运行,按输入样例2进行输入,运行结果符合题意运行结果如图:
改正结束,改正后代码为:
#include <stdio.h>
int main(void)
{
int fahr , lower, upper; /* fahr表示华氏度 */
double celsius; /* celsius表示摄氏度 */
printf("Enter lower:");
scanf("%d",&lower);
printf("Enter upper:");
scanf("%d",&upper);
printf("fahr celsius\n"); /* 显示表头 */
/* 温度转换 */
for (fahr = lower ;fahr <= upper;fahr += 2)
{
celsius = 5 * (fahr - 32.0) / 9 ;
printf(" %3d %6.1f\n", fahr, celsius);
}
return 0;
}
二:学习总结
1:详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么
①定义整形常量i,num,odd,even
②给odd和even赋值为0
③开始for循环语句,表达式1为i=1,表达式2为i<=10,表达式3为i++
④开始输入变量数值num
⑤开始进入了选择语句当num和2求余为0 时even的数值+1
⑥如果num和2 求余为0 时odd的值+1
⑦i<=10成立程序继续循环
⑧再次输入一次变量num
⑨重复上面的循环过程,如果num和2求余为0,even再次+1,如果num和2 求余为0 时odd的值再次+1
⑩直到当i>10的时候跳出循环输出even和odd,程序结束。
程序实现的功能:输入10个数据,判断他们的奇偶性;并分别统计奇数和偶数的个数。
2.增量运算符
(1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?
运行程序结果如下:
有区别,++i是先加后使用,而i++是先使用后加。
(2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?
运行结果如下:
只是第一条先i++是先使用后加,而++j是先加后使用,其他都一样,在单独作为表达式的时候无影响,但是在语句中有影响
i=2 j=3
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
(1)如图:
(2)如图:
(3)如图:
(4)如图:
运行结果(1)(2)(4)相同,都是五个“”并成一行
而运行结果(3)也为五个“”但分成五行排列
首先看第一个和第二个程序就只有两个printf这个语句有区别,第二个有缩格,但是输出的结果是一样的,所以循环体的认定与缩格形式无关。
其次再看第二个和第三个程序,区别在于多了一个花括号{},但是输出结果不同,在比较一下第三个和第四个程序都有花括号{}但是括号的范围不同,结果不同,当printf("\n")在花括号外面时,就不参与循环,结果就不会换行,所以与{}有关。
最后,我认为要想准确的判断循环语句的循环体,首先就得看最后的输出格式是什么,根据输出格式和花括号{}括起来的范围来看在括号外的语句便不参与循环。
4.对其他你认为需要进行总结的内容进行总结
(1)简易的表达方式:i=i+1 可以简写成i++,但是一定要注意区别 i++ 和 ++i 的加减先后顺序;
(2)for语句的用法,注意for()后不加“;”()中用“;”而不是“,”
三:实验总结
本人杨若飞,学号末位为03所以完成总 成循环结构(1)中的1、3、5、7题
总结如下:
1:求奇数分之一序列前N项和
(1)题目:本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
(2)流程图:
(3)源代码:
#include<stdio.h>
int main()
{
int i,N;
double sum,S;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
S=S+(double)1/(2*i-1);
}
printf("sum = %.6f",S);
return 0;
}
(4)实验分析
问题:误将“ printf("sum = %.6f",S);”放在了循环结构里面。
解决办法:把输出语句放在循环结构后面。
(5)本题PTA提交列表
3:奇偶分家
(1)题目:给定N个正整数,请统计奇数和偶数各有多少个?
(2)流程图:
(3)源代码:
#include<stdio.h>
int main()
{
int N,i,S,J,O;
double H;
scanf("%d",&N);
J=0;
O=0;
for(i=1;i<=N;i++)
{
scanf("%d",&S);
H=S%2;
if(H==0)
{
O=O+1;
}
else
{
J=J+1;
}
}
printf("%d %d",J,O);
return 0;
}
(4)实验分析
问题:做实验室脑子一时短路,不知该怎么来记就数的个数
解决办法:通过询问同学得知,在“for”语句中镶嵌“if else”语句
(5)本题PTA提交列表
5: 统计字符
(1)题目:本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
(2)流程图:
(3)源代码:
# include <stdio.h>
int main()
{
char a;
int s,letter = 0,blank = 0,digit = 0,other = 0,i;
for(i = 0;i < 10;i++)
{
scanf("%c",&a);
s = a;
if(s >= 65 && s <= 90)
{
letter++;
}
else if(s >= 97 && s <= 122)
{
letter++;
}
else if(s == 32 || s == 10)
{
blank++;
}
else if(s >= 48 && s <= 57)
{
digit++;
}
else
{
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
(4)实验分析
问题:总编译错误出现一些小问题,细节“==”写成“=” “&&”当“||”用
解决办法:自己反复检查解决了问题
(5)本题PTA提交列表
7:求交错序列前N项和
(1)题目:本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
(2)流程图:
(3)源代码:
# include <stdio.h>
int main()
{
int N,i,y;
double sum;
scanf("%d",&N);
for(i = 1;i <= N;i++)
{
y = i%2;
if(y == 1)
{
sum = sum + i/((2.0*i)-1);
}
else
{
sum = sum - i/((2.0*i)-1);
}
}
printf("%.3f",sum);
return 0;
}
(4)实验分析:
问题:忘记题目要求,sum定义为了"int"型导致错误
解决方法:将“sum”重新定义成“double”型
(5)本题PTA提交列表:
四:博客互评
1.许天笑:http://www.cnblogs.com/snxtx/p/7812139.html
2.范凯华:http://www.cnblogs.com/fkh1/p/7812032.html
3.马阳光:http://www.cnblogs.com/myg123/p/7802056.html
本次作业如上