Программа:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication10
{
class Program
{
public static int GetNum(char c)
{
int m = 0;
if (char.IsDigit(c))
{
m = c - '0';
}
if (char.IsUpper(c))
{
m = c - 'A' + 10;
}
else
{
if (char.IsLower(c))
{
m = c - 'a' + 10;
}
}
return m;
}
public static char GetChar(int m)
{
char c = '0';
if ((m >= 0) && (m <= 9))
{
c = (char)(m + '0');
}
if ((m >= 10) && (m <= 15))
{
c = (char)(m + 'A' - 10);
}
return c;
}
private static void Max(string n, out int m, out int max)
{
m = 0;
max = 0;
char k;
for (int i = 0; i < n.Length; i++)
{
k = n[i];
m = GetNum(k);
do
{
if ((0 <= k && k <= 'f') || (0 <= k && k <= 'F'))
{
if (max < m)
{
max = m;
}
}
} while (((k != ',' && k != '.') && 0 > k && k > 'f') || ((k != ',' && k != '.') && 0 > k && k > 'F'));
}
}
static void Main(string[] args)
{
Console.Write("Введите число: ");
string n = Console.ReadLine();
for (int i = 0; i < n.Length; i++)
{
if (n[i] == ' ')
{
n = n.Replace(" ", "");
}
}
bool neg;
if (n[0] == '-')
{
neg = true;
n = n.Remove(0, 1);
}
else
{
neg = false;
}
int ss;
int m = 0;
int max;
Max(n, out m, out max);
//Если в числе цифры выходят из заданного диапазона <от 1 до F или f> и разделителей целого от дробного <, и .>, то выводим ошибку и завершаем программу
for (int i = 0; i < n.Length; i++)
{
if (((0 <= n[i] && n[i] <= 'f') || (0 <= n[i] && n[i] <= 'F')) || (n[i] == ',' && n[i] == '.'))
{
if (char.IsPunctuation(n[i]) && n[i] != ',' && n[i] != '.')
{
Console.WriteLine("ОШИБКА !!! Произошла пунктуационная ошибка ");
goto end;
}
}
else
{
Console.WriteLine("ОШИБКА !!! Данная последовательность не является числом рациональным ");
goto end;
}
}
// проверяет на наличие количества ',' и '.' если больше 1ого или по одному из каждого как минимум, то выводим ошибку и завершаем работу
int zn1 = 0;
int zn2 = 0;
for (int i = 0; i < n.Length; i++)
{
if (n[i] == ',')
{
zn1++;
if (zn1 > 1)
{
Console.WriteLine("ОШИБКА !!! Количество разделителя <,> превышает больше, чем один ");
goto end;
}
}
if (n[i] == '.')
{
zn2++;
if (zn2 > 1)
{
Console.WriteLine("ОШИБКА !!! Количество разделителя <.> превышает больше, чем один ");
goto end;
}
}
if (zn1 > 0 && zn2 > 0)
{
Console.WriteLine("ОШИБКА !!! Наличие одновременно двух разделителей <,> и <.> является ошибочным ");
goto end;
}
}
//Console.WriteLine(zn1);
//Console.WriteLine(zn2);
//Console.WriteLine("Максимум цифры числа: {0}", max);
Console.WriteLine("=========================================================");
string ent;
bool err = true;
do
{
Console.Write("Введите систему счисления <{0} - 16> из который переводим : ", max + 1);
ent = Console.ReadLine();
err = int.TryParse(ent, out ss);
if ((ss <= max) || (err == false) || (ss > 16))
{
Console.Write("ОШИБКА !!! ");
}
if ((ent == "") || (ent == "exit") || (ent == "выход"))
{
goto end;
}
} while ((ss <= max) || (ss > 16) || (err == false));
char arr;
double sum = 0.0;
int x = 0;
int z = 0;
Console.WriteLine("=========================================================");
//Считаем количество цифр целой части числа
for (int i = 0; i < n.Length; i++)
{
z++;
arr = n[i];
if ((arr != '.') && (arr != ','))
{
x++;
}
else break;
}
//Console.WriteLine("Количество цифр целой части: {0}", x);
//Переводим целую часть числа в 10 СС
for (int i = 0; i < x; i++)
{
arr = n[i];
m = GetNum(arr);
sum += (double)m * (double)Math.Pow(ss, x - i - 1);
}
//Console.WriteLine("Целая часть: {0}", sum);
//Переводим в дробную часть числа в 10 СС
int y = 0;
for (int i = 0; i < n.Length - x; i++)
{
y++;
arr = n[z - 1 + i];
m = GetNum(arr);
sum += m / Math.Pow(ss, y - 1);
//Console.WriteLine(sum);
}
Console.WriteLine("=========================================================");
if (neg == true)
Console.WriteLine("Число в 10-ой системе счисления: -{0}", sum);
else
Console.WriteLine("Число в 10-ой системе счисления: {0}", sum);
Console.WriteLine("=========================================================");
//Вводим новую СС
int newSS;
do
{
Console.Write("В какую систему счисления переводить <2 - 16> ? : ");
ent = Console.ReadLine();
err = int.TryParse(ent, out newSS);
if ((newSS < 2) || (err == false) || (newSS > 16))
{
Console.Write("ОШИБКА !!! ");
}
if ((ent == "") || (ent == "exit") || (ent == "выход"))
{
goto end;
}
} while ((newSS < 2) || (newSS > 16) || (err == false));
int mmm = (int)sum;
string tt = "";
//Переводим целую часть в данную СС
do
{
tt = string.Format("{0}{1}", GetChar(mmm % newSS), tt);
mmm = mmm / newSS;
} while (mmm > 0);
//Console.WriteLine("Целая часть :{0}", tt);
//Вводим точность вычисления
Console.Write("С какой точностью после запятой: ");
int e = int.Parse(Console.ReadLine());
//переводим дробную часть в данную CC
int iz = (int)sum;
double doublez = sum - iz;
//Console.WriteLine("Дробное значение для дальнейших операций: {0}", doublez);
if (e > 0)
{
tt = string.Format("{0},", tt);
double dblprt = doublez;
for (int i = 0; i < e; i++)
{
doublez = doublez * newSS;
tt = string.Format("{0}{1}", tt, GetChar((int)doublez));
doublez = doublez - (int)doublez;
}
}
Console.WriteLine("=========================================================");
if (neg == true)
{
Console.WriteLine("Ответ: -{0}", tt);
}
else { Console.WriteLine("Ответ: {0}", tt); }
end:
Console.WriteLine("Нажмите <Enter> для выхода");
Console.ReadLine();
}
}
}