IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Две задачи на системы счисления
-Chester-
сообщение 4.11.2005 16:28
Сообщение #1


Гость






Друг попросил помочь, а я, мягко говоря, в программировании не силен unsure.gif
Если не трудно, помогите пожалуйста... Не дайте, так сказать ударить в грязь лицом...

ЗАДАЧА 1: Перевести число, представленное в системе счисления с основанием S, в системы счисления с основаниями P, Q, R. Обеспечить корректность ввода числа в системе счисления с основанием S. Перевод чисел реализовать с применением функций. (Разработайте функцию для перевода числа из системы счисления с основанием S в систему счисления с основанием P, а затем, функции для перевода из P в Q и из P в R.) Не использовать стандартных возможностей по вводу/выводу чисел представленных в 2-ой, 8-ой, 16-ой системах счисления. Для представления цифр больших 9 использовать заглавные буквы латинского алфавита.
ЗАДАЧА 2: Вывести на экран в виде таблицы значения чисел из интервала от A до B с шагом C в системах счисления с основаниями S, P, Q, R. Числа A, B, C задаются в системе счисления с основанием S, A>=0, B>A. Обеспечить точность 5 знаков после запятой во всех системах счисления. Разработайте функцию для сложения двух чисел в системе счисления с основанием S.
S=7 P=10 Q=19 R=28
 К началу страницы 
+ Ответить 
2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
Ответов(1 - 19)
volvo
сообщение 4.11.2005 16:58
Сообщение #2


Гость






Цитата(Правила Раздела)
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!

Это - перевод из одной системы в другую:
FAQ: Общие вопросы по математике

Ну, а это выдал поиск:
3 несложные задачи
Этого вполне достаточно для решения задачи...
 К началу страницы 
+ Ответить 
-Chester-
сообщение 5.11.2005 10:27
Сообщение #3


Гость






Volvo Честное слово очень неловко отвлекать вас всякими мелочами, но скажу честно, я вообще никогда не писал на Паскале, поэтому FAQ для меня малопонятен, если можно обьясните подоступней как можно решить эти задачи, что и как надо сделать (мне надо ведь не только написать эти программы, но еще потом и человеку обьснить, что к чему). Буду вам крайне признателен...
 К началу страницы 
+ Ответить 
volvo
сообщение 5.11.2005 10:30
Сообщение #4


Гость






Цитата
я вообще никогда не писал на Паскале

-Chester-, в таком случае Вы явно ошиблись адресом, потому что если я и напишу программу (или это сделает кто-то другой, не важно), понять ее Вы не сможете (если уж "разжеванных" программ из FAQ не понимаете, а второй раз так разжевывать никто не будет, сделают набросок и все), а уж объяснить тем более...
 К началу страницы 
+ Ответить 
Guest
сообщение 5.11.2005 13:54
Сообщение #5


Гость






Ну тогда хоть набросок сделайте...
 К началу страницы 
+ Ответить 
klem4
сообщение 5.11.2005 14:10
Сообщение #6


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Наброски Volvo дале тебе в виде ссылок во втором посте, там есть приктически все что тебе нужно ...


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Guest
сообщение 7.11.2005 15:22
Сообщение #7


Гость






Если не затруднит, проверьте решение ЗАДАЧИ№1:

program test;
uses crt;
var n : string;

function ToDec(n:string; radix:longint):longint;
var
m, i: longint;
const
digit: string[28]='0123456789ABCDEFGHIJKLMNOPQRS';
begin
m:=0;
while n[1]='0' do delete(n,1,1);
for i:=1 to length(n) do
m:=m*radix+pos(n[i],digit)-1;
ToDec:=m;
end;

function FromDec(n, radix:longint):string;
var
s: String;
const
digit: string[28]='0123456789ABCDEFGHIJKLMNOPQRS';
begin
s:='';
repeat
s:=digit[(n mod radix)+1]+s;
n:=n div radix;
until n=0;
FromDec:=s;
end;

function FromDec2(n, radix:longint):string;
var
s: String;
const
digit: string[28]='0123456789ABCDEFGHIJKLMNOPQRS';
begin
s:='';
repeat
s:=digit[(n mod radix)+1]+s;
n:=n div radix;
until n=0;
FromDec2:=s;
end;

begin
clrscr;
readln(n);
writeln(todec(n,7));
writeln(fromdec((todec(n,7)),19));
writeln(fromdec((todec(n,7)),28));
readln;
end.
:cwm33:
 К началу страницы 
+ Ответить 
klem4
сообщение 7.11.2005 15:51
Сообщение #8


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вот мне всегда нравились такие посты : проверьте пожалуйста, а самому ? Берешь исходные данные, делаешь ручной рассчет в тетрадке, потом запускаешь программу с этими исходными данными и сравниваешь ответы, если сошлисьь, значит работает привильно.
dry.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2005 15:59
Сообщение #9


Гость






Guest, во-первых, если уж копируешь программу, то указывай, откуда.

А во вторых - объясни мне, зачем нужны 2 одинаковых функции FromDec и FromDec2?
 К началу страницы 
+ Ответить 
Guest
сообщение 7.11.2005 16:46
Сообщение #10


Гость






Вроде бы все работает, но вот никак не получается сделать чтобы числа в системах от 11 ричной и выше заменялись соответствующими буквами

program test;
uses crt;
var n : integer;

function FromDec(n, radix:longint):string;
var
s: String;
const
digit: string[16]='0123456789ABCDEF';
begin
s:='';
repeat
s:=digit[(n mod radix)+1]+s;
n:=n div radix;
until n=0;
FromDec:=s;
end;

function ToDec(n:string; radix:longint):longint;
var
m, i: longint;
const
digit: string[16]='0123456789ABCDEF';
begin
m:=0;
while n[1]='0' do delete(n,1,1);
for i:=1 to length(n) do
m:=m*radix+pos(n[i],digit)-1;
ToDec:=m;
end;

begin
clrscr;
readln(n);
writeln(fromdec(n,7));
writeln(todec(fromdec(n,7),19));
writeln(todec(fromdec(n,7),28));
readln;
end.

ВЗЯТО ИЗ FAQ
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2005 17:22
Сообщение #11


Гость






Guest, Внимательнее будь!
Для того, чтобы перевести число "11111" в (7)-ой системе счисления в систему с основанием (19), нужно:
writeln( fromdec(todec('11111', 7), 19) );
, а не то, что у тебя было... Чувствуешь разницу? Число НЕ в 10-ной с/с, следовательно должно вводиться в строку, преобразовываться в (10), а оттуда в (19). А ты делал наоборот: вводил число в 10-ной с/с, преобразовывал (10) в (7), и потом вообще непонятно что преобразовывал в (19)...
 К началу страницы 
+ Ответить 
Guest
сообщение 7.11.2005 18:08
Сообщение #12


Гость







program test;
uses crt;
var n : string;

{ ... }

begin
clrscr;
readln(n);
writeln(todec(n,7));
writeln(fromdec(todec(n,7),19));
writeln(fromdec(todec(n,7),28));
readln;
end.


Исправил вроде, но nea.gif что-то мне кажется здесь не то, и так еще раз попорядку:
1. N-строковая переменная, но ведь по идее вводимое число семиричное?"Обеспечить корректность ввода числа в системе счисления с основанием S", может я что-то упустил???
2. ToDec(перевод ИЗ семиричной В десятичную)
3. FromDec(перевод ИЗ десятичной В девятнадцатиричную)
4. FromDec(перевод ИЗ девятнадцатиричной В двадцативосьмиричную)
На всякий случай скажу, что работу программы я проверял по универсальному переводчику систем счисления, PASCOD которого нашел на одной из аналогичных тем данного форума...

Сообщение отредактировано: volvo - 7.11.2005 18:21
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2005 18:20
Сообщение #13


Гость






Стоп...
Цитата
4. FromDec(перевод ИЗ девятнадцатиричной В двадцативосьмиричную)

Не то nea.gif FromDec НЕ МОЖЕТ переводить НИ ИЗ КАКОЙ системы, кроме как из (10), на то он и FromDecimal...
Так что вот так:

readln(n);
{
Если тебе нужен контроль введенного числа,
я во втором (!!!) посте давал ссылку. Это как раз должно быть здесь...

Повторять не буду, сколько можно...
}
writeln(todec(n,7)); { Это зачем? }

{ Перевод "n" (7) -> (10) и сразу же (10) -> (19)... В итоге: (7) -> (19) }
writeln(fromdec(todec(n,7),19));
{ Перевод "n" (7) -> (10) и сразу же (10) -> (28)... В итоге: (7) -> (28) }
writeln(fromdec(todec(n,7),28));

И давай прекращать копировать программы полностью !!! Приводи только тот кусок, который ТЫ написал/изменил... То что есть в FAQ мы знаем...
 К началу страницы 
+ Ответить 
Guest
сообщение 8.11.2005 11:02
Сообщение #14


Гость






Вот так реализовал проверку корректности ввода (взял из универсального переводчика)

function test(n:string; osnov:integer):boolean;
var f,i:integer; mn:set of char;
begin
test:=true;
mn:=[];
for i:=0 to osnov-1 do
if i<=9 then mn:=mn+[chr(i+48)]
else mn:=mn+[chr(i+55)];
f:=ord(n[0]);
for i:=1 to f do
if (n[i]<>',') and (not(n[i] in mn)) then
begin
writeln('ERROR!It is not 7th system. Re-enter value, please');
test:=false;
i:=f;
end;
end;


Но вот осталась одна проблема при переводе в 19 и 28 системы не могу получить корректный результат. Следуя условию задачи, где сказано, что "цифры больше девяти заменять заглавными латинскими буквами" я написал вот так:

function FromDec(n, radix:longint):string;
var
s: String;
const
digit: string[28]='0123456789ABCDEFGHIJKLMNOPQR';
begin
s:='';
repeat
s:=digit[(n mod radix)+1]+s;
n:=n div radix;
until n=0;
FromDec:=s;
end;


в ToDec сделал вот так:

digit: string[7]='0123456';


В итоге получаемые результаты в 19 и 28 системах в моей программе отличаются от результатов получаемых в универсальном переводчике(в первую очередь такое происходит с большими числами). Как я понял надо использовать латиницу только до буквы F, но как при этом организовать корректное отображение результата я понять не могу.
 К началу страницы 
+ Ответить 
volvo
сообщение 8.11.2005 11:09
Сообщение #15


Гость






Guest, а ты не достал уже всех своим "универсальным переводчиком"? mad.gif Или приведи его исходники (ссылку на него), или ищи ошибку у себя в программе сам !!! Откуда я знаю, ЧТО ТЫ ТАМ НАТВОРИЛ в переводчике-то !!! Судя по тому, что было тобой написано в прежних постах, и там тоже может быть все, что угодно. Лист бумаги дома есть? Вот и переведи (ВРУЧНУЮ !!!) число "1243432" из (7) -> (10) -> (19), и проверь.

А вот изменять процедуры из FAQ я бы НЕ рекомендовал... Там уже все отлажено, и все работает. Не надо умничать, если не понимаешь КАК это работает !!!
 К началу страницы 
+ Ответить 
Guest
сообщение 8.11.2005 13:14
Сообщение #16


Гость






ССЫЛКА: Универсальный переводчик систем счисления
К примеру возьмем число 666666 и подставим его в мою программу получим результат:
10: 117648
19: H2H0
28: 5A1K
подставим это же число в переводчик и получим:
10: 117648
19: A2A0
28: 5A1D
Сравним результаты, в этом и состоит проблема...
 К началу страницы 
+ Ответить 
Guest
сообщение 9.11.2005 9:41
Сообщение #17


Гость






Не судьба видно dry.gif
 К началу страницы 
+ Ответить 
volvo
сообщение 9.11.2005 10:03
Сообщение #18


Гость






Да что ты говоришь? А РАЗОБРАТЬСЯ в работе этого пресловутого "универсального" переводчика - не судьба? Только один пример:
Цитата
function simvol(n:byte):char;
begin
  if n in [10..15] then simvol:=chr(n+55)
  else simvol:=chr(n+48);
end;

Всё !!! Однозначный диагноз: правильно работает ТОЛЬКО для систем счисления с основанием <= 16... Я добавлю эту ремарку по ссылке...

Вот, кстати, моя программа, выполняющая нужные тебе действия. И результат проверен на бумаге:
666666 (7) = 117648 (10) = H2H0 (19) ...
const
_symbols: string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function FromDec(n, radix:longint):string;
var
s: string;
begin
s := '';
repeat
s := _symbols[(n mod radix)+1] + s;
n := n div radix;
until n = 0;
FromDec := s;
end;

function ToDec(n:string; radix:longint):longint;
var
m, i: longint;
begin
m := 0;
while n[1] = '0' do delete(n, 1, 1);
for i := 1 to length(n) do
m := m * radix + pos(n[i],_symbols) - 1;
ToDec := m;
end;

function isCorrect(n: string; radix: longint): boolean;
var
bad: boolean;
i: integer;
begin
bad := False;
i := 0;
repeat
inc(i);
bad := (pos(n[i], copy(_symbols, 1, radix)) = 0);
until bad or (i = length(n));
isCorrect := not bad;
end;


var
s: string;

begin
write('(7) : '); readln(s);
if not isCorrect(s, 7) then writeln('error !!!')
else begin
writeln('(19): ', fromdec(todec(s, 7), 19) );
writeln('(28): ', fromdec(todec(s, 7), 28) );
end;
end.
 К началу страницы 
+ Ответить 
-Chester-
сообщение 28.11.2005 11:46
Сообщение #19


Гость






Огромное спасибо за помощь в написании первой проги, отдельный респект Volvo.
Но вот вторую никак не удается одолеть:
Как я понимаю, она основывается на первой, добавляется цикл с папраметром (от A до B), но как реализовать шаг цикла (С), мне не понятно. Неясен и момент где: Обеспечить точность 5 знаков после запятой во всех системах счисления. Разработайте функцию для сложения двух чисел в системе счисления с основанием S (причем тут сложение).
Прошу прощения, что подымаю всем уже порядком поднадоевшую тему, но мне без вашей помощи кранты...
 К началу страницы 
+ Ответить 
Romtek
сообщение 28.11.2005 13:27
Сообщение #20


Знаток
****

Группа: Пользователи
Сообщений: 303
Пол: Мужской
Реальное имя: Роман

Репутация: -  2  +


{ Исходное число A(S) умножить на R по правилам S-арифметики. Целая часть
полученного числа представляет собой цифру b-1 числа А® . Затем, отбросив
целую часть, умножить дробную часть на R . При этом получается число, целая
часть которого есть цифра b-2 . Повторять процесс умножения l раз, пока не будут найдены все l цифр числа A®.
Взято из http://matsievsky.newmail.ru/sys-schi/rules.htm }

const
N = 0.12345678;
MaxP = 5;
epsMaxP = 1e-5; {требуемая точность}
Base = 5; {основание системы}

var
i: integer;
r, {основание в степени -i }
t, {основание в степени i (степень наращивается в цикле умножением на основание)}
Num, {исходное дробное число}
coef, {коэффициент перед r, который мы вычисляем для каждого слагаемого}
outn: single; {приближённая сумма, должна быть с точностью до MaxP знаков}

begin
Num := N;
writeln (Num:10:5);

outn := 0.0;

t := 1.0;
for i := 1 to MaxP do
begin
t := t * Base;
r := 1.0 / t; {r = base^(-i)}

Num := Num * Base; {умножаем дробную часть на основание}
coef := Trunc(Num); {Целая часть числа есть коэффициент}
Num := Num - coef; {отбрасываем целую часть}

outn := outn + coef * r;

write (coef:4:0);
end;

writeln;
writeln (outn:10:6);
end.
Эта программа вычисляет коэффициенты, но выдаваемый результат не имеет точности 1e-5, т.к. в цикле я брал только 5 цифр.
В действительности же нужно создать такой цикл, что outn будет сравниваться с N и если ошибка меньше чем epsMaxP, то прекратить его.
Вот здесь есть ещё неплохой материал: Википедия: Системы счисления


--------------------
Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 12.08.2025 13:08
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"