鱼C论坛

 找回密码
 立即注册
查看: 1167|回复: 2

[已解决]求助 C语言 关于数组的移动

[复制链接]
发表于 2019-2-21 20:47:36 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 我是个汉子 于 2019-2-21 20:58 编辑

  1. 好像移动有问题,但我没有找出来
  2. /*-------------------------------------------------------
  3. 【程序设计】
  4. ---------------------------------------------------------

  5. 题目:找出二维整型数组a[4][4]中每行元素的最大值,并将该元
  6.       素移动至该行首列。

  7. 编写程序:
  8.       1、编写void findmax(int a[][N], int n[])函数:找出
  9.          二维数组a中每行元素的最大值,并将该元素的列下标
  10.          存入数组n中,即第0行元素最大值的列下标存入n[0],
  11.          ...,第3行元素最大值的列下标存入n[3]。

  12.       2、编写void move(int a[][N],int n[])函数:根据数组
  13.          n中保存的数据,将a数组中每行最大值元素移动到该
  14.          行首列,要求移动后该元素与该行其他元素的相对位
  15.          置不变。

  16. 例如:
  17.       a数组的初始数据为:
  18.          -2  13   6    9
  19.          25   4   0   11
  20.          -8   3  10   16
  21.          4    7   5   20

  22.       经过处理后a数组中数据为:
  23.          13   6   9   -2
  24.          25   4   0   11
  25.          16  -8   3   10
  26.          20   4   7    5

  27. ---------------------------------------------------------
  28. 注意:请勿改动主函数main()中的任何语句。
  29. -------------------------------------------------------*/

  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #define N 4
  33. void findmax(int a[][N], int n[]){
  34. /**********Program**********/
  35. int i,j,k,max;
  36. for(i=0; i<N; i++)
  37. {
  38.         max=0;
  39.         for(j=0; j<N; j++)
  40.         {
  41.                 if(max<a[i][j])
  42.                 {
  43.                         max=a[i][j];
  44.                         n[i]=j;
  45.                 }
  46.         }
  47. }
  48. /**********  End  **********/
  49. }
  50. void move(int a[][N],int n[]){  //  0   1   2    3
  51. /**********Program**********/   // -2  13   6    9
  52. int i,j,k;
  53. for(i=0; i<N; i++)
  54. {
  55.         while(a[i][0] != a[i][n[i]])
  56.         {
  57.                 k=a[i][0];
  58.                 for(j=0; j<N-1; j++)
  59.                         a[i][j]=a[i][j+1];
  60.                 a[i][N-1]=k;        
  61.         }
  62. }
  63. /**********  End  **********/
  64. }

  65. int main(){
  66.   int i,j;
  67.   int a[N][N]={{-2,13,6,9},{25,4,0,11},{-8,3,10,16},{4,7,5,20}},n[4];
  68.   FILE *fp;
  69.   findmax(a,n);
  70.   move(a,n);
  71.   if((fp=fopen("data.txt","w"))==NULL){
  72.     printf("open file error\n");
  73.     exit(0);
  74.   }
  75.   for(i=0;i<N;i++){
  76.     for(j=0;j<N;j++){
  77.       fprintf(fp,"%d\t",a[i][j]);
  78.       printf("%d\t",a[i][j]);
  79.     }
  80.     fprintf(fp,"\n");
  81.     printf("\n");
  82.   }
  83.   fclose(fp);
  84. }
复制代码


最佳答案
2019-2-22 00:17:02
63行
  1.         while(a[i][0] != a[i][n[i]])
复制代码

对于一个确定的i而言,n是一个定值,n=2(以数组第一行为例)
只要a[0]和a[2]的值不相等,那么进入死循环(因为退出循环条件a[0] == a[n]恒不成立)
可以先定义一个中间量g将最大值赋给中间量g,然后用while循环这样写: while(a[0] != g)
找最大值的函数没问题,两个函数我都看了,就移动的这有一点小问题
如有疑问,请跟帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-22 00:17:02 | 显示全部楼层    本楼为最佳答案   
63行
  1.         while(a[i][0] != a[i][n[i]])
复制代码

对于一个确定的i而言,n是一个定值,n=2(以数组第一行为例)
只要a[0]和a[2]的值不相等,那么进入死循环(因为退出循环条件a[0] == a[n]恒不成立)
可以先定义一个中间量g将最大值赋给中间量g,然后用while循环这样写: while(a[0] != g)
找最大值的函数没问题,两个函数我都看了,就移动的这有一点小问题
如有疑问,请跟帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-22 20:31:10 | 显示全部楼层
910201513 发表于 2019-2-22 00:17
63行
对于一个确定的i而言,n是一个定值,n=2(以数组第一行为例)
只要a[0]和a[2]的值不相等,那么进入 ...

可以,很详细。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 22:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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