Перевод чисел из одной системы счисления в другую - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д