Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
GLEB011
0 / 0 / 0
Регистрация: 08.09.2010
Сообщений: 3
#1

Подскажите) - C++

08.09.2010, 11:15. Просмотров 513. Ответов 7
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "main.h"
 
int Cycle;
 
#define MakeEven( _num ) ( _num & 0xFE )
#define Rand( _num ) (_num ? rand( ) % _num : 0)
#define EvenRand( _num ) ( Rand( _num ) & 0xFE )
#define EvenMax( _num ) ( _num & 0xFE ) 
#define EvenAverage( _num ) ( ( EvenMax( _num ) / 2 ) & 0xFE )  
#define OddRand( _num ) ( Rand( _num ) | 0x01 )
#define Randomize( ) ( srand( ( unsigned ) time( NULL ) ) )
 
inline int OddBetween( int N1, int N2 )
    {  int T;  return ( T = OddRand( N2 ) ) > N1 ? T : OddBetween( N1, N2 );  }
inline int EvenBetween(int N1, int N2)
    {  int T;  return ( T = EvenRand( N2 ) ) > N1 ? T : EvenBetween( N1, N2);  }
inline int GetDirection( int width )
    {  
    int Z = Rand( 4 );
    return ( Z == 0 ? -1 : Z == 1 ? 1 : Z == 2 ? width : -width );  }
int GetRandom( int width, int height, int *x )
    {
        int Row, Col;
        Row = EvenBetween( 0, height );
        Col = EvenBetween( 0, width );
        *x = width * Row + Col;
        if( ( *x % width ) % 2 != 0 )
            GetRandom( width, height, x );
        return Cycle--;
    }
 
 
void Labirint::GenLabirint( )
    {
        std::string StrBuffer;
        std::stringstream sstrBuff;
        
        system( "cls" );
        std::cout << "\nЗАДАНИЕ РАЗМЕРА ЛАБИРИНТА\n[цифра или 'Q' для перехода в меню]\n\n";
        
        bool IsInput = true;
        while( IsInput )
            {
                StrBuffer = "";
                std::cout << "   ВЫСОТА:\t\t";  std::cin >> StrBuffer;
                if( CheckInput( StrBuffer ) )
                    {
                        if( StrBuffer == "q" || StrBuffer == "Q" )
                            {  IsInput = false; continue;  }
                        else
                            {  sstrBuff.clear( );  sstrBuff << StrBuffer;  sstrBuff >> Height;  Height = MakeEven( Height );  }
                    }
                else continue;
                
                StrBuffer = "";
                std::cout << "   ШИРИНА:\t\t";  std::cin >> StrBuffer;
                if( CheckInput( StrBuffer ) )
                    {
                        if( StrBuffer == "q" || StrBuffer == "Q" )
                            {  IsInput = false; continue;  }
                        else
                            {  sstrBuff.clear( );  sstrBuff << StrBuffer;  sstrBuff >> Width;  Width = MakeEven( Width );  }
                    }
                else continue;
                    
                StrBuffer = "";
                std::cout << "   КОЛИЧЕСТВО СТЕН:\t";  std::cin >> StrBuffer;
                if( CheckInput( StrBuffer ) )
                    {
                        if( StrBuffer == "q" || StrBuffer == "Q" )
                            {  IsInput = false; continue;  }
                        else
                            {  sstrBuff.clear( );  sstrBuff << StrBuffer;  sstrBuff >> WallNum;    }
                    }
                else continue;
                
                if( Height == 0 || Width == 0 )
                    { std::cout << "ОШИБКА:  Неверно заданы размеры лабиринта, повторите ввод\n\n"; continue; }
                WallNum = WallNum == 0 ? 70 : WallNum;
                
                Height++;  Width++;
                ArrSize = Height * Width;
                ARRAY = new unsigned char [ ArrSize ] ( );
                
                CreateBorder( );
                CreateDoors( );
                Randomize( );       // Инициализация рандома
                
                int X = 0, Z = 0;
                Cycle += ArrSize + ArrSize / 2;
                while( GetRandom( Width, Height, &X ) > 0 )
                    {
                        if( ARRAY[ X ] == 1 ) continue;
                        Z = GetDirection( Width );
                        do  // Здесь мы строим стену
                            {               
                                if( ARRAY[ X ] == 0 ) ARRAY[ X ] = 1; 
                                X += Z; 
                                if( Rand( 100 ) > WallNum ) break;   
                            }
                        while( ARRAY[ X ] == 0 );
                    }               
                IsInput = false;
                IsGenerated = true;
            }
 
        Display( );
        std::cout << "\n";
        system( "pause" );
    }
 
 
void Labirint::CreateBorder( )
    {
        unsigned char *TempArr = ARRAY;
        for( TempArr; TempArr - ARRAY < ArrSize; TempArr++ )
            {
                if( ( TempArr - ARRAY ) < Width ||                      // Определение первой строки
                     ( TempArr - ARRAY ) % Width == 0 ||                    // Определение левой стороны
                     ( TempArr - ARRAY ) % Width == Width - 1 ||        // Определение правой стороны
                     ( TempArr - ARRAY ) > Width * ( Height - 1 ) ) // Определение нижней границы
                      *TempArr = 1;
            }
    }
 
void Labirint::CreateDoors( )
    {
        int T;
      do { T = OddBetween( 0, Width ); }  while( T == 0 || T == Width );
      ARRAY[ T ] = 0xAA;    // вход
      do { T = OddBetween( ArrSize - Width, ArrSize ); }  while( T == ArrSize || ARRAY[ T ] == 0 );
      ARRAY[ T ] = 0xFF;    // выход
    }
обьясните турику что тут сначало деляется для чего define что такое int Cycle и так далее))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2010, 11:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подскажите) (C++):

подскажите что делать при вводимых данных 10 25 и 5 20 программа работает не правильно должна выводить 135 подскажите что делать - C++
Вывод В выходной файл выведите одно число - сколько ударов сделали часы за этот отрезок времени.

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

Подскажите - C++
Вот начал изучать с++ с 0. Столкнулся с проблемой уже в самом начале...подскажите плиз что не так... #include &lt;iostream.h&gt; class...

Подскажите! - C++
Привет! Учился на программиста в универе, окончил в 2005 году. После универа ушел в 1С и писал только на 1С, другие языки не использовал. В...

Подскажите - C++
Подскажите сайтик с подробным описоним библиотек и их операторов.И ссылку или тему форума о классах.

Подскажите - C++
Как с помощью 0 канала системного таймера подсчитать время выполнения определенных действий?Может у кого код есть с подобным...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
08.09.2010, 11:37 #2
Цитата Сообщение от GLEB011 Посмотреть сообщение
для чего define
Прочитайте эту ссылку.

Цитата Сообщение от GLEB011 Посмотреть сообщение
int Cycle
Глобайльная переменаая.


Цитата Сообщение от GLEB011 Посмотреть сообщение
и так далее
Прочитайте что нибудь по C++, чтобы всё стало понятно.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
08.09.2010, 12:02 #3
Да, в двух словах тут не объяснишь)
0
GLEB011
0 / 0 / 0
Регистрация: 08.09.2010
Сообщений: 3
08.09.2010, 12:09  [ТС] #4
ясненько спасибо)
0
Mencey
147 / 94 / 7
Регистрация: 22.07.2010
Сообщений: 424
08.09.2010, 12:19 #5
Первые 12 строчек опишу.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Подключает файл "main.h"
#include "main.h"  
 
// Глобальная переменная т.е. эта переменная видна везде где есть её объявления(Cycle с английского переводится как цикл)
int Cycle;  
 
// ???
#define MakeEven( _num ) ( _num & 0xFE ) 
// Генерирует "случайное" число в диапозоне от 0 до _num
#define Rand( _num ) (_num ? rand( ) % _num : 0)  
// ???
#define EvenRand( _num ) ( Rand( _num ) & 0xFE ) 
// ???
#define EvenMax( _num ) ( _num & 0xFE ) 
 // ???
#define EvenAverage( _num ) ( ( EvenMax( _num ) / 2 ) & 0xFE ) 
// Как мне кажется этот макрос генерирует не чётное "случайное" число от 1 до _num  
#define OddRand( _num ) ( Rand( _num ) | 0x01 ) 
// Инициализация датчика случайных чисел
#define Randomize( ) ( srand( ( unsigned ) time( NULL ) ) )
1
Lord_Voodoo
Супер-модератор
8588 / 2188 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
08.09.2010, 12:20 #6
GLEB011,

Не по теме:

это я вашу тему перенес, все вам правильно говорил Johny_D

0
GLEB011
0 / 0 / 0
Регистрация: 08.09.2010
Сообщений: 3
08.09.2010, 17:07  [ТС] #7
Mencey спасибо большое=)

Добавлено через 4 часа 31 минуту
люди ну помогите полностью по програме в каком коде используется в какой переходит типы данных функции помогите пожалуста
0
rrrFer
Заблокирован
08.09.2010, 17:40 #8
Mencey,
дополнил ваши комментарии
C++
1
2
3
4
5
6
7
8
9
10
11
// макрос записывает в младший двоичный разряд числа ноль(число полюбому становится четным) :
#define MakeEven( _num ) ( _num & 0xFE ) 
// генерирует четное "случайное" число, при этом использует описанный [I]Mencey[/I] макрос(число в диапазоне от нуля до num) :
#define EvenRand( _num ) ( Rand( _num ) & 0xFE ) 
// абсолютно такой же как MakeEven, понятия не имею зачем автор этого творения дублирует код:
#define EvenMax( _num ) ( _num & 0xFE ) 
 // у числа последний разряд становится равным нулю(число стало четным), затем оно делится на 2, затем из результата отнимают единицу, если он нечетный. Поидее EvenMax можно было и не вызывать, т.к. при делении по умолчанию число округляется вниз и единица в младшем разряде не влияет на результат деления на 2. 
#define EvenAverage( _num ) ( ( EvenMax( _num ) / 2 ) & 0xFE ) 
// Как мне кажется этот макрос генерирует не чётное "случайное" число от 1 до _num  
//верно, макрос записывает 1 в младший разряд числа, полученного от Rand, поэтому результат полюбому становится нечетным
#define OddRand( _num ) ( Rand( _num ) | 0x01 )
Добавлено через 12 минут
C++
1
2
3
inline int OddBetween( int N1, int N2 )
        {  int T;  return ( T = OddRand( N2 ) ) > N1 ? T : OddBetween( N1, N2 );  }
//inline это рекомендация компилятору подставить код функции в каждую точку ее вызова, но т.к. она рекурсивная то я сомневаюсь что компилятор таки сделает ее встроеной. Функция генерирует нечетное случайное число в диапазоне от N1 до N2 и работает через задний проход, ИМХо автор сего творенья специально писал быдлокод, т.к. случайно так небывает. Вобщем Функция требует генерировать число в диапазоне от 0 до N2 до тех пор пока оно не окажется больше N1(надо заметить что это не всегда возможно) прощегенерировать число в диапазоне от нуля до N2-N1 и прибавить его к N1 - Результат тотже, но потребляет меньше памяти, работает быстрее и снижает вероятность ошибки
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2010, 17:40
Привет! Вот еще темы с ответами:

Подскажите - C++
У мя есть функция , допустим MyFunc() в ней выполняются некоторые действия, также реализован какой либо цикл где вызывается эта функция...

Подскажите - C++
В ручную знаю как расчитать... А вот программу... подскажите

подскажите пожалуйста - C++
вот код программы... ________________ #include &lt;iostream.h&gt; #include &lt;math.h&gt; int A,B,n,N; double...

Подскажите ошибку) - C++
Выдает следующие ошибки: C:\Program Files\Microsoft Visual Studio\MyProjects\laba6good\laba6good.cpp(45) : error C2039: 'volt' : is...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.09.2010, 17:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru