ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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 ввести з клавіатури.