鱼C论坛

 找回密码
 立即注册
查看: 1290|回复: 19

[已解决]数组元素作为函数的参数

[复制链接]
发表于 2020-8-23 09:06:57 | 显示全部楼层 |阅读模式

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

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

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

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

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

  4. #include <stdio.h>
  5. int main()
  6. {
  7.         int reversal(int x,int n);
  8.         int i,x,a[10] = {9,8,7,6,5,4,3,2,1,0};
  9.         int extern b[10];
  10.         printf("The original array:\n");
  11.         for(i = 0;i < 10;i++)
  12.         {
  13.                 printf("%d ",a[i]);
  14.         }
  15.         printf("\n");
  16.         for (i = 0;i < 10;i++)
  17.         {
  18.                 x = a[i];
  19.                 reversal(x,i);                                         // 数组元素a[i]作为函数的实参
  20.         }
  21.         printf("The reversal array:\n");
  22.         reversal(x,i);
  23. }

  24. int reversal(int x,int i)
  25. {
  26.         int j,b[10] = {0};       
  27.         if (b[0] != 0)
  28.         {
  29.                 b[9 - i] = x;                                     // 赋值赋不进去
  30.         }
  31.         else
  32.         {
  33.                 for (j = 0;j < 10;j++)
  34.                 {
  35.                         printf("%d ",b[j]);
  36.                 }
  37.                 printf("\n");
  38.         }
  39.         return 0;
  40. }


  41. #endif


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

  44. // 已正常运行

  45. #endif


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

  48. // 已正常运行

  49. #endif


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

  52. // 已正常运行

  53. #endif
复制代码

最佳答案
2020-8-23 10:33:03
  1. #include <stdio.h>

  2. //定义全局变量
  3. int b[10] = {0};

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

  8.         printf("The original array:\n");
  9.         for(i = 0;i < 10;i++)
  10.         {
  11.                 printf("%d ",a[i]);
  12.         }
  13.         printf("\n");
  14.         for (i = 0;i < 10;i++)
  15.         {
  16.                 x = a[i];
  17.                 reversal(x,i);                                         // 数组元素a[i]作为函数的实参
  18.         }
  19.         printf("The reversal array:\n");
  20.         reversal(x,i);
  21.        
  22.         return 0;
  23. }

  24. int reversal(int x,int i)
  25. {
  26.         int j;//        int b[10] = {0};
  27.        
  28.         //改变判断条件
  29.         if (i < 10)
  30.         {
  31.                 b[9 - i] = x;                                     // 赋值赋不进去
  32.         }
  33.         else
  34.         {
  35.                 for (j = 0;j < 10;j++)
  36.                 {
  37.                         printf("%d ",b[j]);
  38.                 }
  39.                 printf("\n");
  40.         }
  41.         return 0;
  42. }
复制代码


int extern b[10];
这个声明不是 全局变量,这个叫外部变量
所谓外部变量是指模块之外的变量,也就是定义在别的c/cpp文件里的变量,
在这里用extern 声明一下,就可以拿来用。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-23 09:26:32 | 显示全部楼层
本帖最后由 巴巴鲁 于 2020-8-23 09:38 编辑

不用数组或指针感觉无法完成,b数组在调用完函数时被销毁了
  1. int reversal(int x,int i)
  2. {
  3.         int j,b[10] = {0};        // 你这里把b数组初始为0
  4.         if (b[0] != 0)              // 这个条件不会成立,当然不会赋值了
  5.         {
  6.                 b[9 - i] = x;                                     // 赋值赋不进去
  7.         }
  8.         else
  9.         {
  10.                 for (j = 0;j < 10;j++)
  11.                 {
  12.                         printf("%d ",b[j]);
  13.                 }
  14.                 printf("\n");
  15.         }
  16.         return 0;
  17. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 09:32:40 | 显示全部楼层
本帖最后由 xieglt 于 2020-8-23 09:36 编辑

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

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

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

能说下这个代码要达到什么效果?
数组反转?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 09:42:49 | 显示全部楼层
麻烦说清楚一点,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 09:44:01 | 显示全部楼层
巴巴鲁 发表于 2020-8-23 09:26
不用数组或指针感觉无法完成,b数组在调用完函数时被销毁了

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

将 if...else 去掉,那么,在赋值没有完成的情况下,每调用一次,都会打印一次,结果就是满屏的 0;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

将 if...else 去掉 ...

是的,只有赋值的那个才不会为0,因为程序在进入reversal一次,就会打印一次
我大致明白了,你是想不使用数组或指针来实现数组中的数按相反顺序打印吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 09:50:36 | 显示全部楼层
xieglt 发表于 2020-8-23 09:32
reversal函数里的  b[10]是个临时变量,
出了函数后就不存在了,因此,不是值赋不进去,而是值不能保存。
...

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

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

你说的后面好改,reversal(x,i),这次调用好办,将 i 直接传一个常量即可,但前面不知怎么改。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 09:53:23 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-23 09:42
麻烦说清楚一点,谢谢。

就是不使用数组名和指针,调用 reversal(),完成将10个顺序颠倒
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 09:58:59 | 显示全部楼层
本帖最后由 巴巴鲁 于 2020-8-23 10:00 编辑
  1. #include <stdio.h>
  2. int fun(int num);
  3. int main(void)
  4. {
  5.                 int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  6.                 int i, temp;
  7.                
  8.                 for(i = 0; i < 10; i++)
  9.                 {
  10.                         temp = fun(a[9-i]);
  11.                         printf("%d ", temp);
  12.                 }
  13.                
  14.                 return 0;
  15. }

  16. int fun(int num)
  17. {
  18.                 int x;
  19.                
  20.                 x = num;
  21.                
  22.                 return x;
  23.                //其实直接返回num就行了
  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不可能。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 10:13:58 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-8-23 10:15 编辑


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

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

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

  4. #include <stdio.h>
  5. int main()
  6. {
  7.         int reversal(int x,int n);
  8.         int i,x,a[10] = {9,8,7,6,5,4,3,2,1,0};
  9.         int extern b[10];
  10.         printf("The original array:\n");
  11.         for(i = 0;i < 10;i++)
  12.         {
  13.                 printf("%d ",a[i]);
  14.         }
  15.         printf("\n");
  16.         for (i = 0;i < 10;i++)
  17.         {
  18.                 x = a[i];
  19.                 reversal(x,i);                                         // 数组元素a[i]作为函数的实参
  20.         }
  21.         printf("The reversal array:\n");
  22.         reversal(x,i);
  23. }

  24. int reversal(int x,int i)
  25. {
  26.         int j,b[10] = {0};       
  27.         if (b[0] != 0)
  28.         {
  29.                 b[9 - i] = x;
  30.         }
  31.         else
  32.         {
  33.                 for (j = 0;j < 10;j++)
  34.                 {
  35.                         printf("%d ",b[j]);
  36.                 }
  37.                 printf("\n");
  38.         }
  39.         return 0;
  40. }


  41. #endif


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

  44. #include <stdio.h>
  45. int main()
  46. {
  47.         void reversal(int x[],int n);
  48.         int i,a[10] = {9,8,7,6,5,4,3,2,1,0};
  49.         printf("The original array:\n");
  50.         for(i = 0;i < 10;i++)
  51.         {
  52.                 printf("%d ",a[i]);
  53.         }
  54.         printf("\n");
  55.         reversal(a,10);                                         // 数组名 a 作为函数的实参
  56.         printf("The reversal array:\n");
  57.         for(i = 0;i < 10;i++)
  58.                 printf("%d ",a[i]);
  59.         printf("\n");
  60.         return 0;
  61. }

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


  73. #endif


  74. // 主程序使用数组名,函数使用指针
  75. #if(0)
  76. #include <stdio.h>
  77. int main()
  78. {
  79.         void reversal(int *x,int n);
  80.         int i,a[10] = {9,8,7,6,5,4,3,2,1,0};
  81.         printf("The original array:\n");
  82.         for(i = 0;i < 10;i++)
  83.         {
  84.                 printf("%d ",a[i]);
  85.         }
  86.         printf("\n");
  87.         reversal(a,10);
  88.         printf("The reversal array:\n");
  89.         for(i = 0;i < 10;i++)
  90.         {
  91.                 printf("%d ",a[i]);
  92.         }
  93.         printf("\n");
  94.         return 0;
  95. }

  96. void reversal(int *x,int n)
  97. {
  98.         int *p,temp,*i,*j,m = (n - 1) / 2;
  99.         i = x;
  100.         j = x + n - 1;
  101.         p = x + m;
  102.         for(;i <= p;i++,j--)
  103.         {
  104.                 temp = *i;
  105.                 *i = *j;
  106.                 *j = temp;
  107.         }
  108. }


  109. #endif


  110. // 主程序与函数均使用指针
  111. #if(0)
  112. #include <stdio.h>
  113. int main()
  114. {
  115.         void reversal(int *x,int n);
  116.         int i,a[10] = {9,8,7,6,5,4,3,2,1,0};
  117.         int *p = a;
  118.         printf("The original array:\n");
  119.         for(i = 0;i < 10;i++)
  120.         {
  121.                 printf("%d ",*p++);
  122.         }
  123.         printf("\n");
  124.         p = a;
  125.         reversal(p,10);
  126.         printf("The reversal array:\n");
  127.         for(p = a;p < a + 10;p++)
  128.                 printf("%d ",*p);
  129.         printf("\n");
  130.         return 0;
  131. }

  132. void reversal(int *x,int n)
  133. {
  134.         int *p,temp,*i,*j,m = (n - 1) / 2;
  135.         i = x;
  136.         j = x + n - 1;
  137.         p = x + m;
  138.         for(;i <= p;i++,j--)
  139.         {
  140.                 temp = *i;
  141.                 *i = *j;
  142.                 *j = temp;
  143.         }
  144. }


  145. #endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的描述乱七八糟。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 10:22:41 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-8-23 10:26 编辑


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

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

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  5.         int i;
  6.                
  7.         printf("The original array:\n");
  8.         for(i = 0;i < 10;i++)
  9.         {
  10.                 printf("%d ",a[i]);
  11.         }
  12.         printf("\n");
  13.         printf("The reversal array:\n");
  14.         for(i = 9;i >= 0;i--)
  15.                 printf("%d ",a[i]);
  16.         printf("\n");
  17. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 10:29:27 | 显示全部楼层
风过无痕1989 发表于 2020-8-23 10:22
你这有点掩耳盗铃的意思哈~~~

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

我怎么没想到还能这样,学到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 10:31:17 | 显示全部楼层

我用清楚的描述,你回复说“不可能”,我将的我问题连同已经解决了的问题一起发,又是乱七八糟的,我真的不知道该怎么描述了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 10:33:03 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>

  2. //定义全局变量
  3. int b[10] = {0};

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

  8.         printf("The original array:\n");
  9.         for(i = 0;i < 10;i++)
  10.         {
  11.                 printf("%d ",a[i]);
  12.         }
  13.         printf("\n");
  14.         for (i = 0;i < 10;i++)
  15.         {
  16.                 x = a[i];
  17.                 reversal(x,i);                                         // 数组元素a[i]作为函数的实参
  18.         }
  19.         printf("The reversal array:\n");
  20.         reversal(x,i);
  21.        
  22.         return 0;
  23. }

  24. int reversal(int x,int i)
  25. {
  26.         int j;//        int b[10] = {0};
  27.        
  28.         //改变判断条件
  29.         if (i < 10)
  30.         {
  31.                 b[9 - i] = x;                                     // 赋值赋不进去
  32.         }
  33.         else
  34.         {
  35.                 for (j = 0;j < 10;j++)
  36.                 {
  37.                         printf("%d ",b[j]);
  38.                 }
  39.                 printf("\n");
  40.         }
  41.         return 0;
  42. }
复制代码


int extern b[10];
这个声明不是 全局变量,这个叫外部变量
所谓外部变量是指模块之外的变量,也就是定义在别的c/cpp文件里的变量,
在这里用extern 声明一下,就可以拿来用。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  21. int reversal(int x, int i)
  22. {
  23.     int j;
  24.     static int b[10] = { 0 };
  25.     if (i != 9)
  26.     {
  27.         b[9 - i] = x;                                     // 赋值赋不进去
  28.     }
  29.     else
  30.     {
  31.         for (j = 0; j < 10; j++)
  32.         {
  33.             printf("%d ", b[j]);
  34.         }
  35.         printf("\n");
  36.     }
  37.     return 0;
  38. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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) 这个判断,不符合时,就直接打印出结果了

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

  18. }

  19. int reversal(int x, int i)
  20. {
  21.     int j;
  22.     static int b[10] = { 0 };
  23.     if (i != 9)
  24.     {
  25.         b[9 - i] = x;
  26.     }
  27.     else
  28.     {
  29.         printf("The reversal array:\n");
  30.         for (j = 0; j < 10; j++)
  31.         {
  32.             printf("%d ", b[j]);
  33.         }
  34.         printf("\n");
  35.     }
  36.     return 0;
  37. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-23 11:53:19 | 显示全部楼层
xieglt 发表于 2020-8-23 10:33
int extern b[10];
这个声明不是 全局变量,这个叫外部变量
所谓外部变量是指模块之外的变量,也就 ...

我想到了用全局变量,结果却设置成了外部变量,谢谢指教!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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