鱼C论坛

 找回密码
 立即注册
查看: 1228|回复: 8

[已解决]为什么不对啊

[复制链接]
发表于 2023-6-4 15:55:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
定义函数 void fun(int *p, int num),将数据num插入在指针p所指向的数组中,主函数中定义并初始化一个降序排列的数组a[10]={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[6]={86,81,78,68,45,35};
    p=&a[0];
    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[6]={86,81,78,68,45,35};
    scanf("%d",&num);
    fun(p,num);
    for(i=0;i<7;i++)
        printf("%d ",a[i]);
}
为什么不对啊 求大神帮忙!!!!!
最佳答案
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[10] = {86, 81, 78, 68, 45, 35};
    scanf("%d", &num);
    fun(a, num);
    for(i = 0; i < 7; i++) {
        printf("%d ", a[i]);
    }
    return 0;
}

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

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-4 15:56:54 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-6-4 15:58 编辑

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

  • 函数 fun 中的数组 a[6] 是一个局部变量,在该函数执行完毕之后就会被自动释放,这样就无法改变主函数中定义的数组 a[10]。
  • 在 fun 函数中虽然计算了插入位置 i,并将 num 放到了 i 位置上,但并没有将 num 的值赋给 p 所指向的数组中。
  • 主函数中传递给 fun 函数的参数 p 没有使用,而是在函数中重新定义了一个数组 a[6],这样就无法修改主函数中定义的数组 a[10]。


综上所述,可以考虑改进代码如下:
#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[10] = {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[10],将其传递给 fun 函数,完成插入操作。在 fun 函数中,首先遍历 p 指向的数组,找到 num 应该插入的位置,然后将 num 插入到数组中,并保证数组仍按降序排列。

需要注意的是,在插入数据时应该从后往前遍历数组,这样才能保证插入后的数组仍按降序排列。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 15:58:27 | 显示全部楼层
你的代码中有几个问题需要注意。首先,你在 `fun` 函数中重新定义了一个数组 `a[6]`,这其实是一个局部变量,跟你在 `main` 函数中定义的数组 `a[6]` 并不是同一个。其次,你在 `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[7] = {86, 81, 78, 68, 45, 35, 0};  // 数组的长度应该为7,为了留出空间给新插入的元素

    scanf("%d", &num);

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

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

    return 0;
}
在这段代码中,`fun` 函数首先找到要插入的位置,然后将这个位置之后的元素都后移一位,最后在正确的位置插入元素。这样做的结果就是,插入元素后,数组仍然是降序的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没转换?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 15:59:40 | 显示全部楼层

手机上不好搞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 16:00:11 | 显示全部楼层

那你是怎么发出“[ i ]”且不被解析的情况下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码块里没有问题吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[10] = {86, 81, 78, 68, 45, 35};
    scanf("%d", &num);
    fun(a, num);
    for(i = 0; i < 7; i++) {
        printf("%d ", a[i]);
    }
    return 0;
}

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

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

通过传入样例输入 15,可以得到样例输出 86 81 78 68 45 35 15。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表