c语言 输入n行n列的数据 然后实现互换对角的数据的程序怎么写比较好

c语言 输入n行n列的数据 不知到需要不需要先制作一个让用户输入要输入n*n的假设
大概就是 请输入X*Y的值
假设输入的是2*3
下面就让显示 请输入 2*3的数据
然后实现互换对角要素的程序怎么写比较好?
大概给的模板是这个样子,完全没有讲过这个东西……
#include<stdio.h>
#include<string.h>
void rev(char *w);
int main(void)

char a[50];
printf(“输入小写英文和数字。¥n”);
gets(a);
rev(a);
printf(“倒序表示。¥n”);
puts(a);
return 0;

void rev(char *w){
int n,i,j;
char t;
n=strlen(w);
if (n<=1) return;
i=0; j=n-1;
while (i<j){ t=w[i]; w[i]=w[j]; w[j]=t;
i++; j― ―;



谢谢解答,
采纳标准,在正确答案里采纳回答的最快的,谢谢
或者引用文本文档的数据最好~

2行3列怎么互换对角   2 3 3

                                    1 0 1

我觉得是不是  m行m列   互换对角  

比如:    1     2      3

               4     5      6

               7     8      9

互换后:

               3     2      1

               4     5      6

               9     8      7

是这样吗????

 

 

这是我写的代码:

#include <stdio.h>
#define  N  50
int main()
{
    int a[N][N],m,i,j,k;
   puts("请输入多少行列  最大50:");
   scanf("%d",&m);
   printf("请输入%d*%d个数据\n",m,m);
    for(i=0;i<m;i++)
          for(j=0;j<m;j++)  
                scanf("%d",&a[i][j]);
     puts("互换前:");
     for(i=0;i<m;i++)
       {   for(j=0;j<m;j++)  
              { printf("%-4d",a[i][j]);}
           puts("");
       }
   puts("互换后:");
 for(i=0;i<m;i++)
          for(j=0;j<m;j++)  
{
          if(i+j==m-1)  { k=a[i][i];a[i][i]=a[i][j];a[i][j]=k;}
}
 for(i=0;i<m;i++)
       {   for(j=0;j<m;j++)  
              { printf("%-4d",a[i][j]);}
           puts("");
       }
return 0;
}

这是运算结果:

追问

不好意思,貌似我理解错了,老师说的太不清楚了。要求是输入n*n的数据,然后改变对角要素顺序排序,还要求要使用pointer,如果是下面这样的话,怎么做比较好?
如果是输入之后,
1 2 3
4 5 6
7 8 9
然后把对角要素提取 排序 应该就是1 3 7 9 或者9 7 3 1 这样之类的排序的话怎么做比较好呢?
老师还说了句,可以直接读取文本文档的数据,这样的话好实现吗?

追答

我修改后的代码:

#include <stdio.h>
#include <stdlib.h>
#define  N  50
int main()
{
    int a[N][N],b[2*N],m,i,j,k=0;
   puts("请输入多少行列  最大50:");
   scanf("%d",&m);
   FILE *p;
  if((p=fopen("duijiao.txt","r"))==NULL){puts("erro!");exit(1);}
    for(i=0;i<m;i++)
{         for(j=0;j<m;j++)  
               { fscanf(p,"%d",&a[i][j]);}           

fclose(p)  ;
     puts("你输入的数据是:");
     for(i=0;i<m;i++)
       {   for(j=0;j<m;j++)  
              { printf("%-4d",a[i][j]);}
           puts("");
       }
 for(i=0;i<m;i++)
          for(j=0;j<m;j++)  
{
          if(i+j==m-1&&i!=j)  { b[k++]=a[i][i];b[k++]=a[i][j];}
}
puts("对角线上的数为:");
for(i=0;i<k;i++)    
     printf("%-4d",b[i]);
puts("");
puts("排序后:");//选择法排序  small to larger
for(i=0;i<k;i++)
 {    
      for(j=i;j<k;j++){if(b[i]>b[j]){  m=b[i];b[i]=b[j];b[j]=m;}}
}
for(i=0;i<k;i++) printf("%-4d",b[i]);
return 0;
}

 

追问

刚才测试了下 这一行提示错误 FILE *p;

还有……老师的意思我也没太明白,如果是
就是比如输入之后的矩阵是这样
1 2 3
4 5 6
7 8 9
然后取对角要素的1 5 9 单独显示出来,顺序最好是按顺序,最好是从大到小排序 效果就是
逆续排列:9 5 1

比如新建一个文本文档
里面输入
1 2 3
4 5 6
7 8 9
然后在编程里直接读取文档里的数据,再把对角的数据单独排个序
这样有办法实现吗

追答

我在VC6.0里调试运行正确呀,,,
你在源文件的文件夹里建一个“duijiao.txt”文本文档
这样写
1 2 3
4 5 6
7 8 9
保存 运行程序就好
#include
#include
#define N 50
int main()
{
int a[N][N],b[2*N],m,i,j,k=0;
puts("请输入多少行列 最大50:");
scanf("%d",&m);
FILE *p;
if((p=fopen("duijiao.txt","r"))==NULL){puts("erro!");exit(1);}
for(i=0;ib[j]){ m=b[i];b[i]=b[j];b[j]=m;}}
}
for(i=0;i<k;i++) printf("%-4d",b[i]);
return 0;
}

追问

这是用vc6.0编译显示的东西,麻烦看下吧

追答

#include
#include
#define N 50
int main()
{ int a[N][N],b[N],c[N],m,i,j,k=0,l=0; puts("请输入多少行列 最大50:");
scanf("%d",&m); FILE *p;
if((p=fopen("duijiao.txt","r"))==NULL){puts("erro!");exit(1);}
for(i=0;i<m;i++)
{ for(j=0;j<m;j++) { fscanf(p,"%d",&a[i][j]);} }
fclose(p) ; puts("你输入的数据是:");
for(i=0;i<m;i++) { for(j=0;j<m;j++) { printf("%-4d",a[i][j]);} puts(""); }
for(i=0;i<m;i++) for(j=0;j<m;j++)
{ if(i+j==m-1) { b[k++]=a[i][i];c[l++]=a[i][j];}}
puts("对角线上的数为:");
for(i=0;i<k;i++) printf("%-4d",b[i]);puts("");
for(i=0;i<l;i++) printf("%-4d",c[i]);puts("");
puts("排序后:");//选择法排序 larger to small
for(i=0;i<k;i++)
{ for(j=i;j<k;j++){if(b[i]<b[j]){ m=b[i];b[i]=b[j];b[j]=m;}}}
for(i=0;i<l;i++)
{ for(j=i;j<k;j++){if(c[i]<c[j]){ m=c[i];c[i]=c[j];c[j]=m;}}}
for(i=0;i<k;i++) printf("%-4d",b[i]);puts("");
for(i=0;i<l;i++) printf("%-4d",c[i]);puts("");
puts("按任意键继续。。。");
fflush(stdin);
getchar();
return 0;
}

追问

谢谢 还是那个错误 解决不能…………
总之非常感谢
请去这里随便回答点什么
http://zhidao.baidu.com/question/361101080475123492.html
同样是100分 回答之后我去采纳 谢谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-09-15

就是n*n矩阵输入,然后互换对角的数据输出?下面就是这样的程序,可拷贝:

#include  <stdio.h>

#define N 10

int n = 0;

void rev(int w[N][N])
{
  int i, j, t;

  for (i = 0; i < n; i++)
  {
    for (j = 0; j < i; j++)
    {
      t = w[i][j];
      w[i][j] = w[j][i];
      w[j][i] = t;
    }
  }
}

int main()
{
  int  i, j;
  int  a[N][N] = {0};

  printf("Input n:");
  scanf("%d", &n);//输入n值
  printf("Input array:\n");
  for (i = 0; i < n; i++)//下面3句相当于gets(a),即输入矩阵a 
    for (j = 0; j < n; j++)
      scanf("%d", &a[i][j]);

  rev(a); //转换

  printf("converted array:\n");
  for (i = 0; i < n; i++)//下面几句相当于puts(a),即输出矩阵a
  {
    for (j = 0; j < n; j++)
      printf("%d\t", a[i][j]);
    printf("\n");
  }
}

追问

不好意思,貌似我理解错了,老师说的太不清楚了。要求是输入n*n的数据,然后改变对角要素顺序排序,还要求要使用pointer,如果是下面这样的话,怎么做比较好?
如果是输入之后,
1 2 3
4 5 6
7 8 9
然后把对角要素提取 排序 应该就是1 3 7 9 或者9 7 3 1 这样之类的排序的话怎么做比较好呢?
老师还说了句,可以直接读取文本文档的数据,这样的话好实现吗?

追答

是对角线元素的提取和排序?

建立一个文本文件mm.txt到程序运行的目录,并输入如下内容后保存:

3

1 2 3
4 5 6 
7 8 9


然后拷贝使用附件中代码(都是指针实现的),运行(附件是从大到小排序。如果要从小到大,只要修改小于号为大于号,程序中有注释说明)。

追问

这个运行没有问题
我新建了一个文本文档 里面输入了
1 2 3
4 5 6
7 8 9
然后保存之后放到了编译完生成的exe文件的文件夹里,
文本文档的名字有要求嘛,直接运行exe说
open file error
ret !=0

追答

新建的文件名必须是mm.txt

内容第一行是n的值,后面才是数据:

3

1 2 3
4 5 6 
7 8 9


如果是直接双击运行exe文件,那么会很快运行完(快到一闪而过)。可以在程序main函数return 0;这句前加上system("pause");后重新编译,就行。

追问

谢谢,可以完美运行,非常感谢。
不过还想学习下这样显示出来的做法,自己做了总是有问题
Inputed array
1 2 3
4 5 6
7 8 9
The results are
9 5 1
替换到行列显示
9 2 3
4 5 6
7 8 1

就是如果想替换到行列里再显示出来,怎么改动下比较好呢?
写的这么详细非常感谢,之后再追加100分送上

追答for (i = 0; i < n; i++)
{
  *(*(a+i) + i) = *(b + i); //替换
}

放到后面,然后再复制那个输出循环就行。也就是: 

  for (i = 0; i < n; i++)
  {
    for (j = 0; j < n; j++)//输出原矩阵
      printf("%d\t", *(*(a+i) + j));
    printf("\n");
  }

本回答被提问者采纳
第2个回答  2014-06-30
#include <stdio.h>

//支持的最大的数组维数
#define MAX_X   50
#define MAX_Y   50


int getData(int *x, int *y, char data[MAX_X][MAX_Y])
{
        int i = 0, j = 0;
        printf("请输入数组的行数:");
        scanf("%d",x);
        printf("请输入数据的列数:");
        scanf("%d", y);

        //如果要判断x!=y也进行处理可以去掉下面if
        if (*x != *y) {
                printf("数组行数和列数不相等\n");
                return 1;
        }

        for (i = 0; i < *x; ++i) {
                for (j = 0; j < *y; ++j) {
                        printf("请输入第%d行,第%d列的数据:", (i + 1), (j + 1));
                        getchar();
                        scanf("%c", &data[i][j]);
                }
        }


        return 0;
}

void showData(int x, int y, char data[MAX_X][MAX_Y])
{
        int i = 0, j = 0;
        printf("array[%d][%d]\n", x, y);
        for (i = 0; i < x; ++i) {
                for (j = 0; j < y; ++j) {
                        printf(" %c ", data[i][j]);
                }
                printf("\n");
        }
}

void rev(int x, int y, char data[MAX_X][MAX_Y])
{
        char tmp[MAX_X][MAX_Y] = {0};
        int i = 0, j = 0;

        for (i = 0; i < x; ++i) {
                for (j = 0; j < y; ++j) {
                        tmp[i][j] = data[i][j];
                        data[i][j] = '\0';
                }
        }

        for (i = 0; i < x; ++i) {
                for (j = 0; j < y; ++j) {
                        data[j][i] = tmp[i][j];
                }
        }

}

int main()
{
        char data[MAX_X][MAX_Y] = {0};
        int x = 0, y = 0;
        int ret = 0;
        ret = getData(&x, &y, data);
        if (ret != 0) {
                return 0;
        }
        showData(x, y, data);
        rev(x, y, data);
        showData(x, y, data);

        return 0;


}

追问

不好意思,貌似我理解错了,老师说的太不清楚了。要求是输入n*n的数据,然后改变对角要素顺序排序,还要求要使用pointer,如果是下面这样的话,怎么做比较好?
如果是输入之后,
1 2 3
4 5 6
7 8 9
然后把对角要素提取 排序 应该就是1 3 7 9 或者9 7 3 1 这样之类的排序的话怎么做比较好呢?
老师还说了句,可以直接读取文本文档的数据,这样的话好实现吗?

追答

排序的没太明白,要是从文本读取的话,文本格式要求啥样?

追问

就是比如输入之后的矩阵是这样
1 2 3
4 5 6
7 8 9
然后取对角要素的1 5 9 单独显示出来,顺序最好是按顺序,最好是从大到小排序 效果就是
逆续排列:9 5 1

文本他就提了一句
比如新建一个文本文档
里面输入
1 2 3
4 5 6
7 8 9
然后在编程里直接读取文档里的数据,再把对角的数据单独排个序

追答

看看这个是不是你说的那种。

追问

这次题目说的太含糊了 所以根本不知道他让做的是什么……
总之谢谢解答
请去
http://zhidao.baidu.com/question/982546822161807579.html
随便回答点什么 之后我去采纳 非常谢谢

第3个回答  2014-06-30
什么意思?交换数组a【i】【j】和a【j】【i】的值?