Лабораторная работа № 3 на тему «Дружественные функции»
Лабораторная работа №3
Тема работы: Программирование алгоритмов с использованием конструктора, деструктора и конструкта копирования. Использование переменных ссылочного типа. Дружественные функции.
Цель работы: Изучить принцип работы конструктора копирования, использования переменных ссылочного типа и использование дружественных функций.
Вариант заданий: Определить класс String для хранения строки. В классе определите следующие открытые функции: String() - конструктор по умолчанию; String(const char *str) - конструктор. Получает указатель на строку str, инициализирует буфер для хранения строки, копирует строку в буфер; String(const String & str) - конструктор копирования; ~String() - деструктор. Освобождает все занятые ресурсы; int Length() - возвращает длину строки; void Print() - выводит строку на экран; String*StrCpy(String* dst,String* src) - дружественная функция. Копирует строку src в строку dst, возвращает результат; String*StrCat(String* dst,String* src) - дружественная функция. Выполняет конкатенацию строк, результат помещается в dst, возвращает результат. Дружественную функцию в соответствии с вариантом: Вариант 1: Дана строка. Слова в предложении разделены одним или несколькими пробелами. Слова могут состоять только из цифр или букв. Необходимо найти сумму чисел, входящих в строку.
Код программы:
Файл "3.h"
class String { char *str; int r; public: String(); String(const char *str); String(const String &str); ~ String(); int Length (); int Print (); friend String *StrCpy(String *dst, String *src); friend String *StrCat(String *src, String *dst); friend int StrTok_sum(String *dst); };
String *StrCat(String *src, String *dst) { int i,j; String ob4; int l1=dst->Length(); int l2=src->Length(); ob4.str = new char [ l1 + l2 + 1]; for(i=0; src->str[i]!='\0'; i++) ob4.str[i]=src->str[i]; for(j=0; dst->str[j]!='\0'; j++, i++) ob4.str[i]=dst->str[j]; ob4.str[i]='\0'; delete src->str; int k = ob4.Length(); src->str=new char[k+1]; src->r=ob4.Length(); src=StrCpy(src, &ob4); return src; }
int StrTok_sum(String *dst) { int i, sum; for(sum = (i = 0);i<dst->Length() && *(dst->str+i) != '\0'; i++) { if('0' <= *(dst->str+i) && *(dst->str+i) <= '9') { sum += (*(dst->str+i) - 48); } } return sum; } void main() { setlocale(LC_ALL,"RUS"); char st[255], st2[255], st3[255]; cout<<"Введите строку 1 "<<endl; gets(st); cout<<"Введите строку 2"<<endl; gets(st2); cout<<"Создадим объект с помощью констуктора без параметров"<<endl; String str1; str1.Print(); cout<<endl; cout<<"Создадим объект №1 с помощью констуктора c параметром"<<endl; String str2(st); str2.Print(); cout<<"Создадим объект №2 с помощью констуктора c параметром"<<endl; String str3(st2); str3.Print(); cout<<endl; cout<<"Длина строки №2"<<endl; int k=str3.Length(); cout<<k <<endl; cout<<endl; cout<<"Создадим объект №3 с помощью констуктора копирования"<<endl; String str4(str2); str4.Print(); cout<<endl; cout<<"Выведем на экран сумму чисел входящих в строку"<<endl; cout<<StrTok_sum(&str2)<<endl; cout<<"Конкатанация строк №1 и №2"<<endl; StrCat(&str2, &str3); str2.Print(); }