BelzetStarling Ответов: 4

Звездные узоры в одну линию


Я знаю, что это моя домашняя работа, и она назначена по какой-то причине, но я сидел над этой проблемой в течение недели и все еще не понял ее.

Таким образом, цель здесь состоит в том, чтобы создать четыре шаблона (количество строк основано на вводе пользователя), используя одну строку кода C++. Четыре модели:
*     ***       *     ***
**     **      **     **
***     *     ***     *


Я выяснил, как кодировать каждый паттерн, но это означает, что у меня есть два/три цикла while. Мы не изучили цикл for В этом классе и поэтому не можем его использовать. Но я понятия не имею, как я могу даже сжать эти петли в одну линию! Если я обманываю и использую for loops, это почти работает для первого и четвертого паттернов. Но это не так...

Вот код, который у меня есть для шаблонов (n-это пользовательский ввод количества строк):

Образец 1:
int i, j, n;
i = 1;
while (i <= n) {
    j = 0;
    while (j < i) {
        cout << "*";
        j++;
    }
    cout << endl;
    i++;
}


Образец 2:
int i, j, k, n;
i = 0;
while (i < n) {
    k = 0;
    while (k < i) {
        cout << " ";
        k++;
    }
    j = n;
    while (j > i) {
        cout << "*";
        j--;
    }
    cout << endl;
    i++;
}


Образец 3:
int i, j, k, n;
i = 1;
while (i <= n) {
    k = n;
    while (k > i) {
        cout << " ";
        k--;
    }
    j = 0;
    while (j < i) {
       cout << "*";
       j++;
    }
    cout << endl;
    i++;
}


Образец 4:
int i, j, n;
i = 0;
while (i < n) {
    j = n;
    while (j > i) {
        cout << "*";
        j--;
    }
    cout << endl;
    i++;
}


То, что мы узнали в классе, очень просто, потому что этот курс представляет собой введение в вычислительную науку. Предполагается, что он затрагивает множество различных тем внутри in, не вдаваясь в слишком большую глубину. Все, что мы действительно узнали для C++, - это базовое объявление, операторы if и цикл while.

Мне действительно нужна помощь. :( некоторые советы или подсказки меня вполне устроят; я прошу о помощи, а не о том, чтобы кто-то делал за меня мою работу.

Заранее благодарю вас!

Richard MacCutchan

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

BelzetStarling

Именно этого я и боялся. В любом случае, спасибо за ответ. :)

4 Ответов

Рейтинг:
36

BelzetStarling

Ладно, я неправильно понял своего учителя. :( Всем ужасно жаль! Он хотел, чтобы все образцы были напечатаны в одной строке, а не обязательно в одной строке кода. Для тех, кто заинтересован, вот код, которым я закончил (и который он принял в качестве решения):

int i, j, k, n;

cout << "Enter number of rows: ";
cin >> n;

i = 0;
while (i < n) {
    
    j = 0;
    while (j <= i) {
        cout << "*";
        j++;
    }

    k = n - 1;
    while (k > i) {
        cout << " ";
               k--;
    }

    cout << "     ";

    k = 0;
    while (k < i) {
        cout << " ";
        k++;
    }

    j = n;
    while (j > i) {
        cout << "*";
        j--;
    }

    cout << "     ";

    j = n - 1;
    while (j > i) {
        cout << " ";
        j--;
    }

    k = i;
    while (k >= 0) {
        cout << "*";
        k--;
    }

    cout << "     ";

    j = n;
    while (j > i) {
        cout << "*";
        j--;
    }

    cout << endl;
    i++;
}


Еще раз прошу прощения за головную боль, которую я, возможно, вызвал. ^^


enhzflep

Stefan_Lang

Ничего страшного - на этом сайте есть много людей, которые любят каверзные вопросы! ;-Р

Рейтинг:
1

enhzflep

Ну и мозгоправ. Я вижу здесь закономерность, просто пока не могу ее лучше параматериализовать.

Глядя на ваш пример, я записал количество звездочек и пробелов в каждой строке. Это дало мне следующую таблицу:

*     ***       *     ***
**     **      **     **
***     *     ***     *

1, 5, 3, 7, 1, 5, 3
2, 5, 2, 6, 2, 5, 2
3, 5, 1, 5, 3, 5, 1


Вы можете ясно видеть связь в нечетных столбцах с максимальным числом строк, N.
Вы также можете видеть, что четные столбцы имеют свои собственные шаблоны - n+1+2, 2*(n+1)-ряд, n+1+2 N+2, 2*(N+1)-ряд, N+2

Я разбил вместе версию, использующую for loops, а затем перечитал ваш вопрос. Поэтому я преобразовал их в циклы while. Очевидно, что я использую более 1 строки кода. Но при этом - я заметил, что вдоль каждого ряда повторяется повторяющийся паттерн: 1,5,3 в первом ряду повторяется, как и 2,5,2 во втором. Что за полный мозгобой!!

Вот вам несколько ОД, чтобы рассмотреть. Возможно, вы сможете определить закономерность, с которой я еще не совсем разобрался. Скороговорка, которая устранит большую часть повторений, которые я демонстрировал, и при этом создаст код, который (почти/фактически) разумен как одна строка кода.

Я тестировал с N в диапазоне примерно до 25 и был вознагражден тем же рисунком, хотя и масштабировался все больше. Обратите внимание, что для удобства/краткости завершающего условия каждого цикла while N содержит число 1, большее, чем количество строк, которые вы действительно хотите напечатать.

int main()
{
    int row, sp, st;
    int n = 4;

    row=1; while (row < n)
    {
        st=0; while(st++ < row) printf("*");
        sp=0; while(sp++ < n+1) printf(" ");
        st=0; while(st++ < n-row) printf("*");
        sp=0; while(sp++ < 2*n-row) printf(" ");

        //---------------
        st=0; while(st++ < row) printf("*");
        sp=0; while(sp++ < n+1) printf(" ");
        st=0; while(st++ < n-row) printf("*");

        printf("\n");
        row++;
    }
    return 0;
}


Вот пример (моего)n = 10
*           *********                   *           *********
**           ********                  **           ********
***           *******                 ***           *******
****           ******                ****           ******
*****           *****               *****           *****
******           ****              ******           ****
*******           ***             *******           ***
********           **            ********           **
*********           *           *********           *


У меня болит голова!


Рейтинг:
0

Richard MacCutchan

Это должно помочь вам начать работу, но вам нужно будет выяснить правильные значения интервалов для себя

int i = 0;
while (i != 3)
    cout << string(i, '*') << string(4-i, ' ') << setw(4) << string(4 - i, '*') << setw(6) << string(i, '*')  << string(4, ' ') << string(4 - i, '*') << string(i++, ' ') << endl;


Stefan_Lang

Хорошая мысль об использовании setw, но если ОП точен в том, что изучил только "базовую декларацию, операторы if и цикл while", я сомневаюсь, что это тот ответ, который искал учитель.

Тем не менее, у меня нет другой идеи, как ее решить, кроме удаления всех разрывов строк и, возможно, замены ';' на ',' ;-p

Richard MacCutchan

В моем первоначальном предложении были только звезды и пространства. Все вышесказанное было для меня скорее упражнением в обучении. :)

Рейтинг:
0

Member 8616148

ЦЕЛОВАТЬ.

std::cout << "*     ***       *     ***" << std::endl << "**     **      **     **" << std::endl << "***     *     ***     *" << std::endl;


BelzetStarling

Это было то, о чем я думал, но, к сожалению, количество строк зависит от n, которое является пользовательским вводом. Я не знаю, как реализовать это в вашем решении.

Member 8616148

Ах, значит, ты кое-что узнал. Ни один программист не может "реализовать" решение, не зная *всех* требований. Вы не упомянули в своем вопросе "пользовательский ввод".

BelzetStarling

Я действительно упомянул пользовательский ввод: прямо над всеми кодами для шаблонов - "вот код, который у меня есть для шаблонов (n-это пользовательский ввод количества строк):"

Member 8616148

Это было утверждение о "коде, который у вас есть", а не требование. Ваше заявление о требовании было довольно конкретным: "Итак, цель здесь состоит в том, чтобы создать четыре шаблона, используя одну строку кода C++. Четыре модели:"

BelzetStarling

Мне жаль, что это не было ясно. Я отредактирую сообщение, чтобы упомянуть об этом. :)

Member 8616148

Well, there are some other inconsistencies in your problem statement you should think about as well. A not-so-subtle point I'm trying to get across is that the very first step in solving any programming challenge is to find a clear and specific statements of the requirements and constraints. For example, you say there are "4 patterns", and yet I obviously saw 3 (one line for each, where I think you meant 3 lines for pattern #1, and 3 different lines for pattern #2, etc.) You also state "We haven't learned the for loop in this class and are therefore not allowed to use it." -- but I have no idea what else you "haven't learned", thus I don't know what other constraints there are on solving this problem. Finally, you mention "in one line of code", which is impossible, unless you really stretch the definition of "one line", how are you going to get and store the input variable? How are you going to meet the requirement for "main"?

Member 8616148

Используя 2 строки, игнорируя "main" и делая некоторые другие предположения о вашем истинном требовании, попробуйте сделать это (предполагая, что троичный также не запрещен):

std::cin >> n;
std::cout << ((1==n)? "*\n**\n***\n" : ((2==n)? "***\n * * \n *\n" : ((3==n)? "*\n * * \n** * \n" : ((4==n)? "***\n* * \n*\n" : ""))));

enhzflep

Я думаю, что вы можете хотеть еще несколько пространств между вашими звездами, чем это! - (В примере есть 5, 6 или 7 пробелов между каждым блоком звезд)

Member 8616148

Я думаю, вам нужно узнать разницу между пропорционально расположенными шрифтами и другими. Попробуйте скопировать то, что я написал в блокнот, а затем установите свой шрифт на Courier New. Исключите код и вставьте каждую группу звездочек (звездочек, на самом деле) в новую строку. Я думаю, вы найдете, что они вполне соответствуют первоначальному требованию.

enhzflep

Я сделал кое - что получше. Я скопировал/вставил ваш код и запустил его. Он не произвел показанный пример(который также был скопирован/вставлен). Вздремнешь - проиграешь!

Я задремал!

Member 8616148

В консольном приложении?

enhzflep

Ага.

Stefan_Lang

Если вы копируете непосредственно из решения, то получаете только один пробел между каждым блоком***, потому что он отформатирован в HTML! Если вы нажмете на кнопку "улучшить решение", то увидите, что исходный код содержит несколько пробелов. ;-)

enhzflep

Ах милый. Да, действительно - совершенно упустил этот момент. Спасибо за сдержанность, которая превзошла мою.

:Наливает себе крепкого кофе, потом подходит к зеркалу и говорит: "ты дремлешь, ты проиграл!":

nv3

Я читаю всю эту тему и задаюсь вопросом, что такого особенного в решении проблемы в одной строке. Все зависит от того, насколько длинной может быть эта линия. За очень немногими исключениями, код C не зависит от какой-либо строчной структуры. Таким образом, каждая программа на языке Си может быть написана в основном в одной строке. Не то чтобы это имело какой-то смысл для читателя-человека :-)

Я рад, что учитель разрешил это недоразумение. Иначе я бы не увидел, что хорошего это принесет классу новичков, на самом деле любому классу C или C++.