CS50--Week1

本文为记录CS50的习题

1. Mario 1.0

题目:在马里奥游戏中1-1关结束后会出现如图的积木金字塔,要求输入一个数字1--8决定金字塔的层数,利用#代替积木块制造如图的金字塔,并且输出金字塔的层数。

 

 

这里的解法如下,这个可以引入矩阵的思维,假设输入数字5,即有5层金字塔,如下图,对角线点的坐标已经标出来了,对角线右下方的点就是积木块也就是需要显示#的位置。观察点的坐标可以发现,对角线点坐标相加正好是为5-1=4(如果左上角改为(1,1)开始计算则为5,这里写成(0,0),是因为程序从零开始算的),若有n行则为n-1,即i+j>=n-1的位置为#,其他为空格,并且可以观察到每一行都是n个元素。

 

则程序可以如下编写:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
   int n=get_int("input the height of pyramid:");//获取层数

    while(n<1 ||n>8) //限制层数为1--8层,否则重新输入
    {
        n=get_int("error,please reenter:");
    }
    printf("The height of pyramid is %i \n",n);//输出层数
    for(int i=0;i<n;i++)//外循环,控制层数
    {
        for(int j=0;j<n;j++)//内循环,控制每层的每个位置
        {
            if ((j+i)>=n-1)
            printf("#");
            else
            printf(" ");
        }
        printf("\n");//每层结束换行
    }
    printf("\n");//换行
}

在CS50的云服务Linux编译和运行:

 

 2. Mario2.0

在Mario游戏开始的时候会出现如下图的方块金字塔,两边对称,中间永远空出两个木块的位置,试用#代替木块实现输出给定层数的金字塔(层数在1--8)。

 

 

 如下图,方块代表小木块,设要输出的金字塔层数为n,i为外层循环数,j为内层循环数,则每一层有多少位置是确定的,为2n+2,那么每层中间空出的那两个位置为n+1和n+2,但这里外层循环为i,n与i的关系为i=n-1,用i表示中间空出的那两个位置为n和n+1,那么左边为小木块的位置区间为(n-1-i,n-1),右边为(n+2,n+2+i),这样就确定了什么位置是小木块,什么位置是空的。

 

 

 程序如下:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int n=get_int("the height of pyramid:");//给定高度
    while( n<1 ||n>8)//控制给定高度
    {
        n=get_int("error,please reenter:");
    }
    printf("The height of pyramid is %i \n",n);//输出高度
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<2*n+2;j++)
        {
            if((j>=n-i-1 &&j<=n-1)||(j>=n+2 && j<=n+2+i))//木块位置
            printf("#");
            else
            printf(" ");
        }
        printf("\n");
    }
    printf("\n");
}

编译输出:

 

 

 

 

题目来源:https://docs.cs50.net/2019/x/psets/1/index.html

 

posted @ 2022-04-27 10:31  soranonioi  阅读(482)  评论(0编辑  收藏  举报