- •Классы и объекты
- •Введение
- •Лабораторная работа № 1. Структура-пара
- •Выполнение лабораторной работы
- •Методические указания к выполнению лабораторной работы
- •XXX yyy; // скалярная переменная
- •Vl, v2[20]; // скалярная переменная и массив
- •Int _tmain(int argc, _tchar* argv[])
- •X.Read();
- •X.Display(); // вывод полей на экран
- •Лабораторная работа № 2. Структуры и классы
- •Выполнение лабораторной работы
- •Методические указания к выполнению лабораторной работы
- •Int getDigitByPosition(p_number V,int pos) {
- •Int transferTo10(p_number V) {
- •Int p_number_class::getDigitByPosition(int pos) {
- •Int p_number_class::transferTo10() {
- •Void p_number_class::transferFrom10(int numb) {
- •Int main(int argc, char* argv[])
- •Библиографический список
Int getDigitByPosition(p_number V,int pos) {
if(pos >= strlen(v.number)) return -1;
switch(v.number[pos]) {
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 'A' : return 10;
case 'B' : return 11;
case 'C' : return 12;
case 'D' : return 13;
case 'E' : return 14;
case 'F' : return 15;
case 'a' : return 10;
case 'b' : return 11;
case 'c' : return 12;
case 'd' : return 13;
case 'e' : return 14;
case 'f' : return 15;
default : return -1;
}
}
Int transferTo10(p_number V) {
int result = 0;
int len = strlen(v.number);
for (int index = 0; index < len; index++) {
int digit = getDigitByPosition(v,index);
if(digit != -1) {
result = result+digit*Power(v.scale_of_notation,len-index-1);
}
}
return result;
}
char* transferFrom10(int numb,int scale_of_notation) {
int dividend = numb;
int index = 0;
char revers[200];
number[200];
// используется операция деления в столбик
while(dividend >= scale_of_notation) {
int rest = dividend%scale_of_notation;
revers[index] = getCharByDigit(rest);
index++;
dividend = dividend/scale_of_notation;
}
revers[index] = getCharByDigit(dividend);
index++;
revers[index] = '\0';
// переворачиваем результат
for (int ind = 0; ind < index; ind++) {
number[ind] = revers[index - ind - 1];
}
number[index] = '\0';
return number;
}
Класс. Так как любой метод класса имеет доступ к полям этого класса, то передавать в метод необходимо только дополнительную информацию.
char * P_number_class::getNumber()
{
return number;
}
unsigned int P_number_class::getScaleOfNotation()
{
return scale_of_notation;
}
void P_number_class::init(char *n,int s) // метод присвоения полям значений
{
int string_length = strlen(n);
strncpy(number,n,string_length);
number[string_length] = '\0';
scale_of_notation = s;
}
void P_number_class::display() // метод вывода полей на экран
{ cout << "\n number: " << number << "\n scale_of_notation: " << scale_of_notation; }
void P_number_class::read() // метод ввода полей с клавиатуры
{ cout << "number: "; cin >> number;
cout << " scale_of_notation: "; cin >> scale_of_notation;
}
char* P_number_class::toString() // метод преобразования в строку
{
char string[25];
return strcat(strcat(number," в системе счисления "), itoa(scale_of_notation,string,10));
}
void P_number_class::add(P_number_class &x) // метод сложения
{
int num10 = transferTo10() + x.transferTo10();
transferFrom10(num10);
}
void P_number_class::sub(P_number_class &x) // метод вычитания
{
int num10 = transferTo10() - x.transferTo10();
transferFrom10(num10);
}
void P_number_class::mul(P_number_class &x) // метод умножения
{
int num10 = transferTo10() * x.transferTo10();
transferFrom10(num10);
}
void P_number_class::div(P_number_class &x) // метод деления
{
int num10 = transferTo10()/x.transferTo10();
transferFrom10(num10);
}
bool P_number_class::equal(P_number_class &x) // метод проверки на равенство
{
return (transferTo10() == x.transferTo10());
}
bool P_number_class::greate(P_number_class &x) // метод проверки на то, что число больше
{
return (transferTo10() > x.transferTo10());
}
bool P_number_class::less(P_number_class &x) // метод проверки на то, что число меньше
{
return (transferTo10() < x.transferTo10());
}
char P_number_class::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';
}
}
