为什么不对啊
定义函数 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: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 插入到数组中,并保证数组仍按降序排列。
需要注意的是,在插入数据时应该从后往前遍历数组,这样才能保证插入后的数组仍按降序排列。 你的代码中有几个问题需要注意。首先,你在 `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` 函数首先找到要插入的位置,然后将这个位置之后的元素都后移一位,最后在正确的位置插入元素。这样做的结果就是,插入元素后,数组仍然是降序的。 isdkz 发表于 2023-6-4 15:58
你的代码中有几个问题需要注意。首先,你在 `fun` 函数中重新定义了一个数组 `a`,这其实是一个局部变量 ...
没转换? 歌者文明清理员 发表于 2023-6-4 15:58
没转换?
手机上不好搞{:10_277:} isdkz 发表于 2023-6-4 15:59
手机上不好搞
那你是怎么发出“[ i ]”且不被解析的情况下 歌者文明清理员 发表于 2023-6-4 16:00
那你是怎么发出“[ i ]”且不被解析的情况下
代码块里没有问题吧 你的代码出现了几个问题,我来帮你分析一下:
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:} 你的代码中,定义了函数 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]