PTA-解析
一、判断题
1、在对数组全部元素赋初值时,可以省略行数,但不能省略列数。(T)
2、在C语言中能逐个地使用下标变量,也能一次引用整个数组。(F)
3、以下定义了一个一维数组str,该数组可以存放81个字符型数据。(T)
char str[81];
4、在定义数组之后,根据数组中元素的类型及个数,在内存中分配一段连续存储单元用于存放数组中的各个元素。(T)
5、以下定义了一个二维数组tab,该数组可以存放7个整型数据。(F)
int tab[3][4];
二、单选题
1、组定义为 int a[3][2]={1, 2, 3, 4, 5, 6},数组元素__B__的值为6。(2分)
A.a[3][2] B.a[2][1] C.a[1][2] D.a[2][3]
2、以下数组定义中错误的是(B )。
Aint x[][3]={0};
Bint x[2][3]={{1,2},{3,4},{5,6)};
Cint x[][3]={{1,2,3},(4,5,6)};
Dint x[2][3]={1,2,3,4,5,6};
3、在int a[ ][3] = { {1,4}, {3,2}, {4,5,6}, {0} };
中,a[2][1]
的值是( A)。
- A 5
- B 0
- C 6
- D 2
4、若用数组名作为函数调用时的实参,则实际上传递给形参的是( A)。 - A、数组首地址
- B、数组的第一个元素值
- C、数组中全部元素的值
- D、数组元素的个数
5、假定int类型变量占用两个字节,其有定义:int x[10]={0, 2, 4}; 则数组x在内存中所占字节数是(D) - A 、3
- B、 6
- C、10
- D、20
6、下列程序段的功能是:计算数组x中相邻两个元素的和,依次存放到 a 数组中,然后输出a数组。程序段中待填空的(1)和(2)的正确选项是( C)。
int i;
int a[9], x[10];
for(i = 0; i < 10; i++){
scanf("%d", &x[i]);
}
for( (1) ; i < 10; i++ ) { /* 此处待填空(1) */
a[i-1] = x[i] + (2) ; /* 此处待填空(2) */
}
for(i = 0; i < 9; i++){
printf("%d ",a[i]);
}
printf("\n");
- A、(1)
i = 1
(2)x[i+1]
- B、(1)
i = 0
(2)x[i-1]
- C、(1)
i = 1
(2)x[i-1]
- D、(1)
i = 0
(2)x[i+1]
三、程序填空题
1、下面程序可求出矩阵a的主对角线上的元素(行标和列标相等的元素)之和。
#include <stdio.h>
int main() {
int a[3][3]={1,3,5,7,9,11,13,15,17},sum=0,i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(i==j) //如果是主对角线
sum=sum+a[i][j];
printf("sum=%d",sum);
return 0;
}
2、将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的这n个数。<输出逆序数><函数解法>
#include <stdio.h>
void converse (int a[],int n)
{
int i;
for (i=0;i<n/2;i++)
{
int temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}
}
int main()
{
int a[30];
int i,n;
scanf ("%d",&n);
for (i=0;i<n;i++)
{
scanf ("%c",&a[i]);
}
converse (a,n);
for (i=0;i<n;i++)
{
printf ("%c",a[i]);
}
}
3、本题目要求完成冒泡排序。所谓冒泡排序,是指相邻两个数比较,如果前者比后者大,就交换两个数。等第一轮结束时,最大的数已经冒到数组的最后一个位置,这就是冒泡的由来。第二轮的时候,因为最后一个数已经排好,我们只需要对前面没排好的数进行相邻比较即可。大家会发现,每一轮都会排好一个数,下一轮就可以少比较一次。N个数只需要N-1轮就能排序完毕。
#include <stdio.h>
#define N 10
int main()
{
int a[N],i,j,t;
for(i=0; i<N; i++)
{
scanf ("%d",&a[i]);
}
for(i=0; i<N; i++)
{
for(j=0; j<N-1-i; j++)
{
if(a[j]>a[j+1]) //从小到大进行排序
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=0; i<N; i++)
{
if(i==0)
printf("%d",a[i]);
else
printf(" %d",a[i]);
}
return 0;
}
四、函数
1、 在数组中查找指定元素
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
int search( int list[], int n, int x );
其中list[]
是用户传入的数组;n
(≥0)是list[]
中元素的个数;x
是待查找的元素。如果找到则函数search
返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int search( int list[], int n, int x );
int main()
{
int i, index, n, x;
int a[MAXN];
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
scanf("%d", &x);
index = search( a, n, x );
if( index != -1 )
printf("index = %d\n", index);
else
printf("Not found\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
5
1 2 2 5 4
2
输出样例1:
index = 1
输入样例2:
5
1 2 2 5 4
0
输出样例2:
Not found
答案代码:
int search( int list[], int n, int x )
{
int i;
for(i=0;i<n;i++)
{
if(list[i]==x)
{
return i;
break;
}
}
if(i==n)
{
return -1;
}
}
2、使用函数找出数组中的最大值
本题要求实现一个找出整型数组中最大值的函数。
函数接口定义:
int FindArrayMax( int a[], int n );
其中a
是用户传入的数组,n
是数组a
中元素的个数。函数返回数组a
中的最大值。
#include <stdio.h>
#define MAXN 10
int FindArrayMax( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ ){
scanf("%d", &a[i]);
}
printf("%d\n", FindArrayMax(a, n););
return 0;
}
/* 请在这里填写答案 */
输入样例:
4
20 78 99 -14
输出样例:
99
答案代码
int FindArrayMax( int a[], int n )
{
int i,temp;
int max=a[0];
for (i=1; i<n; i++)
{
if (max<a[i])
{
temp=a[i];
a[i]=max;
max=temp;
}
}
return max;
}
五、编程题
1、本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”
输入格式:
输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。
输出格式:
在一行中输出X的位置,或者“Not Found”。
输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found
答案代码:
<函数解法>
#include <stdio.h>
#define MAXN 20
int search( int list[], int x, int n);
int main()
{
int i, index, n, x;
int a[MAXN];
scanf("%d", &x);
scanf("%d", &n);
for( i = 0; i < n; i++ )
scanf("%d", &a[i]);
index = search( a, n, x );
if( index != -1 )
printf("%d\n", index);
else
printf("Not Found\n");
return 0;
}
int search( int list[], int x, int n )
{
int i;
for(i=0;i<n;i++)
{
if(list[i]==x)
{
return i;
break;
}
}
if(i==n)
{
return -1;
}
}
2、交换最小值和最大值 (15分)
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8
答案代码:
#include <stdio.h>
int main ()
{
int n,i,j,min,max,t,temp;
int a[10];
scanf ("%d",&n);
for (i=0; i<n; i++)
{
scanf ("%d",&a[i]);
}
min=a[0];
max=a[0];
for (i=1; i<n; i++)
{
if (a[i]<min)
{
min=a[i];
}
if (a[i]>max)
{
max=a[i];
}
}
for(i=0; i<n; i++)
{
if(min==a[i])
{
t=a[0];
a[0]=min;
a[i]=t;
}
}
for(i=0; i<n; i++)
{
if(a[i]==max)
{
temp=a[n-1];
a[n-1]=max;
a[i]=temp;
}
}
for (i=0; i<n; i++)
{
printf ("%d ",a[i]);
}
return 0;
}
3、求矩阵各行元素之和
本题要求编写程序,求一个给定的m×n矩阵各行元素之和。
输入格式:
输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间以空格分隔。
输出格式:
每行输出对应矩阵行元素之和。
输入样例:
3 2
6 3
1 -8
3 12
输出样例:
9
-7
15
#include <stdio.h>
int main ()
{
int m,n,i,j;
int sum=0;
scanf ("%d %d",&m,&n);
int a[m][n];
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
scanf ("%d",&a[i][j]);
}
}
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
sum+=a[i][j];
}
printf ("%d\n",sum);
sum=0;
}
return 0;
}