Составить программу, которая будет печатать ромб одним из значков (* или + или #) Выбор значков организовать оператором 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
#
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
#
Комментарии
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; }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; } }Олег Елизаров
// моя программа рисует ромб и при высоте большей чем ширина ромба, чего нет в образце.
#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;
}
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>=xmax) XorY=true;</em> <em> else XorY=false;</em> for (int i=0; i<=ymax; i++) { for (int j=0; j<=xmax; j++) { bPrintflag=false; //флаг совпадения for (int k=0; k<C; k++) { <em>if (!XorY)</em> <em> {</em> <em> dy=dK[k]*double(j)+dB[k]; //вычисление Y</em> <em> if ((static_cast<int>(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<int>(floor(dx+0.5)))==j) bPrintflag=true; //сравнение текущей координаты X с вычисленной, перед сравнением приводим тип double в int</em> } } if (bPrintflag) cout<<cPrintSymb; //если выявлено совпадение, выводим символ else cout<<" "; //если нет, то пробелКонстантин Воливач
#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();
}