Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2366.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
402.43 Кб
Скачать

Выполнение лабораторной работы

Для выполнения работы необходимо:

  • формализовать задачу;

  • составить описание структуры и класса;

  • составить алгоритм для каждого метода, описанного в структуре и классе, и определить все методы;

  • создать объекты описанного типа;

  • разработать набор тестов, на которых будет проверяться программа;

  • продемонстрировать работу программы на наборе тестов;

  • оформить работу и отчитаться по ней.

Методические указания к выполнению лабораторной работы

Задание

Реализовать класс натуральное число в Р-ичной системе счисления (2 < Р < 9). Класс должен содержать методы:

  • сложение; вычитание; умножение; деление;

  • функции, реализующие операции отношения (равно, не равно, больше, меньше).

Выполнение

Формализация задачи

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

Системой счисления называется совокупность приемов наименования и записи чисел. В любой системе счисления для представления чисел выбираются некоторые символы (их называют цифрами), а остальные числа получаются в результате каких-либо операций над цифрами данной системы счисления.

Система называется позиционной, если значение каждой цифры (ее вес) изменяется в зависимости от ее положения (позиции) в последовательности цифр, изображающих число.

Число единиц какого-либо разряда, объединяемых в единицу более старшего разряда, называют основанием позиционной системы счисления. Если количество таких цифр равно P, то система счисления называется P-ичной. Основание системы счисления совпадает с количеством цифр, используемых для записи чисел в этой системе счисления.

Запись произвольного числа x в P-ичной позиционной системе счисления основывается на представлении этого числа в виде многочлена

x = anPn + an-1Pn-1 + ... + a1P1 + a0P0 + a-1P-1 + ... + a-mP-m.

Арифметические действия над числами в любой позиционной системе счисления производятся по тем же правилам, что и десятичной системе, так как все они основываются на правилах выполнения действий над соответствующими многочленами. При этом нужно только пользоваться теми таблицами сложения и умножения, которые соответствуют данному основанию P системы счисления.

При переводе чисел из десятичной системы счисления в систему с основанием P > 1 обычно используют следующий алгоритм:

1) если переводится целая часть числа, то она делится на P, после чего запоминается остаток от деления. Полученное частное вновь делится на P, остаток запоминается. Процедура продолжается до тех пор, пока частное не станет равным нулю. Остатки от деления на P выписываются в порядке, обратном их получению;

2) если переводится дробная часть числа, то она умножается на P, после чего целая часть запоминается и отбрасывается. Вновь полученная дробная часть умножается на P и т. д. Процедура продолжается до тех пор, пока дробная часть не станет равной нулю. Целые части выписываются после запятой в порядке их получения. Результатом может быть либо конечная, либо периодическая дробь в системе счисления с основанием P. Поэтому, когда дробь является периодической, приходится обрывать умножение на каком-либо шаге и довольствоваться приближенной записью исходного числа в системе с основанием P.

Пример:

1. Перевести данное число из десятичной системы счисления в двоичную:

а) 464(10); б) 380,1875(10); в) 115,94(10) (получить пять знаков после запятой в двоичном представлении).

Решение.

464 | 0 380 | 0 |1875 115 | 1 |94

232 | 0 190 | 0 0|375 57 | 1 1|88

116 | 0 95 | 1 0|75 28 | 0 1|76

58 | 0 47 | 1 1|5 14 | 0 1|52

а) 29 | 1 б) 23 | 1 1|0 в) 7 | 1 1|04

14 | 0 11 | 1 3 | 1 0|08

7 | 1 5 | 1 1 | 1 0|16

3 | 1 2 | 0

1 | 1 1 | 1

а) 464(10) = 111010000(2); б) 380,1875(10) = 101111100,0011(2); в) 115,94(10) » 1110011,11110(2) (в настоящем случае было получено шесть знаков после запятой, после чего результат был округлен).

При переводе чисел из системы счисления с основанием P в десятичную систему счисления необходимо пронумеровать разряды целой части справа налево, начиная с нулевого, и в дробной части, начиная с разряда сразу после запятой слева направо (начальный номер – 1). Затем вычислить сумму произведений соответствующих значений разрядов на основание системы счисления в степени, равной номеру разряда. Это и есть представление исходного числа в десятичной системе счисления.

Пример:

Перевести данное число в десятичную систему счисления.

а) 1000001(2).

1000001(2) = 1× 26 + 0× 25 + 0× 24 + 0× 23 + 0× 22 + 0× 21 + 1× 20 = 64 + 1 = 65(10).

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

  1. методы и функции, реализующие операции отношения (равно, не равно, больше, меньше) в своей реализации будут сначала переводить числа в десятичную систему счисления, осуществлять над ними операции, а затем при необходимости переводить числа обратно в нужную систему счисления;

  2. для выполнения первого пункта, необходимо определить и реализовать методы перевода чисел из любой системы в десятичную, и из десятичной системы в любую другую.

Описание класса. В задании требуется описать структуру и класс. Кроме функций, описанных в задании, структура и класс должны определять поля, в которых будет храниться представление числа. Нам надо хранить значение числа и его систему счисления, поэтому поля у нас два. Так как число натуральное вроде бы естественно для хранения его значения использовать беззнаковый целый тип. Однако в задании требуется хранить числа в системах счисления, для которых запись будет содержать кроме цифр ещё и буквы (системы счисления больше десятичной). Поэтому для хранения значения будем использовать строку, в языке С++ одно из представлений строки – это массив символов. Систему счисления же можно хранить в беззнаковом целом типе.

Описание структуры выглядит следующим образом:

struct P_number {

char number[200]; // число

unsigned int scale_of_notation; // система счисления

};

В описание класса кроме объявления полей включается объявление методов для работы с полями:

class P_number_class {

char number[200]; // число

unsigned int scale_of_notation; // система счисления

int getDigitByPosition(int pos); // возврат цифры числа по позиции

char getCharByDigit(int digit); // перевод числа в символьное представление

int transferTo10(); // перевод в десятичную систему счисления

void transferFrom10(int numb); // перевод из десятичной системы счисления

public:

char* getNumber();

unsigned int getScaleOfNotation();

void read(); // метод ввода значений для полей

void display(); // метод вывода значений полей на экран

void init(char* n,int s);// метод, присваивающий полям значения

char* toString(); // метод преобразования в строку

void add(P_number_class &x); // метод сложения

void sub(P_number_class &x); // метод вычитания

void mul(P_number_class &x); // метод умножения

void div(P_number_class &x); // метод деления

bool equal(P_number_class &x); // метод проверки на равенство

bool greate(P_number_class &x); // метод проверки на то, что число больше

bool less(P_number_class &x); // метод проверки на то, что число меньше

};

В задании необходимо чтобы над натуральными числами в Р-ичной системе счисления выполнялись арифметически операции и операции сравнения. Так как компьютер умеет выполнять эти операции в десятичной системе счисления, рационально не писать отдельный метод для каждой системы счисления, а выполнять перевод из используемых систем счисления в десятичную, затем производить операцию и переводить обратно в текущую систему счисления. Для выполнения таких действий требуется наличие метода перевода в десятичную систему счисления и метода перевода из десятичной системы счисления. В описании это соответственно int transferTo10() и transferFrom10(int numb). Первый метод возвращает десятичное значение хранимого в объекте числа, а второй воспринимает десятичное значение и изменяет поле number.

Так как поле number строкового типа для операций необходимо переводить его в целочисленное значение, а потом обратно. Для этих целей в класс добавлены два метода: int getDigitByPosition(int pos) и char getCharByDigit(int digit).

Определение методов класса. Все методы определяем как внешние.

Структура. Для структуры мы используем обычные функции. При этом в каждую функцию приходится передавать саму структуру.

void display(P_number v) // функция вывода полей на экран

{ cout << "number: " << v.number << "\n scale_of_notation: " << v.scale_of_notation; }

void read(P_number v) // функция ввода полей с клавиатуры

{ cout << "number: "; cin >> v.number;

cout << " scale_of_notation: "; cin >> v.scale_of_notation;

}

char* toString(P_number v) // функция преобразования в строку

{

char string[25];

return strcat(strcat(v.number," в системе счисления "), itoa(v.scale_of_notation,string,10));

}

void add(P_number &x, P_number &y) // функция сложения

{

int num10 = transferTo10(x) + transferTo10(y);

strcpy(x.number,transferFrom10(num10));

}

void sub(P_number &x, P_number &y) // функция вычитания

{

int num10 = transferTo10(x) - transferTo10(y);

strcpy(x.number,transferFrom10(num10));

}

void mul(P_number &x, P_number &y) // функция умножения

{

int num10 = transferTo10(x) * transferTo10(y);

strcpy(x.number,transferFrom10(num10));

}

void div(P_number &x, P_number &y) // функция деления

{

int num10 = transferTo10(x)/transferTo10(y);

strcpy(x.number,transferFrom10(num10));

}

bool equal(P_number &x, P_number &y) // метод проверки на равенство

{

return (transferTo10(x) == transferTo10(y));

}

bool greate(P_number &x, P_number &y) // метод проверки на то, что число больше

{

return (transferTo10(x) > transferTo10(y));

}

bool less(P_number &x, P_number &y) // метод проверки на то, что число меньше

{

return (transferTo10(x) < transferTo10(y));

}

char getCharByDigit(int digit) {

switch(digit) {

case 0 : return '0';

case 1 : return '1';

case 2 : return '2';

case 3 : return '3';

case 4 : return '4';

case 5 : return '5';

case 6 : return '6';

case 7 : return '7';

case 8 : return '8';

case 9 : return '9';

case 10 : return 'A';

case 11 : return 'B';

case 12 : return 'C';

case 13 : return 'D';

case 14 : return 'E';

case 15 : return 'F';

default : return '\0';

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]