Разработать класс, который выполняет, указанные ниже, операции с набором строк, причем строки имеют фиксированную длину. Класс должен содержать следующие методы:
- конструктор класса, имеет два параметра: количество строк и максимальная длина строк;
- операцию задания строки, с заданным номером;
- метод, который выполняет вывод заданной строки или всех строк на экран;
- метод конкатенации (объединения) двух строк;
- метод, который определяет наличие в наборе строк заданной строки. Этот метод должен возвращать номер этой строки в наборе( или -1 если она не найдена).
Автор исходного кода — Лилия Марьенко.
#include <iostream>
#include <cstring>
using namespace std;
class Strings
{
private:
int amount;//количество строк вцелом
int length;//длина строк
int x; //для записи возвращаемого значения функцией searchStr()
int varNumber;//номер строки, которую пользователь захочет вывести на экран
bool varConcat;//выбор пользователя (объединять строки или нет)
//указатели на начало строк, которые будут заполняться пользователем
char *str1;
char *str2;
char *str3;
char *strSearch;//для поиска заданной строки
char *strConcat;//для записи всех введенных строк в одну строку
public:
Strings()//количество строк и максимальная длина строк
{
amount = 3;//количество
length = 31;//максимальная длина
}
int searchStr()//метод, который определяет наличие в наборе строк заданной строки
{
//строка strSearch и все остальные будут заданы в методе setString()
//там же и будет вызван ткущий метод searchStr()
if (strcmp(strSearch,str1) == 0) return 1;// функция strcmp сравнит две строки и вернет 0, если они идентичны
else if(strcmp(strSearch,str2) == 0) return 2;
else if(strcmp(strSearch,str3) == 0) return 3;
else return -1;
}
void setString()// задание строки, с заданным номером;
{
str1 = new char[length];//выделяем память для строк из 30-ти символов и один символ для '\0'
str2 = new char[length];
str3 = new char[length];
strSearch = new char[length];
strConcat = new char[length*amount];//выделяем память для строки, в которую можно записать все введенные пользователем строки
for(int i = 0; i < length; i++)//заполним все строки символами \0, чтобы очистить память от ненужных значений в строках
{
str1[i] = '\0';
str2[i] = '\0';
str3[i] = '\0';
strSearch[i] = '\0';
}
for(int i = 0; i < length*amount; i++)//заполним строку символами \0
{
strConcat[i] = '\0';
}
cout << "Введите три строки (латиницей)." << endl;
for(int i = 0; i < amount; i++)
{
cout << "Введите строку №" << i+1 << " (не более 30-ти символов): ";
if(i == 0)cin.getline (str1, length);
if(i == 1)cin.getline (str2, length);
if (i == 2) cin.getline (str3, length);
}
cout << "Введите строку, номер которой хотите найти (не более 30-ти символов): ";
cin.getline (strSearch, length);
x = searchStr();//присвоим переменной х значение, которое вернет функция searchStr()
if (x == 1) cout << "\nНомер введенной Вами строки в наборе строк = 1" << endl;
else if (x == 2) cout << "\nНомер введенной Вами строки в наборе строк = 2" << endl;
else if (x == 3) cout << "\nНомер введенной Вами строки в наборе строк = 3" << endl;
else cout << "\nСтрока не найдена!!!\n\n";
}
void getString()//вывод строк на экран
{
cout << "\n\n";
cout << "Если вы хотите отобразить все строки - введите 0.";
cout << "\nЕсли вы хотите вывести на экран конкретную строку, введите ее номер (1, 2 или 3): ";
cin >> varNumber;
cout << "\n\n";
if (varNumber == 1) cout << "Строка 1: " << str1 << endl << endl;
else if (varNumber == 2) cout << "Строка 2: " << str2 << endl << endl;
else if (varNumber == 3) cout << "Строка 3: " << str3 << endl << endl;
else//в данном случае если пользователь ввел 0
{
cout << "Строка 1: " << str1 << endl << endl;
cout << "Строка 2: " << str2 << endl << endl;
cout << "Строка 3: " << str3 << endl << endl;
}
}
void concat()//метод конкатенации (объединения) строк;
{
cout << "\nЕсли Вы хотите объединить все строки, нажмите - 1. Если нет, нажмите - 0: ";
cin >> varConcat;
if(!varConcat) cout << "Строки не будут объединены!" << endl;//если varConcat = 0(ложь)
else //если varConcat = 1
{
strcat(strConcat, str1);
strcat(strConcat, str2);
strcat(strConcat, str3);
cout << "Объединенные строки: " << strConcat << endl << endl;//если пользователь ранее объединил строки, выводим их одной строкой
}
}
void del()//метод очистки памяти по завершении работы программы
{
delete strConcat;
delete strSearch;
delete str3;
delete str2;
delete str1;
}
};
int main()
{
setlocale(LC_ALL, "rus");
Strings strings;//создаем объект
strings.setString();//вызываем метод задания строк в котором также вызывается метод сравнения строк
strings.getString();// вывод строк на экран
strings.concat();// метод конкатенации (пользователь выбирает объединять строки или нет)
strings.del();//чистим память
return 0;
}
Смотрим результат работы программы:
CppStudio.com
Введите три строки (латиницей). Введите строку №1 (не более 30-ти символов): C++ Введите строку №2 (не более 30-ти символов): C# Введите строку №3 (не более 30-ти символов): java Введите строку, номер которой хотите найти (не более 30-ти символов): C# Номер введенной Вами строки в наборе строк = 2 Если вы хотите отобразить все строки - введите 0. Если вы хотите вывести на экран конкретную строку, введите ее номер (1, 2 или 3): 0 Строка 1: C++ Строка 2: C# Строка 3: java Если Вы хотите объединить все строки, нажмите - 1. Если нет, нажмите - 0: 1 Объединенные строки: C++C#java
Комментарии
Alex Antonyuk
#ifndef TEXT_H #define TEXT_H #include <vector> #include <iostream> using namespace std; class Text { private: vector <string> text; int rows; unsigned int maxLength; public: Text(int, int); void setLine(const int, string); vector <string>& get(); string get(const int); void concatenation(const int, const int); void concatenation(const int, string); int presence(string); }; #endif // TEXT_H#include "Text.h" #include <iostream> #include <vector> using namespace std; Text::Text(int rows1, int maxLength1) { rows = rows1; maxLength = maxLength1; text.resize(rows); for (int i = 0; i < rows; ++i) { text[i].clear(); } } void Text::setLine(const int id, string line) { if (line.size() > maxLength) { cout << "Line is too long" << endl; return; } text[id] = line; } vector <string> &Text::get() { return text; } string Text::get(const int id) { return text[id]; } void Text::concatenation(const int id1, const int id2) { if (text[id1].size() + text[id2].size() > maxLength) { cout << "Line is too long" << endl; return; } text[id1] += text[id2]; } void Text::concatenation(const int id, string line) { if (text[id].size() + line.size() > maxLength) { cout << "Line is too long" << endl; return; } text[id] += line; } int Text::presence(string line) { for (int a = 0; a < rows; ++a) { if (text[a].size() >= line.size()) { for (unsigned int i = 0; i < text[a].size(); ++i) { if (text[a].size() - i < line.size()) { break; } bool presence = true; for (unsigned int j = i + 1, k = 1; j < text[a].size(); ++j, ++k) { if (text[a][j] != line[k]) { presence = false; break; } } if (presence) { return a; } } } } return -1; }Arthur
#include<iostream> #include<stdio.h.> #include<cstring> #include <Windows.h> #include<cstdlib> using namespace std; const int SZ = 80; //длина строки class String { private: char str[SZ]; public: String() { strcpy(str,""); //конструктор без параметров } String(char s[]) //конструктор с одним параметром { strcpy(str, s); } void getstr(int numb) //получение строки от пользователя { cout<<"Введите строку №"<<numb<<" (не более 30-ти символов): "; gets(str); } void showstr() const //показ строки { cout<<str; } void findnumb() //получение строки номер которой ищем { cin.sync(); cout<<"\nВведите строку, номер которой хотите найти : "; gets(str); } bool operator==(String ss) const //перегрузка операции сравнения { return (strcmp(str, ss.str) == 0)?true:false; } String operator+(String sp) const //перегрузка операции сложения { String temp; //временная строка if(strlen(str) + strlen(sp.str)<SZ) { strcpy(temp.str, str); //копируем первую строку во временную strcat(temp.str, sp.str); //добавляем вторую строку return temp; } else { cout<<"\nПереполнение!"; exit(1); } } }; ///////////////////////////////////// int main() { setlocale(LC_CTYPE, "rus"); SetConsoleCP(1251); SetConsoleOutputCP(1251); String s1[3],sAll, fn; for(int i = 0; i<3; i++) //получение строк от пользователя s1[i].getstr(i+1); int menu; bool ex = 1; while(ex) { cout<<"\nЕсли вы хотите вывести строку на экран, введите ее номер (1, 2 или 3)." <<"\nЕсли хотите найти номер строки - введите 4." <<"\nЕсли вы хотите отобразить все строки - введите 5." <<"\nЕсли вы хотите объединить все строки - введите 6." <<"\nДля выхода - введите 0." <<"\n>>: "; cin>>menu; switch(menu) { case 0: { ex = 0; break; } case 1: { cout<<"Строка "<<menu<<": "; s1[menu - 1].showstr(); break; } case 2: { cout<<"Строка "<<menu<<": "; s1[menu - 1].showstr(); break; } case 3: { cout<<"Строка "<<menu<<": "; s1[menu - 1].showstr(); break; } case 4: { bool ch=0; fn.findnumb();//получение строки номер которой необходимо найти for(int i = 0; i<3; i++) if(s1[i] == fn) {cout<<"Номер введеной вами строки: "<<i+1; ch=1;} if(!ch) cout<<"Нет такой строки!"; break; } case 5: { for(int i = 0; i<3; i++) { cout<<"\nСтрока "<<i+1<<": "; s1[i].showstr(); } break; } case 6: { sAll = s1[0] + s1[1] + s1[2]; sAll.showstr(); break; } default: cout<<"Неверный ввод!"<<endl; } } return 0; }