Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Моя ргр Готово.docx
Скачиваний:
11
Добавлен:
12.02.2015
Размер:
34.17 Кб
Скачать

Программа:

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();

}

}

}