
2 семестр ФИБС / Информатика / 4 практика / GROUP_FIO_P4
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ИИСТ
отчет
по практической работе №4
по дисциплине «Информационные технологии»
Тема: Классы.
Студент гр. номер |
|
ФИО |
Преподаватель |
|
Куракина Н.И. |
Санкт-Петербург
20__
Цель работы:
Изучить классы в С++.
Теоретические положения:
Классы в С++ — это абстракция, описывающая методы, свойства, ещё не существующих объектов. Объекты — конкретное представление абстракции, имеющее свои свойства и методы. Созданные объекты на основе одного класса называются экземплярами этого класса. Эти объекты могут иметь различное поведение, свойства, но все равно будут являться объектами одного класса.
Оператор — это символ, который сообщает компилятору выполнить определенные математические или логические манипуляции.
Ключевое слово operator объявляет функцию, указывающую, какой оператор-символ означает при применении к экземплярам класса. Это дает оператору более одного значения — "перегружает" его. Компилятор различает разные значения оператора, проверяя типы его операндов.
Функцию большинства встроенных операторов можно переопределить глобально или для отдельных классов. Перегруженные операторы реализуются в виде функции.
Если унарная операция перегружается как функция-член, то она не должна иметь аргументов, так как в этом случае ей передается неявный аргумент-указатель this на текущий объект.
Если унарная операция перегружается дружественной функцией, то она должна иметь один аргумент – объект, для которого она выполняется.
Если бинарная операция перегружается с использованием метода класса, то в качестве своего первого аргумента она получает неявно переданную переменную класса (указатель this на объект), а в качестве второго — аргумент из списка параметров. То есть, фактически бинарная операция, перегружаемая методом класса, имеет один аргумент (правый операнд), а левый передается неявно через указатель this.
Если бинарная операция перегружается дружественной функцией, то в списке параметров она должна иметь оба аргумента.
Результаты работы:
Общее:
Создать класс строка. Максимальное число символов в строке – 79.
Ввод строки и определение ее длины оформить в конструкторе
Определить:
Содержит ли строка символы отличные от букв;
Начинается ли строка с буквы А;
Сколько слов в строке
#include <iostream>
#include <string>
#include "Windows.h"
class string
{
public:
string(char* strIn);
char str[81];
bool IsLetter(void);
bool AF(void);
int NumberOfWords();
};
bool string::IsLetter()
{
char simb[53] = { 'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z',' ' };
for (int i = 0; i < strlen(str); i++)
{
int kounter=0;
for (int j = 0; j < 53; j++)
if (str[i] != simb[j])
kounter++;
if (kounter == 53)
return false;
}
return true;
}
bool string::AF()
{
if (str[0] == 'A')
return true;
else
return false;
}
int string::NumberOfWords()
{
int num = 0;
for (int i = 0; i < strlen(str); i++)
if (str[i + 1] == '\0' || (str[i]== ' ' && str[i + 1] != ' '))
num++;
return num;
}
string::string(char* strIn)
{
int strBeg = 0;
int strEnd = strlen(strIn);
for (int j = 0; j < strlen(strIn); j++)
if (strIn[j] != ' ')
{
strBeg = j;
break;
}
for (int j = strBeg; j < strlen(strIn); j++)
{
if (strIn[j] != ' ')
strEnd = j;
}
int j = strBeg;
for (int i = 0; i < 81; i++)
{
str[i] = strIn[j++];
if (j > strEnd)
{
str[++i] = '\0';
return;
}
}
str[80] = '\0';
}
void main()
{
SetConsoleOutputCP(1251);
char str[256];
printf("Введите строку: ");
gets_s(str,256);
string st(str);
printf("\n%s\n",st.IsLetter()?"Только буквы":"Присутствуют отличные от букв символы");
printf("\n%s\n",st.AF()?"Строка начинается на \'A\'":"Строка не начинается на \'A\'");
printf("\nКоличество слов: %d\n",st.NumberOfWords());
}
Индивидуальное:
Создать класс строка. Максимальное число символов в строке – 79.
Предусмотреть:
• Функцию-член для ввода строки и определения ее длины (конструктор может отсутствовать!);
• Функции-члены анализа строки (из общего задания)
• Функцию-член печати строки;
Программа должна содержать перегруженную операцию «=», использование которой скопирует S1 в S2. S1 и S2 являются двумя объектами одного класса!
• Создать функцию-член Run(…); выполняющую следующие действия
! Применить Run к объекту S2, предварительно скопировав в него S1
Длина L кратна 4-м, то первая часть строки меняется местами со второй.
#include <iostream>
#include <string>
#include "Windows.h"
class string
{
public:
string(char* strIn);
bool IsLetter(void);
bool AF(void);
int NumberOfWords();
static string get_s();
void puts();
void Run();
string operator=(const string& str);
int len = 0;
char str[81];
};
string string::operator=(const string& strR ) {
for (int i = 0; i < 81; i++)
{
this->str[i] = strR.str[i];
}
return *this;
};
string::string(char* strIn)
{
int strBeg = 0;
int strEnd = strlen(strIn);
for (int j = 0; j < strlen(strIn); j++)
if (strIn[j] != ' ')
{
strBeg = j;
break;
}
for (int j = strBeg; j < strlen(strIn); j++)
{
if (strIn[j] != ' ')
strEnd = j;
}
int j = strBeg;
for (int i = 0; i < 81; i++)
{
len++;
str[i] = strIn[j++];
if (j > strEnd)
{
str[++i] = '\0';
return;
}
}
str[80] = '\0';
}
bool string::IsLetter()
{
char simb[53] = { 'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z',' ' };
for (int i = 0; i < len; i++)
{
int kounter = 0;
for (int j = 0; j < 53; j++)
if (str[i] != simb[j])
kounter++;
if (kounter == 53)
return false;
}
return true;
}
bool string::AF()
{
if (str[0] == 'A')
return true;
else
return false;
}
int string::NumberOfWords()
{
int num = 0;
for (int i = 0; i < len; i++)
if (str[i + 1] == '\0' || (str[i] == ' ' && str[i + 1] != ' '))
num++;
return num;
}
string string::get_s()
{
char str[256];
gets_s(str, 256);
string st(str);
return st;
}
void string::puts() {
printf("\n%s\n",str);
return;
}
void string::Run()
{
int mid = 0;
if (len % 4 == 0)
{
mid = len / 2;
char* temp = new char[mid];
for (int i = 0; i < mid; i++)
{
temp[i] = str[i];
str[i] = str[mid + i];
}
for (int i = 0; i < mid; i++)
{
str[mid + i] = temp[i];
}
delete temp;
}
else
return;
}
void main()
{
SetConsoleOutputCP(1251);
char str[256];
printf("Введите строку: ");
gets_s(str,256);
string st(str);
string stCopy = st;
printf("Введите новую строку:");
st=string::get_s();
stCopy.Run();
printf("\nПервая строка: %s\nВторая измененная строка: %s\n",st.str,stCopy.str);
printf("\n%s\n",st.IsLetter()?"Только буквы":"Присутствуют отличные от букв символы");
printf("\n%s\n",st.AF()?"Строка начинается на \'A\'":"Строка не начинается на \'A\'");
printf("\nКоличество слов: %d\n",st.NumberOfWords());
}
Вывод: выполнив практическую работу научились использовать перегрузку операторов в с++.