Перевод чисел из одной системы счисления в другую - C (СИ) (76430)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Нужна помощь, имеется программа по переводу чисел из одной системы счисления в другую. Программа написана на С.Всего 6 функций, 4 из них работают, остальные же две я попытался сделать на основе прошлых, но ничего не получилось. Это первое. Второе, функции без проблем переводят целые числа, с дробными же беда, быть может еще дополнить что то нужно? Помогите пожалуйста, сроки поджимают, последний день сегодня, быть может кто-нибудь уже сталкивался с программами перевода чисел!
#include <stdio.h>
#include <conio.h>
//#include <graphics.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void sys2to8(){
char *res,*in, *s;
int i, l, r, e, minus;
 
gets(s);
 
strcpy(res,"");
if (s[0]=='-') { minus=1; strcat(res,"-"); }
else minus=0;
for(l=0; (s[l]) && (s[l]!='.'); l++){}
r=(l-minus) % 3;
switch (r) {
  case 0: strcpy(in,s+minus);  break;
  case 1: strcpy(in+2,s+minus); in[1]='0'; in[0]='0';  break;
  case 2: strcpy(in+1,s+minus); in[0]='0';  break;
}
for(l=0; (in[l]) && (in[l]!='.'); l++){}
for(i=0; i<l ;i+=3){
  if (in[i]=='1') r=4;
  else r=0;
  if (in[i+1]=='1') r+=2;
  if (in[i+2]=='1') r+=1;
  r+=48;
  e=strlen(res);
  res[e]=r;
  res[e+1]=0;
}
puts(res);
}
 
void sys2to16(){
char *res, *in, *s;
int i, l, e, minus;
char r;
printf("Ievadiet skaitli");
gets(s);
 
strcpy(res,"");
if (s[0]=='-') { minus=1; strcat(res,"-"); }
else minus=0;
for(l=0; (s[l]) && (s[l]!='.'); l++){}
r=(l-minus) % 4;
switch (r) {
  case 0: strcpy(in,s+minus);  break;
  case 1: strcpy(in+3,s+minus); in[2]='0'; in[1]='0'; in[0]='0';  break;
  case 2: strcpy(in+2,s+minus); in[1]='0'; in[0]='0';  break;
  case 3: strcpy(in+1,s+minus); in[0]='0';  break;
}
for(l=0; (in[l]) && (in[l]!='.'); l++){}
for(i=0; i<l ;i+=4){
  if (in[i]=='1') r=8;
  else r=0;
  if (in[i+1]=='1') r+=4;
  if (in[i+2]=='1') r+=2;
  if (in[i+3]=='1') r+=1;
  if (r<10) r+=48;
  else  r+=55;    // 65..70
  e=strlen(res);
  res[e]=r;
  res[e+1]=0;
}
printf("\nRezultats ir");
puts(res);
 
}
 
void sys8to2(){
char *res, *one, *s;
int i, r, j, minus;
 
printf("Ievadiet skaitli");
gets(s);
 
strcpy(res,"");
if (s[0]=='-') { minus=1; strcat(res,"-"); }
else minus=0;
for(i=minus; s[i] ;i++){
  strcpy(one,"");
  r=s[i]-48;
  for(j=0; j<3; j++){
    if ( (r % 2 )==1 ) strcat(one,"1");
    else strcat(one,"0");
    r=r/2;
  }
  strrev(one);
  strcat(res,one);
}
if (minus) res++;
for(; res[0]=='0'; res++){}
if (minus) {
    res--;
    res[0]='-';
}
if (strcmp(res,"")==0) strcpy(res,"0");
puts(res);
}
 
void sys8to16(){
char *res, *in, *s;
 
printf("Ieadiet skaitli");
gets(s);
 
strcpy(in,sys8to2(s));
strcpy(res,sys2to16(in));
puts(res);
}
 
void sys16to2(){
char *res, *one, *s;
int i, l, r, j, minus, dot;
 
printf("Ievadiet skaitli");
gets(s);
 
strcpy(res,"");
if (s[0]=='-') { minus=1; strcat(res,"-"); }
else minus=0;
for(i=minus; s[i] ;i++){
  strcpy(one,"");
  if (s[i]<=58) r=s[i]-48; // 1..9
  else r=s[i]-55;          // A..F
  for(j=0; j<4; j++){
    if ( (r % 2 )==1 ) strcat(one,"1");
    else strcat(one,"0");
    r=r/2;
  }
  strrev(one);
  strcat(res,one);
}
if (minus) res++;
for(; res[0]=='0'; res++){}
if (minus) {
    res--;
    res[0]='-';
}
if (strcmp(res,"")==0) strcpy(res,"0");
puts(res);
}

void sys16to8(){
char *res, *in, *s;
 
printf("Ievadiet skitli");
gets(s);
 
strcpy(in,sys16to2(s));
strcpy(res,sys2to8(in));
puts(res);
}

void ShowMenu()
 
{
 
clrscr();
 
printf("Menu: \n");
printf("1. No 2 uz 8 \n");
printf("2. No 2 uz 16 \n");
printf("3. No 8 uz 2 \n");
printf("4. No 8 uz 16 \n");
printf("5. No 16 uz 2 \n");
printf("6. No 16 uz 8 \n");
 
}

void main()
 
 {
 
 ShowMenu();

 i=getch();
 switch (i)
 
 {
 
 case 49: sys2to8(); break;
 case 50: sys2to16(); break;
 case 51: sys8to2(); break;
 case 52: sys8to16(); break;
 case 53: sys16to2(); break;
 case 54: sys16to8(); break;
 }
 getch();
}

Решение задачи: «Перевод чисел из одной системы счисления в другую»

textual
Листинг программы
void kalk5(int e)
{
    int j,a,c,f,g;
    double x=0;
    double d=8;
    j=0;
    a=1;
    c=2;
    f=e/100;
    if ((e/10<=0,7)&(e<8)) {x=e*pow(d,j);}
    else
        if ((e/10>=1)&(e%10<8)&(e/10<8)) {x=e/10*pow(d,a)+e%10*pow(d,j);}
        else
        if ((e/10>=10)&(e%10<8)&((e-100*f)/10<8)) {x=f*pow(d,c)+(e-100*f)/10*pow(d,a)+e%10*pow(d,j);}
        else cout<<"nekorrektno->";
cout<<x;
}

Объяснение кода листинга программы

  1. В функции объявлены следующие переменные:
    • j (указатель на количество разрядов числа)
    • a (коэффициент для определения разрядов числа)
    • c (коэффициент для определения разрядов числа)
    • f (коэффициент для определения разрядов числа)
    • g (не используется в коде)
  2. Переменная j инициализируется значением 0.
  3. Переменная a инициализируется значением 1.
  4. Переменная c инициализируется значением 2.
  5. Переменная f вычисляется как результат деления e на 100.
  6. Затем проверяется условие: если e/10 меньше или равно 0,7 и e меньше 8, то x вычисляется как результат умножения e на d в степени j.
  7. Если условие не выполняется, то проверяется следующее условие: если e/10 больше или равно 1 и e mod 10 меньше 8 и e/10 меньше 8, то x вычисляется как результат умножения e/10 на d в степени a, плюс результат умножения e mod 10 на d в степени j.
  8. Если и это условие не выполняется, то проверяется последнее условие: если e/10 больше или равно 10 и e mod 10 меньше 8 и ((e-100f)/10) меньше 8, то x вычисляется как результат умножения f на d в степени c, плюс результат умножения (e-100f)/10 на d в степени a, плюс результат умножения e mod 10 на d в степени j.
  9. Если ни одно из условий не выполняется, то выводится сообщение nekorrektno.
  10. В конце функции выводится значение x.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы