S1E20:二维数组 课后作业

0. 在内存中有下边一段数据:

如果它被定义为一个 5 行 4 列的二维数组(a[5][4]),那么请问 a[3][3] 的值是多少?

答:a[3][3]=4

1. 请问下边代码是初始化一个几行几列的二维数组?

int a[][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

答:一行四列  (错误

答案:是一个 3 行 4 列的二维数组。由于我们这里只初始化了 10 个元素,并指定了该数组有 4 列,a[2][4] 是不够放了,只能用 a[3][4] 来存放,剩余的空间初始化为 0。

2. 假设有一个五维数组,如果要遍历其中的每一个元素,应该使用几层循环嵌套合适?V,9hy

答:五层

3. 下边用二维数组来存放 5 句口号,请问需要使用几层循环嵌套将它们打印出来?

答:两层(错误

答案:一层

#include <stdio.h>

#define NUM 5

int main()
{
        char slogans[NUM][100] = {
                "I love FishC.com!",
                "Keep moving!",
                "Impossible is nothing!",
                "Just do it!",
                "I am what I am!"};
        int i;

        for (i = 0; i < NUM; i++)
        {
                printf("%s\n", slogans[i]);
        }

        return 0;
}

4. 如何获取二维数组 a 的长度?

答:通过sizeof

答案:sizeof(a)/sizeof[0][0]

5. 请问二维数组 a[4][5] 是 4 行 5 列还是 5 行 4 列呢?

答:4行5列

答案:其实两种答案都是正确的。因为几行几列实际上只是我们为了方便大家理解和想象而构造出来的概念模型。实际上在内存中,它的存储方式仍然一维数组的线性方式扩展开而已。但无论你的程序采用哪一种解释方法,都请坚持使用同一种方法。

动动手:
0. 请补齐代码,使之可以按下图格式打印。o.

程序执行后按如下格式打印:Powered by 

答:

#include <stdio.h> 

int main()
{
    int a[4][5] = {
        {1,2,3,4,5},
        {6,7,8,9,10},
        {11,12,13,14,15},
        {16,17,18,19,20}};
    int i,j;
    for(i = 0;i<4;i++)
    {
        for(j=0;j<5;j++)
        {
            printf(" %2d ",a[i][j]);
            if(((5*i+j+1)%4) == 0)
            printf("\n");        
        }    
    }
    printf("\n");    
    return 0;
}

答案:

#include <stdio.h>

int main()
{
        int a[4][5] = {
                {1, 2, 3, 4, 5},
                {6, 7, 8, 9, 10},
                {11, 12, 13, 14, 15},
                {16, 17, 18, 19, 20}};

        int i, j;

        for (i = 0; i < 4; i++)
        {
                for (j = 0; j < 5; j++)
                {
                        printf("%2d ", a[i][j]);
                        if (i + j == 3)
                        {
                                printf("\n");
                        }
                }
        }
        printf("\n");

        return 0;
}

1. 实现矩阵相乘算法。
设 A 为 m * p 的矩阵,B 为 p * n 的矩阵,那么称 m * n 的矩阵 C 为矩阵 A 与 B 的乘积,记作 C = AB,其中矩阵 C 中的第 i 行第 j 列元素可以表示为:


`]qHS,Py1dCv9J{F*R(E}Lw)
如下所示:


注意:当矩阵 A 的列数等于矩阵 B 的行数时,A 与 B 可以相乘。

  • 矩阵 C 的行数等于矩阵 A 的行数,C 的列数等于 B 的列数。
  • 乘积 C 的第 m 行第 n 列的元素等于矩阵 A 的第 m 行的元素与矩阵 B 的第 n 列对应元素乘积之和。

题目要求:已知矩阵 A 和矩阵 B,计算出矩阵 C 并如下图格式打印。
程序实现如下:

提示:这道题在打印的地方需要比较大的脑洞,墙裂建议仔细琢磨下再看答案(自己想粗来和直接看答案的成就感是截然不同滴)。

答:矩阵知识忘记了,有机会再做吧

答案:

#include <stdio.h>

#define M 2
#define N 2
#define P 3

int main()
{
        int a[M][P] = {
                {1, 2, 3},
                {4, 5, 6}};

        int b[P][N] = {
                {1, 4},
                {2, 5},
                {3, 6}};

        int c[M][N] = {0};

        int i, j, k, row;

        for (i = 0; i < M; i++)
        {
                for (j = 0; j < N; j++)
                {
                        for (k = 0; k < P; k++)
                        {
                                c[i][j] += a[i][k] * b[k][j];
                        }
                }
        }

        // row 取行数最大值
        row = M > P ? M : P;

        for (i = 0; i < row; i++)
        {
                // 打印A
                printf("|  ");
                for (j = 0; j < P; j++)
                {
                        if (i < M)
                        {
                                printf("\b%d ", a[i][j]);
                                printf("|");
                        }
                        else
                        {
                                printf("\b\b\b     ");
                        }
                }
                // 打印 * 号
                if (i == row / 2)
                {
                        printf(" * ");
                }
                else
                {
                        printf("   ");
                }
                printf("|  ");
                // 打印B
                for (j = 0; j < N; j++)
                {
                        if (i < P)
                        {
                                printf("\b%d ", b[i][j]);
                                printf("|");
                        }
                        else
                        {
                                printf("\b\b\b     ");
                        }
                }
                // 打印 = 号
                if (i == row / 2)
                {
                        printf(" = ");
                }
                else
                {
                        printf("   ");
                }
                // 打印C
                printf("|  ");
                for (j = 0; j < N; j++)
                {
                        if (i < M)
                        {
                                printf("\b%d ", c[i][j]);
                                printf("|");
                        }
                        else
                        {
                                printf("\b\b\b      ");
                        }
                }
                printf("\n");
        }

        return 0;
}

2. 每一个好的品牌都有一个耳熟能详的 Slogan(口号)。写一个程序,让用户输入 5 句话,并计算出最长和最短的两句。
要求 A:使用 1 个二维数组存储用户输入的 5 句话。
要求 B:结果打印格式如下图。

答:

#include <stdio.h>
#include <string.h>


int main()
{
    char buffer[5][30];
    int i,j,k;
    int max,min,val = 0;
    
    for(i=0; i<5; i++) 
    {
      printf("请输入%d语句\n",i);    
      scanf("%s",buffer[i]);                
    } 
    for(j=0; j<5; j++)
    {
        val = strlen(buffer[j]);
        min = val < strlen(buffer[min]) ? j : min;
        max = val > strlen(buffer[max]) ? j : max;
    }
    printf("你输入了下面五句话:\n");
    for(k=0; k<5; k++)
    {
        printf("%s\n",buffer[k]);
    }
    printf("其中最长的是:%s\n",buffer[max]);
    printf("其中最短的是:%s\n",buffer[min]);
    
    return 0;
} 

答案:

#include <stdio.h>
#include <string.h>

#define NUM 5

int main()
{
        char slogan[NUM][100];
        int i, j, ch, min, max, temp;

        for (i = 0; i < NUM; i++)
        {
                printf("请输入%d句话:", i+1);
                for (j = 0; (ch = getchar()) != '\n'; j++)
                {
                        slogan[i][j] = ch;
                }
                slogan[i][j] = '\0';
        }

        min = 0;
        max = min;

        printf("你输入了下边%d句话:\n", NUM);

        // 打印每句口号,同时比较长度
        for (i = 0; i < NUM; i++)
        {
                printf("%s\n", slogan[i]);
                temp = strlen(slogan[i]);
                min = temp < strlen(slogan[min]) ? i : min;
                max = temp > strlen(slogan[max]) ? i : max;
        }

        printf("其中最长的是:%s\n", slogan[max]);
        printf("其中最短的是:%s\n", slogan[min]);

        return 0;
}

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值