C语言程序设计实验课参考答案(实验八:数组程序设计1)

实验八 数组程序设计1

1. double 类型数组练习

说明

输入 n(0<n≤1000) 个小数,并将其依次输出。

输入输出格式及样例

输入数据:

第一行一个正整数 n;
第二行连续输入n 个 double 型浮点数。

5

29.495762 83.042158 69.332532 11.874342 47.989582

输出数据:

输出一行,将这n 个浮点数按输入顺序输出,保留 3 位小数。

29.496 83.042 69.333 11.874 47.990

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(){
int n;
scanf("%d", &n);
double num[1000]; //数组的长度一定是一个确定的、不能改变的值,不能是输入的n!
for(int i=0; i<n; i++){
scanf("%lf", &num[i]);
}
for(int i=0; i<n; i++){
printf("%.3f ", num[i]);
}
return 0;
}

2.输出月份的天数

说明

通过对一维数组的初始化赋值,我们可以将一些诸如:素数、斐波那契数列、月份天数之类的常量事先存储进去,然后通过下标或结合循环进行访问。

现在,请你编写一个小算法,输入一个年份及月份,输出对应的天数。

输入输出格式及样例

输入数据:两个整数 y,m(1600≤y≤10^4 ,1≤m≤12),分别代表年份和月份。

输出数据:输出对应的天数。

数据1 数据2
输入数据 1600 1 1600 2
输出数据 31 29

提示

闰年判断方法:

  1. 非整百年:年数除以 4 余数为 0 通常是闰年,但年数除以 100 余数为 0 的年份通常不是闰年,即公元 4、8、12……年;
  2. 整百年:年数除以 400 余数为 0 通常是闰年;年数除以 3200 余数为 0,通常不是闰年;年数除以 172800 余 0 又通常为闰年。

注意!!!整除3200不是闰年!!!

参考答案

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main(){
int d[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
int y, m;
scanf("%d %d", &y, &m);
int leep = (y%400==0 && y%3200!=0) || (y%4==0 && y%100!=0);
printf("%d", d[leep][m - 1]);
return 0;
}

3. 老鹰捉小鸡

说明

狐狸老师和格莱尔等5位小朋友玩老鹰捉小鸡的游戏,狐狸老师当老鹰,排在第一位的小朋友当“母鸡”,其他4位小朋友当“小鸡”。但是“母鸡”很辛苦,所以过一段时间“母鸡”需要排到队伍最后成为“小鸡”,让第二位小朋友当“母鸡”······试编一程序,模拟10次位置变化的过程。

输入输出格式及样例

输入数据:无

输出数据:每行输出每一次的位置。注意每行尾没有空格!

1
2
3
4
5
6
7
8
9
10
1: 1 2 3 4 5
2: 2 3 4 5 1
3: 3 4 5 1 2
4: 4 5 1 2 3
5: 5 1 2 3 4
6: 1 2 3 4 5
7: 2 3 4 5 1
8: 3 4 5 1 2
9: 4 5 1 2 3
10: 5 1 2 3 4

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main(){
int a[5] = {1, 2, 3, 4, 5};
for(int i=0; i<10; i++){
//输出顺序
printf("%d:", i+1);
for(int j=0; j<5; j++){
printf(" %d", a[j]);
}
printf("\n");
//调整顺序
int k, t = a[0];
for(k=0; k<4; k++){
a[k] = a[k+1];
}
a[k] = t;
}
return 0;
}

4. 最重的苹果

说明

小 y 有n 个苹果,他知道每个苹果的重量。希望你能帮他找出最重的那个苹果,苹果编号为1,2,⋯,n。

输入输出格式及样例

输入数据:

第一行是一个正整数n,表示有n个苹果(1≤n≤1000)。

第二行包含n个整数 。

5

67 43 90 78 32

输出数据:一个整数,最重的苹果的编号。

3

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
int main(){
int n;//int apple[1000]; 没有使用数组
scanf("%d", &n);
int max=0, index=0;
for(int i=0; i<n; i++){
int t;
scanf("%d", &t);
if(t> max){
max = t;
index = i+1;
}
}
printf("%d", index);
return 0;
}

5. 陶陶摘苹果

说明

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出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
16
#include<stdio.h>
int main(){
int n, m=30, count=0;
int apple[10];
for(int i=0; i<10; i++){
scanf("%d", &apple[i]);
}
scanf("%d", &n);
for(int i=0; i<10; i++){
if(apple[i]<= m+n){
count++;
}
}
printf("%d", count);
return 0;
}

6. 简单排序2

说明

在上周的 HHXL 小学四年级1000米自由泳比赛中,共有n(0<n≤100)名同学踊跃参赛,已知他们各自游完1000米的时间互不相同,请你算算小J能排第几名吧!

输入输出格式及样例

输入数据:

第1行1个正整数n,表示参赛的人数。

第2行连续输入n个正整数,表示各名队员游完1000米的秒数,均在[1,600]的范围内。

第3行1个正整数m,表示小J游完1000米的秒数。

5

50 55 30 59 43

43

输出数据:输出1个正整数,表示小J的名次。

2

参考答案

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

7. 初级计数排序

说明

小 J 最近终于学到了数组,他知道使用数组就可以对一个数列进行排序了!

今天,他小试牛刀,使用数组来对 n 个数字进行排序。你也会做吗?

输入输出格式及样例

输入数据:

第一行一个正整数n(0<n≤10^4 )

第二行连续输入 n 个不大于 10^4 的非负整数。

输出数据:

一行,输出这 n 个数从小到大排序后的结果,中间用一个空格隔开。

如果一个数出现了多次,在排序结果里只写一次即可。

数据1 数据2
输入数据 5
3 7 0 2 4
5
1 2 1 2 1
输出数据 0 2 3 4 7 1 2

参考答案

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>
int main(){
int n;
scanf("%d", &n);
int num[10000];
for(int i=0; i<n; i++){
scanf("%d", &num[i]);
}
//paixu
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
if(num[i]>num[j]){
int t = num[i];
num[i] = num[j];
num[j] = t;
}
}
}
//输出
int t=-1;
for(int i=0; i<n; i++){
if(t != num[i]){
printf("%d ", t=num[i]);
}
}
return 0;
}

8. 校门外的树

说明

某校大门外长度为L 的马路上有一排树,每两棵相邻的树之间的间隔都是1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,…,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入输出格式及样例

输入数据:

第一行有两个整数L(1≤L≤10000) 和 M(1≤M≤100),L 代表马路的长度,M 代表区域的数目,
L 和 M 之间用一个空格隔开。接下来的 M 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
对于20% 的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。

500 3

150 300

100 200

470 471

输出数据:包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

298

参考答案

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
#include<stdio.h>
int main(){
int L, M, count=0;
scanf("%d %d", &L, &M);
int s[100][2]; //修地铁的区域
int t[10000]={0}; //总线路,默认0 为种树,
for(int i=0; i<M; i++){
scanf("%d %d", &s[i][0], &s[i][1]);
}
// 循环 修地铁的区间, 将对应点修改位 1,
for(int i=0; i<M; i++){
for(int j=s[i][0]; j<=s[i][1]; j++){
if(t[j] == 0){
t[j] = 1;
}
}
}
//重新 循环 总路线, 统计为0的个数,即还有树的, 从[0-L],包含L这个点,
for(int i=0; i<=L; i++){
if(t[i] == 0){
count++;
}
}
printf("%d", count);
return 0;
}

9. 数列的第 m 个数

说明

已知一个数列从第k个数开始,有连续的n个数,不断地循环出现,求其中的第m(m≥k)个数是几?

输入输出格式及样例

输入数据:

第一行两个整数,n,k(0<k≤100,0<n≤30)。

第二行连续的n 个整数,中间用空格隔开,表示从第k 个数开始连续n 个数。

第三行一个整数 m(k≤m≤10^9 )。

5 7

23 7 19 51 6

13

输出数据:输出一个整数,为所求的数字。

7

提示

23 是第 7 个数,数列开始进行 23, 7, 19, 51, 6, 23, 7, 19, 51, 6,…… 的循环,那么第 911 个数就是 6。

参考答案

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

10.折半查找法

说明

大魔导师培根曾经说过:“读史使人明智,读诗使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩。”由此可见书籍的重要性是不言而喻的。而与书籍天天打交道的图书管理员,更是夺天地之造化,吸日月之精华的“神之职业”。据史料记载,魔法世界从古至今诞生的众多不平凡的人物中,有不少人都曾经做过“图书管理员”,如道家学派创始人老子,威软公司创始人比耳、少林藏经阁的扫地神僧等等。所以,作为以马虎自负出名的楚继光,在魔法学院的社会实践活动中又怎么会放过这“天将降大任于斯人也”的必经锻炼呢。但想成为一个合格的图书管理员并不容易,他必须能够在一排(10000以内)已按编号大小排好序的图书中,快速地按编号查找到某本书所在的位置。

输入输出格式及样例

输入数据:输入文件第一行是N,表示有N个元素,第二行是N个按升序排好的数,第三行是M表示要查找的数。

3

2 4 6

4

输出数据:一个数,即如找到该数,则输出位置,否则输出-1

2

参考答案

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
#include<stdio.h>
int main(){
int n,m;
int a[10000];
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d", &a[i]);
}
scanf("%d", &m);
int top=0, bot=n-1, mid;
do{
mid = (top + bot) / 2;
if(m == a[mid]){
printf("%d", mid + 1);
break;
}
else if(m > a[mid]){
top = mid + 1;
}else{
bot = mid - 1;
}
}while(top<=bot);

if(top>bot){
printf("-1");
}
return 0;
}

11. 矩阵交换行

说明

给定一个 5×5 的矩阵(数学上,一个 r×c 的矩阵是一个由 r 行 c 列元素排列成的矩形阵列),将第 n 行和第 m 行交换,输出交换后的结果。

输入输出格式及样例

输入数据:

输入共 6 行,前 5 行为矩阵的每一行元素,元素与元素之间以一个空格分开。
第 6 行包含两个整数 m,n,以一个空格分开。(1≤m,n≤5)

1
2
3
4
5
6
1 2 2 1 2
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
3 0 8 2 4
1 5

输出数据:输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。

1
2
3
4
5
3 0 8 2 4
5 6 7 8 3
9 3 0 5 3
7 2 1 4 6
1 2 2 1 2

参考答案

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

12. 计算鞍点

说明

给定一个 5×5 的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。

鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。

例如:在下面的例子中(第 4 行第 1 列的元素就是鞍点,值为 8)。
11  3  5  6  9
12  4  7  8 10
10  5  6  9 11
 8  6  4  7  2
15 10 11 20 25

输入输出格式及样例

输入数据:输入包含一个 5 行 5 列的矩阵,均为非负整数。

1
2
3
4
5
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25

输出数据:如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出 not found。

4 1 8

参考答案

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
33
34
35
36
37
#include<stdio.h>
int main(){
int a[5][5];
for(int i =0; i<5; i++){
for(int j=0; j<5; j++){
scanf("%d", &a[i][j]);
}
}
int max = a[0][0], row=0, col=0;
int i;
for(i=0; i<5; i++){
for(int j=0; j<5; j++){
if(a[i][j] > max){
max = a[i][j];
row = i;
col = j;
}
}
int k;
for(k=0; k<5; k++){
if(a[k][col]<max){
break;
}
}
if(k>=5){
printf("%d %d %d", row+1, col+1, a[row][col]);
break;
}
row = i+1;
col = 0;
max=a[row][col];
}
if(i>=5){
printf("not found");
}
return 0;
}