Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
31.05.2025
Размер:
230.4 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра ИИСТ

отчет

по практической работе №4

по дисциплине «Информационные технологии»

Тема: Классы и строка

Студент гр. номер

ФИО

Преподаватель

Куракина Н.И

Санкт-Петербург

20__

Цель работы.

Научиться работать со строками, используя классы, в языке программирования С++.

Основные теоретические положения.

Определение класса состоит из двух частей: заголовка, включающего ключевое слово class, за которым следует имя класса, и тела, заключенного в фигурные скобки. После такого определения должны стоять точка с запятой или список объявлений. Внутри тела объявляются данные-члены и функции-члены и указываются уровни доступа к ним. Таким образом, тело класса определяет список его членов. Функции-члены можно назвать операциями, которые позволяют работать с объектами класса. Функции-члены класса объявляются в его теле. Это объявление выглядит точно так же, как объявление функции в области видимости пространства имен.

Длина Си-строки определяется по достижению нулевого символа  — нуль терминатор. Функция strlen видит начало Си-строки  и начинает сначала считать количество символов (байтов, отводимых под каждый символ), этот процесс выполняется до тех пор, пока не будет достигнут завершающий нулевой символ. Получить строку из стандартного потока ввода. Функция gets считывает символы из стандартного потока ввода до символа новой строки n или до тех пор, пока не будет достигнут конец файла EOF, после чего сохраняет считанные символы в строку типа char.

В С++ есть условная операция, очень похожая на условный оператор выбора if else. Условная операция называется тернарной операцией. Форма записи тернарной операции в С++ “условие”?” выражение 1” : “выражение 2”; Если условие истинно, то выполняется выражение 1,иначе выполняется условие 2.

Функция strcpy копируется си-строку, включая завершающий нулевой символ в строку назначения, на которую ссылается указатель.

Задание.

Создать класс строку. Максимальное число символов в которой 79. Ввод строки и определение ее длины оформить в конструкторе.

Определить:

  1. Содержит ли строка символы отличные от букв;

  2. Начинается ли строка с буквы А;

  3. Сколько слов в строке;

Анализ строки оформить в виде функций- членов. Например функция возвращается 0, если все символы буквы, 1 -если нет. Код функции членов – вне пространства определения.

Код программы общего задания:

#include <iostream>

#include <cstring>

#include <clocale>

using namespace std;

class String

{

char str[80];

int metr;

int k;

public:

String(char* strIn);

void look();

int analiz_s();

void analiz_A();

int analiz_word();

};

void String::look()

{

printf("Ваша введенная строка:\n");

puts(str);

}

String::String(char* strIn) //Конструктор помимо инициализации убирает лишние пробелы, заменяя их на один

{

k=0;

metr=strlen(strIn)+1;

for (int i =0; i<metr; i++)

{

if ((strIn[i]!=' ')&&(strIn[i+1]!=' ')||((strIn[i]!=' ')&&(strIn[i+1]=' ')))

{

str[k]=strIn[i];

k=k+1;

}

else

{

if ((strIn[i-1]!=' ')&&(i!=0))

{

str[k]=strIn[i];

k=k+1;

}

}

}

metr=strlen(str);

}

int String::analiz_s()

{

int k =0;

for(int i = 0;i<metr;i++)

{

if(((str[i]>=0)&&(str[i]<=31))||((str[i]>=33)&&(str[i]<=64))||((str[i]>=91)&&(str[i]<=96))||((str[i]>=123)&&(str[i]<=127)))

{

k=k+1;

}

}

return k;

}

void String::analiz_A()

{

int i=0;

if ((str[i]==65)||(str[i]==97))

{

printf("Строка начинается с буквы À\n");

}

else

{

printf("Строка не начинается с буквы À\n");

}

}

int String::analiz_word()

{

k=1;

for(int i=0;i<metr;i++)

{

if(str[i]==32)

{

k++;

}

}

return k;

}

int main(){

setlocale (LC_ALL,"rus");

char sen[666];

printf("Введите вашу строку:\n");

gets(sen);

String fa(sen);

fa.look();

printf("\n%s\n",((fa.analiz_s())==0)?"Присутствуют только буквы":"Имеются символы");

fa.analiz_A();

printf("% Слов в строке\n",fa.analiz_word()); }

Индивидуальное задание.

Создать класс строка. Максимальное число символов в строке-79.

Предусмотреть:

- Функцию-член для ввода строки и определения ее длины;

- Функции-члены анализа строки из общего задания;

-Функцию-член печати строки;

Программа должна содержать перегруженную операцию <=>, использование которой скопируется S1 в S2, которые являются объектами одного класса!

Создать функцию Run к объекту S2, предварительно скопировав в него S1: Длина кратна 3, то удаляется каждый 3-й символ.

Код программы:

#include <iostream>

#include <clocale>

#include <cstring>

using namespace std;

class String

{

char str[80];

char sen[99];

int metr;

int k;

public:

String operator=(const String & other)

{

for (int i = 0; i < 80; i++)

{

this->str[i] = other.str[i];

}

this->metr = other.metr;

return *this;

}

void format();

void scan_sen();

void look();

int analiz_s();

void analiz_A();

int analiz_word();

void Run();

};

void String::scan_sen()

{

printf("Введите вашу строку:\n");

gets(sen);

}

void String::format()

{

k=0;

metr=strlen(sen)+1;

for (int i =0; i<metr; i++)

{

if ((sen[i]!=' ')&&(sen[i+1]!=' ')||((sen[i]!=' ')&&(sen[i+1]=' ')))

{

str[k]=sen[i];

k++;

}

else

{

if ((sen[i-1]!=' ')&&(i!=0))

{

str[k]=sen[i];

k++;

}

}

}

metr=strlen(str);

}

void String::look()

{

printf("Ваша введенная отформатированная строка:\n");

printf("Ее длина: %d\n",metr);

puts(str);

}

int String::analiz_s()

{

int k =0;

for(int i = 0;i<metr;i++)

{

if(((str[i]>=0)&&(str[i]<=31))||((str[i]>=33)&&(str[i]<=64))||((str[i]>=91)&&(str[i]<=96))||((str[i]>=123)&&(str[i]<=127)))

{

k++; } }

return k; }

void String::analiz_A()

{

int i=0;

if ((str[i]==65)||(str[i]==97))

{

printf("Строка начинается с буквы А\n");

}

else

{

printf("Строка не начинается с буквы А\n");

}

}

int String::analiz_word()

{

k=1;

for(int i=0;i<metr;i++)

{

if(str[i]==32)

{

k++;

}

}

return k;

}

void String::Run()

{

char sen[(metr-(metr/3))];

if (metr%3==0)

{

printf("Строка кратна трем\n");

k=1;

int j=0;

for(int i=0;i<(metr+1);i++)

{

if(k%3!=0)

{

sen[j]=str[i];

j=j+1;

k=k+1;

}

else

{

k=1;

}

}

strcpy(str, sen);

metr=strlen(sen);

}

else

{

printf("Строка не кратна трем\n");

}

}

int main()

{

setlocale (LC_ALL,"rus");

String S1;

S1.scan_sen();

S1.format();

S1.look();

S1.analiz_A();

S1.analiz_s();

S1.analiz_word();

printf("%s\n",(S1.analiz_s()==0)?"Присуствуют только буквы":"Имеются символы");

printf("Количество слов в предложении:%d\n",S1.analiz_word());

String S2;

S2=S1;

S2.Run();

S2.look();

}

Результаты работы

  1. Тест общего коды программы. Примеры вводимых строк: capital is important to us; I have 67 dollars; Australia is a large continent in our word;

Картинка 1. Общее

Картинка 2. Общее задание

Картинка 3. Общее задание

  1. Тест инвидуального задания. Вводимые строки для теста:Usa of state 56,make some of,Alan go;

Картинка 4. Индивидуальное задание.

Картинка 5.Индивидуальное задание.

Картинка 6.Индивидуальное задание.

Вывод.

В проделанной работе было продолжено изучение классов на примере строк. Также был изучен перегруженный оператор.

15

Соседние файлы в папке 4 практика