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