|
|||
Лабораторная работа №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. Создать класс, который запоминает римские числа в виде строк. Перегрузить операции –, – – и –=.
|
|||
|