Файл: Лабораторна робота 11.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.09.2024

Просмотров: 11

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторна робота №11. Використання рядків

Мета роботи : вивчити особливості строкових даних, правила роботи з компонентами ListBox і СomboBox. Написати і відлагодити програму роботи з рядками.

7.1. Загальні теоретичні відомості Рядки як одновимірні масиви символів

У мові З/З++ рядок - це одновимірний масив символів, заканчиваю-щийся нульовим байтом, кожен біт якого дорівнює нулю, при цьому для нульового байта визначена константа ´´ (ознака закінчення рядка або нуль-терминатор).

Для рядка, що складається з 80 символів, в описі масиву необхідно вказати розмір 81, оскільки останній байт отведится під нуль-терминатор.

Нагадаємо, що строкова константа - це набір символів, поміщених в лапки, наприклад, "Лабораторна робота по рядках" (" не вказується).

Рядки можна ініціалізувати при декларації, наприклад:

char S1[10] = "123456789", S2[ ] = "12345";

у останньому випадку розмір рядка встановлюється по фактичній кількості.

Операції над рядками рекомендується виконувати з використанням стандартних бібліотечних функцій, розглянемо найбільш часто використовувані функції бібліотеки string.h:

1) strcpy (S1, S2) - копіює вміст рядка S2 в рядок S1;

2) strcat (S1, S2) - приєднує рядок S2 до рядка S1 і поміщає його в масив, де знаходився рядок S1, при цьому рядок S2 не змінюється; нульовий байт, який завершував рядок S1, замінюється першим символом рядка S2;

3) strcmp (S1, S2) - порівнює рядки S1 і S2 і повертає значення = 0, якщо рядки рівні, тобто містять одно і те ж число однакових символів; значення <0, якщо S1<S2; і значення > 0, якщо S1 > S2.

4) strlen (S) - повертає довжину рядка, тобто кількість символів, починаючи з першого (S[0]) і до нуль-терминатора, який не враховується.

5) strstr (S1, S2) - вказує перша поява підрядка S2 в рядку S1.

6) перетворення рядка S в число (бібліотека stdlib.h) : ціле - (int) atoi(S); довге ціле - (long) atol(S); дійсне - (double) atof(S);

при виникненні помилки ці функції повертають значення 0;

7) перетворення числа V в рядок S : ціле - itoa(int V, char S, int kod); довге ціле - ltoa(long V, char S, int kod); значення параметра kod визначає вибір системи числення для перетворення і знаходиться в діапазоні 2(kod(36, для негативних чисел kod = 10.

7.2. Створення віконного застосування


Тип AnsiString

Тип AnsiString є основним строковим класом в Builder.

Часто використовувані методи цього класу: с_str() - перетворення рядка AnsiString в масив символів; Delete() - видалення символів, SubString() - копіювання підрядка; Pos() - пошук позиції; Length() - визначення довжини рядка.

Компонент ListBox

Цей компонент є списком, елементи якого вибираються за допомогою клавіатури або миші. Список елементів задається властивістю Items, методи Add, Delete і Insert якого використовуються для додавання, видалення і вставки рядків, відповідно. Об'єкт Items зберігає рядки списку. Для визначення номера виділеного елементу використовується властивість ItemIndex.

Компонент ComboBox

Список ComboBox - комбінація списку ListBox і редактора тексту Еdit, тому практично усі властивості аналогічні. Для роботи з вікном редагування використовується властивість Text, як в Edit, а для роботи із списком вибору - властивість Items, як в ListBox. Cуществует п'ять модифікацій компоненти, визначуваних її властивістю Style, вибравши в якому модифікацію csSimple, розкриваємо список, потягнувши його за нижню кромку (захопивши її мишею).


Компонент-кнопка BitBtn

Компонент BitBtn розташований на сторінці Additonal і є різновидом стандартної кнопки Button. Її відмінність - наявність зображення на поверхні, визначувана властивістю Glyph. Крім того, властивість Kind задає один з 11 стандартних різновидів кнопок, натиснення будь-якої з них, окрім bkCustom і bkHelp, закриває вікно і повертає в програму результат mr*** (наприклад, bkOk - mrOk). Кнопка bkClose закриває головне вікно і завершує роботу програми.

Обробка подій

Про усі події, що відбуваються в системі, такі, як створення форми, натиснення кнопки миші або клавіатури і так далі, ядро Windows інформує вікна шляхом посилки відповідних повідомлень. Середовище Builder дозволяє приймати і обробляти більшість таких повідомлень. Кожна компонента містить обробники повідомлень на сторінці Events інспектора об'єктів.

Для створення обробника події необхідно виділити потрібну компоненту, далі на сторінці Events вибрати обробник і подвійним клацанням кнопкою миші у білому (порожньому) віконці в текст програми буде вставлена відповідна функція. Наприклад, виділивши компоненту Form1 і вибравши обробник OnActivate, буде вставлена функція .FormActivate(.){ }.

Кожна компонента має свій набір обробників подій, проте деякі з них властиві більшості компонент. Розглянемо найбільш часто вживані події:

OnActivate - форма отримує цю подію при активації;

OnCreate - виникає при створенні форми (Form), в обробнику події задаються дії, які повинні відбуватися у момент створення форми;

OnKeyPress - виникає при натисненні клавіші клавіатури, параметр Key типу WORD містить ASCII -код натиснутої клавіші (Enter має код 13, Esc - 27) і зазвичай використовується, коли потрібна реакція на натиснення однієї з клавіш;

OnKeyDown - виникає при натисненні клавіші клавіатури, обробник цієї події отримує інформацію про натиснуту клавішу і стан клавіш Shift, Alt і Ctlr, а також про натиснуту кнопку миші;

OnKeyUp - є парною подією для OnKeyDown і виникає при відпуску раніше натиснутої клавіші;

OnClick - виникає при натисненні кнопки миші в області компоненти, а OnDblClick - при подвійному клацанні кнопкою миші в області компоненти.

7.3. Приклад виконання завдання

Написати програму підрахунку числа слів в рядку, що містить пропуски.

7.3.1. Створення віконного застосування


Для введення рядків і роботи з ними використовувати компоненту ComboBox. Введення рядка закінчувати натисненням клавіші Enter, для виходу використовувати кнопку «Close». Панель діалогу з результатами програми може мати вигляд, представлений на мал. 7.1.

У тексті програми приведемо тільки функції-обробники:

//---------------------------------------------------------------------------

void __fastcall TForm1::FormActivate(TObject *Sender)

{

Form1 ->ComboBox1 ->SetFocus(); // Передача фокусу ComboBox1

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)

{

if (Key == 13) {

ComboBox1 ->Items ->Add(ComboBox1 ->Text);

// Рядок з вікна редагування заноситься в ComboBox1

ComboBox1 ->Text=""; // Очищення вікна

}

}

//------------ Обробка натиснення кнопки миші --------------------

void __fastcall TForm1::ComboBox1Click(TObject *Sender)

{

int n, i, nst;

nst = ComboBox1 ->ItemIndex; // Визначення номера рядка

String st = ComboBox1 ->Items ->Strings[nst]; // Запис вибраного рядка st

if (st[1] != ' ') n = 1; // Тут і нижче ' ' - пропуск

else n = 0;

for(i=1; i<st.Length(); i++) // Перегляд символів рядка st

if(st[i] == ' ' && st[i+1] != ' ') n++;

Edit1 ->Text = IntToStr(n); // Виведення числа слів в Edit1

}

Мал. 7.1


7.3.2. Створення консольного застосування

Для введення рядка, що містить пропуски використовуємо функцію gets (см лаб.раб. №1).

Текст функції main() може мати наступний вигляд:

#include <string.h>

void main()

{

int n, i, nst, len;

char st[81];

puts(" Input string ");

gets(st);

if (st[0] != ' ') n = 1; // Тут і нижче ' ' - пропуск

else n = 0;

len = strlen(st);

for(i=1; i<=len; i++) // Перегляд символів рядка

if(st[i] == ' ' && st[i+1] != ' ') n++;

printf("\n Words = %d", n); // Виведення кількості слів

puts("\nPress any key ... ");

getch();

}

Результат виконання представленої програми матиме наступний вигляд:

7.4. Індивідуальні завдання

У віконному застосуванні початкові дані вводити з компоненти Edit в ListBox (закінчувати натисненням Enter). Скалярний результат виводити в компоненту Label. Для виходу з програми використовувати кнопку «Close».

1. У рядку, що складається з груп нулів і одиниць, розділених пропусками, знайти кількість груп з п'ятьма цифрами.

2. У рядку, що складається з груп нулів і одиниць, знайти і вивести на екран найкоротшу групу.

3. У рядку, що складається з груп нулів і одиниць, підрахувати кількість символів в щонайдовшій групі.

4. У рядку, що складається з груп нулів і одиниць, знайти і вивести на екран групи з парною кількістю символів.

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

6. З рядка, що складається з букв, цифр, ком, точок, знаків + і, -, виділити підрядок, який відповідає запису цілого числа.

7. З рядка, що складається з букв, цифр, ком, точок, знаків + і, -, виділити підрядок, задаючий дійсне число з фіксованою точкою.

8. З рядка, що складається з букв, цифр, ком, точок, знаків + і, -, виділити підрядок, задаючий дійсне число з плаваючою точкою.

9. Даний рядок символів, що складається з цифр, розділених пропусками. Вивести на екран числа цього рядка в порядку зростання їх значень.

10. Даний рядок символів, що складається з цифр, розділених пропусками. Вивести парні числа цього рядка.

11. Даний рядок, що складається із слів англійською мовою, розділених пропусками. Вивести на екран ці слова в порядку алфавіту.

12. Даний рядок, що складається із слів, розділених пропусками. Вивести на екран порядковий номер слова, k, що містить, -у позицію, якщо в k -ої позиції пропуск, то - номер попереднього слова. Значення k ввести з клавіатури.