ОПМС ЛР14 kudrinskikh

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 13

Мета: навчитися використовувати властивості опрацювання та обробки

символьних масивів при розробці програм в середовищі програмування Сі;


відпрацювати навики написання змішаних алгоритмів з використанням рядків,
редагування та відладки програми.

Обладнання: ОС Windows, компілятор (середовище програмування) мови


С++ - MsVisual Studio

Хід роботи

1 Створила каталог С:\Student\шифр групи\ПІБ\ЛР.

2 Запустила середовище програмування Ms Visual Studio, створила в ньому


пустий проект, номер якого співпадає з номером лабораторної роботи.

3 Додала необхідні файли початкового коду.

4 Відладила та протестувала програму. Продемонструвала свою роботу


викладачеві.

Умови задач наведено на рисунках 1-3

Змн. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР
Розроб. Кудринских Розробка програм з Літ. Арк. Аркушів
Перевір. Є.Р.
Саприкіна І.Г. використанням символьних 1 13
Реценз. рядків
Н. Контр. Саприкіна І.Г. Група ПЗ-21-1/9
Затверд. Саприкіна І.Г.
Рисунки 1-3 – Умови задач

Розв’язання:

Таблиця 1 – Таблиця символічних імен функції завдання 1

Матема- Ім’я у Смислове Змінна


тичне програмі значення
ім’я Тип Значення Призначення
- arr[15] масив char Вводиться з клавіатури Для збереження
у циклі символьного масиву
- i змінна int Початково 0 Для збереження
цілого числа

Таблиця 2 – Таблиця символічних імен функції завдання 2

Матема- Ім’я у Смислове Змінна


тичне програмі значення
ім’я Тип Значення Призначення
- a змінна int 128 Для збереження
цілого числа
- i змінна int Початково 0 Для збереження
цілого числа

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 2
Таблиця 3 – Таблиця символічних імен функції завдання 3

Матема- Ім’я у Смислове Змінна


тичне програмі значення
ім’я Тип Значення Призначення
- a[] масив char "Я не готовий" Для збереження
символьного масиву
- b[] масив char "До лабораторноi Для збереження
роботи" символьного масиву
- d[50] масив char Надається під час Для збереження
роботи функції символьного масиву
- *c масив char Надається під час Для збереження
роботи функції символьного масиву

Таблиця 4 – Таблиця символічних імен функції завдання 4

Матема- Ім’я у Смислове Змінна


тичне програмі значення
ім’я Тип Значення Призначення
- a[50] масив char Вводиться з Для збереження
клавіатури символьного масиву
- b змінна int Початково 0 Для збереження
цілого числа
- i змінна int Початково 0 Для збереження
цілого числа

Таблиця 5 – Таблиця символічних імен функції завдання 5

Матема- Ім’я у Смислове Змінна


тичне програмі значення
ім’я Тип Значення Призначення
- text змінна string Вводиться з Для збереження
клавіатури символьного масиву
- delimiter змінна string "%" Для збереження
символьного масиву
- pos змінна size_t Початково 0 Для збереження
цілого числа
- word змінна string Надається під час Для збереження
роботи функції символьного масиву
- minCount змінна int Початково INT_MAX Для збереження
цілого числа

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 3
Продовження таблиці 5:

Матема- Ім’я у Смислове Змінна


тичне програмі значення
ім’я Тип Значення Призначення
- minStart змінна char Надається під час Для збереження
Char роботи функції символу

Таблиця 6 – Таблиця символічних імен функції завдання 6

Матема- Ім’я у Смислове Змінна


тичне програмі значення
ім’я Тип Значення Призначення
- input змінна string Вводиться з Для збереження
клавіатури символьного масиву
- count змінна int Початково 0 Для збереження
цілого числа
- lastWord змінна string Надається під час Для збереження
роботи функції символьного масиву

Лістинг програми:

Файл menuha.h:

#pragma once
void t1(); //завдання 1
void t2(); //завдання 2
void t3(); //завдання 3
void t4(); //завдання 4
void t5(); //завдання 5
void t6(); //завдання 6
void vyhod(); //вихід з програми
void trubochist(); //чистка вікна

Файл menuha.cpp:

#include<iostream>
#include<Windows.h>
#include<cstring>
#include<string.h>
#include <clocale>
#include <conio.h>
#include<algorithm>
#include <string>

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 4
#include <sstream>
#include <map>
#include "risunokmenuhi.h"
#include "menuha.h"
#pragma warning(disable:4996)
using namespace std;
extern HANDLE hStdOut;
extern CONSOLE_SCREEN_BUFFER_INFO csbInfo;
extern SMALL_RECT consolRect;
extern WORD woкkWindowAttributes;
void main()
{
setlocale(LC_CTYPE, "rus");
SetConsoleTitle(L"лр14");
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hStdOut, &csbInfo);
consolRect = csbInfo.srWindow;
SetConsoleTextAttribute(hStdOut, woкkWindowAttributes);
system("CLS");
narisuj();
}
void t1() {
char arr[15];
for (int i = 0; i < 15; i++) {
cout << "Enter the char: ";
cin >> arr[i];
}
for (int i = 0; i < 15; i++) {
if (i == 1 || i == 6) {
continue;
}
cout << arr[i] << " ";
}
}
void t2() {
int a = 128;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 16; j++) {
char b = char(a);
cout << b << " ";
a++;
}
cout << endl;
}
}
void t3() {
char a[] = "я не готовий",b[]="до лабораторноi роботи";
char d[50];
strcpy(d,a);
strcat(d, " ");
strcat(d,b);
transform(d, d + strlen(d), d, ::tolower);
cout <<d<<endl<<strlen(d)<<endl;
char* c = strtok(d, " ");
cout << c << endl;
c = strtok(NULL, " ");
c = strtok(NULL, " ");
cout << c << endl;

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 5
}
void t4() {
char a[50];
int b=0;
cout << "Введiть рядок: ";
cin >> a;
for (int i = 0; i < strlen(a); i++) {
if (a[i] == ',') {
a[i] = '.';
b++;
}
else if (a[i] == '.') {
a[i] = '!';
b++;
}
}
cout << "Змiнений рядок: " << a << endl << "Кiлькість змiн: " << b;
}
void t5() {
string text;
cout << "Введіть текст: ";
getline(cin, text);

string delimiter = "%";


size_t pos = 0;
string word;
int minCount = INT_MAX;
char minStartChar;

while ((pos = text.find(delimiter)) != string::npos) {


word = text.substr(0, pos);

char startChar = word[0];

int count = 0;

for (size_t i = 0; i < text.length(); i++) {


if (text[i] == '%') {

i += delimiter.length();
if (i < text.length() && text[i] == startChar) {
count++;
}
}
}

if (count < minCount) {


minCount = count;
minStartChar = startChar;
}

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 6
text.erase(0, pos + delimiter.length());
}

cout << "Буква, на яку починається найменша кількість слів: " << minStartChar << endl;

}
void t6() {
string input;
cout << "Введіть рядок: ";
getline(cin, input);

int count = 0;
string lastWord;

for (int i = input.length() - 1; i >= 0; i--) {


if (input[i] != ' ') {
lastWord = input[i] + lastWord;
}
else if (!lastWord.empty()) {
break;
}
}
for (char c : lastWord) {
if (tolower(c) == 'a' || tolower(c) == 'а' || tolower(c) == 'A' || tolower(c) == 'А')
{
count++;
}
}

cout << "Кількість букв 'а' в останньому слові: " << count << endl;
}
void vyhod() {
int resp;
cout << "Вы уверены, что хотите выйти из программы? (y/n)?";
resp = getchar();
if (resp == 'y' || resp == 'Y') { ochistka(1); exit(0); }
}
void trubochist() {
ochistka();
}

Файл risunokmenuji.h:

#pragma once
void narisuj(); //створення меню
void dvizhenije(int x, int y); //переміщення курсора на позицію int x, int y
void vybor(int vyb, bool active); //підсвічування пункту меню
void ochistka(int okno = 0); //очищення консольного вікна
void getCursor(void); //запам'ятовування розміщення курсору
void showCursor(bool visible); //показ курсору

Файл risunokmenuji.cpp:

#include <windows.h>
#include <conio.h>
#include <iostream>

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 7
#include <string>
#include <sstream>
#include <map>
#include "risunokmenuhi.h"
#include "menuha.h"
using namespace std;
#define KEY_ARROW_RIGHT 77
#define KEY_ARROW_LEFT 75
#define KEY_ENTER 13
typedef void(*FUN) (void);
typedef struct {
int x, y;
char str[50];
FUN f;
} ITEM;
HANDLE hStdOut;
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
SMALL_RECT consolRect;
COORD curspos = { 0,1 };
WORD woкkWindowAttributes = 120;
WORD inactiveItemAttributes = 20;
WORD activeItemAttributes = 100;
enum menuitems { MNUT1, MNUT2, MNUT3, MNUT4,MNUT5, MNUT6, MNUVYHOD,MNUCHISTKA };
extern const int numMenu = 8;
ITEM menu[numMenu] = {
{ 1, 0, R"(задание 1)", t1},
{ 11, 0, R"(задание 2)", t2 },
{ 21, 0, R"(задание 3)", t3 },
{ 31, 0, R"(задание 4)", t4 },
{ 41, 0, R"(задание 5)", t5 },
{ 51, 0, R"(задание 6)", t6 },
{ 61, 0, R"(выход)", vyhod },
{ 68, 0, R"(очистить)", trubochist },
};
void narisuj() {
menuitems sel = MNUT1;
SetConsoleTextAttribute(hStdOut, inactiveItemAttributes);
string s(80, ' '); cout << s.c_str();
for (int i = 0; i < numMenu; i++) {
dvizhenije(menu[i].x, menu[i].y);
cout << menu[i].str;
}
vybor(sel, true);
fflush(stdin);
int iKey = 67;
while (1)
{
if (_kbhit())
{
iKey = _getch();
switch (iKey)
{
case KEY_ARROW_RIGHT:
if (sel < numMenu - 1) {
vybor(sel, false);
sel = (menuitems)(sel + 1);
vybor(sel, true);
}

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 8
else {
vybor(sel, false);
sel = MNUT1;
vybor(sel, true);
}
showCursor(false);
break;
case KEY_ARROW_LEFT:
if (sel > 0) {
vybor(sel, false);
sel = (menuitems)(sel - 1);
vybor(sel, true);
}
else {
vybor(sel, false);
sel = MNUVYHOD;
vybor(sel, true);
}
showCursor(false);
break;
case KEY_ENTER:
dvizhenije(curspos.X, curspos.Y);

SetConsoleTextAttribute(hStdOut,
woкkWindowAttributes);

showCursor(true);
switch (sel)
{
case MNUT1:
t1();
getCursor();
break;
case MNUT2:
t2();
getCursor();
break;
case MNUT3:
t3();
getCursor();
break;
case MNUT4:
t4();
getCursor();
break;
case MNUT5:
t5();
getCursor();
break;
case MNUT6:
t6();
getCursor();
break;
case MNUCHISTKA:
trubochist();
curspos = { 0, 1 };

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 9
break;
case MNUVYHOD:
int resp;
cout <<endl<< "Вы уверены, что хотите выйти из программы ?
(y / n) ? :"<<endl;
resp = getchar();
if (resp == 'y' || resp == 'Y')
{
dvizhenije(0, 0); ochistka(1); exit(0);
}
getCursor();
break;
}
fflush(stdin);
dvizhenije(menu[sel].x, menu[sel].y);
showCursor(false);
break;
case 120:
case 88:
case 27:
dvizhenije(0, 0);
ochistka(1);
exit(0);
}
}
}
}
void dvizhenije(int x, int y)
{
COORD cursorPos = { x, y };
SetConsoleCursorPosition(hStdOut, cursorPos);
}
void getCursor(void)
{
GetConsoleScreenBufferInfo(hStdOut, &csbInfo);
curspos = csbInfo.dwCursorPosition;
}
void ochistka(int it)
{
int i;
string s(120, ' ');
SetConsoleTextAttribute(hStdOut, woкkWindowAttributes);
if (it == 0) dvizhenije(0, consolRect.Top + 1);
else dvizhenije(0, consolRect.Top);
for (i = consolRect.Top; i < curspos.Y + 1; i++)

cout << s.c_str();


dvizhenije(0, 0);
}
void vybor(int sel, bool activate)
{
WORD itemAttributes;
if (activate) itemAttributes = activeItemAttributes;
else itemAttributes = inactiveItemAttributes;
dvizhenije(menu[sel].x, menu[sel].y);
SetConsoleTextAttribute(hStdOut, itemAttributes);

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 10
cout << menu[sel].str;
}
void showCursor(bool visible)
{
CONSOLE_CURSOR_INFO ccInfo;
ccInfo.bVisible = visible;
ccInfo.dwSize = 20;
SetConsoleCursorInfo(hStdOut, &ccInfo);
}

Результат роботи програми:

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 11
Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 12
Рисунки 4-12 – Задачі 1-6

5 Оформила виконані завдання відповідним чином за зразком.

Висновок: навчилася використовувати вказівники та основні операції над


ними при розробці програм в середовищі програмування С++; відпрацювала
навики написання змішаних алгоритмів та функцій користувача, редагування та
відладки програми.

Арк.

Змін. Арк. № докум. Підпис Дата


ФКЗЕ. 121ОПМС00. 14ЛР 13

You might also like