Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод вказів лаборат роб Опер сист.doc
Скачиваний:
11
Добавлен:
08.02.2016
Размер:
1.41 Mб
Скачать

5. Приклад рішення задачі

5.1. Індивідуальне завдання:

" Функція - substr(s,n,l). Призначення - виділення з рядка s подстроки, починаючи з позиції n, довжиною l.

5.2. Опис методу рішення

5.2.1. Символьний рядок у мові C представляється в пам'яті як масив символів, наприкінці якого знаходиться байт із кодом 0 - ознака кінця рядка. Рядок, як і будь-який інший масив можна обробляти або традиційним методом - як масив, з використанням операції індексації, або через покажчики, з використанням операцій адресної арифметики. При роботі з рядком як з масивом потрібно мати на увазі, що довжина рядка заздалегідь невідома, так що цикли повинні бути організовані не з лічильником, а до появи ознаки кінця рядка.

5.2.2. Функція повинна реалізовувати поставлену задачу - і нічого більш. Це означає, що функцію можна буде, наприклад, перенести без змін у будь-яку іншу програму, якщо специфікації функції задовольняють умовам задачі. Це також означає, що при помилковому завданні чи параметрів при якихось особливих випадках у їхніх значеннях функція не повинна аварийно завершувати чи програму виводити якісь повідомлення на екран, але повинна повертати якесь прогнозоване значення, по якому та функція, що викликала нашу, може зробити висновок про чи помилку про особливий випадок.

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

іnt substr (src, dest, num, len);

де src - рядок, з яким вибираються символи;

dest - рядок, у яку записуються символи;

num - номер першого символу в рядку src, з якого починається подстрока (нумерація символів ведеться з 0);

len - довжина вихідного рядка.

Можливі значення функції, що повертаються, установимо: 1 (завдання параметрів правильне) і 0 (завдання не правильне). Ці значення при звертаннях до функції можна буде інтерпретувати як "істина" чи "неправда".

Позначимо через Lsrc довжину рядка src. Тоді можливі такі варіанти при завданні параметрів:

" num+len <= Lsrc - цілком правильне завдання;

" num+len > Lsrc; num < Lsrc - правильне завдання, але довжина вихідного рядка буде менше, ніж len;

" num >= Lsrc - неправильне завдання, вихідний рядок буде порожньою;

" num < 0 чи len <= 0 - неправильне завдання, вихідний рядок буде порожньою.

Помітимо, що інтерпретація конфігурації параметрів як правильна / неправильна і вибір реакції на неправильне завдання - справа виконавця. Але виконавець повинний строго виконувати прийняті правила. Можливий також випадок, коли вихідний рядок вийде більшої довжини, чим для неї відведене місця в пам'яті. Однак, оскільки нашої функції невідомий розмір пам'яті, відведений для рядка, функція не може розпізнати й обробити цей випадок - так само поводяться і бібліотечні функції мови C.

5.3. Опис логічної структури

5.3.1. Програма складається з одного програмного модуля - файл LAB1.C. До складу модуля входять три функції - maіn, substr_mas і subs_ptr. Загальних перемінних у програмі немає. Макроконстантою N визначена максимальна довжина рядка - 80.

5.3.2. Функція maіn є головною функцією програми, вона призначена для уведення вихідного даних, виклику інших функцій і висновку результатів. У функції визначені перемінні:

o ss і dd - вхідний і вихідний рядки відповідно;

o n - номер символу, з якого повинна починатися вихідний рядок;

o l - довжина вихідного рядка.

Функція запитує і вводить значення вхідного рядка, номера символу і довжини. Далі функція викликає функцію substr_mas, передаючи їй як параметри введені значення. Якщо функція substr_mas повертає 1, виводиться на екран вхідний і вихідний рядки, якщо 0 - виводиться повідомлення про помилку і вхідний рядок. Потім вхідний рядок робиться порожній і те ж саме виконується для функції substr_ptr.

5.3.3. Функція substr_mas виконує поставлене завдання методом масивів. Її параметри: - src і dest - вхідний і вихідний рядки відповідно, представлені у виглядімасивів невизначеного розміру; num і len. Внутрішні перемінні й і j використовуються як індекси в масивах.

Функція перевіряє значення параметрів у відповідності з випадком 4, якщо умови цього випадку виявлені, у перший елемент масиву dest записується ознака кінця рядка і функція повертає 0.

Якщо випадок 4 не виявлений, функція переглядає num перших символів вхідного рядка. Якщо при цьому буде знайдена ознака кінця рядка, це - випадок 3, при цьому в перший елемент масиву dest записується ознака кінця рядка і функція повертає 0.

Якщо ознака кінця в перших num символах не знайдений, виконується цикл, у якому індекс вхідного масиву починає мінятися від 1, а індекс вихідного - від 0. У кожній ітерації цього циклу один елемент вхідного масиву пересилається у вихідний. Якщо пересланий елемент є ознакою кінця рядка (випадок 2), то функція негайно закінчується, повертаючи 1. Якщо в циклі не зустрінеться кінець рядка, цикл завершиться після len ітерацій. У цьому випадку в кінець вихідного рядка записується ознака кінця і Функція повертає 1.

5.3.4. Функція substr_ptr виконує поставлене завдання методом покажчиків. Її параметри: - src і dest - вхідний і вихідний рядки відповідно, представлені у виглядіпокажчиків на початки рядків; num і len.

Функція перевіряє значення параметрів у відповідності з випадком 4, якщо умови цього випадку виявлені, за адресою, що задає dest, записується ознака кінця рядка і функція повертає 0, ці дії виконуються одним оператором.

Якщо випадок 4 не виявлений, функція пропускає num перших символів вхідного рядка. Це зроблено циклом whіle, умовою виходу з який є зменшення лічильника num до 0 чи поява ознаки кінця вхідного рядка. Важливо чітко представляти порядок операцій, що виконуються в цьому циклі:

o вибирається лічильник num;

o лічильник num зменшується на 1;

o якщо обране значення лічильника було 0 - цикл завершується;

o якщо обране значення було не 0 - вибирається символ, на який указує покажчик src;

o покажчик src збільшується на 1;

o якщо обране значення символу було 0, тобто, ознака кінця рядка, цикл завершується, інакше - повторюється.

Після виходу з циклу перевіряється значення лічильника num: якщо воно не 0, це означає, що вихід з циклу відбувся по ознаці кінця рядка (випадок 3), за адресою, що задає dest, записується ознака кінця рядка і функція повертає 0.

Якщо ознака кінця не знайдений, виконується цикл, подібний до першого циклу whіle, але по лічильнику len. У кожній ітерації цього циклу символ, на який показує src листується за адресою, що задається dest, після чого обидва покажчики збільшуються на 1. Цикл закінчиться, коли буде переписано len чи символів зустрінеться ознака кінця рядка. У будь-якому варіанті завершення циклу по поточному адресі, що міститься в покажчику dest, записується ознака кінця рядка і функція завершується, повертаючи 1.