- 要求二
题目7-3 求交错序列前N项和
1.实验代码
1 #include<stdio.h>
2 #include<math.h>
3 int main()
4 {
5 int i=1,x=1,n;
6 double sum=0;
7 scanf("%d",&n);
8 while(i<=n)
9 {
10 sum=sum+pow(-1,i+1)*(i*1.0/x);
11 x+=2;
12 i++;
13 }
14 printf("%.3lf",sum);
15 return 0;
16 }
2.设计思路
(1)主思路
- 第一步:定义整数型变量i(循环变量)、x(交错序列项分母)、n(循环次数)和浮点型变量sum(总和);
- 第二步:用scanf函数读入整数给n;
- 第三步:使用while循环,运用pow函数计算出每一项并累计求和;
- 第四步:用printf函数输出结果计算结果即sum的值。
注解:注意本题交错项的正负号转换,以及输出的sum应精确到小数点后三位。
(2)流程图
3.本题调试过程碰到问题及解决办法
本题遇到的主要问题就是如何正确转换相邻项的正负号,基于数学思想,我的思路就是前置乘以(-1)(i+1)来控制符号;老师后分享的方法,即定义一个flag=1,并在循环体中以flag=-flag来实现正负符号转换,达到同样的效果。我认为学到不同的思路对自己的编程思想都是一种进步。
至于错误没有。
4.本题PTA提交列表
题目7-5 统计学生平均成绩与及格人数
1 #include<stdio.h>
2 int main()
3 {
4 int i=1,n,grade,count=0;
5 double sum=0;
6 scanf("%d",&n);
7 if(n!=0)
8 {
9 while(i<=n)
10 {
11 scanf("%d",&grade);
12 if(grade>=60)count++;
13 sum+=grade;
14 i++;
15 }
16 printf("average = %.1lf\n",sum/n);
17 }
18 else
19 printf("average = 0.0\n");
20 printf("count = %d",count);
21 return 0;
22 }
- 第一步:定义整数型变量i(循环)、n(总人数)、grade(学生成绩)、count(及格人数)和浮点型变量sum(总成绩);
- 第二步:用scanf函数读入整数给n,并用if条件句以n是否为0为条件进行判断;
- 第三步:使用while循环,循环输出n个学生的成绩grade并累加得到sum,并用if条件句判断计算及格人数count;
- 第四步:计算输出平均成绩sum/n或者0.0以及及格人数count的值。
注解:若总人数为0,按照题目条件输出也应该保留小数点后一位即‘“0.0”。
一开始没有考虑到n为负整数,固n也有可能输入为0,基于题目average的精度为小数点后一位的要求,此时应输出“average = 0.0”。
解决办法就是多用一个if条件句判断一下,后来发觉在“sum/n”一步改成“1.0*sum/n”转换一下再保留1位小数即可。
(部分正确即为上述碰到的问题并解决。)
>>补充题目<<
题目7-1 求1到100的和
1.设计思路
2.调试程序和PTA提交过程中遇到的问题及解决方法
课堂练习固无错误。
题目7-2 求奇数分之一序列前N项和
思路雷同7-1固没有错误。
题目7-4 找出最小值
本题主要难点在于在while循环的基础上建立一个最小数交换,而两部分都是课堂练习过的基础题型,无错误。
题目12-1 求n!
题目12-2 统计字符
本题原型因在10.30学习switch语句时老师作为拓展简单展示过,且作为C题库第31题早已做过固无错误。
题目12-3 最佳情侣身高差
本题主要需要理清楚的是所谓最佳情侣身高对性别不同计算过程也不同,至于逻辑,for循环里加入一个简单的if-else判断句即可。
题目13(1)-6-1
本题为C题库第8题原题,唯一改动为输入的数据以空格间隔变为回车间隔,固没有错误。
题目13(1)-1求奇数和
思路雷同7-1,关于奇数的判断方式早在9.25的课堂上就学习了,固没有错误。
题目13(1)-2求给定精度的简单交错序列部分和
没有考虑到精度大于等于1即精度为整数时sum求和错误的问题,导致PTA提交部分正确。
解决办法就是在进行精度循环之前用if-else条件句进行精度判断再分情况讨论。(即如下部分代码)
if(eps>=1)
sum=1;
else
{
while(fabs(x)>eps)
{
x=flag*1.0/i;
sum+=x;
i+=3;
flag=-flag;
}
}
题目13(1)-3单词长度
没有考虑到本题输出格式应为数据开头及结束,所以采用“%d ”的方式是不对的。
解决办法就是定义一个变量i,以i的值判输出是否为第一个数据,然后再结合数据n是否为0来决定输出“ %d”即可。(即如下部分代码)
if(x=='.')
{
if(n!=0)
{
switch(i)
{
case 1:printf("%d",n);break;
default:printf(" %d",n);break;
}
}
break;
}
if(x==' ')
{
if(n!=0)
{
switch(i)
{
case 1:printf("%d",n);n=0;i=2;break;
default:printf(" ");printf("%d",n);n=0;break;
}
}
}
这道题还涉及到while(1)循环并用break语句结束。
题目13(2)-1猜数字游戏
ps:按照代码顺序画完流程图才发现避免不了的交叉了,交叉代表有关系,所以这是不对的,我以后会重视这个问题。
(在网上查询似乎有交叉的表达方式又或是少数交叉不影响,对于这个问题我需要抽时间研究一下。)
导致本题部分错误的原因在于在while(1)循环之下通过switch语句打印出如“Lucky You!”这样的结束话语之后无论如何继续输入都不会再给出反馈。
解决办法就是在switch语句后面加入break语句跳出循环。(即如下部分代码)
switch(i)
{
case 1:printf("Bingo!");break;
case 2:case 3:printf("Lucky You!");break;
default:printf("Good Guess!");break;
}
break;
题目13(2)-2统计素数并求和
思路雷同7-1,涉及到的判定素数也在课堂练习学习,固没有错误。
题目13(2)-3跟奥巴马一起画方块
本题没有错误,但是想到了易错点应该在于输入的边长N若为奇数,那么行数四舍五入则需要编程另算。
题目13(2)-4水仙花数
本题编程难度不大没有出错,但是PTA检测当输入N最大7时出现运算超时。
自己精简代码无果,后通过老师指点将原程序中运用pow函数计算每一位数N次方改为一个循环,问题得到解决。
题目13(2)-5画菱形
本题PTA提交一次正确,问题主要出现在编程菱形下半部分之时,关于菱形上半部分输出的规律很好掌握,也基于循环变量递增;但菱形下半部分总是得不到我想的运行结果,后通过数学思想倒推得出了在循环变量递增情况下的输出规律。(所述部分代码如下)
for(i=1;i<=n-1;i++)
{
for(j=1;j<=i;j++)
printf(" ");
for(h=1;h<=2*n-1-2*i;h++)
printf("*");
printf("\n");
}
- 要求四
上传成功后coding.net项目的截图
Git地址:https://git.coding.net/cyq1076926262/NO.4.git
- 要求五
个人总结
(1 )本周你学习了哪些内容?收获了什么?
①学习了break语句和continue语句;
②学习了常用数学库函数;
③以课堂练习题方式复习了多种循环结构的应用;
④学习了嵌套结构的逻辑分析;
⑤学习了使用Dev-C++进行编程调试;
⑥自学并练习使用了了while(1)循环搭配break语句。
(2)本周所学内容中你觉得哪些是难点?有哪些知识点还不明白?
两周所学知识都是基础很简单的,倒也没有不明白,但融汇贯通起来就是难点了,在两周的学习中这一点主要体现在PTA上吧,在精简程序的基础上看一些题目的逻辑确实累人,我觉得在这一点上我做的还远远不够,那句优秀程序员的编程时间不是空穴来风。我在做C题库时有不少困扰的我题目使我在此停滞,这也是我正视的我的不足之处,我会继续努力的。
- 要求六
1.点评作业
①何宗彦(http://www.cnblogs.com/hezongyan/)(16楼)
②胡俊鲜(http://www.cnblogs.com/123456hjx/)(17楼)
③陈盈驰(http://www.cnblogs.com/1999-cyc/)(1楼)
2.学习进度条(11/9 13:00~11/19 8:00)