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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2012, 19:23   #1
Keti
Пользователь
 
Регистрация: 16.12.2011
Сообщений: 11
Печаль Системы счисления (Free Pascal)

Ребят....в очередной раз очень нужна ваша помощь...контрольную нужно было сдать ещё вчера, но никак не могу домучить задание... В общем нужно написать программу в паскале для перевода чисел из 19-й СС в 10-ю, затем из 10-й в 18-ю и из 10-й в 25-ю. Понимаю, что в общем программа будет состоять из функций или процедур. И основу будут составлять div и mod. Но больше всего меня смущают буквы например в 19-й сс... Как правильно осуществить перевод их в числовую форму? И правильно ли использовать при вводе числа строковый тип? Просто именно эти моменты заводят меня в тупик. Вроде задача не сложная на вид, но как доходит до дела - возникает куча вопросов и ошибок... Может у кого-нибудь есть пример перевода из любой СС >10 в десятичную? И вообще буду рада любому совету...который может направить меня в правильное русло)
P.S. готовую программу не прошу...но правда очень нужна помощь, мозг уже взрывается просто.
Заранее спасибо
Keti вне форума Ответить с цитированием
Старый 16.01.2012, 20:54   #2
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Цитата:
Но больше всего меня смущают буквы например в 19-й сс...
Меня тоже. Если я ничего не путаю, буквы есть только в шестнадцатиричной, причем шестнадцатиричной всмысле hex. Тебе же нужны алгебраические системы счисления. Посмотри тут, вроде бы все понятно.

Update: Пардон, чушь спорол. Ссылка в сообщении ниже это подтверждает.
Все тривиальное просто

Последний раз редактировалось whatever; 16.01.2012 в 21:02.
whatever вне форума Ответить с цитированием
Старый 16.01.2012, 20:55   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

посмотрите здесь:

Преобразование из одной системы счисления в другую


Цитата:
Сообщение от whatever
Если я ничего не путаю, буквы есть только в шестнадцатиричной
Да нет. Любая система счисления с основанием больше 10 требует наличия РАЗЛИЧНЫХ знаков (очевидно, что цифр уже не хватает) для представления базового множества.
поэтому, принято использовать буквы латинского алфавита, A - для обозначения значения десять, B- значение одиннадцать, C- двенадцать и т.д.
очевидно, что это позволит легко оперировать до систем счисления с основаниме <=36 (10 цифр + 26 латинских букв). Дальнейшее увеличение потребует расширение алфавита...

Последний раз редактировалось Serge_Bliznykov; 16.01.2012 в 21:00.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.01.2012, 21:09   #4
g101k
 
Регистрация: 17.11.2011
Сообщений: 8
По умолчанию

С символами все просто нужно взять код буквы A (заглавная буква!!!) и вычитать из кодов букв это значение да прибавить 10.

К примеру код буквы A = 65, F = 70;
70 - 65 + 10 = 15.
то есть в первом разряде 15 единиц.


аски коды тут


На делфи есть две полезные функции chr и ord

Надеюсь суть понятна
g101k вне форума Ответить с цитированием
Старый 17.01.2012, 11:32   #5
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Все просто.
Делаешь строковую константу
Код:
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
и потом из нее вытаскиваешь нужные тебе символы.
Вот пример программы, переводящей десятичное число в любую другую систему счисления (от 2-ной до 35-ной) на С++:
Код:
string dec2any(int value, int base) {

    string buf;

    // Проверяем, корректно ли задана основа пересчета
    if (base < 2 || base > 35) return buf; // если нет -- возвращаем пустую строку

    enum { kMaxDigits = 35 };   // Максимальный разряд числа
    buf.reserve( kMaxDigits );  // Выделяем достаточное количество места

    int quotient = value;

    // Переводим число в строку с требуемой основой
    do {
            buf += "0123456789abcdefghijklmnopqrstuvwxyz"[ abs( quotient % base ) ];
            quotient /= base;
    } while ( quotient );

    // Добавляем знак, если он есть
    if ( value < 0) buf += '-';

    reverse( buf.begin(), buf.end() );
    return buf; // Искомое число в соответствующей системе счисления в виде строки
}
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 22.01.2012, 18:34   #6
Keti
Пользователь
 
Регистрация: 16.12.2011
Сообщений: 11
По умолчанию

Огромное спасибо, тем кто откликнулись) Большая часть ваших советов мне пригодилась...по крайней мере на что-то натолкнула. В общем первую часть задания я всё-таки домучила (перевод из 19-й в 10-ю сс), а дальше опять застряла...
Вот эта часть программы работает...
Код:
program lab1;
uses crt;
const
     a: string [36] = ‘0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’; //задаем строку для выбора в ней символов
var
     s:string;
     i,n,rez,rez2,c: integer;
//функция для перевода целого числа из 19-й системы счисления в 10-ю
function ToDec (var s:string; c:real): integer;
var i,n,sum:integer;
begin
        c:=19;
        sum:=0;
        n:=length(s); // присваиваем n – длину строки s
        for i:=1 to n do //идём по строке
        begin
             dec (n); //уменьшаем счетчик на 1
             sum:=sum+round((pos(s[i],a)-1)*exp(ln(c)*n)); //суммируем число (найденное в строке по позиции символа -1)
         end;
         ToDec:=sum;
end;
begin
Clrscr;
     Write (‘Введите целое девятнадцатеричное число’);
      readln (s);
      val (s,n); // переводим строку
      rez:= ToDec (s,c);
      Write (‘Число в десятеричной системе счисления’, rez); 
end.
а дальше при попытке вставить функцию для перевода из 10-й, например в 18-ю получается бред...
Код:
// функция для перевода целого числа из 10-й в 18-ю СС
function Vosemn (s:integer; c: real): string;
var 
      n,sum2: integer;
      begin
      s:=rez;
      c:=18;
      repeat
      	   s:=s div c;
           sum2:=s mod c +s;
      until (s=0);
      Vosemn:=sum2;
end;
Может быть типы не те указываю? Или присваивать значения переменным s и c нужно не в функции, а уже в основной части? А может вообще всё не то делаю... Please help me... уже все сроки сорвала....

Последний раз редактировалось Keti; 22.01.2012 в 18:37.
Keti вне форума Ответить с цитированием
Старый 22.01.2012, 21:14   #7
Keti
Пользователь
 
Регистрация: 16.12.2011
Сообщений: 11
По умолчанию

ну пожалуйста...хоть кто-нибудь откликнитесь. очень нужна помощь...
Keti вне форума Ответить с цитированием
Старый 22.01.2012, 21:42   #8
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

да как бы функция совсем мягко скажем....
мб как-то так?
Код:
function Vosemn (MyDec: integer): string;
var
    s,s1: string;
begin
    s := '';
    while (MyDec >= 18) do
    begin
        if (MyDec mod 18) > 9 then
            s := s + chr(55 + (MyDec mod 18))
        else
        begin
             s1 := '';
             Str((MyDec mod 18), s1);
             s := s + s1;
        end;
        MyDec := MyDec div 18;
    end;
    if MyDec > 9 then
            s := s + chr(55 + MyDec)
        else
        begin
             s1 := '';
             Str(MyDec, s1);
             s := s + s1;
        end;
    Vosemn := s;
end;
Писал с потолка надеюсь алгорит понятен, если нет спрашивайте!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 23.01.2012, 00:25   #9
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Код:
const
     a: string [36] = ‘0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ’;
...
function DesToCC (s,CC:integer): string;
var 
      r:string;
      begin
      r:='';
      repeat
        r:=a[s mod CC +1]+r;
        s:=s div СС;
      until (s=0);
      DesToCC:=r;
end;
на неконкретные вопросы даю неконкретные ответы ...

Последний раз редактировалось Step_UA; 23.01.2012 в 13:36. Причина: опечатка
Step_UA вне форума Ответить с цитированием
Старый 23.01.2012, 22:29   #10
Keti
Пользователь
 
Регистрация: 16.12.2011
Сообщений: 11
По умолчанию

Урааа!!! Получилось, теперь программа реализует перевод 19-го числа в 10-е и 10-е в 18-е и 25-е. Правда только целые и осталось ещё добавить проверку корректности ввода числа, ноо...самое страшное позади и спасибо всем огромное-преогромное)))) А особенно Step_UA, ваш код мне очень помог завершить начатое))
Тему можно закрыть, ответы на вопросы получены)
Keti вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Задачи на системы счисления и множества. MrVovun Помощь студентам 4 14.11.2011 23:35
Pascal. перевод из десятичной системы счисления в двоичную Xeon332 Помощь студентам 3 24.01.2011 13:54
Системы счисления .Pascal. Corpinccom Помощь студентам 2 18.08.2010 00:29