Шесть равнобедренных треугольников

Уровень сложности:

Вот интересная и относительно не  сложная задача по программированию. Задачкой с нами поделился  пользователь — NaikoN. Собственно, условие задачи короткое и очень простое.

Требуется вывести в консоль от 1-го до 6-ти равнобедренных треугольников, в зависимости от того какое число введет пользователь. Например, если на вход в программу будет отправлено число 3, то необходимо напечатать 3 треугольника, если пользователь введет 6, то напечатать 6-ть треугольников. Треугольники нужно выводить не в столбик, а в строчку. При этом размер треугольников также формируется по введенному пользователем числу. Как я и говорил, если пользователь введет число 3, то должно напечататься три равнобедренных треугольника, высота которых равна — 3-м. Для печати треугольников можно выбрать любой символ, как вам удобно, в существующем решении используется символ звездочки — *.

CppStudio.com
Enter number of triangles: 7
      *             *             *             *             *             *             *       
     ***           ***           ***           ***           ***           ***           ***      
    *****         *****         *****         *****         *****         *****         *****     
   *******       *******       *******       *******       *******       *******       *******    
  *********     *********     *********     *********     *********     *********     *********   
 ***********   ***********   ***********   ***********   ***********   ***********   ***********  
************* ************* ************* ************* ************* ************* *************

Решение также предоставил — NaikoN. Кстати говоря, это не первая версия исходного кода. Первый исходник, который прислал NaikoN был не очень красивый, так как там использовались метки, что достаточно сильно усложняло понимание кода. Кроме того, старый код неправильно работал в линуксе, а точнее — была проблема с отступами между треугольниками. Скорее всего это связано с тем, что пробелы явно не были указаны. Теперь все это исправлено, код на порядок стал дружелюбнее, чем в старой версии программы. Еще раз поблагодарим пользователя — NaikoN, интересную задачку  и предоставленное решение. Исходник смотрим ниже:

#include <iostream>

using namespace std;

int main()
{
    cout<<"Enter number of triangles: ";
    int number;
    cin>>number;
    for(int y=1;y<=number;++y)///высота треугольника расходящаяся к низу
    {
        for(int i=1;i<=number;++i)///кол-во треугольников
        {
            for(int x=1;x<=number-y;++x)///пробелы слева
            {
                cout<<" ";
            }
            if(y==1)
            {
                cout<<"*";
            }
            else
            {
                for(int x=(-1)*y;x<y-1;++x)///выводим треугольник
                {
                    cout<<"*";
                }
            }
            for(int x=1;x<=number-y;++x)///пробелы справа
            {
                cout<<" ";
            }
            cout<<" ";///пробел между треугольниками
        }
        cout<<endl;
    }
    return 0;
}

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

CppStudio.com
Enter number of triangles: 7
      *             *             *             *             *             *             *       
     ***           ***           ***           ***           ***           ***           ***      
    *****         *****         *****         *****         *****         *****         *****     
   *******       *******       *******       *******       *******       *******       *******    
  *********     *********     *********     *********     *********     *********     *********   
 ***********   ***********   ***********   ***********   ***********   ***********   ***********  
************* ************* ************* ************* ************* ************* *************

У меня получилось напечатать 7 треугольников, собственно можно и больше, но если они не влезут в окно консоли, тогда треугольники сломаются. Например, в линуксе я нормально смог распечатать 10 треугольников. Задачка очень интересная как и сама программа, рекомендую разобраться с этим кодом.

Следующие статьи помогут вам в решении данной задачи:
Автор: Marienko L.
Дата: 21.11.2013
Поделиться:

Комментарии

  1. Роман Максимов

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	const char symbol = '*';
    	
    	int num_triangles, // кол-во треугольников 
    	    num_lines,     // кол-во линий
    	    num_points,    // кол-во точек в линии
    	    width,
    	    offset;        // смещение начала отрисовки
    
    	cout << "Enter number of triangles: " << endl;
    	cin >> num_triangles;
    	
    	width = num_lines = num_triangles;
    	
    	for (int line = 1; line <= num_lines; line++, width--)
    	{
    		num_points = (line * 2) - 1;
    		offset = width;
    		
    		for (int triangle = 0; triangle < num_triangles; triangle++)
    		{
    			cout.width(offset);
    			for (int point = 0; point < num_points; point++)
    				cout << symbol;
    			
    			offset = (num_lines - line  + 1) * 2;
    		}
    		
    		cout << endl;
    	}
    	
    	system("pause");
    	return 0;
    }
  2. AndreiST

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int a=0;
        cout << "Enter quantity triangle: ";
        cin >> a;
        int len=((a*2)-1);
        for(int i(0); i<a; i++)
        {
            for(int j(0); j<a; j++)
            {
                for(int k(0); k<=len; k++)
                {
                    if(k==a-i||k==a||k==a+i)
                    {
                        cout << '*';
                        while(k<a+i)
                        {
                           cout << '*';
                           k++;
                        }
                    }
                    else
                        cout << ' ';
                }
            }
            cout << endl;
        }
        return 0;
    }
  3. sancta

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
        setlocale(0,"rus");
        int i=0; //кол-во треугольниковж
        cout << "\nВведите кол-во треугольников > "; cin >>i;
        int pos = i;
        int ryad=1;
        for (int y=0; y<i; ++y)
        {
          for (int p=0; p<i; ++p) //кол-во повторов - сколько у нас будет треугольников
           {
             for (int x=0; x<i+i; ++x)
                {
                  if (x>=(pos) & x<(pos+ryad)) cout << "*"; else cout << " ";
                }
            } //уконец цикла отрисовки треугольников
            pos--; ryad+=2;
            cout <<"|" << endl;
        }
    
        return 0;
    }
  4. Splatt_I

    Splatt_I

    спустя 6 часов раздумий

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	setlocale(0, "");
    
    	cout << "\t\t\tВывод треугольников\nВведите количество треугольников (от 2 до 6): ";
    	int tre = 0, pointer = 0, counter = 1;
    	while (tre > 6 || tre < 2)
    	cin >> tre;
    	for (int i = 0; i < tre; i++)
    	{
    		counter = 1;
    		for (int position = 0; position < tre * tre * 2; position++)
    		{
    			if (position >= tre * counter - pointer && position <= tre * counter + pointer  )
    				cout << "*";
    			else
    				cout << " ";
    			if (position != 0 && position % (tre * 2) == 0)
    				counter += 2;
    		}
    		pointer++;
    		cout << endl;
    	}
    	
    	system("pause");
    	return 0;
    }
  5. colt

    #include "stdafx.h"
    #include "iostream"
    #include "windows.h"
    
    using namespace std;
    
    int intDim, intDots, intHalfDots;
    
    int _tmain(int argc, _TCHAR* argv[])
    {  
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
    
        while(true)
        {  
            system("CLS");
    		cout<<"Введите число=размер треугольников: ";
    		cin>>intDim;
    		if ((intDim%2)==0) cout<<"Введите нечётное число\n";
    		else 
    		{
    			intDots=1;
    			for (int i=2; i<=intDim;i++) intDots+=2;
    			intHalfDots=intDots/2;
    			for (int i=0; i<intDim;i++)
    			{
    				for (int k=0; k<intDim;k++)
    				{
    					for (int j=0; j<intDots;j++)
    					{
    						if ((j>=(intHalfDots-i))&&(j<=(intHalfDots+i))) cout<<"*";
    						else cout<<" ";					
    					}
    					cout<<" ";
    				}
    				cout<<"\n";
    			}
    		}
    		system("PAUSE");
        }
        return 0;
    }
  6. KeeN

    Сократил код из решения. В циклах переменные задал = 0 по привычке.

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int number;
        cout << "Enter number of triangles: ";
        cin >> number;
    
        for(int y=0; y < number; cout << endl, y++) { //высота треугольника расходящаяся к низу
    
            for(int i=0; i < number; i++) { //кол-во треугольников
                //пробелы слева
                for(int x=0; x < number-y-1; cout << " ", x++) ;    //минус 1, т.к. y начинается с нуля
    
                //выводим треугольник
                for(int x=-y; x <= y; cout << "*", x++) ;
    
                //пробелы справа
                for (int x=0; x <= number-y-1; cout << " ", x++) ;  //плюс 1 пробел между треугольниками
            }
        }
    
        return 0;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.