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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2009, 13:56   #1
Fifo4ka
Пользователь
 
Аватар для Fifo4ka
 
Регистрация: 15.10.2009
Сообщений: 12
Восклицание Системы счислений. Паскаль

Доброе время суток,
уважаемые посетители этого замечательного сайта !!

Очень нужна ваша помощь в дописании кода программы перевода чисел из одной СС в другую СС.

Вот программка, которая переводит целые числа с 10-ной СС в произвольную и с произвольной СС в 10-ную:
Код:
uses crt;
var
b2,ss,b,s:string;
os,c,e,ch,p,i,j,n,k:integer;

begin
clrscr;
s:='0123456789ABCDEFGHIJ';{20}


  writeln('VVEDITE CHISLO');
   read(n);
  writeln('VVEDITE SISTEMU SCHISLENIYA');
   read(k);
  while n>=1 do begin
   p:=n mod k;
   if p>=10 then b:=copy(s,p,1) else str(p,b);
   ss:=b+ss;
   n:=n div k;
  end;
  writeln(ss);


  writeln('VVEDITE SISTEMU SHISLENIYA');
   readLN(k);
  writeln('VVEDITE CHISLO');
   readln(sS);
  c:=length(ss);
  for i:=1 to c do begin
   b:=copy(ss,i,1);
   for j:=1 to 36 do begin
    b2:=copy(s,j,1);
    if b=b2 then os:=j;
   end;
   ch:=k*ch+os;
  end;
  writeln(ch);


readkey;
end.
Но трабл в том, что необходимо переводить и дробную часть числа. Причем, если дробная часть отделяется не через точку, то программа не должна закрываться, а должна писать ошибку. И необходим запрет на ввод букв основания СС.
Как это доделать подскажите, пожалуйста.

Последний раз редактировалось Rembo; 15.10.2009 в 18:19.
Fifo4ka вне форума Ответить с цитированием
Старый 15.10.2009, 14:33   #2
NeshSoft
Максим Николаев
Форумчанин
 
Аватар для NeshSoft
 
Регистрация: 15.02.2009
Сообщений: 170
По умолчанию

Цитата:
Причем, если дробная часть отделяется не через точку, то программа не должна закрываться, а должна писать ошибку. И необходим запрет на ввод букв основания СС.
Посимвольно проверяем чтобы в числе не было лишних символов, а также считаем сколько в числе '.', если точек больше 1 или присутствуют лишние символы - выводим ошибку, иначе число введено верно, начинаем его обрабатывать
NeshSoft. Программирование на заказ для студентов. Delphi/Pascal. Подробнее на сайте neshsoft.narod.ru
NeshSoft вне форума Ответить с цитированием
Старый 16.10.2009, 00:58   #3
Fifo4ka
Пользователь
 
Аватар для Fifo4ka
 
Регистрация: 15.10.2009
Сообщений: 12
По умолчанию

и все же какой алгоритм перевода дробной части??
Fifo4ka вне форума Ответить с цитированием
Старый 16.10.2009, 02:16   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Fifo4ka
Покажу на примере алгоритм перевода дробной части. Пусть нам надо число 0.635 из 10ой системы перевести в двоичную
1. 0.635 * 2 = 1.27
теперь целую часть пишем пишем, а с дробной повторяем |0.1
2. 0.27 * 2 = 0.54 |0.10
3. 0.54 * 2 = 1.08 |0.101
4. 0.08 * 2 = 0.16 |0.1010
и т.д. Выполняем этот цикл, до тех пор, пока дробная часть не станет равна 0, или же мы не получим дробную часть, которая уже встречалась ранее (в этом случае будет бесконечная периодическая дробь)
Ну вот, соответственно допустим для 16ой системы счисления надо умножать на 16
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 17.10.2009, 20:21   #5
Fifo4ka
Пользователь
 
Аватар для Fifo4ka
 
Регистрация: 15.10.2009
Сообщений: 12
По умолчанию

вот, вроде с алгоритмом перевода дробной части разобралась, только на Си переделала:
Код:
#include <math.h>
#include <conio.h>
#include <stdio.h>

void cel (int x,int y) {
int Rez[20],i=0;
  while (x>=y) {
   Rez[i]=x%y;
   x=x/y;
   i=i+1;
  }
  Rez[i]=x;
  printf ("Rezul:");
  for (int j=i;j>=0;j--)
    printf ("%d",Rez[j]);
  }

void drob(float x,int y) {
int Rez[20],buf,k=0;
float eps,dec=0, r=x;
  do {
    buf=(int)(x*y);
    Rez[k]=buf;
    x=x*y-Rez[k];
    k=k+1;
  } while(k<4);
printf (".");
  for (int j=0;j<k;j++)
    printf ("%d",Rez[j]);
  for (j=0;j<k;j++){
    dec=dec+Rez[j]*1/pow(y,j+1);
  }
  printf ("\ndec=%f",dec);
eps=(r-dec)*100;
printf ("\nPogreshnost: %f%",eps);
}

void main () {
int x,y;
float d;
int running=1;
  while (running) {
  clrscr();
  printf ("1-Vvod s klaviaturi\n");
  printf ("2-Vvod iz fayla\n");
  printf ("3-Raschet i vivod rezultatov,pogresnost\n");
  printf ("4-Vihod");
  int ch=getch();
    if (ch=='1') {
      clrscr();
      printf ("Vvedite celuyu chast:\n");
      scanf ("%d",&x);
      printf ("Vvedite drobnuyu chast:\n");
      scanf ("%f",&d);
      printf ("Vvedite osnovanie sistemi\n");
      scanf ("%d",&y);
      if (y>20) {
        printf ("\nVvedite druguyu sistemu schisleniya!!!");
        scanf ("%d",&y);
      getch();
      }
    }
      if (ch=='2') {
      clrscr();
      printf ("Vvedite osnovanie sistemi\n");
      scanf ("%f",&d);
      char s[10];FILE *pf;
      printf("\nVvedite imya fayla, naprimer fail ss.txt)\n");
      scanf("%s",&s);
      pf=fopen(s,"r");
        while (!feof(pf)) {
          fscanf (pf,"%d",&x);
          fscanf (pf,"%f",&d);
        }
      printf ("Celaya chast:\n");
      scanf ("%d",&x);
      printf ("Drobnaya chast:\n");
      scanf ("%f",&d);
      }
    if (ch=='3') {
      clrscr();
      cel(x,y);
      drob(d,y);
      getch();
    }
    if(ch=='4')
    running=0;
  }
}
Но вот с работой над файлами я не очень дружу, как можно разделить число в файле на целую часть и дробную??

P.S. А название темы надо же поменять...

И как можно поставить защиту от ввода основания системы букв??

Последний раз редактировалось Stilet; 19.10.2009 в 08:50.
Fifo4ka вне форума Ответить с цитированием
Старый 20.10.2009, 00:48   #6
Fifo4ka
Пользователь
 
Аватар для Fifo4ka
 
Регистрация: 15.10.2009
Сообщений: 12
По умолчанию

видимо, либо глупый вопрос, либо что??
Fifo4ka вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Графика. Нужна помощь с фрагментом программы Кэмерон Помощь студентам 1 27.04.2009 20:35
SOS! Нужна срочная помощь Паскаль! ЯншинаВера Помощь студентам 2 02.06.2008 21:25
нужна помощь паскаль novol Помощь студентам 5 12.12.2007 21:05
Паскаль. Не могу найти ошибку. Нужна помощь! Nexx Помощь студентам 10 06.12.2007 19:12