Перевод чисел из одной системы счисления в другую - 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;
}
Объяснение кода листинга программы
- В функции объявлены следующие переменные:
- j (указатель на количество разрядов числа)
- a (коэффициент для определения разрядов числа)
- c (коэффициент для определения разрядов числа)
- f (коэффициент для определения разрядов числа)
- g (не используется в коде)
- Переменная j инициализируется значением 0.
- Переменная a инициализируется значением 1.
- Переменная c инициализируется значением 2.
- Переменная f вычисляется как результат деления e на 100.
- Затем проверяется условие: если e/10 меньше или равно 0,7 и e меньше 8, то x вычисляется как результат умножения e на d в степени j.
- Если условие не выполняется, то проверяется следующее условие: если e/10 больше или равно 1 и e mod 10 меньше 8 и e/10 меньше 8, то x вычисляется как результат умножения e/10 на d в степени a, плюс результат умножения e mod 10 на d в степени j.
- Если и это условие не выполняется, то проверяется последнее условие: если 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.
- Если ни одно из условий не выполняется, то выводится сообщение
nekorrektno. - В конце функции выводится значение x.