about 多维数组的空间想象
一维数组: 一列长表或一个向量
二维数组: 一个表格或一个平面矩阵
三维数组: 三维空间的一个方阵
多维数组: 多维空间的一个数据列阵
上面两篇我们学习了一维数组,接着我们来看下二维数组:
1. 定义
类型名 数组名[行长度][列长度]
int a[3][2];
定义1个二维数组 a,3 行 2 列,6 个元素
int b[5][10];
定义1个二维数组 b,5 行 10 列, 50 个元素
2.引用
先定义,后使用
数组元素的引用:
数组名[行下标] [列下标]
行下标和列下标:整型表达式
行下标的取值范围是[0,行长度-1]
列下标的取值范围是[0,列长度-1]
int a[3][2]; 3 行 2 列, 6个元素
a[0][0] a[0][1]
a[1][0] a[1][1]
a[2][0] a[2][1]
还是强调,下标不要越界!!!
关于二维数组,对于没有线性代数基础的我必须对一个词有初步认识——“矩阵”
然后是一些运算:
还有陌生一点的转置和矩阵乘法
有关初始化
1. 分行赋初值
int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
static int b[4][3] = { {1, 2, 3}, { }, {4, 5} };
2. 顺序赋初值
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
static int b[4][3] = { 1, 2, 3, 0, 0, 0, 4, 5 };
3.省略行长度
对全部元素都赋了初值
int a[ ][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
或分行赋初值时,在初值表中列出了全部行
static int b[ ][3] = { {1, 2, 3}, { }, {4, 5}, { }
有一句话这样讲:1+1=2会吧,可以去高考了
定义函数day_of_year (year, month, day),计算并返回年year、月month和日day对应的是该年的第几天。
day_of_year (2000, 3, 1) 返回61
day_of_year (1981, 3, 1) 返回60
当然最核心的即是:
int tab[2][13] =
{
{ 0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31 }
{ 0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31 }
}
整合起来就是
int day_of_year ( int year, int month, int day )
{
int k, leap;
int tab[2][13] =
{
{ 0, 31, 28, 31, 30,31,30,31,31,30,31, 30,31 }
{ 0, 31, 29, 31, 30,31,30,31,31,30,31, 30,31 }
};
leap = (year4==0 && year%100!=0) || (year%400==0);
for ( k = 1; k < month; k++ )
{
day = day + tab[leap][k];
}
return day;
}
#include <stdio.h>
int main()
{
int a[6][6];
int m,n,i,j;
scanf("%d %d",&m,&n);
for (i=0; i<n; i++)
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
m%=n;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%d ",a[i][(n-m+j)%n]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main(void)
{
int i,j;//循环变量
int k=1;//1~n*n的数字走势
int n;//n行n列
scanf("%d",&n);
int x=0,y=0;
int bound0=n-1,bound1=n-1,bound2=0,bound3=1;
int a[10][10];
int direction=0;
while(k<=n*n)
{
if(direction==0)
{
a[x][y++]=k++;
if(y==bound0)
{
direction=1;
bound0--;
}
}
else if(direction==1)
{
a[x++][y]=k++;
if(x==bound1)
{
direction=2;
bound1--;
}
}
else if(direction==2)
{
a[x][y--]=k++;
if(y==bound2)
{
direction=3;
bound2++;
}
}
else if(direction == 3)
{
a[x--][y] = k++;
if (x == bound3)
{
direction = 0;
bound3++;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf(" %2d",a[i][j]);
}
printf("\n");
}
return 0;
}
诶不知道有没有印象有一道回文数的题:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i=0,s,n;
printf("请输入一个数:");
scanf("%d",&n);
s=n;
while(s!=0)
{
i=i*10+s%10;
s/=10;
}
if(i==n)
printf("是回文数");
else
printf("不是回文数");
}
输入一个以回车符为结束标志的字符串(少于80个字符),判断该字符串是否为回文。
加上字符串,我们这样来
#include<stdio.h>
# define MAXLINE 80
int main ( void )
{
int i, k;
char line[MAXLINE];
printf ( "Enter a string: " );
k = 0;
while ( (line[k] = getchar() ) != '\n' )
{
k++;
}
line[k] = '\0';
i = 0; /* i是字符串首字符的下标 */
k = k -1; /* k是字符串尾字符的下标 */
while ( i< k )
{
if ( line[i] != line[k] )
{
break;
}
i++;
k--;
}
if( i >= k)
{
printf("It is a plalindrome\n");
}
else
{
printf("It is not a plalindrome\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int n, k;
char a[10][10] = { 0 };
int i, j;
int x1, y1, x2, y2;
int sum = 0;
int wrong = 0;
scanf("%d", &n);
getchar();
for (i = 0; i < 2 * n; i++)
{
for (j = 0; j < 2 * n; j++)
{
scanf("%c", &a[i][j]);
getchar();
}
}
scanf("%d", &k);
while (k--)
{
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
x1 -= 1;
y1 -= 1;
x2 -= 1;
y2 -= 1;
if (a[x1][y1] == a[x2][y2] && a[x1][y1] !='*')
{
a[x1][y1] = a[x2][y2] = '*';
sum++;
if (sum == 2 * n * n)
{
printf("Congratulations!");
return 0;
}
else
for (i = 0; i < 2 * n; i++)
{
printf("%c", a[i][0]);
for (j = 1; j < 2 * n; j++)
{
printf(" %c", a[i][j]);
}
printf("\n");
}
}
else
{
printf("Uh-oh\n");
wrong++;
if (wrong == 3)
{
printf("Game Over");
break;
}
}
}
return 0;
}