社区
C语言
帖子详情
新人提问~
panlianges
2007-04-06 02:14:27
用for语句实现二维数组:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
有代码的会最好。。。
非常感谢。。。
...全文
277
14
打赏
收藏
新人提问~
用for语句实现二维数组: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 有代码的会最好。。。 非常感谢。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hongming1129
2007-04-07
打赏
举报
回复
楼主,你得找个机会,好好谢谢royt(小白鼠) 呀,他算是辛苦啦。
panlianges
2007-04-07
打赏
举报
回复
非常感谢。。。
不是偶小气。。。
是没有分数了。。。
loongee
2007-04-07
打赏
举报
回复
royt(小白鼠) 的程序代码用到了动态定义数组,在新标准的编译器里为什么能通过呢?
VC6是通不过的,书上也说数组是不允许动态定义大小的啊。
小弟不明,还望指点。
heiun
2007-04-07
打赏
举报
回复
好!太好了,太强了
royt
2007-04-07
打赏
举报
回复
royt(小白鼠) 的程序代码用到了动态定义数组,在新标准的编译器里为什么能通过呢?
VC6是通不过的,书上也说数组是不允许动态定义大小的啊。
小弟不明,还望指点。
------------------------------------------------------------------------------
vc6是98年的产品吧,遵守的是C89标准,而且即使是老的标准,各种编译器也不是100%的支持。例如for (int i=0; i<n; i++)这样的语句,标准是把i看成for里面的局部变量的,但是vc把i看成是for外面的int i定义的,在for后面也可以继续使用。目前最新的是C99标准,可以支持边长数组等特性,目前能够完全支持的编译器还不多,建议使用gcc 4或者vc2005作为编译器,它们对新标准提供了较好的支持。
幸福的小雨
2007-04-07
打赏
举报
回复
好强
zylian
2007-04-07
打赏
举报
回复
辛苦,顶
fohonet
2007-04-07
打赏
举报
回复
不好意思 ,呵呵
重新 发一个算法 :
main()
{int t=0,n,i,j,k,l1,l0,c1,c0;
int aa[20][20];
printf("请输入n阶方阵的阶数n:");
scanf("%d",&n);
i=l0=0,
l1=n-1,
j=c0=0,
c1=n-1;/*l0,l1分别表示左右边界,c0,c1分别表示上下边界*/
k=1;
for(k=1;k<=n*n;k++)
{aa[i][j]=k;
switch(t)
{case 0: /*t=0表示方阵的旋转方向为从左到右*/
j++;
if (j>c1) /*判断是否已超出右边界*/
{j--;i++;t++;l0++;}/*改变行列及t和左边界的值*/
break;
case 1: /*t=1表示方阵的旋转方向为从上到下*/
i++;
if (i>l1) /*判断是否已超出下边界*/
{i--;j--;t++;c1--;}
break;
case 2: /*t=2表示方阵的旋转方向为从右到左*/
j--;
if (j<c0) /*判断是否已超出左边界*/
{j++;i--;t++;l1--;}
break;
case 3: /*t=3表示方阵的旋转方向为从下到上*/
i--;
if (i<l0) /*判断是否已超出上边界*/
{i++;j++;t=0;c0++;}
break;
}
}
printf("所得的方阵是:\n");
for(i=0;i<n;i++)
{for (j=0;j<n;j++)
printf("%5d",aa[i][j]);
printf("\n");
}
getch();
}
royt
2007-04-06
打赏
举报
回复
不好意思,我的程序改动一下,将while(1)里面的第一句 int tmp = k; 放到while外面,改成tmp = k; tmp的定义请加到开始的 int i,j,k 后面。
另外就是有些C编译器要求变量的定义必需在main的开始处,否则无法编译通过,遇到这种情况请更改一下语句的秩序,将定义语句放最前面。
royt
2007-04-06
打赏
举报
回复
/*
* Author: Royt
* Date: Apr 6th, 2007
* Function: 将一个方阵从定点到中心用递增的整数填满
* Compiler: Dev-C++ 4.9.9.2(mingw)
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
// 判断索引是否超出方阵的边界
int InSquare(int x, int y, int n)
{
if ((x >= 0 && x < n) && (y >= 0 && y < n))
{
return 1;
}
else
{
return 0;
}
}
// 在控制台上输出方阵
void PrintSquare(int **s, int n)
{
int i, j;
printf("\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%2d ", *((int*)s + (n * i) + j));
}
printf("\n");
}
}
// 主函数
int main()
{
int N; // 方阵边长
printf("边长:");
scanf("%d", &N);
int i, j, k;
int square[N][N]; // 定义方阵
int count = 1; // 计数变量,没填写一个方格count值加1
/*
* 该结构体定义了位置沿着不同方向变化时索引的改变
* 如向左移动时,方阵的行索引减1,列索引不变
*/
struct _direction {
int horizontal;
int vertical;
} dct, direction[4]; // dct记录当前的移动方向
direction[0].vertical = -1; direction[0].horizontal = 0; // up
direction[1].vertical = 1; direction[1].horizontal = 0; // down
direction[2].vertical = 0; direction[2].horizontal = -1; // left
direction[3].vertical = 0; direction[3].horizontal = 1; // right
// 初始化square方阵,每一个值均为0
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
square[i][j] = 0;
}
}
i = 0; j = 0; // i和j表示起始位置,这里表示从第一行第一列开始
square[i][j] = 1;
k = 3; // k代表方向,例如当k==3时direction[k]表示移动方向为右
dct = direction[k];
// 在方阵中寻找路径
while (1)
{
int tmp = k; // tmp记录当前的移动方向
/*
* 每当进行下一步移动之前,先判断继续沿当前方向的一下个位置是否合法
* 包括:1.下一步是否会超出边界;2.下一步是否已经路过,即值是否非0
* 如果下一步可用,则退出循环继续沿此方向前进,若不可用则改变方向
* 用tmp记录当前方向,通过++k%4将尝试其它方向是否下一步可行
* 若最后k==tmp则说明四个方向都已顺次尝试,无路可通,于是程序结束
*/
while (! (InSquare(i + dct.vertical, j + dct.horizontal, N)
&& (square[i + dct.vertical][j + dct.horizontal] == 0)))
{
k = ++k % 4;
dct = direction[k];
if (k == tmp)
{
PrintSquare((int **)square, N); // 输出方阵
printf("\n%d个方块绘制完毕!\n", count);
getch();
return 0;
}
}
tmp = k; // 记录当前移动方向
// 使用三条语句填写下一个值
i += dct.vertical;
j += dct.horizontal;
square[i][j] = ++count;
}
return 0;
}
// 输出结果示范
/*
边长:5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
25个方块绘制完毕
*/
// 可以修改源文件中i,j,k的值,如i=8(最边沿),j=0,k=0(向上),输出如下
/*
边长:9
9 10 11 12 13 14 15 16 17
8 39 40 41 42 43 44 45 18
7 38 61 62 63 64 65 46 19
6 37 60 75 76 77 66 47 20
5 36 59 74 81 78 67 48 21
4 35 58 73 80 79 68 49 22
3 34 57 72 71 70 69 50 23
2 33 56 55 54 53 52 51 24
1 32 31 30 29 28 27 26 25
81个方块绘制完毕!
*/
// 如果起始点不在四个角落的其中一个,则无法填满整个方阵,i=6,j=7,k=2,N=9结果如下
/*
边长:9
14 15 16 17 18 19 20 21 22
13 0 0 0 0 0 0 0 23
12 0 0 0 0 0 0 0 24
11 0 0 0 0 0 0 0 25
10 0 0 0 0 0 0 0 26
9 0 0 0 0 0 0 0 27
8 7 6 5 4 3 2 1 28
39 40 41 42 43 44 45 46 29
38 37 36 35 34 33 32 31 30
46个方块绘制完毕!
*/
// At last,楼主很小气,问题点数为0
heiun
2007-04-06
打赏
举报
回复
我也在想这个问题,但还没想出来。等待高手指点一下啊。
panlianges
2007-04-06
打赏
举报
回复
不过还是谢谢。。。
等待好人路过。。。并给出答案。。。
panlianges
2007-04-06
打赏
举报
回复
不是输入这么简单。。。
是按照规律求出数字并显示。。。
fohonet
2007-04-06
打赏
举报
回复
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
:)
八年级语文下册10浪之歌课堂
提问
新人
教版.doc
八年级语文下册10浪之歌课堂
提问
新人
教版.doc
java经典面试笔试
提问
大全
个人搜集的网上java笔试面试问题,比较全面。对于
新人
很有帮助
好的会计程序
会计专用工具,适合
新人
,爱学习之人,可以进去,
提问
菏泽聊天室源码(完整)
安装过程截图 详细介绍与代码多角度截图展示 菏泽聊天室源码(完整) 自动注册,可以自杀等功能。 点击下载!程序讨论我要评论报告错误 站长论坛 站长茶馆交流 链接交换区 源码资源交流 SEO新手入门 SEO
新人
提问
区 广告交易发布 网站事务讨论 ...
简历面试常见问题_android.rar
此资源是Android 面试的时候HR会提出的各种面试问题,从学历,公司,到项目,以及未来的发展规划,总之对那些新手面试不知道该怎么应答HR的变态
提问
而提供了实用的方法,真的是
新人
不用会后悔系列!
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章