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

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

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

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

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

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

[cpp]

#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;

}

[/cpp]

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

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

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

1 Response

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