c语言学习笔记-数组(3)

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个字符),判断该字符串是否为回文。

¨ 回文:字符串中心对称
·"noon"  √
·" radar " √
·" reader "  ꭓ

 

 加上字符串,我们这样来

#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan-%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值