mo_on 发表于 2023-6-4 15:55:50

为什么不对啊

定义函数 void fun(int *p, int num),将数据num插入在指针p所指向的数组中,主函数中定义并初始化一个降序排列的数组a={86,81,78,68,45,35},输入整数num,调用函数完成插入操作,输出插入数据后的数组,输出格式:"%d "
要求插入完成后,数组仍按降序排列。
【输入形式】
num
【输出形式】
插入后数组
【样例输入】

15

【样例输出】

86 81 78 68 45 35 15
#include <stdio.h>

void fun(int *p, int num)
{
    int i,j;
    int a={86,81,78,68,45,35};
    p=&a;
    for(i=0;i<6;i++)
    {
      if(num>*(p+i))
            break;
    }
    for(j=i;j<7;j++)
    {
    *(p+j+1)=*(p+j);
    }
    num=*(p+i);

}
int main()
{
    int i,num,*p;
    int a={86,81,78,68,45,35};
    scanf("%d",&num);
    fun(p,num);
    for(i=0;i<7;i++)
      printf("%d ",a);
}
为什么不对啊 求大神帮忙!!!!!

歌者文明清理员 发表于 2023-6-4 15:56:54

本帖最后由 歌者文明清理员 于 2023-6-4 15:58 编辑

这道题目的代码中存在几个问题:


[*]函数 fun 中的数组 a 是一个局部变量,在该函数执行完毕之后就会被自动释放,这样就无法改变主函数中定义的数组 a。

[*]在 fun 函数中虽然计算了插入位置 i,并将 num 放到了 i 位置上,但并没有将 num 的值赋给 p 所指向的数组中。

[*]主函数中传递给 fun 函数的参数 p 没有使用,而是在函数中重新定义了一个数组 a,这样就无法修改主函数中定义的数组 a。


综上所述,可以考虑改进代码如下:

#include <stdio.h>

void fun(int *p, int num) {
    int i, j;
    // 在p指向的数组中找到num应该插入的位置
    for (i = 0; i < 10; i++) {
      if (num > *(p + i)) {
            break;
      }
    }
    // 将num插入到p指向的数组中
    for (j = 9; j > i; j--) {
      *(p + j) = *(p + j - 1);
    }
    *(p + i) = num;
}

int main() {
    int a = {86, 81, 78, 68, 45, 35};
    int num, i;
    scanf("%d", &num);
    fun(a, num);   // 将num插入到a指向的数组中
    for (i = 0; i < 10; i++) {
      printf("%d ", *(a + i));
    }
    return 0;
}
主函数中定义了一个降序排列的整型数组 a,将其传递给 fun 函数,完成插入操作。在 fun 函数中,首先遍历 p 指向的数组,找到 num 应该插入的位置,然后将 num 插入到数组中,并保证数组仍按降序排列。

需要注意的是,在插入数据时应该从后往前遍历数组,这样才能保证插入后的数组仍按降序排列。

isdkz 发表于 2023-6-4 15:58:27

你的代码中有几个问题需要注意。首先,你在 `fun` 函数中重新定义了一个数组 `a`,这其实是一个局部变量,跟你在 `main` 函数中定义的数组 `a` 并不是同一个。其次,你在 `fun` 函数中将 `p` 的值改变了,它并没有真正的指向 `main` 函数中的数组 `a`。此外,你在 `fun` 函数中的插入元素操作也有问题。

下面的代码应该可以帮助你完成你想做的事情:


#include <stdio.h>

// 函数接收一个指针和一个整数,插入整数到指针所指向的数组
void fun(int *p, int num) {
    int i, j;

    // 寻找插入位置
    for (i = 0; i < 6; i++) {
      if (num > *(p + i)) {
            break;
      }
    }

    // 后移元素以腾出空间
    for (j = 6; j > i; j--) {
      *(p + j) = *(p + j - 1);
    }

    // 插入元素
    *(p + i) = num;
}

int main() {
    int i, num;
    int a = {86, 81, 78, 68, 45, 35, 0};// 数组的长度应该为7,为了留出空间给新插入的元素

    scanf("%d", &num);

    // 将数组的首地址传递给函数
    fun(a, num);

    // 打印插入后的数组
    for (i = 0; i < 7; i++) {
      printf("%d ", a);
    }

    return 0;
}

在这段代码中,`fun` 函数首先找到要插入的位置,然后将这个位置之后的元素都后移一位,最后在正确的位置插入元素。这样做的结果就是,插入元素后,数组仍然是降序的。

歌者文明清理员 发表于 2023-6-4 15:58:52

isdkz 发表于 2023-6-4 15:58
你的代码中有几个问题需要注意。首先,你在 `fun` 函数中重新定义了一个数组 `a`,这其实是一个局部变量 ...

没转换?

isdkz 发表于 2023-6-4 15:59:40

歌者文明清理员 发表于 2023-6-4 15:58
没转换?

手机上不好搞{:10_277:}

歌者文明清理员 发表于 2023-6-4 16:00:11

isdkz 发表于 2023-6-4 15:59
手机上不好搞

那你是怎么发出“[ i ]”且不被解析的情况下

isdkz 发表于 2023-6-4 16:32:12

歌者文明清理员 发表于 2023-6-4 16:00
那你是怎么发出“[ i ]”且不被解析的情况下

代码块里没有问题吧

sfqxx 发表于 2023-6-4 17:54:57

你的代码出现了几个问题,我来帮你分析一下:

1. 在 `fun` 函数中重新定义了数组 `a`,并将指针 `p` 指向了数组的首元素,这样是不对的,因为指针 `p` 已经指向了传递进来的数组 `a`,不应该再重新定义一个新的数组;

2. 在 `fun` 函数中,当找到插入位置后,应该将 `num` 插入到数组中,并且需要退出循环;

3. 在 `main` 函数中,应该调用 `fun` 函数来完成插入操作,而不是直接对数组进行操作。

下面是修改后的代码供你参考:


#include <stdio.h>

void fun(int *p, int num) {
    int i, j;
    for(i = 0; i < 6; i++) {
      if(num > *(p+i)) {
            break;
      }
    }
    for(j = 6; j > i; j--) {
      *(p+j) = *(p+j-1);
    }
    *(p+i) = num;
}

int main() {
    int i, num, a = {86, 81, 78, 68, 45, 35};
    scanf("%d", &num);
    fun(a, num);
    for(i = 0; i < 7; i++) {
      printf("%d ", a);
    }
    return 0;
}

注意,我们在 `main` 函数中调用了 `fun` 函数来完成插入操作,并且传递了数组 `a` 的首地址作为参数。在 `fun` 函数中,我们遍历数组找到插入位置,并将数组后面的元素依次向后移动一位,然后将 `num` 插入到相应位置上。最后输出插入后的数组即可。

求最佳答案{:10_254:}

陶远航 发表于 2023-6-4 19:33:34

你的代码中,定义了函数 fun 来完成将数字 num 插入到指针 p 所指向的数组中,但是在该函数内部,你重新定义了一个名为 a 的数组,并将指针 p 指向了该数组的第一个元素。这就导致在函数执行过程中,指针 p 指向的数组与主函数中的数组 a 并不是同一个数组,因此在主函数中输出 a 的元素时,并没有插入新数字的操作。

另外,在函数中,你使用了一个循环来找到新数字需要插入的位置,并使用了另一个循环将该位置后面的元素都向后移动一位。但是在移动的过程中,你并没有将新数字 num 插入到数组中。

下面是改正后的另一份代码,可供参考:

#include <stdio.h>

void fun(int *p, int num)
{
    int i, j;
    for (i = 0; *(p + i) > num && i < 6; i++);
    for (j = 5; j > i; j--)
      *(p + j) = *(p + j - 1);
    *(p + i) = num;
}

int main()
{
    int i, num, a = {86, 81, 78, 68, 45, 35};
    scanf("%d", &num);
    fun(a, num);
    for (i = 0; i < 7; i++)
      printf("%d ", a);
    return 0;
}
在上述代码中,主函数定义了一个名为 a 的降序排列的数组,并将其作为参数传递给函数 fun。函数中使用了两个循环,第一个循环用于寻找插入位置,并使用了指针运算来访问数组元素;第二个循环用于将插入位置后面的元素都向后移动一位,最后将新数字插入到指定的位置。

通过传入样例输入 15,可以得到样例输出 86 81 78 68 45 35 15。
页: [1]
查看完整版本: 为什么不对啊