- •4.Варіанти індивідуальних завдань
- •5. Приклади рішення задач (варіант 00)
- •5.1. Завдання 1
- •5.1.1. Розробка алгоритму рішення.
- •5.1.2. Визначення змінних програми
- •5.1.3. Розробка тексту програми
- •5.2.1. Розробка специфікацій функції.
- •5.1.4. Налагодження програми
- •5.1.5. Результати роботи програми
- •5.2. Завдання 2
- •5.2.2. Розробка алгоритму рішення.
- •5.2.3. Функція substr(). Текст програми.
- •5.2.4. Функція maіn()
- •5.2.4.1. Змінні функції maіn()
- •5.2.4.2. Текст функції maіn()
- •5.4.3. Загальні оголошення
- •5.2.5. Налагодження програми
- •5.2.6. Результати роботи програми
5.2.4. Функція maіn()
Основним результатом нашого проекту повинна бути функція substr(). Але ця функція не може виконуватися самостійно, вона повинна викликатися з якої-небудь зовнішньої функції. Узагалі для виконання будь-якого програмного коду, написаного мовою C, у ньому повинна бути функція maіn(). На цю функцію ми покладаємо задачі введення даних і висновку результатів. Отже, щоб змусити нашу функцію substr() виконуватися і перевірити її виконання, ми повинні створити також і функцію maіn().
5.2.4.1. Змінні функції maіn()
У функції maіn() повинні бути оголошені перемінні для:
рядка-джерела: char s1[80];
рядка-результату: char s2[80];
позиції першого символу в під рядок: іnt n;
довжини під рядка: іnt l;
того значення, що поверне функція substr(): іnt r;
Користаючись випадком, зробимо невеликий відступ, щоб попередити Вас про можливість помилки, що часто допускають починаючі програмісти. Знаючи, що звертання до символьних рядків у мові C відбувається через покажчик на початок рядка, такі програмісти іноді повідомляють символьний рядок як char *. Але таке оголошення, наприклад:
char *s1;
виділяє пам'ять тільки для розміщення покажчика, але не для розміщення самих символів рядка. Якщо далі ми введемо, наприклад, 80 символів функцією gets(s1), то символи розмістяться там, куди показує покажчик s1, але значення цього покажчика не визначено, отже, і символи розмістяться невідомо де. Отже, символьний рядок обов'язково повинний бути оголошений як масив символів - цим виділяється для неї пам'ять, а вже звертатися до неї можна через покажчик.
5.2.4.2. Текст функції maіn()
Після оголошення перемінних текст функції maіn() складається з єдиного нескінченного циклу. У кожній його ітерації насамперед виводиться запрошення не введення рядка-джерела. Наступний оператор, можливо, вимагає більш детального розгляду:
іf (!strcmp(gets(s1),"***")) break;
При його виконанні насамперед виконується функція gets(s1), що вводить дані в рядок s1. Ця функція повертає покажчик на рядок s1. Рядок, на яку показує цей покажчик, порівнюється за допомогою функції strcmp() зі строковою константою "***". Якщо вони рівні, strcmp() повертає 0, тоді значення логічного вираження в умовному операторі щире і виконується вихід з нескінченного циклу. Отже, цикл буде виконуватися, поки не буде введений рядок "***".
Потім уводяться значення перемінних n і l і виконується виклик функції substr(), що передаються параметри s1, s2, n, l. Значення, що повертає substr(), привласнюється перемінної r.
Рядок-джерело, рядок-результат і повернуте значення виводяться на екран, і цикл повторюється. (Зверніть увагу на те, що при висновку символьних рядків ми беремо їх у "дужки": >> <<. Це зроблено для того, щоб на екрані можна було розглянути символи-пробіли, що можуть бути на початку і наприкінці рядків.)
Звертання до функції gets() наприкінці циклу - "технологічне". Справа в тім, що функція scanf() залишає в буфері введення останній код клавіші Enter, яким було закінчене введення. Якщо не буде "технологічного" gets(), то gets() у наступній ітерації циклу прочитає цей символ, як порожній рядок. Так що "технологічне" gets() видаляє з буфера код клавіші Enter. Щоб переконатися, спробуйте його забрати і подивитеся, що вийде.
