【题解】PTA ---数组--<你想要的都在这里!>

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;
}

  • 17
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值