Печать ромба символами ASCII

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

Составить программу, которая будет печатать ромб одним из значков (* или + или #) Выбор значков организовать оператором switch.

Программу решил Naikon, вот его исходный код:

///Программа выводит на экран ромб
///с заданной шириной и высотой
#include <iostream>
#include <windows.h>
using namespace std;
///передаем функции символ которым будт отображаться ромб, высоту и ширину
void fn_normal_out(char symbol,int height,int width)
{
    int position=0;
        for(int y=1;y<=height;++y)///высота
        {
            for(int x=1;x<=width;++x)///ширина
            {
                ///строим ромб
                if(x==(width/2+1+position)||x==(width/2+1-position))
                {
                    cout<<symbol;
                }
                else
                {
                    cout<<" ";
                }
            }
            cout<<endl;
            if(y<height/2+1)position++;
            else position--;
        }
}
int main()
{

        SetConsoleOutputCP(1251);///русский язык
        cout<<"Введите 1 для печати ромба '*' "<<endl;
        cout<<"Введите 2 для печати ромба '+' "<<endl;
        cout<<"Введите 3 для печати ромба '#' "<<endl;
        cout<<"Пожалуйста, введите число 1 - 3: ";
        int second_choice;
        cin>>second_choice;
        if(second_choice<=0||second_choice>3)///Error
        {
            cout<<"\nОшибка. Не верный ввод, программа закрывается...\n";
            return 0;
        }
        cout<<"\nВводить нужно только положительные нечетные числа,\n"
        <<"иначе ромб не построиться"<<endl;
        h:cout<<"\nВведите высоту ромба: ";
        int height;
        cin>>height;
        if(height<0||(!(height%2)))///Error
        {
            cout<<"\nОшибка.\n";
            goto h;
        }
        w:cout<<"\nВведите ширину ромба: ";
        int width;
        cin>>width;
        if(width<0||(!(width%2)))///Error
        {
            cout<<"\nОшибка.\n";
            goto w;
        }
        switch(second_choice)
        {
            case 1:
            {
                char symbol='*';

                fn_normal_out(symbol,height,width);
                break;
            }
            case 2:
            {
                char symbol='+';
                fn_normal_out(symbol,height,width);
                break;
            }
            case 3:
            {
                char symbol='#';
                fn_normal_out(symbol,height,width);
                break;
            }
            default:
            {
                cout<<endl<<"\nОшибка. Не верный ввод, программа закрывается...\n";
                return 0;
            }
        }
    return 0;
}

Результат работы программы:

CppStudio.com
Введите 1 для печати ромба '*' 
Введите 2 для печати ромба '+' 
Введите 3 для печати ромба '#' 
Пожалуйста, введите число 1 - 3: 3

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

Введите высоту ромба: 13

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

Комментарии

  1. Azamat00

    #include <stdio.h>
    #include <iostream>
    
     int _tmain(int argc, _TCHAR* argv[])
    {
    	int a,b,c,n=0,j=0;
    	std::cout << "romba shrift 1=+,2=#,3=*:";
    	std::cin >> a;
    	std::cout << "romba dlina:";
    	std::cin >> b;
    	std::cout << "romba shirina:";
    	std::cin >> c;
    
    	char *arr = new char [b];
    	char arrsim[3] = {'+','#','*'};
    	char sim;
    	switch(a){
    		case 1: sim = arrsim[0];break;
    		case 2: sim = arrsim[1];break;
    		case 3: sim = arrsim[2];break;
    	}
    
    	for(int i = 0; i < b; i++){
    		for(int l = 0; l < b; l++)
    			arr[l] = ' ';
    		for(int (i<=(b/2))?j=0:j=b; i<=(b/2)?(j<=c):(j>=0); i<=(b/2)?j++:j--){
    			if(j == (c/2-n))
    				arr[j] = sim;
    			if(j == (c/2+n))
    				arr[j] = sim;
    		}
    		for(int l = 0; l < c; l++)
    			std::cout << arr[l];
    		(i<(b/2))?n++:n--;
    		std::cout << std::endl;
    	}
    	std::cout << "end";
    	std::cin >> a;
    	return 0;
    }
  2. odto11

    odto11

    moi variant

    #include <iostream>
    using namespace std;
    
    void vRomb(char chSymbol);
    
    int main()
    {
        int iChoice = 0;
        char chStar = '*', chPlus = '+', chCross = '#';
        cout << "\t\tПечать ромба символами ASCII\n\n";
        cout << "Введите 1 для печати ромба '*'\n";
        cout << "Введите 2 для печати ромба '+'\n";
        cout << "Введите 3 для печати ромба '#'\n";
    
        cout << "\nПожалуйста, введите число 1 - 3: ";
        cin >> iChoice;
    
        switch(iChoice)
        {
            case 1:
                vRomb(chStar);
                break;
            case 2:
                vRomb(chPlus);
                break;
            case 3:
                vRomb(chCross);
                break;
            default:
                cout << "Вы должны ввести число от 1 до 3.\n";
        }
    
        return 0;
    }
    
    void vRomb(char chSymbol)
    {
        int X = 0, Y = 0;
        cout << "Вводить нужно только положительные нечетные числа,иначе ромб не построиться\n";
        cout << "Введите высоту ромба: ";
        cin >> X;
        cout << "Введите ширину ромба: ";
        cin >> Y;
    
        for (int i=0; i<X/2; i++)
        {
            for (int j=0; j<Y; j++)
            {
                if (j>=(Y/2-(int)i*((double)Y/X)) && j<=(Y/2+(int)i*((double)Y/X)))
                {
                    cout<<chSymbol;
                }
                else
                {
                    cout<<' ';
                }
            }
            cout<<endl;
        }
        for (int i=X/2; i>=0; i--)
        {
            for (int j=0; j<Y; j++)
            {
                if (j>=(Y/2-(int)i*((double)Y/X)) && j<=(Y/2+(int)i*((double)Y/X)))
                {
                    cout << chSymbol;
                }
                else
                {
                    cout << ' ';
                }
            }
            cout << endl;
        }
    }
  3. Олег Елизаров

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

    #include <bits\stdc++.h>
    using namespace std;

    int x, y;
    string s;
    int main()
    {
    setlocale(LC_ALL, «rus»);
    cout << «Ââåäèòå 1 äëÿ ïå÷àòè ðîìáà ‘*'»;
    cout << endl << «Ââåäèòå 2 äëÿ ïå÷àòè ðîìáà ‘+'»;
    cout << endl << «Ââåäèòå 3 äëÿ ïå÷àòè ðîìáà ‘#'»;
    int ch; cout << endl
    << «Ïîæàëóéñòà, ââåäèòå ÷èñëî 1 — 3: «; cin >> ch;
    switch ( ch ){
    case 1:{
    s = «*»;
    break;
    }
    case 2:{
    s = «+»;
    break;
    }
    case 3:{
    s = «#»;
    break;
    }
    }
    cout << endl << «Ââîäèòü íóæíî òîëüêî ïîëîæèòåëüíûå íå÷åòíûå ÷èñëà,èíà÷å ðîìá íå ïîñòðîèòüñÿ»;
    cout << endl << «\nÂâåäèòå âûñîòó ðîìáà: «; cin >> y;
    cout << endl << «Ââåäèòå øèðèíó ðîìáà: «; cin >> x;
    if (y > x ) { int str = (y-x)/2;
    y = x;
    for (int strV = 1; strV<=str;strV++)
    cout << endl;
    for (int j = 0; j < y/2; j++){
    for (int i = 0;i < x; i++){

    if (i == x / 2 — j || i == x / 2 + j){
    cout << s;}
    else cout <<» «;

    }cout << endl;
    }
    for (int j = y/2 ; j >=0; j—){
    for (int i = 0;i < x; i++){

    if (i == x / 2 — j || i == x / 2 + j){
    cout << s;}
    else cout <<» «;

    }cout << endl;
    }
    for (int strN = 1; strN<=str;strN++)
    cout << endl;
    }
    else {
    for (int j = 0; j < y/2; j++){
    for (int i = 0;i < x; i++){

    if (i == x / 2 — j || i == x / 2 + j){
    cout << s;}
    else cout <<» «;

    }cout << endl;
    }
    for (int j = y/2 ; j >=0; j—){
    for (int i = 0;i < x; i++){

    if (i == x / 2 — j || i == x / 2 + j){
    cout << s;}
    else cout <<» «;

    }cout << endl;
    }
    }
    cout << endl << «\a\a\a»;
    system («pause»);
    return 0;
    }

  4. colt

    Решение задачи для разной ширины и высоты ромба:

     

    #include "stdafx.h"
    #include "iostream"
    #include "windows.h"
    #include "cmath"
    
    using namespace std;
    
    #define C 4
    
    char cPrintSymb;	//символ, которым будем печатать ромб
    int intNumbSymb;	//число выбора символа
    double dy;	
    double dK[C];
    double dB[C];
    bool bPrintflag;
    
    int xmax, ymax, xmid, ymid;		//размер ромба
    
    int f_intCycle(int i, int l)	//корректно возвращает индекс предыдущего элемента массива 
    {								//(чтобы не получить i-1=-1 при i=0, в этом случае функция вернёт индекс последнего элемента массива)
    	if (i==0) return (l-1);
    	else return (i-1);
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    	SetConsoleCP(1251);
    	SetConsoleOutputCP(1251);
    	while(true)
    	{		
    		system("CLS");		
    		intNumbSymb=0;	
    		cout<<"\t\t\tПечать ромба символами ASCII\n\n";
    		cout<<"Введите число соответсвующее символу, которым будет напечатан ромба:\n";
    		cout<<"1 - \"*\"\n";
    		cout<<"2 - \"+\"\n";
    		cout<<"3 - \"#\"\n";
    		cout<<"Выбран вариант №: ";
    		cin>>intNumbSymb;				//вводим число соответсвующее символу
    		cout<<"\n";
    		switch (intNumbSymb)			//выбираем символ
    		{
    		case 1:		{
    				cPrintSymb='*';
    				break;	}
    		case 2:		{
    				cPrintSymb='+';
    				break;	}
    		case 3:		{
    				cPrintSymb='#';
    				break;	}
    		default:	{
    				cPrintSymb=0;
    				cout<<"Хорошая попытка, но нет! Будь внимательней\n\n";
    				break; }			
    		}		
    		if (cPrintSymb!=0)
    		{
    			cout<<"Введите размеры ромба. Используйте только нечётные числа больше трёх (1х1 увы не ромб, а точка)!\n\n";
    			cout<<"Высота: ";
    			cin>>ymax; //y
    			cout<<"\n";
    			cout<<"Ширина: ";
    			cin>>xmax; //x
    			cout<<"\n";
    			if ((xmax<3)||(ymax<3)) cout<<"Размер ромба не может быть меньше 3х3\n\n";
    			else {
    				if (((xmax%2)==0)||((ymax%2)==0)) cout<<"Размер ромба не может состоять из чётных чисел\n\n";
    				else {
    					xmax-=1;		//с этого момента считаем все размеры
    					ymax-=1;		//не от единицы, а он нуля
    					xmid=xmax/2;
    					ymid=ymax/2;
    									//Теперь наша цель - составить уравнения прямой каждой из сторон ромба и вывести на экран. Уравнение имеет вид y=kx+b.
    									//коэффициенты k и b находятся по двум точкам [x0,y0], [x1,y1] с помощью формулы (x-x0)/(x1-x0)=(y-y0)/(y1-y0)
    					double Px[C]={	xmid,	0,		xmid,	xmax	};	//у ромба четыре вершины, соответсвенно это координата Х каждой из них
    					double Py[C]={	ymax,	ymid,	0,		ymid	};	//у ромба четыре вершины, соответсвенно это координата Y каждой из них
    					int i_0;
    						for (int i_1=0; i_1<C; i_1++)
    						{
    							i_0=f_intCycle(i_1,C);
    							dK[i_1]=(Py[i_1]-Py[i_0])/(Px[i_1]-Px[i_0]);	//вычисляем коэффициенты k для всех четырёх сторон
    							dB[i_1]=-dK[i_1]*Px[i_0]+Py[i_0];				//вычисляем коэффициенты b для всех четырёх сторон							
    						}
    						cout<<"\n";
    						cout<<"\n";						
    						//Теперь берём наши исходные высоту и ширину ромба, что является высотой и шириной всего изображения
    						//проходим по каждому индексу изображения, которые соответсвуют координатам (x,y) и подставляем индекс соответствующий "x" в наши уравнения прямой
    						//полученные значения "y" сравниваем с соответсвующим индексом изображения и в случае совпадения выводим выбранный ранее нами символ
    						//если совпадения не выявлено - выводим пробел
    								for (int i=0; i<=ymax; i++)				
    								{
    									for (int j=0; j<=xmax; j++)			
    									{	
    										bPrintflag=false;					//флаг совпадения	
    										for (int k=0; k<C; k++)
    											{												
    												dy=dK[k]*double(j)+dB[k];	//вычисление Y
    												if ((static_cast<int>(floor(dy+0.5)))==i) bPrintflag=true;	//сравнение текущей координаты Y с вычисленной, перед сравнением приводим тип double в int
    											}
    											if (bPrintflag) cout<<cPrintSymb;	//если выявлено совпадение, выводим символ
    											else cout<<" ";						//если нет, то пробел
    									}
    									cout<<"\n";
    								}
    					 }
    				 }
    		}
    		cout<<"\n";
    		cout<<"\n";
    		system("PAUSE");
    	}
    	return 0;
    }
    • colt

      Прошу прощения, внёс немного изменения в код.

      <em>								if (ymax&gt;=xmax) XorY=true;</em>
      <em>								else XorY=false;</em>
      								for (int i=0; i&lt;=ymax; i++)				
      								{
      									for (int j=0; j&lt;=xmax; j++)			
      									{	
      										bPrintflag=false;					//флаг совпадения	
      										for (int k=0; k&lt;C; k++)
      											{	
      												<em>if (!XorY)</em>
      <em>														{</em>
      <em>														dy=dK[k]*double(j)+dB[k];	//вычисление Y</em>
      <em>														if ((static_cast&lt;int&gt;(floor(dy+0.5)))==i) bPrintflag=true;	//сравнение текущей координаты Y с вычисленной, перед сравнением приводим тип double в int</em>
      <em>														}</em>
      <em>												else</em>
      <em>														{</em>
      <em>														dx=(double(i)-dB[k])/dK[k];</em>
      <em>														if ((static_cast&lt;int&gt;(floor(dx+0.5)))==j) bPrintflag=true;	//сравнение текущей координаты X с вычисленной, перед сравнением приводим тип double в int</em>
      														}
      											}
      											if (bPrintflag) cout&lt;&lt;cPrintSymb;	//если выявлено совпадение, выводим символ
      											else cout&lt;&lt;" ";						//если нет, то пробел

       

  5. Константин Воливач

    #include <iostream>
    #include <conio.h>
    using namespace std;
    int main(){char symbol[2];
    int a,b,h,l,n,g;
    setlocale(LC_ALL,»RUS»);
    cout<<«Введите 1 если хотите рисовать *\n»;
    cout<<«Введите 2 если хотите рисовать +\n»;
    cout<<«Введите 3 если хотите рисовать #\n»;
    cin>>a;
    switch(a){
    case 1:symbol[1]=’*';
    case 2:symbol[1]=’+';
    case 3:symbol[1]=’#';
    };
    cout<<«Введите высоту ромба должно быть нечётное число «;
    cin>>a;
    cout<<«Введите ширину ромба должно быть нечётное число «;
    cin>>b;
    h=a/2+1;
    l=b/2+1;
    n=l;
    for(int j=0;j<h;j++){
    for(int i=0;i<=b;i++){
    if (i==l||i==n)
    {cout<<symbol[1];}
    else
    cout<<» «;

    }
    cout<<endl;
    l++;
    n—;
    }
    l—;//Уменьшаем наши счётчики звездочек т.к у нас увлечение происходило в конце и они набрали один лишний
    n++;
    for( int j=0;j<h-1;j++){
    l—;
    n++;
    for(int i=0;i<=b;i++){
    if (i==l||i==n)
    {cout<<symbol[1];}
    else
    cout<<» «;
    }
    cout<<endl;
    }
    getch();
    }

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

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