《明解C语言》第五章 练习5-8,练习5-9,练习5-10答案

在网上找了一下,这三个题大多是待做或者是被跳过了。 分享一下自己的答案。
刚学习C不久,细节可能处理不得当,如有问题请在评论区指出。

编译环境 VScode

练习5-8

#include <stdio.h>
#define NUM 80
int main(void)
{
    int a,b;
    int num;
    int people[NUM];
    int chart[11]= {0};

    printf("请输入学生人数:");

    do
    {
        scanf("%d",&num);
        if (num < 1 || num > NUM)
        {
            printf("请重新输入1~%d的数\n",NUM);
        }
    } while (num < 1 || num > NUM);

    printf("请输入%d人的分数\n",num);

    for (a = 0; a < num; a++)
    {
        printf("%2d位:",a+1);
        do
        {
            scanf("%d",&people[a]);
            if (people[a]<=0 || people[a]>100)
            {
                printf("请重新输入0~100的数");
            }
        } while (people[a]<=0 || people[a]>100);
        chart[people[a] / 10]++;
    }
    
    puts("———————————————————");

    for ( a = 0; a < 10; a++)
    {
        printf("%2d ~ %2d分 :",a*10,a*10+9);
        for (b = 0; b < chart[a]; b++)
            putchar('*');
        printf("\n");
    }

    printf("    100分 :");

    for (a = 0; a < chart[10]; a++)
    {
        putchar('*');
    }
    putchar('\n');
    
    return 0;
}   

练习5-9

#include <stdio.h>
#define NUM 80
int main (void)
 {
    int a,b,number,max;
    int people[NUM];
    int chart[11];

    printf("请输入学生人数: ");
    
    do{
        scanf("%d",&number);
        if (number <= 0 || number > NUM)
            printf("请重新输入1 ~ %d",NUM);
    } while (number <= 0 || number > NUM);
    
    printf("请输入%d个数\n",number);

    for (a = 0; a < number; a++)
    {
        printf("%2d:",a+1);
        do
        {
            scanf("%d",&people[a]);
            if (people[a]<0 || people[a]>100)
                printf("请输入0~100的分数:");
        } while (people[a]<0 || people[a]>100);
        chart[people[a]/10]++;
    }
    puts("————————————————————————————————————————————");

    /* 确定chart数组各项中最大的数,作为空间的高 */
    max = chart[0];
    for (a = 0; a < 11; a++)
    {
        if(chart[a]>max)
            max = chart[a];
    }
    

    for (; max>0; max--)  /* 限定空间的高,确定有从上到下有几行 */
    {
        for (b = 0; b <= 10; b++)    /* 从0到10遍历一行中的每一列 */
        {
            if(chart[b] >= max)    /* 判定数组chart[b]>大于该层空间最大值 */
            {
                printf("   *");   /* chart数组某个数大于空间最大值时,输出两个空格加*号    */
            }
            else
                printf("    ");    /* chart数组不大于空间最大值时,输出三个空格 */
        }
        putchar('\n');  /* 一行结束,换行 */
    }

    puts("————————————————————————————————————————————");
    for (a = 0; a <= 10; a++)
    {
        printf("%4d",a*10);
    }
    
    return 0;
 }

练习5-10

#include <stdio.h>
int main(void)
{
    int a,b,c,d = 0;            
    int array1[4][3];   //矩阵1
    int array2[3][4];   //矩阵2
    int origion[4][12] = {0};   //原始矩阵乘积数据的数组初始化
    int product[4][4] = {0};    //最终矩阵乘积的数组初始化

    puts("请依次输入矩阵1的各值");

    for (a = 0; a < 4; a++)     //遍历矩阵1来赋值
    {
        for (b = 0; b < 3; b++)
        {
            printf("矩阵1[%d][%d]:",a,b);
            scanf("%d",&array1[a][b]);
        }
    }
    
    for (a = 0; a < 3; a++)     //遍历矩阵2来赋值
    {
        for (b = 0; b < 4; b++)
        {
            printf("矩阵2[%d][%d]:",a,b);
            scanf("%d",&array2[a][b]);
        }
        
    }
    //遍历各个乘积赋值到原始数据矩阵中
    for ( a = 0; a < 4; a++)       //矩阵1的每一行
    {
        d = 0;
        for (b = 0; b < 4; b++)     //矩阵2的每一列
        {
            for (c = 0; c < 3; c++)     //矩阵2每一列的各行
            {   
                origion[a][d] = array1[a][c] * array2[c][b];    //将矩阵的原始乘积(未合并)赋值到原始数据数组origion
                d += 1;
            }
        }
        putchar('\n');
    }

    puts("{");
    //将原始乘积合并,赋值到product二维数组,即矩阵的乘积
    for ( a = 0; a < 4; a++)
    {
        b = 0;
        for (d = 0; d < 12; d++ )
        {
            product[a][b] += origion[a][d];
            if ((d+1)%3 == 0)                   //变量从0开始,原始数据矩阵每3个相乘数为一组相加
            {   printf("%4d",product[a][b]);     
                b++;                            //每一组加完后,更换到product数组元素的第二个元素
            }
        }
        putchar('\n');
    }
    puts("}");

    
    return 0;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值