JavaRush /Курсы /Harvard CS50 /Задание 2. С нами Марио!

Задание 2. С нами Марио!

Harvard CS50
1 уровень , 18 лекция
Открыта
cs50 марио

Знаете ли вы самого знаменитого водопроводчика в мире? С легкой руки компании Nintendo вымышленный усатый и немного полноватый дядечка в красной кепке стал героем для нескольких поколений геймеров. Если вы не знаете, о ком речь, вот вам ссылка на классическую игру 1985 года: поверьте, она всё ещё хороша и заслуживает внимания!


Также можно найти вариант классического Super Mario для смартфонов или оффлайновых эмуляторов. Всё это нам нужно для общего развития, это еще, к сожалению, не задание;). А задание состоит вот в чем. В конце первого уровня Mario каждый игрок видел вот такую полупирамидку:

Задание 2. С нами Марио! - 1

Создайте файл mario.c в вашей директории pset1. Наша рограммка будет рисовать полупирамиду, подобную той, что вы видите, но прямо в консоли, без графики: каждый из блоков будет состоять из значка хэша (#). Даже если вы еще не сообразили, как это сделать, поверьте: это просто. Чтобы сделать задачу более интересной, добавим в неё возможность задавать высоту полупирамидки с помощью неотрицательного целого числа от 0 до 23. Высота пирамидки на картинке считается в самом высоком месте, то есть равна 8. Если пользователь неправильно вводит число, нужно попросить его сделать это ещё раз. Затем сгенерировать с помощью printf пирамидку. 

Позаботьтесь о том, чтобы выровнять нижний левый угол вашей полупирамиды по левому краю окна терминала, как в примере ниже. Подчеркнутый текст — это то, что пользователь вводит самостоятельно. 

username:~/workspace/pset1 $ ./mario

height: 8       
       ##
      ###
     ####
    #####
   ######
  #######
 ########
#########

Обратите внимание, что два крайних правых столбца имеют одинаковую высоту. Генерировать трубы, облака и самого Марио пока не стоит=). По крайней мере для этого задания. 

Если пользователь ввел неправильные данные (ввел не число, или число, которое меньше единицы или больше, чем 23), программа должна снова попросить его ввести данные, как в примере внизу, где подчеркнутый текст — то, что вводил пользователь с клавиатуры. 

Для считывания введенной строки используйте GetInt. Она может помочь проверить неправильный ввод, но не для всех случаев. 

username:~/workspace/pset1 $ ./mario
Height: -2
Height: -1
Height: foo
Retry: bar
Retry: 1
##

Чтобы скомпилировать программу, введите строку в терминале:

make mario

или более прозрачный, но длинный вариант:

clang -o mario mario.c -lcs50

после этого запустите программу на исполнение: 

./mario

Если вы хотите проверить правильность выполнения программы, запускайте check50:

check50 2015.fall.pset1.mario mario.c

А если вы хотите поиграться с версией mario, созданной ассистентами курса, mario набирайте следующую строку: 

~cs50/pset1/mario
Комментарии (146)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
xephos23 Уровень 1
27 октября 2025

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

int main(void)
{
    int height;

    do
    {
        height = get_int("Введите высоту (целое число) от 0 до 23: \t");
    }
    while (height < 0  || height > 23);

    for (int row = 0; row < height; row++)
    {
        for (int column = 0; column < height + 1; column++)
        {
            if (column < height - row - 1) {
                printf(" ");
            }
            else {
                printf("#");
            }
        }
        printf("\n");
    }

}

Paul Уровень 7
7 сентября 2025

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

int main(void)
{
    int height;
    do
    {
        height = get_int("Height: ");
    }
    while (height < 1 || height > 23);

    for (int i = 1; i <= height; i++)
    {
        // Print spaces
        for (int j = 0; j < height - i; j++)
        {
            printf(" ");
        }

        // Print hashes
        for (int k = 0; k < i + 1; k++)
        {
            printf("#");
        }

        printf("\n");
    }
}
Oleg Ognev Уровень 2
18 октября 2023
Не знаю только как выравнивать по левую краю терминала, получилось по краям ровно сделать, но ровно по левому краю терминала получается только в значении 8 #include <cs50.h> #include <stdio.h> int main(void) { int x; do { x = get_int("Длина пирамидки: "); }while(x<=0 || x>23); for(int i=1;i<x+1;i++) { printf("\t "); for(int k=1;k<x-i+1;k++) { printf(" "); } for(int j=0;j-1<i;j++) { printf("#"); } printf("\n"); } }
Elina Iraeva Уровень 1
28 июня 2023
Я не считаю своё решение идеальным. Попыталась максимально избавиться от циклов for, сократить количество переменных и в целом упростить код.

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

int main (void)
{
    int height;

    do
    {
        height = get_int("Height:");              //Ввод и проверка начальных данных
    } while (height < 1);

    int absolute = height + 2;                    //Расчёт длины основания пирамиды

    do
    {
        printf("%*s", height-1, "");              //Вывод пробелов

        for (int s=0; s < absolute-height; s++)
        {
            printf("#");                          //Вывод хэшей
        }

        printf("\n");                             //Перенос строки
        height--;
    } while (height > 0);
}
Razdym Уровень 11
23 марта 2023
#include <stdio.h> #include <cs50.h> void printPyramid(int temp); int main(void) { int height; do{ height = get_int("Введите высоту пирамиды: "); } while(height < 1 || height > 23); printPyramid(height); } void printPyramid(int temp) { for(int i = 0; i < temp; i++) { for(int j = temp; j > i + 1; j--) { printf(" "); } for(int k = 0; k < i + 1; k++) printf("#"); printf("\n"); } }
27 июня 2023
Обратите внимание, что два крайних правых столбца должны иметь одинаковую высоту.
Виктор Ларькин Уровень 3
7 ноября 2022
#include <stdio.h> void printPyramid(int height); int main(int argc, char** argv) { int height; do { printf("Height: "); scanf("%i", &height); } while (height < 0); printPyramid(height); } void printPyramid(height) { for(int i = 0; i < height; i++) { for (int j = 0; j < height-1-i; j++) { printf(" "); } for (int k = 0; k < i+2; k++) { printf("#"); } printf("\n"); } }
Макс Уровень 1
4 октября 2022
Разобрал и докрутил код Екатерины, а именно проверку неверного ввода. Решения лучше - не нашел.

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

int main(void)
{
  /*Проверяем правильность введенного диапозона от 1 до 8, 
  в случае, если не верно - запрашиваем новое значение без остановки программы*/
  int h;
  do
  {
      h = get_int("Введите высоту: ");
  }
  while (h < 1 || h > 8);

/*функция, которая печаете каждую строку до тех пор, 
пока не выйдет на заданное значение высоты пользователем*/
        for (int i=1; i < h + 1; i++)
        {
            /*считаем и печатаем пробелы от левого края*/
            for (int j=1; j < h - i + 1; j++)
            {
                printf(" ");
            }
            /*Считаем и печатаем #*/
            for (int l=0; l < i; l++)
            {
                printf("#");
            }
            /*Считаем и печатаем # для второго уровня пирамидки*/
            for (int k=0; k < i; k++)
            {
                printf("#");
            }
             /*В конце напечатанной строки оставляем перенос, чтобы пирамидка не печаталсь в 1 строку*/
            printf("\n");
        }
    }

Екатерина Уровень 0
13 сентября 2022
Двойная башня:

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

int main(void)
{
    int h = get_int("Высота башни: \n");

    while (h < 1 || h > 8)
{
    h = get_int("Foo, вводи заново: \n");
}
    for(int i = 1; i < h+1; i++)
    {
        for(int j=1; j < h-i+1; j++)
        {
         printf(" ");
        }
        for(int l=0; l < i; l++)
       {
        printf("#");
       }
    printf("  ");
       for(int k=0; k < i; k++)
       {
        printf("#");
       }
    printf("\n");
    }
}
Екатерина Уровень 0
12 сентября 2022

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

int main(void)
{
    int h = get_int("Высота башни: \n");

    while (h < 1 || h > 8)
{
    h = get_int("Foo, вводи заново: \n");
}
    for(int i = 1; i < h+1; i++)
    {
        for(int j=1; j < h-i+1; j++)
        {
         printf(" ");
        }
        for(int l=0; l < i; l++)
       {
        printf("#");
       }
    printf("\n");
    }
}
Shahin Уровень 2
27 августа 2022

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

int main(void)
{
    int height = get_int("height: "); // запрашиваем пользователя ввести высоту

    while ( (height < 0) || (height > 23) ) // запрашиваем ввести высоту до тех пор, пока вводимое число меньше 0 и больше 23
    {
        height = get_int("height: "); 
    }

    for (int i = 0; i<height; i++ ) // этот цикл определяет высоту полупирамиды
    {
       for (int k = i; k<height-1; k++) // этот цикл рисует пробелы
       {
        printf(" ");
       }
         for(int j = 0; j< i+2; j++) // этот цикл рисует "#" 
         {
          printf("#");
         }
          printf("\n");
    }

}