Ъγ:_小ツ雨oο 发表于 2013-12-23 22:37:04

C 定义二维数组,后输入坐标找到这个数并打印出来

先定义 一个 二维数组,   假如是a={1,2,3,4,5,6,7,8,9};   之后 在 输入一个坐标(), 把坐标上的数打印出来,   我只会用2个for循环全部打印出来,   求给点思路,

还有 ,   就是输入a中的 任意一个数,   把他的坐标打印 出来;    这个直接给我个代码吧,实在想不出来思路,,


maomingkun 发表于 2013-12-23 22:37:05

Ъγ:_小ツ雨oο 发表于 2013-12-24 21:24 static/image/common/back.gif
额,我回了   还有一个问题 ,在帮我解决一下吧我的 理解   把 a换成 a 或 *(a+0)或*a;他们不都是 ...


#include <stdio.h>

int main()
{
       
        int a={1,2,3,4,5,6,7,8,9};

        int i,j,n,m;

        scanf("%d",&n);

        for (i=0;i<3;i++)
        {
                for (j=0;j<3;j++)
                {
                        if (n==*(*(*(a+i)+j))
                        {
                                printf("%d在该数组中第%d行第%d列!\n",n,i,j);
                                m=1;//标志是否被找到
                                break;//找到的话跳出内层for循环
                        }
                       
                       
                }
                if (m==1)
                {
                        break;//跳出外层for循环
                }
        }
        if (m!=1)//没有找到该数
        {
                printf("该数组中没有你要找的数!");
        }
}


if (n==*(*(*(a+i)+j))这个可以有以下几种写法:
1.      if (n==*(*((a+0)+i)+j))
2.      if (n==*(*(&a+i)+j))此处的a编译器认为是数值吧,所以前边加了个&
3.      if (n==*(a+j))   a是i行的首地址,+j是i行j列的地址
4.      if (n==(*(*a+i)+j))
5.      if (n==*(*(a+0)+i+j))
可能还有其他的自己慢慢琢磨吧

maomingkun 发表于 2013-12-23 23:17:26


#include <stdio.h>

int main()
{
       
        int a={1,2,3,4,5,6,7,8,9};
        int (*p);
       
        int i,j;
        p=a;
        printf("i=");
        scanf("%d",&i);
       
       
        while(i<0 ||i>2)
        {
                printf("i=");
                scanf("%d",&i);
        }
        printf("j=");
        scanf("%d",&j);
        while(j<0 ||j>2)
        {
                printf("j=");
                scanf("%d",&j);
        }
       
        printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));
}

Ъγ:_小ツ雨oο 发表于 2013-12-23 23:26:47

maomingkun 发表于 2013-12-23 23:17 static/image/common/back.gif
#include

int main()


额, 要用2维指针 啊好头疼 ,    {:5_111:}   

maomingkun 发表于 2013-12-24 13:23:10

Ъγ:_小ツ雨oο 发表于 2013-12-23 23:26 static/image/common/back.gif
额, 要用2维指针 啊好头疼 ,

那你想用什么方法啊?》

Ъγ:_小ツ雨oο 发表于 2013-12-24 18:33:37

maomingkun 发表于 2013-12-24 13:23 static/image/common/back.gif
那你想用什么方法啊?》

我的第二问 呢 ,有答案没?:handshake

maomingkun 发表于 2013-12-24 20:06:56

Ъγ:_小ツ雨oο 发表于 2013-12-24 18:33 static/image/common/back.gif
我的第二问 呢 ,有答案没?

这个还不简单啊?用你输入的数和数组里边的每一个数比较,有相同的就输出坐标
代码如下:
#include <stdio.h>

int main()
{
       
        int a={1,2,3,4,5,6,7,8,9};
        int (*p),i,j,n,m;
        p=a;
        scanf("%d",&n);

        for (i=0;i<3;i++)
        {
                for (j=0;j<3;j++)
                {
                        if (n==*(*(p+i)+j))
                        {
                                printf("%d在该数组中第%d行第%d列!\n",n,i,j);
                                m=1;//标志是否被找到
                                break;//找到的话跳出内层for循环
                        }
                       
                       
                }
                if (m==1)
                {
                        break;//跳出外层for循环
                }
        }
        if (m!=1)//没有找到该数
        {
                printf("该数组中没有你要找的数!");
        }
}


仰望天上的光 发表于 2013-12-24 20:10:19

1.
鱼币

先定义 一个 二维数组,   假如是a={1,2,3,4,5,6,7,8,9};   之后 在 输入一个坐标(), 把坐标上的数打印出来,   我只会用2个for循环全部打印出来,   求给点思路,#include <stdio.h>

int main(void) {
        int a={1,2,3,4,5,6,7,8,9};
        int x,y;
        printf("输入坐标:");
        scanf("%d%d",&x,&y);
        if( 0<=x&&x<=2&&0<=y&&y<=2 )
                printf("坐标(%d,%d)出数字是:%d\n",x,y,a);
        else
                printf("坐标非法\n");
        return 0;
}

仰望天上的光 发表于 2013-12-24 20:10:57

还有 ,   就是输入a中的 任意一个数,   把他的坐标打印 出来;    这个直接给我个代码吧,实在想不出来思路,,#include <stdio.h>

int main(void) {
        int a={1,2,3,4,5,6,7,8,9};
        int x,y,data;
        printf("输入要查找的数:");
        scanf("%d",&data);
        for( x=0;x<3;++x )
                for(y=0;y<3;++y) {
                        if( data == a ) {
                                printf("数字%d的坐标是(%d,%d)\n",data,x,y);
                                return 0;
                        }
                }
        printf("数字%d不在表格里\n",data);
        return 0;
}

Ъγ:_小ツ雨oο 发表于 2013-12-24 21:24:33

本帖最后由 Ъγ:_小ツ雨oο 于 2013-12-24 21:25 编辑

maomingkun 发表于 2013-12-24 20:06 static/image/common/back.gif
这个还不简单啊?用你输入的数和数组里边的每一个数比较,有相同的就输出坐标
代码如下:
#include

额,我回了   还有一个问题 ,在帮我解决一下吧我的 理解   把 a换成 a 或 *(a+0)或*a;他们不都是表示第0行0列的地址吗?(书上的意思差不多也是这样的) 我感觉都是可以的,刻用编译器替换 了一下就报错了,   这个是 怎么 回事啊?   

仰望天上的光 发表于 2013-12-24 23:03:54

Ъγ:_小ツ雨oο 发表于 2013-12-24 21:24 static/image/common/back.gif
额,我回了   还有一个问题 ,在帮我解决一下吧我的 理解   把 a换成 a 或 *(a+0)或*a;他们不都是 ...

对于int a;
a的类型是int;不是指针,所以sizeof(a) = 3* sizeof(int)
但是数组名非常容易退化为指针(指向数组首元素),所以,a常常退化为指针类型int(*)。在我的记忆中,仅有sizeof运算符不会使数组名退化,其它所有情况,数组名都会退化为指针。

a是数组a的第0个元素,它的类型是int,这也是一个数组,同上面所说,除了和sizeof运算符在一起外,这个数组都会退化为指向其首元素的指针,该指针类型为int*

*(a+0)这里,a是数组名,先退化为指针类型int(*),该指针+0得到指针类型int(*),对该指针解引用,得到类型int,这是个数组。除了和sizeof在一起,它会退化为指针,指针类型为int*

*a这里,a是数组名,先退化为指针类型int(*),该指针解引用,得到类型int,这是个数组。除了和sizeof在一起,它会退化为指针,指针类型为int*

上面我对a,a,*(a+0)和*a的类型做了叙述。LZ的想法是不管类型,只管它们的值。确实,它们的值都是相同的,但类型不一定相同。而C语言中,不同类型的值不一定能相互替代,所以编译报错。其实,只要你知道自己在做什么,强制类型转换下就可以了。

仰望天上的光 发表于 2013-12-24 23:11:03

最后,建议楼主尽量先学会用程序解决问题,成为合格的程序员。指针是C语言中很难的一个东西,只要你知道它很难,尽量少用就是了,一样可以解决很多问题。个人认为初学者就是不可能完全掌握指针,声称掌握的基本都是在自欺欺人。与其如此,不如不要过于纠结在这上面,以能解决问题为重。将来随着你见的问题多了,自然可以完全了解指针。

我爱鱼C论坛 发表于 2015-2-19 21:04:20

页: [1]
查看完整版本: C 定义二维数组,后输入坐标找到这个数并打印出来