风过无痕1989 发表于 2020-8-23 09:06:57

数组元素作为函数的参数

下面的程序不能达到预期目的,b 数组赋值赋不进去,请帮修改,注意:不要使用数组名及指针,谢谢!

// 将数组a中的n个整数按相反顺序存放。

// 用数组元素作函数的参数
#if(1)

#include <stdio.h>
int main()
{
        int reversal(int x,int n);
        int i,x,a = {9,8,7,6,5,4,3,2,1,0};
        int extern b;
        printf("The original array:\n");
        for(i = 0;i < 10;i++)
        {
                printf("%d ",a);
        }
        printf("\n");
        for (i = 0;i < 10;i++)
        {
                x = a;
                reversal(x,i);                                       // 数组元素a作为函数的实参
        }
        printf("The reversal array:\n");
        reversal(x,i);
}

int reversal(int x,int i)
{
        int j,b = {0};       
        if (b != 0)
        {
                b = x;                                     // 赋值赋不进去
        }
        else
        {
                for (j = 0;j < 10;j++)
                {
                        printf("%d ",b);
                }
                printf("\n");
        }
        return 0;
}


#endif


// 用数组名做函数的参数
#if(0)

// 已正常运行

#endif


// 主程序使用数组名,函数使用指针
#if(0)

// 已正常运行

#endif


// 主程序与函数均使用指针
#if(0)

// 已正常运行

#endif

巴巴鲁 发表于 2020-8-23 09:26:32

本帖最后由 巴巴鲁 于 2020-8-23 09:38 编辑

不用数组或指针感觉无法完成,b数组在调用完函数时被销毁了
int reversal(int x,int i)
{
      int j,b = {0};      // 你这里把b数组初始为0
      if (b != 0)            // 这个条件不会成立,当然不会赋值了
      {
                b = x;                                     // 赋值赋不进去
      }
      else
      {
                for (j = 0;j < 10;j++)
                {
                        printf("%d ",b);
                }
                printf("\n");
      }
      return 0;
}

xieglt 发表于 2020-8-23 09:32:40

本帖最后由 xieglt 于 2020-8-23 09:36 编辑

reversal函数里的b是个临时变量,
出了函数后就不存在了,因此,不是值赋不进去,而是值不能保存。
不用指针或数组做函数参数,可能考虑用全局变量

另外,函数里的判断逻辑错了。
if (b != 0)
b所有元素初始化都是0,b的值总是0,因此这个判断总是执行else
所以可能应该是if (b == 0) 或者别的什么。

主函数最后这个调用也有问题。
printf("The reversal array:\n");
reversal(x,i);
经过上面的循环,这个时候 i 的值已经是10了
传进函数里,肯定是不对的。

能说下这个代码要达到什么效果?
数组反转?

永恒的蓝色梦想 发表于 2020-8-23 09:42:49

麻烦说清楚一点,谢谢。

风过无痕1989 发表于 2020-8-23 09:44:01

巴巴鲁 发表于 2020-8-23 09:26
不用数组或指针感觉无法完成,b数组在调用完函数时被销毁了

这里是问题之一,每调用一次,就赋一次初值,能想到的办法都试了,不知如何处理;

将 if...else 去掉,那么,在赋值没有完成的情况下,每调用一次,都会打印一次,结果就是满屏的 0;

巴巴鲁 发表于 2020-8-23 09:49:56

风过无痕1989 发表于 2020-8-23 09:44
这里是问题之一,每调用一次,就赋一次初值,能想到的办法都试了,不知如何处理;

将 if...else 去掉 ...

是的,只有赋值的那个才不会为0,因为程序在进入reversal一次,就会打印一次
我大致明白了,你是想不使用数组或指针来实现数组中的数按相反顺序打印吗?

风过无痕1989 发表于 2020-8-23 09:50:36

xieglt 发表于 2020-8-23 09:32
reversal函数里的b是个临时变量,
出了函数后就不存在了,因此,不是值赋不进去,而是值不能保存。
...

我已经在主函数里用了全局变量,可是到了 reversal 函数里,好像还是不认;

if (b != 0),这里也是关键,b的初始化问题,不知怎么解决;

你说的后面好改,reversal(x,i),这次调用好办,将 i 直接传一个常量即可,但前面不知怎么改。

风过无痕1989 发表于 2020-8-23 09:51:44

巴巴鲁 发表于 2020-8-23 09:49
是的,只有赋值的那个才不会为0,因为程序在进入reversal一次,就会打印一次
我大致明白了,你是想不使 ...

风过无痕1989 发表于 2020-8-23 09:53:23

永恒的蓝色梦想 发表于 2020-8-23 09:42
麻烦说清楚一点,谢谢。

就是不使用数组名和指针,调用 reversal(),完成将10个顺序颠倒

巴巴鲁 发表于 2020-8-23 09:58:59

本帖最后由 巴巴鲁 于 2020-8-23 10:00 编辑

#include <stdio.h>
int fun(int num);
int main(void)
{
                int a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
                int i, temp;
               
                for(i = 0; i < 10; i++)
                {
                        temp = fun(a);
                        printf("%d ", temp);
                }
               
                return 0;
}

int fun(int num)
{
                int x;
               
                x = num;
               
                return x;
               //其实直接返回num就行了
}

永恒的蓝色梦想 发表于 2020-8-23 10:01:39

风过无痕1989 发表于 2020-8-23 09:53
就是不使用数组名和指针,调用 reversal(),完成将10个顺序颠倒

不可能。

风过无痕1989 发表于 2020-8-23 10:13:58

本帖最后由 风过无痕1989 于 2020-8-23 10:15 编辑

永恒的蓝色梦想 发表于 2020-8-23 10:01
不可能。

我做这个题的目的就是想对数组作为函数的参数作一个总结,下面是我整个的程序:

// 将数组a中的n个整数按相反顺序存放。

// 用数组元素作函数的参数
#if(1)

#include <stdio.h>
int main()
{
        int reversal(int x,int n);
        int i,x,a = {9,8,7,6,5,4,3,2,1,0};
        int extern b;
        printf("The original array:\n");
        for(i = 0;i < 10;i++)
        {
                printf("%d ",a);
        }
        printf("\n");
        for (i = 0;i < 10;i++)
        {
                x = a;
                reversal(x,i);                                       // 数组元素a作为函数的实参
        }
        printf("The reversal array:\n");
        reversal(x,i);
}

int reversal(int x,int i)
{
        int j,b = {0};       
        if (b != 0)
        {
                b = x;
        }
        else
        {
                for (j = 0;j < 10;j++)
                {
                        printf("%d ",b);
                }
                printf("\n");
        }
        return 0;
}


#endif


// 用数组名做函数的参数
#if(0)

#include <stdio.h>
int main()
{
        void reversal(int x[],int n);
        int i,a = {9,8,7,6,5,4,3,2,1,0};
        printf("The original array:\n");
        for(i = 0;i < 10;i++)
        {
                printf("%d ",a);
        }
        printf("\n");
        reversal(a,10);                                       // 数组名 a 作为函数的实参
        printf("The reversal array:\n");
        for(i = 0;i < 10;i++)
                printf("%d ",a);
        printf("\n");
        return 0;
}

void reversal(int x[],int n)
{
        int temp,i,j,m = (n - 1) / 2;        // 循环一次掉换两个数组元素,故循环次数需减半,不然掉换好的数组,又被掉回去了
        for(i = 0;i <= m;i++)
        {
                j = n - 1 - i;
                temp = x;
                x = x;
                x = temp;
        }
}


#endif


// 主程序使用数组名,函数使用指针
#if(0)
#include <stdio.h>
int main()
{
        void reversal(int *x,int n);
        int i,a = {9,8,7,6,5,4,3,2,1,0};
        printf("The original array:\n");
        for(i = 0;i < 10;i++)
        {
                printf("%d ",a);
        }
        printf("\n");
        reversal(a,10);
        printf("The reversal array:\n");
        for(i = 0;i < 10;i++)
        {
                printf("%d ",a);
        }
        printf("\n");
        return 0;
}

void reversal(int *x,int n)
{
        int *p,temp,*i,*j,m = (n - 1) / 2;
        i = x;
        j = x + n - 1;
        p = x + m;
        for(;i <= p;i++,j--)
        {
                temp = *i;
                *i = *j;
                *j = temp;
        }
}


#endif


// 主程序与函数均使用指针
#if(0)
#include <stdio.h>
int main()
{
        void reversal(int *x,int n);
        int i,a = {9,8,7,6,5,4,3,2,1,0};
        int *p = a;
        printf("The original array:\n");
        for(i = 0;i < 10;i++)
        {
                printf("%d ",*p++);
        }
        printf("\n");
      p = a;
        reversal(p,10);
        printf("The reversal array:\n");
        for(p = a;p < a + 10;p++)
                printf("%d ",*p);
        printf("\n");
        return 0;
}

void reversal(int *x,int n)
{
        int *p,temp,*i,*j,m = (n - 1) / 2;
        i = x;
        j = x + n - 1;
        p = x + m;
        for(;i <= p;i++,j--)
        {
                temp = *i;
                *i = *j;
                *j = temp;
        }
}


#endif

永恒的蓝色梦想 发表于 2020-8-23 10:20:18

风过无痕1989 发表于 2020-8-23 10:13
我做这个题的目的就是想对数组作为函数的参数作一个总结,下面是我整个的程序:

你的描述乱七八糟。

风过无痕1989 发表于 2020-8-23 10:22:41

本帖最后由 风过无痕1989 于 2020-8-23 10:26 编辑

巴巴鲁 发表于 2020-8-23 09:58


你这有点掩耳盗铃的意思哈~~~

我在网上看到一个比这个更直接的

#include <stdio.h>

int main()
{
        int a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int i;
               
      printf("The original array:\n");
      for(i = 0;i < 10;i++)
      {
                printf("%d ",a);
      }
      printf("\n");
      printf("The reversal array:\n");
      for(i = 9;i >= 0;i--)
                printf("%d ",a);
      printf("\n");
}

巴巴鲁 发表于 2020-8-23 10:29:27

风过无痕1989 发表于 2020-8-23 10:22
你这有点掩耳盗铃的意思哈~~~

我在网上看到一个比这个更直接的

我怎么没想到还能这样,学到了{:10_254:}

风过无痕1989 发表于 2020-8-23 10:31:17

永恒的蓝色梦想 发表于 2020-8-23 10:20
你的描述乱七八糟。

我用清楚的描述,你回复说“不可能”,我将的我问题连同已经解决了的问题一起发,又是乱七八糟的,我真的不知道该怎么描述了

xieglt 发表于 2020-8-23 10:33:03

#include <stdio.h>

//定义全局变量
int b = {0};

int main()
{
        int reversal(int x,int n);
        int i,x,a = {9,8,7,6,5,4,3,2,1,0};

        printf("The original array:\n");
        for(i = 0;i < 10;i++)
        {
                printf("%d ",a);
        }
        printf("\n");
        for (i = 0;i < 10;i++)
        {
                x = a;
                reversal(x,i);                                       // 数组元素a作为函数的实参
        }
        printf("The reversal array:\n");
        reversal(x,i);
       
        return 0;
}

int reversal(int x,int i)
{
        int j;//        int b = {0};
       
      //改变判断条件
        if (i < 10)
        {
                b = x;                                     // 赋值赋不进去
        }
        else
        {
                for (j = 0;j < 10;j++)
                {
                        printf("%d ",b);
                }
                printf("\n");
        }
        return 0;
}


int extern b;
这个声明不是 全局变量,这个叫外部变量
所谓外部变量是指模块之外的变量,也就是定义在别的c/cpp文件里的变量,
在这里用extern 声明一下,就可以拿来用。

永恒的蓝色梦想 发表于 2020-8-23 10:38:45

风过无痕1989 发表于 2020-8-23 10:31
我用清楚的描述,你回复说“不可能”,我将的我问题连同已经解决了的问题一起发,又是乱七八糟的,我真的 ...

我只能说,你的这个想法就很神奇……我一度以为我理解错了{:10_277:}#include <stdio.h>
int main()
{
    int reversal(int x, int n);
    int i, x, a = { 9,8,7,6,5,4,3,2,1,0 };
    int extern b;
    printf("The original array:\n");
    for (i = 0; i < 10; i++)
    {
      printf("%d ", a);
    }
    printf("\n");
    for (i = 0; i < 10; i++)
    {
      x = a;
      reversal(x, i);                                       // 数组元素a作为函数的实参
    }
    printf("The reversal array:\n");
    reversal(x, i);
}

int reversal(int x, int i)
{
    int j;
    static int b = { 0 };
    if (i != 9)
    {
      b = x;                                     // 赋值赋不进去
    }
    else
    {
      for (j = 0; j < 10; j++)
      {
            printf("%d ", b);
      }
      printf("\n");
    }
    return 0;
}

风过无痕1989 发表于 2020-8-23 11:51:16

永恒的蓝色梦想 发表于 2020-8-23 10:38
我只能说,你的这个想法就很神奇……我一度以为我理解错了

我运行了,程序可以达到目的,但有一个小问题,输出结果是这样的:

The original array:
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
The reversal array:
Press any key to continue

因此需要将18行调到32行之前,19行也失去调用的意义了,因为   if (i != 9) 这个判断,不符合时,就直接打印出结果了

#include <stdio.h>
int main()
{
    int reversal(int x, int n);
    int i, x, a = { 9,8,7,6,5,4,3,2,1,0 };
    int extern b;
    printf("The original array:\n");
    for (i = 0; i < 10; i++)
    {
      printf("%d ", a);
    }
    printf("\n");
    for (i = 0; i < 10; i++)
    {
      x = a;
      reversal(x, i);                      // 数组元素a作为函数的实参
    }

}

int reversal(int x, int i)
{
    int j;
    static int b = { 0 };
    if (i != 9)
    {
      b = x;
    }
    else
    {
        printf("The reversal array:\n");
      for (j = 0; j < 10; j++)
      {
            printf("%d ", b);
      }
      printf("\n");
    }
    return 0;
}


风过无痕1989 发表于 2020-8-23 11:53:19

xieglt 发表于 2020-8-23 10:33
int extern b;
这个声明不是 全局变量,这个叫外部变量
所谓外部变量是指模块之外的变量,也就 ...

我想到了用全局变量,结果却设置成了外部变量,谢谢指教!
页: [1]
查看完整版本: 数组元素作为函数的参数