Консультация № 137548
19.05.2008, 18:10
0.00 руб.
0 3 3
Уважаемые эксперты! Помогите, пожалуйста, решить 3 задачи:
1. Составить программу, которая запрашивает числа с клавиатуры, признак окончания ввода 0 и выводит их в обратном порядке (с помощью рекурсии).
2. Составить программу перевода десятичного числа в а) двоичную запись ; б) q-ичную запись. (с помощью рекурсии).
3. Реализовать сортировку простым выбором в виде рекурсивной процедуры.
Заранее огромное спасибо! Swallow.

Обсуждение

давно
Старший Модератор
31795
6196
19.05.2008, 20:05
общий
это ответ
Здравствуйте, Ласточка!

Первые две задачи в приложении, выполняются последовательно.
Удачи!

Приложение:
var a,q:integer; {рекурсивная процедура первой задачи}procedure task1; var a:integer; begin readln(a); if a<>0 then begin task1; write(a:3); end; end; {рекурсивная процедура второй задачи}procedure task2(a,b:integer); begin if a>0 then begin task2(a div b,b); write(a mod b); end; end;begin {первая задача}writeln(‘Task 1:‘);task1;writeln; {вторая задача}writeln(‘Task 2:‘);write(‘Enter A:‘);readln(a);write(‘Enter Q:‘);readln(q);write(a:5,‘ to 2 :‘);task2(a,2);writeln;write(a:5,‘ to ‘,q:1,‘ :‘);task2(a,q);end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
19.05.2008, 20:11
общий
это ответ
Здравствуйте, Ласточка!
Помогу чем смогу.
Вот функция, которая вернёт значение целого десятеричного числа в двоичной системе исчисления.

function ToBin(var x: integer): string;
var rez: string;
y: integer;
begin
rez := ‘‘; y := x;
Repeat
if (y mod 2 = 0) then rez := ‘0‘ + rez
else rez := ‘1‘ + rez;
y := y div 2;
Until y < 1;
ToBin := rez;
end;

Вы знакомы с алгоритмом переведения числа в двоичную систему? Расскажу вкратце - думаю поймёте. Берётся число из десятеричной системы исчисления и делится на 2 до тех пор, пока делимое не станет меньше единицы. При этом, если при делении числа на 2 у нас имеется остаток, то в результат дописывается 1, если остаток равен нулю, то в результат дописывается нуль. По окончании, результирующая строка "переворачивается", т.е. записывается задом наперёд.
По окончании, строка лишние нули слева могут убраться.
Пример. Переведём в двоичную систему число 10
10 / 2 = 5 | 0
5 / 2 = 2.5 | 1
2 / 2 = 1 | 0
1 / 2 = 0.5 | 1
Получается "0101", переворачиваем и видим, что 10 (10) = 1010 (2)
Результат хранится в строковом типе данных.
Теперь с первой задачкой. Её можно бы оформить при помощи динамического списка, но т.к. с динамическими списками я всё ещё консенсус не нашёл, то сделал по другому: считываем числа до тех пор, пока не встретим нуль; пишем их в типизированный файл, а потом просто читаем файл, начиная с конца. Код в приложении.
Удачи!

Приложение:
var f: file of integer; {файл целых чисел} i: integer; {переменная счётчик}procedure CreateData; {процедура заполнения файла числами}var a: integer;begin readln(a); {считываем число} if a <> 0 then {если число не нуль, то} begin write(f, a); {записываем его в файл} CreateData; {и обращаемся к процедуре повторно (рекурсивно)} end;end;procedure ViewFile; {процедура просмотра файла - действует по тому же принципу}var a: integer;begin seek(f, i); {помещаем указатель в конец файла} read(f, a); {считываем значение} write(a:5); {выводим на экран} dec(i); {сдвигаем счётчик на позицию назад (уменьшаем на единичку)} if i>=0 then ViewFile; {если мы всё ещё не достигли начала файла, то процедура повторяется}end;begin Assign(f, ‘MyFile.dat‘); {зададим файл на диске} Rewrite(f); {создаём файл (перезаписываем)} CreateData; {запускаем процедуру заполнения файла числами} i:=FileSize(f)-1; {счётчику присваиваем значение размера файла} ViewFile; {просматриваем файл} Close(f); {закрываем файл} readln;end.
Неизвестный
19.05.2008, 21:12
общий
это ответ

<i>Здравствуйте, <b>Ласточка</b>!</i>

В приложении находится решение третьей задачи.

Хочется немного добавить относительно задачи 2а. На самом деле, числа в компьютере и без того хранятся в двоичной форме, так что их особо переводить и не надо - нужно просто вывести эти числа без преобразования их в 10-ную систему счисления.

Пример (основан на примере из ответа эксперта <b>Зенченко Константин Николаевич</b>):
<code>
<b>procedure </b>task2a(<b>const </b>a: Integer);
<b>begin
  if</b> (a <> 0) <b>then
  begin</b>
    task2a(a <b>shr </b>1);
    <b>write</b>(a <b>and</b> 1);
  <b> end;
end;</b>
</code>
Хочу заметить, что этот способ позволяет выводить и отрицательные числа.

<em>Успехов!</em>

Приложение:
program q137548_3; uses Crt; const {Размерность массива} MASS_SIZE = 20; type Mass = array[1..MASS_SIZE] of Integer; {Процедура сортировки простым выбором} procedure sortSelect(var aMass: Mass; const m: Integer); var i, minv: Integer; begin {Ищем минимальное значение в массиве, начиная с элемента с индексом m} minv:= m; for i:= m+1 to MASS_SIZE do if (aMass[minv] > aMass[i]) then minv:= i; {Если нашли, то меняем его местами с элементом с индексом m} if (minv > m) then begin i:= aMass[m]; aMass[m]:= aMass[minv]; aMass[minv]:= i; end; {Переходим к следующему элементу} if (m < MASS_SIZE-1) then sortSelect(aMass, m+1); end; var m: Mass; i: Integer; begin {Очистка экрана} ClrScr; {Инициализация} Randomize; for i:= 1 to MASS_SIZE do begin m[i]:= Random(501) - 250; write(m[i]:4, ‘ ‘); end; writeln; {Сортировка и вывод} writeln; writeln(‘Sorted:‘); sortSelect(m, 1); for i:= 1 to MASS_SIZE do write(m[i]:4, ‘ ‘); writeln; {Ожидание нажатия пользователем любой кнопки} WriteLn; WriteLn(‘Press any key...‘); ReadLn; end.
Форма ответа