头歌C语言实验 练习5:循环结构 I

第1关:自然数双向求和

问题描述
在教材第104页的示例程序中,其功能是计算1+2+3+……+n的和。为了有效减少循环次数,程序中使用了两个循环变量,对1~n的自然数进行了双向求和。但这个程序是存在bug的,只有当输入的n为偶数时,程序才能计算出正确的结果。聪明的你,能在不改变双向求和的算法基础上,对原来的程序做出适当调整,以使得无论n为奇数或偶数时,程序都能计算出正确的结果吗?

输入
一个正整数n。

输出
按照输出示例的格式输出1+2+3+……+n的和。

输入示例
100

输出示例
sum=5050

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main(){
int i,j,n,sum=0;
scanf("%d",&n);
for(i=1,j=n;i<j;i++,j--){
sum=sum+i+j;
}
if(n%2!=0)
sum=sum+n/2+1;
printf("sum=%d",sum);
return 0;
}

第2关:勤奋 or 懒散

问题描述
勤奋or懒散,这是一个问题。
如果用1表示原地踏步,则1×1×……×1代表每天停步不前,经过n天后,结果仍然是1。
如果用1+0.1表示勤奋一点点,则1.1×1.1×……×1.1代表每天进步一点点,那么经过n天后,你将会获得多大的收获呢?
如果用1-0.1表示每天懒散一点点,则0.9×0.9×……×0.9代表每天退步一点点,那么n天以后,你又会变成什么样呢?
我们要做一个积极的人,每天进步一点点。

输入
一个正整数n,代表经过n天。

输出
输出包括两行,第一行输出1.1的n次方,第二行输出0.9的n次方,输出结果保留3位小数。
输出格式和内容参见输出示例,其中的标点符号都是中文标点符号。

提示
不要使用pow函数,使用循环计算累乘积。

输入示例
30

输出示例
每天勤奋一点点,30天后变成:17.449
每天懒散一点点,30天后变成:0.042

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
float a=1.1,b=0.9,c=1;
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++){
c*=a;
}
printf("每天勤奋一点点,%d天后变成:%.3f\n",n,c);
c=1;
for(i=1;i<=n;i++){
c*=b;
}
printf("每天懒散一点点,%d天后变成:%.3f\n",n,c);
return 0;
}

第3关:奇数偶数之和

问题描述
计算从1开始到指定的整数n之间所有奇数之和以及偶数之和。

输入
一个正整数n。

输出
输出包括两行:
第一行按照“The sum of odd numbers is xxx”的格式输出所有奇数的和;
第二行按照“The sum of even numbers is xxx”的格式输出所有偶数的和。

输入示例
100

输出示例
The sum of odd numbers is 2500
The sum of even numbers is 2550

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,i,sum=0,o=0,e=0;
int* odd;
int* even;
scanf("%d",&n);
odd=(int*)malloc(n*sizeof(int));
even=(int*)malloc(n*sizeof(int));
for(i=1;i<=n;i++)
{
if(i%2!=0)
odd[o++]=i;
else
even[e++]=i;
}
for(i=0;i<o;i++){
sum+=odd[i];
}
printf("The sum of odd numbers is %d\n",sum);
for(i=0,sum=0;i<e;i++){
sum+=even[i];
}
printf("The sum of even numbers is %d\n",sum);
return 0;
}

第4关:成绩统计 I

问题描述
张老师的班上共有n名学生。期末考试结束后,经过辛苦的阅卷,全班同学的考试成绩都出来了。张老师想要对全班同学的成绩进行统计,需要统计出全班同学的平均成绩以及不及格人数。但是张老师实在没有精神再连续工作下去了,聪明的你能够帮助张老师吗?

输入
输入包括两行:
第一行是一个正整数n,表示张老师班上的总人数。
第二行共包括n个浮点数,每个浮点数表示一位同学的期末考试成绩。

输出
输出共包括两行:
第一行输出全班同学的平均成绩,保留2位小数;
第二行输出不及格人数。
输出格式参照输出示例,注意其中的冒号是中文冒号。

输入示例
12
85.6 83.47 45.8 96.3 100 37.4 68.9 96.6 88 84.6 94.7 78.8

输出示例
平均成绩:80.01分
不及格人数:2人

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<stdlib.h>
int main(){
int n,i,j=0;
float avg;
float* score;
scanf("%d",&n);
score=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++){
scanf("%f",&score[i]);
}
for(i=0;i<n;i++){
avg+=score[i];
if(score[i]<60.0)
j++;
}
avg=avg/n;
printf("平均成绩:%.2f分\n不及格人数:%d人",avg,j);
free(score);
return 0;
}

第5关:打印温度转换表

问题描述
摄氏温度C和华氏温度F的转换公式为:
C=
9
5

×(F−32)
请使用循环编写一段程序将摄氏温度-华氏温度转换表从300摄氏度到0摄氏度 ( 每20度打印一行 ) 打印出来。

输入
无。

输出
第一行是标题行,标题的“摄氏温度”和“华氏温度”之间用一个制表符键(‘\t’)隔开。
其后的每一行输出对应的摄氏温度值和华氏温度值,摄氏温度和华氏温度均为单精度浮点数,中间用两个制表符键(‘\t’)分开。摄氏温度占6个字符宽度,保留1位小数,华氏温度占3个字符宽度,不保留小数。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>

int main(){
float F,C;
int i;
printf("摄氏温度\t华氏温度\n");
for(i=300;i>=0;i-=20){
C=i;
F=(C*9.0/5)+32;
printf("%6.1f\t\t%3.0f\n",C,F);
}
return 0;
}