Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2016, 14:30   #1
MaxKate
 
Регистрация: 12.05.2016
Сообщений: 8
По умолчанию дополнительный и обратный код

Скелет программы не мой, признаюсь.
Пыталась преобразовать его для задания :
Исходный файл содержит числа в шестнадцатеричной системе счисления, отделенные друг от друга запятыми. Составить программу, которая для каждого такого числа из заданного диапазона после знака равенства указывает его значение в семеричной системе, в виде дополнительного кода или в виде обратного кода по выбору пользователя.
Помогите, пожалуйста справиться с заданием, я новичок в программировании, очень сложно сразу сходу начать выполнять такие сложные задания.
Код программы:
Код:
PROGRAM maxkur;
Const
a:string[36]='0123456789ABCDEFGHIJKLMNJPQRSTUVWXYZ';
Function StrToInt(const s:String): Integer;
var
Result, code:integer;
begin
 val(s,Result,code);
 if (code<>0)
 then
  Result:=0;
 StrToInt:=Result;
end;
function ToDec(var Result:string;cc:byte):integer;
var
i,n,sum:integer;
begin
sum:=0;
n:=length(Result);
for i:=1 to n do
 begin
 dec(n);
 sum:=sum+round((pos(Result[i],a)-1)*exp(ln(cc)*n));
 end;
 ToDec:=sum;
 end;
function Convert(numb:integer; const c: byte):string;
var
Result:string;
begin
Result:='';
repeat
 Result:=a[numb mod c +1]+Result;
 numb:=numb div c;
until (numb=0);
Convert:=Result;
end;
function ShowMenu():Byte;
var
Result:byte;
begin
repeat
writeln('В какую систему счисления переводить? ');
readln(Result);
until (Result in [2..16]);
ShowMenu:=Result;
end;
var
f:File of Char;
s:string;
temp:byte;
c:char;
begin
assign(f,'f.txt');
reset(f);
s:='';
while not (eof(f)) do
begin
read(f,c);
if (c in ['0'..'Z'])
then
temp:=ToDec;
s:=s+c
else
if (c=',')
then
begin
temp:=ShowMenu();
writeln(s,'=',Convert(StrToInt(s), temp));
s:='';
case temp of
7:writeln('Перевод в троичную систему счисления');
0:writeln('Перевод с обратным кодом');
1:writeln('Первод с дополнительным кодом');
end;
if (temp<>7)and(temp<>1)and(temp<>0) then
begin
Writeln('Операция не осуществлена');
halt;
end;
end
end;
temp:=ShowMenu();
writeln(s,'=',Convert(StrToInt(s),temp));
close(f);
end.

Последний раз редактировалось Аватар; 16.05.2016 в 14:42.
MaxKate вне форума Ответить с цитированием
Старый 16.05.2016, 14:48   #2
MaxKate
 
Регистрация: 12.05.2016
Сообщений: 8
Печаль

Этот код мне предложили на другом форуме, за что я очень благодарна пользователю. Но проблема в том, что программа работает не верно, а как исправить данную неполадку, я не знаю
При запуске не выходит ни меню, ни ввод чего-либо
Сразу выводит какие-то странные значения

Код:
const
    a: string[17] = '0123456789ABCDEF-';
function StrToInt(const s: String): LongInt;
var
    Result: LongInt;
    code: Integer;
begin
    Val(s, Result, code);
    if (code <> 0)
    then
        Result := 0;
    StrToInt := Result;
end;
function IntToStr(const i: LongInt): String;
var
    Result: String;
begin
    Str(i, Result);
    IntToStr := Result;
end;
function AnyToDec(s: String; const base: Byte): LongInt;
var
    Result: LongInt;
    i, n: Byte;
    flag: Boolean;
begin
    flag := (s[1] = '-');
    if (flag)
    then
        Delete(s, 1, 1);
    Result := 0;
    n := Length(s);
    for i := 1 to n do
    begin
        Dec(n);
        Inc(Result, Round((Pos(s[i], a) - 1) * Exp(Ln(base) * n)));
    end;
    if (flag)
    then
        Result := -Result;
    AnyToDec := Result;
end;
function DecToAny(numb: LongInt; const base: Byte): String;
var
    Result: String;
    flag: Boolean;
begin
    flag := (numb < 0);
    if (flag)
    then
        numb := Abs(numb);
    Result := '';
    repeat
        Result := a[numb mod base + 1] + Result;
        numb := numb div base;
    until (numb = 0);
    if (flag)
    then
        Result := '-' + Result;
    DecToAny := Result;
end;
procedure FullLength(var s: String);
begin
    while (Length(s) < 7) do
        s := '0' + s;
end;
function Direct(const s: String): String;
var
    Result: String;
begin
    Result := s;
    if (s[1] = '-')
    then
        Delete(Result, 1, 1);
    FullLength(Result);
    if (s[1] = '-')
    then
        Result := '1' + Result
    else
        Result := '0' + Result;
    Direct := Result;
end;
function Reverse(const s: String; const base: Byte): String;
var
    Result: String;
    i: Byte;
begin
    Result := s;
    if (s[1] = '-')
    then
        Delete(Result, 1, 1);
    FullLength(Result); Result := '0' + Result;
    if (s[1] = '-')
    then
        for i := 1 to Length(Result) do
            Result[i] := IntToStr(base - 1 - StrToInt(Result[i]))[1];
    Reverse := Result;
end;
function Additional(const s: String; const base: Byte): String;
var
    Result: String;
begin
    Result := Reverse(s, base);
    if (s[1] = '-')
    then
        Result := DecToAny(1 + AnyToDec(Result, base), base);
    Additional := Result;
end;
 
function ShowMenu(): Byte;
var
    Result: Byte;
begin
    repeat
        WriteLn('1. Прямое представление.');
        WriteLn('2. Обратное представление.');
        WriteLn('3. Дополнительное представление');
        ReadLn(Result);
    until (Result in [1..3]);
    ShowMenu := Result;
end;
var
    f: File Of Char;
    s, ans: String;
    c: Char;
begin
    Assign(f, 'f.txt'); ReSet(f);
    s := '';
    while Not (EoF(f)) do
    begin
        Read(f, c);
        if (Pos(c, a) > 0)
        then
        begin
            if ((c = '-') And (Length(s) = 0)) Or (c <> '-')
            then
                s := s + c;
        end
        else
            if (c = ',')
            then
            begin
                ans := DecToAny(AnyToDec(s, 16), 7);
                if (s[1] <> '-')
                then
                    WriteLn(s, '=', Direct(ans))
                else
                begin
                    case ShowMenu() of
                        1: WriteLn(s, '=', Direct(ans));
                        2: WriteLn(s, '=', Reverse(ans, 7));
                        3: WriteLn(s, '=', Additional(ans, 7));
                    end;
                end;
                s := '';
            end
    end;
    Close(f);
    ans := DecToAny(AnyToDec(s, 16), 7);
    if (s[1] <> '-')
    then
        WriteLn(s, '=', Direct(ans))
    else
    begin
        case ShowMenu() of
            1: WriteLn(s, '=', Direct(ans));
            2: WriteLn(s, '=', Reverse(ans, 7));
            3: WriteLn(s, '=', Additional(ans, 7));
        end;
    end;
end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 16.05.2016 в 15:19.
MaxKate вне форума Ответить с цитированием
Старый 16.05.2016, 15:23   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

какой именно у Вас Паскаль?
что у Вас находится в файле f.txt ? (выложите его содержимое)
Что именно выводит программа? (может она то, что надо выводит?!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.05.2016, 15:42   #4
MaxKate
 
Регистрация: 12.05.2016
Сообщений: 8
По умолчанию

free pascal
в исходном файле числа через запятую
file:///C:/Users/%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%8 0%D0%B8%D0%BD%D0%B0/Desktop/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8 F%D0%BD%D0%BD%D1%8B%D0%B9.png
программа выводит числа в семеричной системе счисления, при этом приписывает нули перед самим числом.
хотя по идее пользователю должно предлагаться меню выбора ( 3 варианта:перевод в 7-юю сс, перевод в обратный код или в дополнительный код), затем уже числа, переведенные в нужную форму
MaxKate вне форума Ответить с цитированием
Старый 16.05.2016, 16:11   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
в исходном файле числа через запятую
ну всё верно. так в коде и задано.
если число положительное, то ничего не спрашивается - выводится прямое представление.
Цитата:
Код:
 WriteLn(s, '=', Direct(ans))
Т.е. для положительных чисел нет понятия обратный и дополнительный код!
Для положительных чисел код всегда один и тот же!

для отрицательных чисел задаётся вопрос, в каком виде выводить.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.05.2016, 16:25   #6
MaxKate
 
Регистрация: 12.05.2016
Сообщений: 8
По умолчанию

Спасибо большое за ответ!
MaxKate вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Модифицированный обратный и дополнительный код Smirnyaga52 Помощь студентам 1 16.01.2015 16:07
Перевести число из десятичной системы в прямой, обратный и дополнительный код Delphi или C++ carrie bradshaw Помощь студентам 8 21.03.2014 20:34
задачи по информатике - прямой, обратный и дополнительный коды представления чисел hbyuntvr Помощь студентам 10 31.10.2012 21:44
Доп.код,обратный код,прямой код вычисления Lukas077 Помощь студентам 0 20.03.2011 12:07
Прямой обратный дополнительный код kubachi Паскаль, Turbo Pascal, PascalABC.NET 1 24.12.2010 22:59