关于数组和指针以及插入排序的考试问题

时间:2015-03-05 23:30:34

标签: arrays pointers output

我正在为C编程简介做一些练习考试,我遇到了两个问题,我无法理解该程序的输出。

问题1:

以下程序的输出是什么?

#include <stdio.h>
#define N 8

void fun(int *x,int i) {
*x=*(x+i);
}
void main() {
int a[N]={1,2,3,4,5,6,7,8},i;
fun(a,2);
for(i=0;i<N/2;i++)
printf("%d",a[i]);
printf("\n");
}

a) 1234    
b) 1313    
c) 2234    
d) 3232   
e) 3234 (right answer)

问题2:

以下程序尝试使用插入排序按升序对数组进行排序。它不能按预期工作。它产生了什么输出?

#include <stdio.h>
void insertionSort(int a[], int n){
    int i, j, value;

for(i=0; i<n;i++) {
value = a[i];
j = i-1;

    while(j>=0 && a[j]>value) {
    a[j+1]=a[j];
    j--;
    }
a[i+1]=value;
}
}

int main() {
int i,a[]={2,7,6,3,1,9,5,4,8};
insertionSort(a, 9);

for(i=0; i<9; i++)
printf (" %d ",a[i]);
return 0;
}

a) 9 8 7 6 5 4 3 2 1   
b) 2 2 7 7 7 7 7 9 9    
c) 2 2 7 7 1 9 9 4 8    
d) 2 2 2 2 2 2 2 2 2 (right answer)    
e) 1 1 2 3 4 5 6 7 8

1 个答案:

答案 0 :(得分:0)

fun 函数中的第一个问题中,设置[0]以使用指针获取[0 + i]的值(使用此命令 * x = *(x + i); 你特别要求数组的头部指向头部的地址加上2个更多的是[2]。这就是为什么a [0]变成[2],所以a [0] = 3,并且数组的其余部分保持不变。

至于你的下一个任务,问题是在insertSort中,第一次迭代中[1]的值将被 value 替换,因此所有下一个while循环都将为false并且因此,只执行命令 a [i + 1] = value; 并将所有元素值设置为2.如果删除此命令,您仍然无法获得正确的排序,因为#39;在while循环中也存在问题。我只会在这里发布一个右插入的例子:

#include <stdio.h>
void insertionSort(int a[], int n){
    int i, j, value,t;

    for(i=0; i<n;i++) {
            value = a[i];
            j = i-1;

            while(j>=0 && a[j]>value) {
                        t=a[j+1];
                        a[j+1]=a[j];
                        a[j]=t;
                        j--;
                }

    }
}