Калькулятор для перевода из одной системы счисления в другую на си

Удалось откопать и самую-самую суровую программу времен колледжа.

Была лабораторная с заданием: Написать калькулятор для перевода из одной системы счисления в другую. При этом системы счисления могут быть от 2 до 16 -ричных.

Проект в Visual Studio 2010 можно скачать здесь, а только исполняемый файл тут

UPD: Версия на Pascal тут

Код этого творения:


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <locale.h>
#include <malloc.h>
#include <stdlib.h>
#define z 255

/*Заголовки функций*/
int aton(char a);
char ntoa(int n);
int cdot(char * S);
void dot(char* S, char* S1, char* S2);
void IntTransfer(char *S1, int b1, int b2);
void DotTransfer(char *S2, int b1, int b2);
int types (int b1, char *S);

void main ()
{
int b1, b2;
char S[z];
char S1[z];
char S2[z];
setlocale(LC_CTYPE,"Russian");
printf("Введите число для перевода \n");
gets_s(S,z);
if (cdot(S) == -1)
{
printf("incorrect value, Closed!\n");
getchar();
exit (-1);
}
printf("Введите основание входной сс\n");
scanf_s("%d",&b1);
if (types (b1, S) == -2)
{
printf("Некорректное основание входной системы счисления или неверное число для перевода\n");
getchar();
exit (-1);
}
if (types2(b1) == -1)
{
printf("Неверное основание входной сс\n");
getchar();
exit (-1);
}
printf("Введите основание выходной сс\n");
scanf_s("%d",&b2);
if (types2(b2) == -1)
{
printf("Неверное основание выходной сс\n");
getchar();
exit (-1);
}
dot(S, S1, S2);
IntTransfer(S1, b1, b2);
DotTransfer (S2,b1,b2);
printf("\n");
}

int aton(char a) // преобразование символа в номер цифры (Число)
{
if ((a >= '0') && (a <= '9'))
return a - '0';
else if ((a >= 'a') && (a <= 'z'))
return a - 'a' + 10;
else
return a - 'A' + 10;
}
char ntoa(int n) // преобразование номера цифры в символ
{
if ((n >= 0) && (n <= 9))
return '0' + n;
else
return 'A' - 10 + n;

}
void dot(char* S, char* S1, char* S2) // Разделение введеной строки. До точки\после точки
{
const char* delim = ".";
char* cp = malloc(strlen(S)+1);
char* tmp;
if (cp == NULL)
{
printf("Ошибка при работе с памятью");
exit(-1);
}

tmp = strtok(S,".");
if (tmp!=NULL) strcpy(S1,tmp);
else strcpy(S1,"\0");
tmp=strtok(NULL,".");
if (tmp!=NULL) strcpy(S2,tmp);
else strcpy(S2,"\0");
free(cp);
}
void IntTransfer(char* S1, int b1, int b2)
{
int n1, N, i,r1;
int d1 [z];
n1=strlen(S1);
N=0;
for (i=0;i<n1;i++)
{
N=N*b1+aton(S1[i]);
}
if (N==0)
{
printf("0");
}
else
{
r1=0;
while (N!=0)
{
d1[r1]=N%b2;
N=N/b2;
r1++;
}
for (i=r1-1;i>=0;i--)
{
printf("%c",ntoa(d1[i]));
}
}
}
void DotTransfer (char *S2, int b1, int b2)
{
int n2 , i, k2;
int const K = 20;
long double Nf;
n2 = strlen(S2);
if (n2 == 0)
{
printf("\n");
return;
}
printf(".");
Nf = 0;
for (i = n2-1; i >= 0; i--)
{
Nf = (aton(S2[i]) + Nf) / b1;
}
k2 = 0;
while (Nf != 0 && k2 < K)
{
k2++;
printf("%c",ntoa(floor(Nf*b2)));
Nf=fmod((Nf*b2), 1);
}
}
int cdot(char * S)
{
int i, kol = 0;
for (i = 0; i < strlen(S); i++)
{
if (S[i] == '.') kol++;
}
if (kol > 1)
{
return -1;
}
}
int types (int b1, char *S)
{
int i;
for (i = 0; i < strlen(S); i++)
{
if (aton(S[i]) >= b1) return -2;
}
}
int types2 (int b)
{
if (b > 16 || b < 2) return -1;

}

Проверка кода была произведена в Visual Studio 2010, а сам он был написан с использованием Visual Studio 2005, хотя, наверное это и не интересно, так как решения-то нет. Есть только файл исходного кода.

Все библиотеки стандартны.

Проект в Visual Studio 2010 можно скачать здесь, а только исполняемый файл тут

1 Response

Добавить комментарий