Хелпикс

Главная

Контакты

Случайная статья





Лабораторная работа №4. Перегрузка операций. Пример.



Лабораторная работа №4

Перегрузка операций

 

Цель работы:приобрести навыки в использовании перегрузки операций.

Задание: Согласно условию определить класс, который должен включать в себя метод для ввода данных с обязательной проверкой на корректность вводимых данных, метод вывода данных (обязательна перегрузка операций << и >> для консольного ввода/вывода), метод приведения типа к int или double и указанные в задании перегружаемые операторы. Числа, записанные в строке или в одномерном массиве, должны быть произвольной длины, то есть они не обязательно поместятся в разрядную сетку известных числовых форматов, а, следовательно, для их сложения или вычитания требуется разработка собственного алгоритма.

 

Примечание 1. Методы ++ и – – следует перегрузить как методы класса, а +, –, += и –= можно как методы класса, можно как дружественные функции.

 

Примечание 2. Для методов ++ и – – следует разработать собственный алгоритм добавления или вычитания 1, а для +, –, += и –= можно привести операнды к типу double и выполнить требуемую операцию.

 

Пример.

Условие задачи.Создать класс, который запоминает вещественные числа в виде строк. Перегрузить операции *, и  *=.

 

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

 

using namespace std;

class CDoubleString

{

char *DoubleStr;//указатель на строку, которая хранит число

int count;

public:

CDoubleString(int n=100) //конструктор

{

       count=0;

       DoubleStr=new char[n]; //выделение памяти под строку

}

CDoubleString(const CDoubleString& c1) //конструктор копирования

{

       DoubleStr=new char[c1.count+1]; //выделение памяти под строку

       strcpy(DoubleStr,c1.DoubleStr);

       count=c1.count;

}

~CDoubleString()

{

       if (DoubleStr) delete DoubleStr;

}

friend istream & operator>>(istream &, CDoubleString &);//дружественная функция для ввода строки

friend ostream & operator<<(ostream &, CDoubleString &);//дружественная функция для ввода строки

void operator *(const CDoubleString& c1) //перегруженный оператор умножить

{

       double d1,d2;

       d1=atof(DoubleStr); //перевели строку из текущего в вещественное число

       d2=atof(c1.DoubleStr); //перевели строку из аргумента функции в вещественное число

       d1*=d2;

       sprintf(DoubleStr,"%f",d1);//перевели число в строку текущего объекта

       count=strlen(DoubleStr)+1; //получили новое значение count

}

CDoubleString& operator =(const CDoubleString& c1) //перегруженный оператор присваивания

{

       if (this!=&c1)

       {

             strcpy(DoubleStr,c1.DoubleStr); //копируем строку из аргумента функции в текущий объект

             count=c1.count;

       }

       return *this;

}

void operator *=(const CDoubleString& c1)//перегруженный оператор *=

{

       double d1,d2;

       d1=atof(DoubleStr);

       d2=atof(c1.DoubleStr);

       d1*=d2;

       sprintf(DoubleStr,"%f",d1);

       count=strlen(DoubleStr)+1;

}

 

operator double()

{

       return atof(DoubleStr);

}

};

 

istream & operator>>(istream & input, CDoubleString &c1) //определение дружественной функции ввода строки

{

char key;

int flag=0; //пользователь не нажал еще десятичную точку

printf("Enter the number: ");

do

{

       key=getch(); //считываем символ с клавиатуры без вывода на акран

       if (c1.count==0 && (key=='-' || (key>='0' && key<='9'))) //проверяем, является ли перевый введенный символ цифрой или минусом

       {

             c1.DoubleStr[c1.count++]=key; //сохраняем введенный символ в строке и увеличиваем счетчик числа введенных символов на 1

             putch(key); //выводим символ на экран

       }

       else

             if (flag==0 && key=='.') //проверяем, первый ли раз нажал пользолватель десятичную точку

             {

                   flag=1;//устанавливаем признак введенной десятичной точки

                   c1.DoubleStr[c1.count++]=key;

                   putch(key);//выводим символ на экран

             }

             else

                   if (key>='0' && key<='9') //нажата ли цифра

                   {

                        c1.DoubleStr[c1.count++]=key;

                        putch(key);//выводим символ на экран

                   }

}

while (c1.count==0 || key!=13); //цикл работает, пока пользователь не нажмет ENTER

c1.DoubleStr[c1.count++]='\x0';

printf("\n");

return input;

}

 

ostream & operator<<(ostream & output, CDoubleString &c1)

{

int i;

i=0;

cout<<"Number: ";

while(i<c1.count)

{

       putch(c1.DoubleStr[i++]);

}

printf("\n");

return output;

}

 

int main()

{

CDoubleString d; //создали объект

cin>>d; //ввели строку

cout<<d; //вывели строку

CDoubleString d1;//создали второй объект

d1=d; //скоировали данные из первого объекта во второй

cout<<d1; //вывели второй

d1*d; //умножили второй на первый, результат во втором

cout<<d1; //вывели второй

CDoubleString d2; //создали третий объект

cin>>d2; //ввели данные в третий объект

cout<<d2; //выведи третий объект

d2*=d; //умножили третий на первый, результат в третьем

cout<<d2; //вывели третий

double x;

x=double(d);

cout<<x;

return 0;

}

 

 


Содержание отчёта

 

1. Титульный лист.

2. Условие лабораторной работы.

3. Текст программы.

4. Экранные формы с примерами работы программы.

 

Варианты заданий.

 

1.  Создать класс, который запоминает целые десятичные числа в виде строк. Перегрузить операции +, ++ и  +=.

 

2. Создать класс, который запоминает целые десятичные числа в виде строк. Перегрузить операции –, – – и  –=.

 

3. Создать класс, который запоминает вещественные числа в виде строк. Перегрузить операции +, ++ и  +=.

 

4. Создать класс, который запоминает вещественные числа в виде строк. Перегрузить операции –, – – и  –=.

 

5. Создать класс, который запоминает целые двоичные числа в виде строк. Перегрузить операции +, ++ и  +=.

 

6. Создать класс, который запоминает целые двоичные числа в виде строк. Перегрузить операции –, – – и  –=.

 

7. Создать класс, который запоминает целые восьмеричные числа в виде строк. Перегрузить операции +, ++ и  +=.

 

8. Создать класс, который запоминает целые восьмеричные числа в виде строк. Перегрузить операции –, – – и  –=.

 

9. Создать класс, который запоминает целые шестнадцатеричные числа в виде строк. Перегрузить операции +, ++ и  +=.

 

10.  Создать класс, который запоминает целые шестнадцатеричные числа в виде строк. Перегрузить операции –, – – и  –=.

 

11.  Создать класс, который запоминает целые десятичные числа в виде одномерного массива. Перегрузить операции +, ++ и  +=.

 

12.  Создать класс, который запоминает целые десятичные числа в виде одномерного массива. Перегрузить операции –, – – и  –=.

 

13.  Создать класс, который запоминает целые двоичные числа в виде одномерного массива. Перегрузить операции +, ++ и  +=.

 

14.  Создать класс, который запоминает целые двоичные числа в виде одномерного массива. Перегрузить операции –, – – и  –=.

 

15.  Создать класс, который запоминает целые шестнадцатеричные числа в виде одномерного массива. Перегрузить операции +, ++ и  +=.

 

16.  Создать класс, который запоминает целые шестнадцатеричные числа в виде одномерного массива. Перегрузить операции –, – – и  –=.

 

17.  Создать класс, который запоминает целые восьмеричные числа в виде одномерного массива. Перегрузить операции +, ++ и  +=.

 

18.  Создать класс, который запоминает целые восьмеричные числа в виде одномерного массива. Перегрузить операции –, – – и  –=.

 

19.  Создать класс, который запоминает вещественные числа в виде одномерного массива. Перегрузить операции +, ++ и  +=.

 

20.  Создать класс, который запоминает вещественные числа в виде одномерного массива. Перегрузить операции –, – – и  –=.

 

21.  Создать класс, который запоминает римские числа в виде строк. Перегрузить операции +, ++ и  +=.

 

22.  Создать класс, который запоминает римские числа в виде строк. Перегрузить операции –, – – и  –=.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.