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

Рекурсия - C++

Восстановить пароль Регистрация
 
Mr. Wolf^^
 Аватар для Mr. Wolf^^
-32 / 0 / 0
Регистрация: 16.10.2010
Сообщений: 38
21.03.2011, 22:19     Рекурсия #1
Помогите срочно !

Нужен код дампа с рекурсией.. могу дать без рекурсии для редактирования. Сдавать завтра(


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
#include <iostream> 
using namespace std; 
short int a,b,i(1); 
 
short int dvoichnay(short int number) 
{ 
short int digit; 
short int mask(040000); 
bool flag(false); 
if (number) 
 
{ 
if (number < 0) 
 
{ 
flag = true; 
cout << char(1 + 48); 
} 
for (int i = 0; i < 15; ++i) 
 
{ 
digit = (number & mask) >> 15 - i - 1; 
if (digit) 
 
{ 
flag = true; 
cout << char(digit + 48); 
} 
else 
if (flag) cout << char(0 + 48); 
mask >>= 1; 
} 
cout << endl; 
} 
else 
cout << char(0 + 48) << endl; 
return 0; 
} 
 
short int vosmirichnay(short int number) 
{ 
short int digit; 
short int mask(070000); 
bool flag(false); 
if (number) 
{ 
if (number < 0) 
{ 
flag = true; 
cout << char(1 + 48); 
} 
for (int i = 0; i < 5; ++i) 
{ 
digit = (number & mask) >> 15 - 3 * i - 3; 
if (digit) 
{ 
flag = true; 
cout << char(digit + 48); 
} 
else 
if (flag) cout << char(0 + 48); 
mask >>= 3; 
} 
cout << endl; 
} 
else 
cout << char(0 + 48) << endl; 
return 0; 
} 
short int shestnadzatirichay(short int number) 
{
short int digit; 
short int highMask(0xf000); 
short int lowMask(0x000f); 
short int mask(0xf00); 
bool flag(false); 
if (number) 
{ 
digit = ((short int(number & highMask)) >> 16 - 4) & lowMask; 
if (digit) 
{ 
flag = true; 
cout << (digit > 9 ? char(digit + 87) : char(digit + 48)); 
} 
for (int i = 1; i < 4; ++i) 
{ 
digit = (number & mask) >> 16 - 4 * i - 4; 
if (digit) 
{ 
flag = true; 
cout << (digit > 9 ? char(digit + 87) : char(digit + 48)); 
} 
else 
if (flag) cout << char(0 + 48); 
mask >>= 4; 
} 
cout << endl; 
} 
else 
cout << char(0 + 48) << endl; 
return 0; 
}
int main() 
{ 
cout << "Vvedite chislo?\a"; 
cin >> a; 
 
do 
{ 
cout << "Kakaya sistema?\a"; 
cin >> b; 
 
switch(b) 
{ 
case 2 : dvoichnay(a); 
break; 
case 8 : vosmirichnay(a); 
break; 
case 16 : shestnadzatirichay(a); 
break; 
default : cout << "Vvedite sistemy 2,8,16\a"; 
} 
cout << endl; 
 
} 
while((b!=2)&&(b!=8)&&(b!=16)); 
return 0;
}
Вот...нужно найти ошибки либо рационализовать.

Двоичный дамп

Представим реализацию двоичного дампа для короткого целого. Будем формировать символьную последовательность на основе символьных литералов '0' и '1', сохраняя в ней ведущие нули. Циклическая операция маскирования позволяет выявить значение для всех двоичных разрядов числа, начиная с разряда, следующего за знаковым. Знаковый разряд, как видим, следует рассматривать независимо от остальных. Начальное значение маски можно задать с помощью восьмеричного литерала 040000 или шестнадцатеричного литерала 0х4000. Маску, как видим, всякий раз следует сдвигать вправо на один разряд.

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
// Binary dump for a short integer
 
#include <iostream>
 
int main()
{
using namespace std;
short int number;
short int mask(040000);
cout << "Short integer? ";
cin >> number;
if (cin.fail())
{
cout << "Invalid format!\n";
return -1;
}
if (number < 0)
cout << '1';
else
cout << '0';
for (int i = 0; i < 15; ++i)
{
if (number & mask)
cout << '1';
else
cout << '0';
mask >>= 1;
}
cout << endl;
return 0;
}
Результат работы программы:

Short integer? 0
0000000000000000
Short integer? 2
0000000000000010
Short integer? -2
1111111111111110
Short integer? 32767
0111111111111111
Short integer? -32768
1000000000000000
Представим альтернативную реализацию двоичного дампа для короткого целого, где вместо операции маскирования будет использоваться операция проверки знака: если число неотрицательное, то в символьную последовательность отправляется литерал '0', в противном случае – литерал '1'. Циклическая операция проверки знака позволяет выявить значение для всех двоичных разрядов числа. Число, как видим, всякий раз следует сдвигать влево на один разряд.

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
// Binary dump for a short integer
 
#include <iostream>
 
int main()
{
using namespace std;
short int number;
cout << "Short integer? ";
cin >> number;
if (cin.fail())
{
cout << "Invalid format!\n";
return -1;
}
for (int i = 0; i < 16; ++i)
{
if (number < 0)
cout << '1';
else
cout << '0';
number <<= 1;
}
cout << endl;
return 0;
}
Результат работы программы:

Short integer? 0
0000000000000000
Short integer? 2
0000000000000010
Short integer? -2
1111111111111110
Short integer? 32767
0111111111111111
Short integer? -32768
1000000000000000
Теперь зададимся целью реализовать механизм подавления ведущих нулей для неотрицательных чисел. В основу механизма подавления ведущих нулей кладётся флаг – переменная, значение которой “просигналит” о появлении первой единицы в символьной последовательности. Нулевое значение флага препятствует появлению в символьной последовательности литералов '0', трактуя их как ведущие нули. Очевидно, что сам нуль станет теперь “особым” числом, которое следует рассматривать независимо от остальных неотрицательных чисел. Поначалу представим реализацию двоичного дампа для короткого целого с использованием операции маскирования.

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
// Binary dump for a short integer
 
#include <iostream>
 
int main()
{
using namespace std;
short int number;
short int mask(040000);
bool flag(false);
cout << "Short integer? ";
cin >> number;
if (cin.fail())
{
cout << "Invalid format!\n";
return -1;
}
if (number)
{
if (number < 0)
{
flag = true;
cout << '1';
}
for (int i = 0; i < 15; ++i)
{
if (number & mask)
{
flag = true;
cout << '1';
}
else
if (flag) cout << '
if (flag) cout << '0';
mask >>= 1;
}
cout << endl;
}
else
cout << '0' << endl;
return 0;
}
Результат работы программы:

Short integer? 0

Short integer? 2
10
Short integer? -2
1111111111111110
Short integer? 32767
111111111111111
Short integer? -32768
1000000000000000
Представим реализацию двоичного дампа для короткого целого с использованием операции проверки знака.

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
// Binary dump for a short integer
 
#include <iostream>
 
int main()
{
using namespace std;
short int number;
bool flag(false);
cout << "Short integer? ";
cin >> number;
if (cin.fail())
{
cout << "Invalid format!\n";
return -1;
}
if (number)
{
for (int i = 0; i < 16; ++i)
{
if (number < 0)
{
flag = true;
cout << '1';
}
else
if (flag) cout << '0';
number <<= 1;
}
cout << endl;
}
else
cout << '0' << endl;
return 0;
}
Результат работы программы:

Short integer? 0

Short integer? 2
10
Short integer? -2
1111111111111110
Short integer? 32767
111111111111111
Short integer? -32768
1000000000000000
Как видим, результаты работы программ для двоичного дампа с реализацией механизма подавления ведущих нулей требуют от пользователя не только навыков чтения двоичного кода целых чисел заданного типа, но и глубокого понимания их “природы”, связанной с форматом внутреннего представления.
В завершение обзора обратимся к иллюстрации одной из ключевых концепций, которая будет востребованной в реализациях восьмеричного и шестнадцатеричного дампа для целых чисел. Очевидно, что цифры алфавита рассматриваемой двоичной системы счисления могут быть получены и другим способом, если воспользоваться таблицей символов ASCII-кодов, в которой каждый символ кодируется своим десятичным номером. Так, например, символу '0' соответствует номер 48, а символу '1' – номер 49. Чтобы по десятичному номеру символа таблицы ASCII-кодов получить соответствующий ему символьный литерал, необходимо выполнить преобразование типа, например, с помощью оператора конструирования значения. Например, для символа '0' необходимо выполнить преобразование char(48), а для символа '1' соответственно – char(49). Отметим, что выражение для оператора конструирования значения следует трактовать как составное, например, char(0 + 48) или char(1 + 48). В этом случае второй операнд выражения (число 48) воспринимается как смещение по таблице ASCII-кодов для символов от '0' до '9', а первый операнд – как двоичный код числа от 0 до 9.
Представим реализацию двоичного дампа для короткого целого с использованием операции маскирования, не привлекая пока механизм подавления ведущих нулей.

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
// Binary dump for a short integer
 
#include <iostream>
 
int main()
{
using namespace std;
short int number;
short int mask(040000);
cout << "Short integer? ";
cin >> number;
if (cin.fail())
{
cout << "Invalid format!\n";
return -1;
}
if (number < 0)
cout << char(1 + 48);
else
cout << char(0 + 48);
for (int i = 0; i < 15; ++i)
{
cout << char(((number & mask) >> 15 - i - 1) + 48);
mask >>= 1;
}
cout << endl;
return 0;
}
Представим реализацию двоичного дампа для короткого целого с использованием операции маскирования, привлекая на этот раз механизм подавления ведущих нулей.

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
// Binary dump for a short integer
 
#include <iostream>
 
int main()
{
using namespace std;
short int number;
short int digit;
short int mask(040000);
bool flag(false);
cout << "Short integer? ";
 
#175
Максим Опарин 
сегодня в 22:10
cin >> number;
if (cin.fail())
{
cout << "Invalid format!\n";
return -1;
}
if (number)
{
if (number < 0)
{
flag = true;
cout << char(1 + 48);
}
for (int i = 0; i < 15; ++i)
{
digit = (number & mask) >> 15 - i - 1;
if (digit)
{
flag = true;
cout << char(digit + 48);
}
else
if (flag) cout << char(0 + 48);
mask >>= 1;
}
cout << endl;
}
else
cout << char(0 + 48) << endl;
return 0;
}
вот.. тут как я понял надо сделать переполнение и рекурсию
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2011, 22:19     Рекурсия
Посмотрите здесь:

РЕкурсия C++
Рекурсия (на С) C++
Рекурсия C++
рекурсия C++
Рекурсия C++
C++ Рекурсия
C++ Рекурсия
Рекурсия C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 02:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru