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