头歌C语言实验 练习9:使用数组

第1关:陶陶摘苹果

问题描述
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入
输入包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出
输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

输入示例
100 200 150 140 129 134 167 198 200 111
110

输出示例
5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main(){
int arr[10];
int max,i,n=0;
for(i=0;i<10;i++){
scanf("%d",&arr[i]);
}
scanf("%d",&max);
for(i=0;i<10;i++){
if(max+30>=arr[i])
n++;
}
printf("%d",n);
return 0;
}

第2关:成绩统计 III

问题描述
某班中最多有50名学生。期末考试结束后,班主任张老师需要统计这个班上所有同学的平均成绩、及格率以及考试成绩在平均成绩以上的学生人数。聪明的你,能够利用所学到的知识,编写一段程序帮助张老师自动完成这个统计工作吗?

输入
输入数据包括两行:
第一行是这个班级的学生人数n(n≤50)。
第二行包括n个介于0到100的实数,表示每位同学的期末考试成绩,每两个成绩之间用一个空格分开。

输出
输出数据包括三行:
第一行是班级的平均成绩,保留2位小数。
第二行是一个百分数,表示班级的及格率,保留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
83.33%
8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
int main(){
int i,n,a=0,b=0;
double avg=0;
double *score;
scanf("%d",&n);
score=(double*)malloc(sizeof(double)*n);
for(i=0;i<n;i++){
scanf("%lf",&score[i]);
avg+=score[i];
}
avg/=n;
for(i=0;i<n;i++){
if(score[i]>=60.0)
a++;
if(score[i]>=avg)
b++;
}
printf("%.2lf\n%.2lf\n%d",avg,(double)a/n*100,b);
return 0;
}

第3关:计算书费

问题描述
下面是一个图书的单价表:

给定每种图书购买的数量,编程计算应付的总费用。

输入
输入第一行包含一个正整数k(0<k<100),表示有k组测试数据;接下来k行,每行包含一组测试数据。每组测试数据包含10个整数(大于等于0,小于等于100),分别表示购买的《计算概论》、《数据结构与算法》、《数字逻辑》、《C++程序设计教程》、《人工智能》、《计算机体系结构》、《编译原理》、《操作系统》、《计算机网络》、《JAVA程序设计》的数量(以本为单位)。每两个整数之间用一个空格分开。

输出
对于每组测试数据,输出一行。该行包含一个浮点数f,表示应付的总费用。精确到小数点后两位。

输入示例
2
1 5 8 10 5 1 1 2 3 4
3 5 6 3 100 1 1 0 1 0

输出示例
2140.20
4427.80

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
#include<stdio.h>
#include<stdlib.h>
int main(){
int k,i,j;
int **num;
double price[10]={28.9,32.7,45.6,78,35,86.2,27.8,43,56,65};
double f;
scanf("%d",&k);
num=(int**)malloc(sizeof(int*)*k);
for(i=0;i<k;i++)
num[i]=(int*)malloc(sizeof(int)*10);
for(i=0;i<k;i++){
f=0;
for(j=0;j<10;j++){
scanf("%d",&num[i][j]);
f+=num[i][j]*price[j];

}
printf("%.2lf\n",f);
}
for(i=0;i<k;i++)
free(num[i]);
free(num);
return 0;
}

第4关:打印极值点下标

问题描述
在一个整数数组中,对于下标为i的整数,如果它大于所有它相邻的整数,或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。

输入
有2×n+1行输入:第一行是要处理的数组的个数n;对其余2×n行,第一行是此数组的元素个数k(3≤k≤80),第二行是k个整数,每两个整数之间用空格分隔。

输出
输出为n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔。
为简化程序的输出控制,每一行输出的最后一个数字之后都有一个多余的空格。

提示
请注意避免 <font color='red'>下标越界 </font>的错误!

输入示例
3
10
10 12 12 11 11 12 23 24 12 12
15
12 12 122 112 222 211 222 221 76 36 31 234 256 76 76
15
12 14 122 112 222 222 222 221 76 36 31 234 256 76 73

输出示例
0 7
2 3 4 5 6 10 12
0 2 3 10 12 14

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
28
29
30
31
32
#include<stdio.h>
#include<stdlib.h>
int main(){
int i,j,n,k;
int* arr;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&k);
arr=(int*)malloc(sizeof(int)*k);
for(j=0;j<k;j++){
scanf("%d",&arr[j]);
}
for(j=0;j<k;j++){
if(j==0){
if(arr[j]>arr[j+1]||arr[j]<arr[j+1])
printf("%d ",j);
}
else if(j==k-1){
if(arr[j]>arr[j-1]||arr[j]<arr[j-1])
printf("%d ",j);
}else{
if(arr[j]>arr[j+1]&&arr[j]>arr[j-1])
printf("%d ",j);
if(arr[j]<arr[j+1]&&arr[j]<arr[j-1])
printf("%d ",j);
}
}
printf("\n");
free(arr);
}
return 0;
}

第5关:矩阵加法

问题描述
请编写程序计算两个同型矩阵的加法运算,并输出和矩阵。
矩阵加法被定义在两个相同大小的矩阵。两个m×n矩阵A和B的和,标记为A+B,一样是个m×n矩阵,其内的各元素为其相对应元素相加后的值。例如:

输入
输入共有多行。
第一行是两个用空格分开的正整数n和m(0 < m, n <= 20),分别表示两个同型矩阵的行数和列数。
接下来有2×n行输入,每一行都包含m个用空格分开的整数。
第一个n行输入的共n×m个整数,表示第一个矩阵的各个元素。
第二个n行输入的共n×m个整数,表示第二个矩阵的各个元素。

输出
输出共有n行,每行输出m个整数,每两个整数之间用一个空格分开,表示计算后输出的和矩阵。
为简化程序的输出控制,每一行输出的最后一个数字之后都有一个多余的空格。

输入示例
2 3
1 2 3
2 3 4
4 5 6
5 6 7

输出示例
5 7 9
7 9 11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<stdlib.h>
int main(){
int m,n,i,j;
int* a;
int* b;
scanf("%d %d",&m,&n);
a=(int*)malloc(sizeof(int)*m*n);
b=(int*)malloc(sizeof(int)*m*n);
for(i=0;i<m*n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<m*n;i++){
scanf("%d",&b[i]);
a[i]+=b[i];
}
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%d ",a[i*n+j]);
}
printf("\n");
}
return 0;
}