Консультация № 177891
17.04.2010, 15:01
0.00 руб.
0 25 2
Доброго время суток Дорогие эксперты!
Помогите пожалуйста решить задачи в среде TP-7.0

1)Дано целое неотрицательное число <2^16. Получить число перестановкой битов каждого байта данного числа в обратном порядке.
(использовать побитовые операции в паскале)

2)Строку, представляющую собой запись вещественного числа в форме с фиксированной точкой, преобразовать в строку, представляющую собой запись того же числа в форме с плавающей точкой в нормализованном виде.
(использовать преобразование типов)

3)Дана прямоугольная матрица. Упорядочить столбцы матрицы по невозрастанию минимальных элементов столбцов.

Представление матрицы должно быть такое - Указатель на матрицу!

!Не указатель на массив указателей на столбцы и так далеее а именно указатель на матрицу

Разработать алгоритм и составить программы для решения задачи для четырех случаев, матрицу следует разместить в "куче" при выполнении следующих условий:

Тоисть 4 функции описать отдельно по инициализации матрицы в памяти

а) число строк и число столбцов - константы;

б) число строк - константа, а число столбцов - исходное данное;

c) число строк - исходное данное, число столбцов - константа;

д) число строк и число столбцов - исходные данные.

Ввод, вывод и обработку матрицы описать отдельными подпрограм-мами. Для случаев а) - д), где возможно, использовать одни и те же подпрограммы.

Спасибо за внимание!

Система: Windows Vista Home Premium

Обсуждение

давно
Академик
320937
2216
17.04.2010, 16:45
общий
Юдин Евгений Сергеевич:
В первом и втором вопросах просто переписать на Pascal с ответа на С? https://rfpro.ru/question/177700
Неизвестный
18.04.2010, 02:50
общий
Юдин Евгений Сергеевич:
Что такое "невозрастание" элементов?
Неизвестный
18.04.2010, 10:56
общий
Алексей S, 2-й класс пейджер | цитировать

Юдин Евгений Сергеевич:
Что такое "невозрастание" элементов?


невозрастание элементов это тоже самое что убывание))
давно
Академик
320937
2216
18.04.2010, 11:41
общий
Невозрастание элементов - не то же самое, что убывание.
Убывание: x1>x2>x3>...>xn
Невозрастание: x1>=x2>=x3>=..>=xn
Неизвестный
20.04.2010, 12:12
общий
Цитата: lamed

• 17.04.2010, 16:45 :: lamed, Практикант пейджер | цитировать

Юдин Евгений Сергеевич:
В первом и втором вопросах просто переписать на Pascal с ответа на С? https://rfpro.ru/question/177700

если решение будет при этом работать то можно
давно
Академик
320937
2216
20.04.2010, 12:45
общий
Turbo Pascal 7, ABC.
Юдин Евгений Сергеевич:
Код:
{ ============================== }
{ Дано целое неотрицательное число <2^16.
Получить число перестановкой битов каждого
байта данного числа в обратном порядке.
Вариант 1
}

program p177891a;
var
i: integer;
num: integer;
len: integer;
hi, lo: integer;

procedure PrintBinary(x: word);
{ печать беззнакового двухбайтового целого в битовой форме }
var
i: integer;
len: integer;
begin
len := sizeof(word)*8; { бит в числе }

for i:=len-1 downto 0 do
if (x and (1 shl i)=0) then
write('0')
else
write('1');
writeln;
end; { PrintBinary }

begin
len := sizeof(word)*8;

write('num=');
readln(num);

writeln('Введенное число');
PrintBinary(num);

for i:=0 to (len+1) div 2-1 do
begin
if (num and (1 shl (len-i-1)))<>0 then
hi:= 1
else
hi := 0;
if (num and (1 shl i))<>0 then
lo := 1
else
lo := 0;

{ если установлен левый бит, установить правый бит,
иначе сбросить правый бит }
if hi=0 then
num := num and not(1 shl i)
else
num := num or (1 shl i);

{если установлен правый бит, установить левый бит,
иначе сбросить левый бит }
if lo=0 then
num := num and not (1 shl (len-i-1))
else
num := num or (1 shl (len-i-1));
end;
writeln('Число с переставленными битами');
PrintBinary(num);

readln;
end.


Код:
{ ===============================
{2)Дано целое неотрицательное число <2^16.
Получить число перестановкой битов каждого
байта данного числа в обратном порядке.
Вариант 2 }

program p177891;
var
num1, num2: integer;
ch: byte;
hi, lo: byte;

procedure PrintBinary(x: word);
{ печать беззнакового двухбайтового целого в битовой форме }
var
i: integer;
len: integer;
begin
len := sizeof(word)*8; { бит в числе }

for i:=len-1 downto 0 do
if (x and (1 shl i)=0) then
write('0')
else
write('1');
writeln;
end; { PrintBinary }

function Reverse(x: byte): byte;
var
i: integer;
res: byte;
{ Перестановка битов байта }
begin
res := x and 1;
for i:=1 to 7 do
res := (res shl 1) or ((x shr i) and 1);
Reverse := res;
end; { Reverse }

begin
write('num1=');
readln(num1);

writeln('Введенное число');
PrintBinary(num1);

hi := $FF and (num1 shr 8); { левый байт }
lo := $FF and num1; { правый байт }

writeln('Число с переставленными битами');
num2 := (Reverse(hi) shl 8) or Reverse(lo);
PrintBinary(num2);

Readln;
end.

Неизвестный
20.04.2010, 12:54
общий
lamed:
Привет, а почему не в ответе разместили?
давно
Академик
320937
2216
20.04.2010, 13:04
общий
Boriss:
Добрый день! Сейчас положу.
давно
Академик
320937
2216
20.04.2010, 13:09
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич. Ответ на первый вопрос в Приложении. В варианте 1 "переворачивается" число целиком, в варианте 2 - побайтово. Turbo Pascal 7, ABC.


Приложение:
{ ============================== }
{ Дано целое неотрицательное число <2^16.
Получить число перестановкой битов каждого
байта данного числа в обратном порядке.
Вариант 1
}

program p177891a;
var
i: integer;
num: integer;
len: integer;
hi, lo: integer;

procedure PrintBinary(x: word);
{ печать беззнакового двухбайтового целого в битовой форме }
var
i: integer;
len: integer;
begin
len := sizeof(word)*8; { бит в числе }

for i:=len-1 downto 0 do
if (x and (1 shl i)=0) then
write('0')
else
write('1');
writeln;
end; { PrintBinary }

begin
len := sizeof(word)*8;

write('num=');
readln(num);

writeln('Введенное число');
PrintBinary(num);

for i:=0 to (len+1) div 2-1 do
begin
if (num and (1 shl (len-i-1)))<>0 then
hi:= 1
else
hi := 0;
if (num and (1 shl i))<>0 then
lo := 1
else
lo := 0;

{ если установлен левый бит, установить правый бит,
иначе сбросить правый бит }
if hi=0 then
num := num and not(1 shl i)
else
num := num or (1 shl i);

{если установлен правый бит, установить левый бит,
иначе сбросить левый бит }
if lo=0 then
num := num and not (1 shl (len-i-1))
else
num := num or (1 shl (len-i-1));
end;
writeln('Число с переставленными битами');
PrintBinary(num);

readln;
end.

{ ===============================
{2)Дано целое неотрицательное число <2^16.
Получить число перестановкой битов каждого
байта данного числа в обратном порядке.
Вариант 2 }

program p177891;
var
num1, num2: integer;
ch: byte;
hi, lo: byte;

procedure PrintBinary(x: word);
{ печать беззнакового двухбайтового целого в битовой форме }
var
i: integer;
len: integer;
begin
len := sizeof(word)*8; { бит в числе }

for i:=len-1 downto 0 do
if (x and (1 shl i)=0) then
write('0')
else
write('1');
writeln;
end; { PrintBinary }

function Reverse(x: byte): byte;
var
i: integer;
res: byte;
{ Перестановка битов байта }
begin
res := x and 1;
for i:=1 to 7 do
res := (res shl 1) or ((x shr i) and 1);
Reverse := res;
end; { Reverse }

begin
write('num1=');
readln(num1);

writeln('Введенное число');
PrintBinary(num1);

hi := $FF and (num1 shr 8); { левый байт }
lo := $FF and num1; { правый байт }

writeln('Число с переставленными битами');
num2 := (Reverse(hi) shl 8) or Reverse(lo);
PrintBinary(num2);

Readln;
end.
Неизвестный
20.04.2010, 13:10
общий
lamed:
Неизвестный
20.04.2010, 13:36
общий
Больщое спасибо, lamed! очень признателен вам!

как быть с другими вопросами особенно с 3им!
давно
Академик
320937
2216
20.04.2010, 13:50
общий
Юдин Евгений Сергеевич:
Если никто из экспертов не ответит, у меня будет время в воскресенье. Тогда выложу как сообщение в мини-форум.
Неизвестный
20.04.2010, 13:59
общий
Спасибо lamed! Буду признателен!
Неизвестный
20.04.2010, 14:06
общий
1) Третье - занимаюсь отладкой
2) И самое важное: видите как неудобно, когда в одном вопросе Вы сразу помещаете три задания!! Больше так не делайте
Неизвестный
20.04.2010, 22:11
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.
Вот (в приложении и в прикрепленном файле - архиве) решение третьей задачи
Разные варианты задания числа колонок и столбцов ничем не различаются, поскольку используется попрограмма
Пишите, ежели что

Приложение:
{$R-} {Отключаем выход за пределы диапазона}
TYPE
TMatrix = array[1..1, 1..1] of Integer;
PMatrix = ^TMatrix;

TRow = array[1..1] of Integer; {Нужно будет для упорядочения}
PRow = ^TRow;

function HeapFunc(Size: Word): Integer; far;
{Нужная для работы с динамической памятью = кучей}
begin
HeapFunc := 1;
end;

{Есть проблема в работе с таким массивом. Паскаль неправильно
вычисляет адрес элементов. Так, например, элемент с индексами
[2, 5] это тоже, что и элемент с индексами [5, 2]
Надо работать впрямую обращаясь к памяти, адрес которой надо вычислять
Для этого и используются две подпрограммы
С одномерными массивами такой проблемы нет}

VAR
m_seg, m_ofs: Word; {сегмент и смещение области, на которую указывает
матрица}
CONST
s_int = sizeof(Integer); {2 байта, но ...}
max_rand = 100;

function GetElement(r, c, aCols: Integer): Integer;
begin
GetElement := memw[m_seg: m_ofs + ((r-1)*aCols + (c-1))*s_Int]
{считать слово. Альтернатива - использовать MOVE}
end;

procedure PutElement(r, c, aCols, value: Integer);
{ r ряд, куда записать, c - колонка, aCols - всего колонок;
value - величина}
begin
memw[m_seg : m_ofs + ((r-1)*aCols + (c-1))*s_Int] := Value
end;

function DefineMatrix(aRows, aCols: Integer): PMatrix;
{Создание матрицы. Если не удается, то возвращает nil}
var ma: PMatrix;
i, j: Integer;
begin
DefineMatrix := nil;
ma := nil;
GetMem(ma, aRows*aCols*s_Int);
if ma = nil then Exit;
{заполнение}
m_seg := Seg(ma^);
m_ofs := Ofs(ma^);
for i:=1 to aRows do
for j:=1 to aCols do
PutElement(i, j, aCols, random(max_rand) {i*j + 20*(i-1)});
DefineMatrix := ma;
end;

procedure ShowMatrix(aMatrix: PMatrix; aRows, aCols: Integer);
var i, j: Integer;
begin
if aMatrix = nil then Exit;
for i:=1 to aRows do
begin
for j:=1 to aCols do
Write(GetElement(i, j, aCols):4);
WriteLn;
end;
end;



procedure SortMatrix(aMatrix: PMatrix; aRows, aCols: Integer);
var MinElements: PRow;
i, j, min: Integer;

{Локальная процедура для обмена столбцов}
procedure Swap(col1, col2: Integer); {Все остальное она знает}
var temp, k: Integer;
begin
for k:= 1 to aRows do begin
temp := GetElement(k, col1, aCols);
PutElement(k, col1, aCols, GetElement(k, col2, aCols));
PutElement(k, col2, aCols, temp);
end;
{Теперь не забыть поменять местами в массиве минимальных
элементов. А я, было, забыл}
temp := MinElements^[col1];
MinElements^[col1] := MinElements^[col2];
MinElements^[col2] := temp
end;

begin
if aMatrix = nil then Exit;
GetMem(MinElements, aCols*sizeof(Integer));
{Сначала найдем минимальные в каждом столбце}
for j :=1 to aCols do
begin
{Отслеживаем номер (ряд) минимального элемента в колонке}
MinElements^[j] := 1;
for i:=1 to aRows do
if GetElement(i, j, aCols) < GetElement(MinElements^[j], j, aCols)
then MinElements^[j] := i;
end;

{Для сортировки применим метод вставки: колонку с самым
большим значением минимального элемента ("отсюда" и до конца)
и ставим "сюда"
Здесь, как правило, потребуется меньше перестановок, чем в пузырьковом}
for i:=aCols-1 downto 2 do
begin
min := i;
{Номер ряда, где минимальный элемент самый маленький}
for j := i-1 downto 1 do
if GetElement(MinElements^[j], j, aCols) <=
GetElement(MinElements^[min], min, aCols)
then min := j;
if i <> min then Swap(i, min);
end;

FreeMem(MinElements, aCols*sizeof(Integer));
end;

function DisposeMatrix(var aMatrix: PMatrix; aRows, aCols: Integer): Boolean;
begin
DisposeMatrix := FALSE;
if aMatrix = nil then Exit;
FreeMem(aMatrix, aRows*aCols*s_Int);
m_seg := 0; m_ofs := 0;
DisposeMatrix := True
end;

procedure DoMatrix(aRows, aCols: Integer);
{Подпрограмма, которая все вызывает}
var
M: PMatrix;
begin
m_seg := 0; m_ofs := 0;
M := DefineMatrix(aRows, aCols);
if M = nil then
begin
WriteLn('Не удается создать матрицу размером ',aRows,' x ',aCols);
WriteLn('Скорее всего, заданы слишком большие количества строк и столбцов');
end
else
begin
WriteLn('Матрица до сортировки');
ShowMatrix(M, aRows, aCols);
SortMatrix(M, aRows, aCols);
WriteLn('Матрица после сортировки');
ShowMatrix(M, aRows, aCols);
DisposeMatrix(M, aRows, aCols);
end
end;

CONST
rows = 5;
cols = 10;
VAR
n_rows: Integer;
n_cols: Integer;

BEGIN
HeapError := @HeapFunc; {Назначаем свой обработчик ошибок}

DoMatrix(rows, cols);
(*
{С переменными нет никаких проблем - смотри ниже}
Write('Введите число строк: '); ReadLn(n_rows);
Write('Введите число колонок: '); ReadLn(n_cols);
DoMatrix(n_rows, n_cols); *)
END.
Прикрепленные файлы:
Неизвестный
20.04.2010, 22:11
общий
А что со второй? Рзобрались?
давно
Академик
320937
2216
20.04.2010, 22:33
общий
Юдин Евгений Сергеевич:
Решение второй. Сделал "кальку" с C-программы, проверял в ABC, возможно, что-то упустил.
Код:
{ 3)Строку, представляющую собой запись вещественного числа в форме с
фиксированной точкой, преобразовать в строку, представляющую собой
запись того же числа в форме с плавающей точкой в нормализованном виде.
Считаем, что мантисса всегда меньше единицы, а ее первый
разряд содержит отличную от нуля цифру }


program p177891c;
var
s1, s2: string;
i,power: integer;
len: integer;
len2: integer;

begin
write('s=');
readln(s1);
len := length(s1);
i:=1;
s2:= '';

while (i<=len) and not(s1[i] in ['-','.','0'..'9']) do
i:=i+1;
if (i>len) then
begin
writeln('Нет числа');
readln;
exit;
end;

if (s1[i]='-') then
begin
s2 := s2+'-';
i:=i+1;
end;

if not (s1[i] in ['.', '0'..'9']) then
begin
writeln('Нет числа');
readln;
exit;
end;

s2:=s2+'0.';
power:=0;

while (i<=len) and (s1[i]='0') do
i:= i+1;

while (i<=len) and (s1[i] in ['0'..'9']) do
begin
s2:= s2+s1[i];
i:= i+1;
power:= power+1;
end;

if (s1[i]='.') then
i:=i+1;

if (power=0) then
while (i<=len) and (s1[i]='0') do
begin
power:= power-1;
i:= i+1;
end;

while (i<=len) and (s1[i] in ['0'..'9']) do
begin
s2:=s2+s1[i];
i:= i+1;
end;

s2:=s2+'e';

if (power>=0) then
s2:=s2+'+'
else
s2:=s2+'-';

if (power<0) then
power:=-power;

s2:=s2+chr(ord('0')+power mod 10);


while (power >= 10) do
begin
power:= power div 10;
len2:= length(s2);
s2 := s2+s2[len2];
s2[len2]:= chr(ord('0')+power mod 10);
end;

writeln(s2);
readln;
end.

Неизвестный
20.04.2010, 23:12
общий
lamed:
Автор вопроса написал в самом начале, то на TP 7.0
давно
Академик
320937
2216
21.04.2010, 07:16
общий
Boriss:
Проверил в Turbo. Есть проблема. В Turbo мантисса от >=1 и <10. Поэтому для того, чтобы программа была адекватной, нужны контрольные примеры. Может быть, найду описание.
Неизвестный
21.04.2010, 07:37
общий
lamed:
Может быть... может быть. У автора вопроса нет указания, что это должен быть формат Turbo Pascal. Может спросить, так ли?
давно
Академик
320937
2216
21.04.2010, 08:37
общий
Юдин Евгений Сергеевич:
Доброе утро! Вы пишете
Строку, представляющую собой запись вещественного числа в форме с фиксированной точкой, преобразовать в строку, представляющую собой запись того же числа в форме с плавающей точкой в нормализованном виде.(использовать преобразование типов)

1. Как должны выглядеть указанные Вами числа?
2. О преобразовании каких типов идет речь?
Неизвестный
21.04.2010, 16:41
общий
Доброго времени суток эксперты! завтра я уточню все вопросы касаемо данных задач. в данный момент нахожусь в поездке
давно
Академик
320937
2216
21.04.2010, 17:18
общий
Юдин Евгений Сергеевич:
Тогда заодно приведете несколько примеров :)
Неизвестный
12.05.2010, 16:24
общий
Чмсла могут выглядеть так с фиксированной точкой -.5;1.23 и так далее
с плавающей точкой так +-(значащая цифра).2313е+1 например
Неизвестный
13.05.2010, 10:30
общий
Юдин Евгений Сергеевич:
Уважаемый Евгений Сергеевич.
Вообще-то плохая практика: задавать несколько задач в одном вопросе. Вот и сейчас мы убедились в этом: наши эксперты обратили внимаение, что на вторую задачу Вашего вопроса нет ответа.
Конечно, мы можем легко ее решить, но если решение дается "официальное", во время срока действия вопроса, то эксперт получает балы. Вроде бы хрень, а приятно, особенно если сможешь в результате перейти на более высокий уровень общественного признания.
По этой причине, создайте, если Вам еще нужно, новый вопрос. И, на будущее, не задавайте несколько задач в одном вопросе
Удачи и Вам и нам с Вами!
Форма ответа