Суть задачи заключается в том, чтобы познакомиться с устройством библиотеки string (библиотека для работы со строками) и понять, как самостоятельно писать библиотеки.
В данной задаче необходимо реализовать: сравнение строк, сложение (конкатенация строк), вывод строки и разбить на два файла (можете записать в один файл весь код (классы сверху, main внизу)).
Реализация через классы.
Создаём нашу библиотеку для работы со строками (не путать с классической библиотекой string (разница в регистре (регистр это большая или маленькая буква))).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#pragma once #include <iostream> #include <cstring> class String { private: enum { Q = 80 //максимальный размер строки (этакая константа размера массива символов) }; char str[Q]; //сама строка public: String() { //конструктор без параметров str[0] = '\0'; //записываем сразу конец строки, это единственное, что есть в строке } String(char s[]) { //конструктор с одним параметром strcpy_s(str, s); //передаём в строку определённые символы } void display() { //метод вывода строки std::cout << str; //выводим нашу строку } void concat(String s2) { //метод сложения строк if (strlen(str) + strlen(s2.str) < Q) { //если длины складываемых строк больше заданного размера Q, то произойдёт переполнение массива strcat_s(str, s2.str); } else { std::cout << "\nПереполнение!"; } } String &operator+(String &s2) { //перегрузка операции сложения String tmp = str; //создаём временный объект класса if (strlen(str) + strlen(s2.str) < Q) { //если переполнение - выдаём ошибку strcat_s(tmp.str, s2.str); } else { std::cout << "\nПереполнение!"; } return tmp; } bool &operator==(String &s2) { //метод проверки равенства строк String tmp = str; //создаём временный объект класса bool t = true; bool f = false; if (tmp.str == s2.str) { return t; } else { return f; } } bool &operator>(String &s2) { //метод сравнения строк String tmp = str; //создаём временный объект класса bool t = true; bool f = false; if (tmp.str < s2.str) { return t; } else { return f; } } bool &operator<(String &s2) { //метод сравнения строк String tmp = str; //создаём временный объект класса bool t = true; bool f = false; if (tmp.str > s2.str) { //если правая больше, то выдаём TRUE, иначе выдаём FALSE return t; } else { return f; } } }; |
Создание «Заголовочного файла»
В Visual Studio (сокращённо VS) в отдельный (заголовочный) файл выносить можно следующим образом:
- В главном окне VS в обозревателе решений находите «Заголовочные файлы». Кликаете на нём правой кнопкой мыши.
2. У Вас должно появиться контекстное меню. В нём нажимаете на «добавить», а после «Создать элемент» или можно просто нажать комбинацию горячих клавиш «Ctrl+Shift+A».
3. В появившемся окне выбираете «Файл заголовка», прописываете ему имя (какое хотите, либо оставьте которое по умолчанию) и нажимаете «Добавить».
4. Появится такое окно, в котором мы будем писать нашу мини-библиотеку. Обратите внимание, сверху у нас появились две вкладки: Source.cpp и Header.h.
Source.cpp — это файл основной программы, там мы будем экспериментировать и писать главную суть нашей программы.
Header.h — это заголовочный файл, это файл для нашей самопальной (ручного изготовления) библиотеки.
Переносим сюда весь наш класс String с его методами:
Теперь сохранитесь от греха подальше 🙂
Основной код программы
Переходим в Source.cpp и пишем основной код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include "Header.h"; //подключили наш заголовочный файл int main(){ setlocale(LC_ALL, "Russian"); String s1("Привет"); //конструктор с одним параметром String s2 = "Пока"; //аналогично, но в другой форме String s3; //конструктор без параметров String q; //объект нужный для математических операций std::cout << "\ns1 ="; s1.display(); //показываем строку s1 std::cout << "\ns2 ="; s2.display(); //показываем строку s2 std::cout << "\ns3 ="; s3.display(); //показываем строку s3 s3 = s1; //присваиваем std::cout << "\ns3 ="; s3.display(); //выводим строку s3 s3.concat(s2); //складываем методом std::cout << "\ns3 ="; s3.display(); std::cout << std::endl; //выводим строку s3 после сложения q = s1 + s2; //складываем перегрузкой сложения std::cout << "\nq = "; q.display(); //выводим строку q if (q == s3) { //если равны - то выводим "равны", если нет, то выводим "не равны" std::cout << "\nРАВНЫ" << std::endl; } else { std::cout << "\nНЕ РАВНЫ" << std::endl; } if (q > s3) { //если больше - то выводим "больше", если нет, то выводим "не больше" std::cout << "\nБОЛЬШЕ" << std::endl; } else { std::cout << "\nНЕ БОЛЬШЕ" << std::endl; } if (q < s3) { //если меньше - то выводим "меньше", если нет, то выводим "не меньше" std::cout << "\nМЕНЬШЕ" << std::endl; } else { std::cout << "\nНЕ МЕНЬШЕ" << std::endl; } system("pause"); //нужно, чтобы программа не завершалась сразу return 0; } |
Готово.