Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > изо


Автор: danilkramatorsk 19.1.2013, 17:23
нужно такое нарисовать)
*
**
***
****
*****
******
*******

            * 
          **
        ***
      ****
    *****
  ******
*******
Напишите программу, которая печатает по отдельности, один под другим,  
показанные ниже треугольники. Используйте для генерации трафаретов цикл for. 
Все звездочки (*) должны-печататься единственным оператором вида cout « '*'; 

как я понял нам необходимо создать цикл в данном треугольнике до 7, т.к. конечное число * = 7;
то есть 
for (i=1;i<=7;i++)
cout << i ;
только вместо цифр надо звездочки, как реализовать?
1=*
2=**
3=***
....

Автор: feodorv 19.1.2013, 18:04
Цитата(danilkramatorsk @  19.1.2013,  18:23 Найти цитируемый пост)
только вместо цифр надо звездочки

Код

cout << '*' ;

Только на каждом шаге for-цикла придётся рисовать i звёздочек, а не одну (что подразумевает ещё один цикл  smile )

Автор: danilkramatorsk 19.1.2013, 18:36
feodorv, это я понял, а легче способа нет?

Автор: feodorv 19.1.2013, 20:09
Цитата(danilkramatorsk @  19.1.2013,  19:36 Найти цитируемый пост)
а легче способа нет? 

Всё зависит от того, как понимать это "легче" smile Второй треугольник, например, влёгкую рисуется простой модификацией первого.
Да, можно всё написать с участием одного-единственного цикла и массива звёздочёк или задействовав рекурсию, но тут уж Вам виднее...

Автор: danilkramatorsk 19.1.2013, 20:15
feodorv, 
Цитата

задействовав рекурсию

это я еще не изучал,
что это такое вообще и для чего она нужна?

Автор: bsa 20.1.2013, 20:50
Цитата(danilkramatorsk @  19.1.2013,  21:15 Найти цитируемый пост)
что это такое вообще и для чего она нужна?

меньше знаешь, крепче спишь  smile 


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

Автор: Silent 21.1.2013, 09:19
Код

#include <iostream>
using namespace std;

int main()
{
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j <= i; j++) {
            cout << '*';
        }
        cout << endl;
    }
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            cout << ((j < 7 - i - 1) ? ' ' : '*');
        }
        cout << endl;
    }
    return 0;
}

Автор: bsa 21.1.2013, 10:42
Silent, ну вот зачем ты дал готовый ответ?

Автор: danilkramatorsk 21.1.2013, 18:02
bsa, 
Цитата

меньше знаешь, крепче спишь   

вообще она в дальнейшем понадобится?

Автор: bsa 21.1.2013, 18:13
danilkramatorsk, не исключено

Автор: danilkramatorsk 21.1.2013, 19:43
Silent, 
Код

 cout << ((j < 7 - i - 1) ? ' ' : '*');


объясните как выполняется

Автор: bsa 21.1.2013, 22:24
danilkramatorsk, не пытайся понять. напиши свое.

Автор: Silent 22.1.2013, 10:19
bsa, мне просто было скучно ^_^
даже имея на руках исходник (а задачка-то плевая), человек не сдаст без понимания, а с этим, как мы видим, проблемы

Автор: bsa 22.1.2013, 10:30
Silent, просто вместо того, чтобы разобраться и написать свое, ему приходится тратить силы на разбор чужого кода, уровень которого превышает имеющийся у человека.
Если очень хочется, можешь поразмяться в разделе Центр помощи - там тусуются те, кто не хочет разбираться.

Автор: danilkramatorsk 22.1.2013, 15:38
bsa, 
Silent, разобрался,но не пиши пожалуйста больше готовый ответ, хочу всему сам научиться!
bsa прав.

Автор: bsa 23.1.2013, 10:26
danilkramatorsk, если ты уже решил задачу, то выложи готовый ответ, а мы его покритикуем.  smile 

Автор: danilkramatorsk 27.1.2013, 15:43
bsa, 
Код

 cout << ((j < 7 - i - 1) ? ' ' : '*');


i-количество строк
j-количество столбцов 
код, как я понял , действует так
в то время когда j <7-i-1 печатаем пробел, в противном случае печатаем *
j < 7 -i-1
сначала печатается 7 строка и 7 столбцов
затем  количество столбцов и строк уменьшается и получается выражение 6<7-1-1
если бы мы не написали дополнительно -1 у нас бы выполнялся неправильный и бесконечный цикл.
В итоге у нас печатается на 6 строке 6 столбцов и т.д.
Так понял я?   

Автор: volatile 27.1.2013, 17:14
Цитата(danilkramatorsk @  27.1.2013,  15:43 Найти цитируемый пост)
если бы мы не написали дополнительно -1 у нас бы выполнялся неправильный и бесконечный цикл.

Нет. Вечного цикла бы небыло. просто треугольник был бы кривой.

Цитата(danilkramatorsk @  22.1.2013,  15:38 Найти цитируемый пост)
не пиши пожалуйста больше готовый ответ

danilkramatorsk, можно исправить ситуацию

Напишите код для оставшихся треугольников сами.
Вот для таких:
Код

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

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

и покажите полный код (не фрагмент)
Есть подозрение что вы не до конца поняли.


Автор: danilkramatorsk 27.1.2013, 19:54
volatile, 
Код

for (int j = 0; j < 7; j++) {
            cout << ((j > 7-i-1) ? ' ' : '*');
        }
        cout << endl;


Код

   for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            cout << ((j > 6-i-1) ? '*' : ' ');
        }
        cout << endl;
    }

но если честно, как-то тяжело мне даются эти циклы, если не сложно объясните более подробней.

Автор: volatile 28.1.2013, 00:06
danilkramatorsk, нижняя функция рисует не такой треугольник

Цитата(danilkramatorsk @  27.1.2013,  19:54 Найти цитируемый пост)
тяжело мне даются эти циклы,

Вам не циклы тяжело даюцца, а тернарный оператор, с условиями.
В таких случаях нужно упрощать. (рефакторинг - по научному smile )

Например так. Создадим универсальную маленькую функцию, которая будет выводить один символ, нужное число раз.
Код

void repeat_char (char c, int n)
{  while (n --) 
      cout << c;
}

Если теперь вызвать эту функцию так:
Код

repeat_char ('A', 234);

то она напечатает букву A, ровно 234 раза. (универсальная функция, может пригодицца и в других программах)

После этого, очень легко и быстро можно написать все 4 функции треугольника, не путаясь.

Код

void triangle_1 (int size)
{
   for (int i = 0; i < size; ++ i) 
   {
      repeat_char ('*', i + 1); // В первой итерации (i=0) выводицца i+1=1 звездочка. во второй = 2, и т.д.
      cout << endl;
   }
}
Здесь все понятно. 
Код

void triangle_2 (int size)
{
   for (int i = 0; i < size; ++ i) 
   {
      repeat_char (' ', size - i); // Здесь перед звездочками выводяцца пробелы. сначала 6, потом 5, и т.д.
      repeat_char ('*', i + 1);  // Также как и выше
      cout << endl;
   }
}


Заодно мы сделали универсальный размер, а не жестко заданный.
http://codepad.org/iIwL9Luc

Оставшиеся 2 вам будет написать гораздо проще.

Добавлено через 8 минут и 59 секунд
кстати, я немного ошибся, выводицца на 1 пробел больше, чем необходимо. (хотя и не заметно)
Но это очень легко исправить.
исправьте сами.

Автор: danilkramatorsk 28.1.2013, 01:07
volatile, во! теперь немного понял. Спасибо!

Автор: XLAT 2.2.2013, 05:35
Цитата(bsa @  21.1.2013,  10:42 Найти цитируемый пост)
Silent, ну вот зачем ты дал готовый ответ? 

Цитата(danilkramatorsk @  19.1.2013,  18:36 Найти цитируемый пост)
feodorv, это я понял, а легче способа нет? 


а вот самый верх совершенства! smile 
Код

cout << '*' ;
cout << '**' ;
cout << '***' ;
cout << '****' ;
cout << '*****' ;
cout << '******' ;
cout << '*******' ;

cout << '            *' ; 
cout << '          **' ;
cout << '        ***' ;
cout << '      ****' ;
cout << '    *****' ;
cout << '  ******' ;
cout << '*******' ;


Добавлено через 3 минуты и 3 секунды
код чуть выпирает, но это из-за того, что тег code по умолчанию не использует моношириный шрифт

Автор: danilkramatorsk 2.2.2013, 12:19
XLAT, гениально просто))))

Автор: volatile 2.2.2013, 14:47
Цитата(XLAT @  2.2.2013,  05:35 Найти цитируемый пост)
тег code по умолчанию не использует моношириный шрифт 

тег code по умолчанию как раз использует моношириный шрифт, у вас просто кривой треугольник  smile 

И с условиями тоже косяк :
Цитата(danilkramatorsk @  19.1.2013,  17:23 Найти цитируемый пост)
Все звездочки (*) должны-печататься единственным оператором вида cout « '*'; 


Автор: Albor 3.2.2013, 09:52
Цитата(XLAT @  2.2.2013,  04:35 Найти цитируемый пост)
а вот самый верх совершенства! 

Ну да, если исправить ошибки в "совершенстве" и вставить перевод строки smile .  Но шутка понятна.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)