Сделай Сам Свою Работу на 5

Расчетно–графическая работа





На тему: «Перевод чисел из одной системы счисления в другую»

 

Выполнил: студент группы бИФБС-11

Шигонцев Ю.С.

Проверил: к.ф.-м.н., доц. Каф. ИБС

Беспалова Н.В.

 

Саратов 2014 г.

План

1) Введение;

2) Алгоритм решения поставленной задачи на языке программирования C#;

3) Программа;

4) Заключение.

 


 

Введение:

Еще с давних времен нам приходилось решать сложные математические, алгебраические и геометрические задачи, на которые затрачивалось много времени. И неудивительно, что в результате такого длительного процесса мы допускали ошибки, нам приходилось перерешивать задания по несколько раз. Для этого и была создана первая в своем роде ЭВМ (Электронная Вычислительная Машина). Первые варианты ЭВМ выполняли простейшие задачи: сложение, вычитание, деление и умножение. Со временем ЭВМ развивалась и стало проще выполнять поставленные задачи.

На данный момент мы находимся в той же ситуации. При переводе числа из одной системы счисления в любую другую затрачивается много времени. Чтобы решить эту проблему – мы создадим программу на языке С#.

Целью данной расчетно-графической работы является создание программы перевода числа из одной системы счисления в другую через десятичную систему счисления. Для достижения цели нам необходимо составить алгоритм решения поставленной задачи и разработать программу на языке программирования.



 


Алгоритм решения и написание программы в C#

Для решения поставленной задачи мы должны выполнить следующие действия:

I. Число перевести из данной системы счисления в 10-ую СС:

Где:

1) S – данная система счисления

2) – данное число

3) – цифры числа

4) n – разряд целой части числа

5) m – разряд дробной части числа

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

II. Получившееся число в 10-ой системе счисления перевести в любую другую. Для этого мы должны переводить целую и дробную часть числа по отдельности.

a) Для перевода целой части числа из 10-ой СС в любую другую необходимо выполнить целочисленное деление. Полученное частное нужно делить на данную систему счисления, в которую хотим перевести, пока не останется 0. Остатки нужно выписать в обратном порядке – полученная последовательность и будет являться числом в новой системе счисления



b) При переводе дробной части нужно умножать на данную систему счисления, в которую хотим перевести. Каждый раз, при умножении, мы отбрасываем целые части, а дробную часть - повторно умножаем. Полученные целые цифры выписываем в прямом порядке – это и получается дробная часть после запятой.

Не забываем про то, что при этой операции может получиться большое число или конечного ответа нет. Для этого нам будет нужно задать точность после запятой.

Так же не надо забывать, что при работе с системами счисления больше 10-ти, цифрам больше 9-ти присваиваются буквенные значения английского алфавита (A=10, B=11, C=12, D=13, E=14, F=15). Так как в языках программирования числа, имеющие буквенное значение, не распознает, нам придется прописать метод присвоения двухзначных цифр за букву английского алфавита, а исходное число представить как строку. В таком случае за каждой цифрой числа будет закрепляться его индекс.

Теперь приступаем к разработке алгоритма при работе с программой:

1) Ввод исходного числа. (Ввод числа должен осуществляться через строку. Не забываем проверку на отрицательность числа)

2) Ввод исходной системы счисления (В пределах ОДЗ)

3) Перевод исходного числа в число 10-ой системы счисления (для удобства вычисления число должно быть вещественным)

4) Ввод новой системы счисления (В пределах ОДЗ)

5) Перевод числа в 10-ой системе счисления в число другой системы счисления. (Перевод целой и дробной части числа проводим каждый отдельно, и их результаты выводим в строковом типе. Не забываем про точность после запятой)



6) Вывод результата. (Не забываем вывести отрицательный знак, если он присутствует)

Для удобства присваивания цифры в число, можно создать метод преобразования символа в число:

public static int GetNum(char c)

{

int m = 0;

if (char.IsDigit(c)) //Если символ является цифрой

m = c - '0'; //То ищем разницу между кодами данного символа и цифры ‘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)) //Если число от 0 до 9

c = (char)(m + '0'); //Сопоставим число с цифрой

if ((m >= 10) && (m <= 15)) //Если число от 10 до 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'));

}

}

Полное решение поставленной задачи на C# предоставлено на следующей странице в пункте «Программа».


 

Программа:

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

}

}

}

 


 

Заключение:

В ходе выполнения расчетно-графической работы была написана программа, переводящая числа из одной системы счисления в любую другую. Данная программа была создана с учетом ОДЗ. В случае ошибок программа, либо возобновляет цикл, либо заканчивает свою работу.

Мы удостоверились на практике, что при работе с числами различной системы счисления, проще перевести данное число в строковый тип и продолжить работу со строками.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.