Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2010, 14:51   #1
veter48
Форумчанин
 
Регистрация: 26.07.2010
Сообщений: 150
По умолчанию Ромб

Здравствуйте, в одной книжке нашел задание нарисовать в консоли ромб. Вот что у меня получилось (ромб 9х9):

Код:
#include <iostream>

using std::cout;
using std::endl;

int main() {

    int skait1, skait2, skait3;
    
    for (skait1 = 1; skait1 < 9; skait1 += 2) {
        for (skait2 = 0; skait2 < 9-skait1; skait2+=2) {
        cout << " ";
              
        }
        
        for (skait3 = 0; skait3 < skait1; skait3++) {
        
        cout << "*";
        
        }
        
    
    cout << endl;
    }
        
   
   
   
    for ( skait1 = 0 ; skait1 < 9; skait1+=2 ) {
      
       for ( skait2 = 0 ; skait2 < skait1 - skait2; skait2++ ) {
            
        cout << " ";    
        
        }
        for ( skait3 = 0 ; skait3 < 9 - skait1; skait3++ ) {
            
        cout << "*";    
        
        }
      
    cout << endl;
     
    }
    


system("pause");
return 0;
}
Скажите, может это можно реализовать как-то оптималнее, с меньшем количеством циклов, или такой код нормальный?
P.S.
Может, есть какие-то замечания?
Я только начал учитца.
veter48 вне форума Ответить с цитированием
Старый 25.08.2010, 15:18   #2
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Вот по-короче

Код:
#include <iostream>

using std::cout;
using std::endl;

int main() 
{
	for(int i = -4; i < 5; i++,cout << endl)
	{
		for(int j = 0; j < abs(i); j++,cout << " ");
		for(int j = 0; j < 10 - abs(i) * 2 - 1; j++,cout << "*");
		for(int j = 0; j < abs(i); j++,cout << " ");
	}
	system("pause");
	return 0;
}
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 25.08.2010, 15:49   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
#include <stdio.h>

#define N 21
#define MIDDLE (N / 2)

int main()
{
	int i, j;
	int start = MIDDLE;
	int stop = MIDDLE;

	for (i = 0; i < N; i++) {
		for (j = 0; j < N; j++) {
			printf("%c", j >= start && j <= stop ? '*' : ' ');
		}
		i < MIDDLE ? (start--, stop++) : (start++, stop--);
		printf("\n");
	}

	return 0;
}
.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 26.08.2010, 09:47   #4
veter48
Форумчанин
 
Регистрация: 26.07.2010
Сообщений: 150
По умолчанию

К сожелению незнаю таких функцый/операторов.

К сожелению незнаю таких функцый/операторов.
Цитата:
printf("%c", j >= start && j <= stop ? '*' : ' ');
i < MIDDLE ? (start--, stop++) : (start++, stop--);
abs(i);
Цитата:
Вот по-короче


Код:

#include <iostream>

using std::cout;
using std::endl;

int main()
{
for(int i = -4; i < 5; i++,cout << endl)
{
for(int j = 0; j < abs(i); j++,cout << " ");
for(int j = 0; j < 10 - abs(i) * 2 - 1; j++,cout << "*");
for(int j = 0; j < abs(i); j++,cout << " ");
}
system("pause");
return 0;
}
С етим разобрался.
Цитата:
10 - abs(i) * 2 - 1
Но как до этого можно додуматся?

Последний раз редактировалось Stilet; 26.08.2010 в 12:24.
veter48 вне форума Ответить с цитированием
Старый 26.08.2010, 10:22   #5
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Код:
#include <iostream>

using std::cout;
using std::endl;

void dotPaint(int NUM, char DOT)
{
    for (int i=0; i<NUM; i++)
    cout << DOT;
}

int main() {

    const int NUM=9;
    
    int i;
    
    for (i = 0; i < NUM/2; i++)
    {
        dotPaint(NUM/2-i, ' '); //4,3,2,1,0
        dotPaint(i*2+1, '*'); //1,3,5,7,9

	cout << endl;
    }
        
    for (i = NUM/2 ; i>=0; i--) 
    {  
	dotPaint(NUM/2-i, ' '); //0,1,2,3,4
	dotPaint(i*2+1, '*'); //9,7,5,3,1
		
	cout << endl;
    }
    
        return 0;
}

Последний раз редактировалось Indian; 26.08.2010 в 10:28.
Indian вне форума Ответить с цитированием
Старый 26.08.2010, 10:25   #6
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Цитата:
Но как до этого можно додуматся?
Закономерность
В ромбе идёт 1,3,5,7,9,7,5,3,1 знака на горизонталь. abs(i) = 4,3,2,1,0,1,2,3,4
abs(i) * 2 = 8,6,4,2,0,2,4,6,8. Видно что если от 10 отнять abs(i) * 2 и еще отнять единицу то получается кол-во знаков на горизонталь
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 26.08.2010, 12:10   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
10 - abs(i) * 2 - 1
Или если плясать вообще от самой печки, то начинаем с того, что ромб у нас сначала равномерно расширяется, а потом столь же равномерно сужается. Понятно, что для обеспечения такого непрерывного изменения параметра (ширины ромба) проще всего идти сначала от отрицательных чисел к нулю, а потом дальше в положительные, беря модуль этих чисел (вообще, вспомним вид графика функции y = |x|). Изначально ширина ромба равняется единице, а потом последовательно увеличивается на 2, а затем на 2 же уменьшается. Соответственно, сначала ширина ромба у нас имеет значение 1 + 2 * i, а затем (максимум) - (2 * i + 1). Навешиваем сюда модуль, определяем границы изменения аргумента, получаем результат!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 26.08.2010, 12:45   #8
veter48
Форумчанин
 
Регистрация: 26.07.2010
Сообщений: 150
По умолчанию

Ну я понял. Спасибо
veter48 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С. Нарисовать Ромб Николай Денисюк Помощь студентам 4 13.11.2015 17:55
Нарисовать в графическом режиме ромб. Ширину и высоту задавать с клавиатуры mulatoschka1990 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 02.12.2009 10:11
графика. ромб. оч странный ромб aka_faith Паскаль, Turbo Pascal, PascalABC.NET 19 11.06.2009 02:57