我正在为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
答案 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--;
}
}
}