Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Methods_AP_LABS_I

.pdf
Скачиваний:
25
Добавлен:
17.03.2016
Размер:
1.53 Mб
Скачать

Рисунок 1.11 – Вікно властивостей проекту Побудова прекомпільованого заголовочного файлу відбувається при

кожній його зміні або зміні заголовочних файлів, які з нього підключаються,

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

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

1.3 Практичні завдання

1.3.1 Завдання 1

Створіть у середовищі Visual Studio новий проект мовою C++ Win32 Console Application. У вікні майстра створення проекту виберіть тип застосування «Console Application» (рисунок 1.12).

Рисунок 1.12 – Створення нового проекту Ознайомтеся з вихідним кодом програми, що виводить через кому числа

від 1 до 10 (рисунок 1.13):

Рисунок 1.13 – Лістинг програми Дана програма ілюструє використання оператора для організації

циклічного виконання з відомою початковою (i = 0) і кінцевою (i <= 10)

умовою, а також для зміни змінної циклу (++i операція збільшення/

інкремент змінної i).

У тілі циклу, вкладеному між фігурними дужками після оператора for,

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

“%d”використовується для здійснення виведення значення цілочисленого виразу (у нашому випадку значення цілочисленої змінної i) у десятковій системі числення.

Для виведення шістнадцятеричного значення цілочисленого виразу використовується модифікатор “%x”.

Оператор розгалуження if управляє виведенням коми - кома повинна виводитися після кожного числа, крім самого останнього.

Завдання (10 балів): Виконайте трасування даної програми, звертаючи увагу на вміст змінних на кожному кроці виконання програми. Чому дорівнює значення змінної після виходу із циклу?

Доробіть дану програму, щоб вона виводила через кому всі парні числа діапазону від 1 до 100, відсортовані в порядку убування, тобто 100, 98, 96, …, 6, 4, 2.

1.3.2 Завдання 2

Розглянемо принципи роботи програми, що обчислює суму чисел,

переданих їй у вигляді аргументів командного рядка (рисунок 1.14).

Рисунок 1.14 – Лістинг програми Розглянемо роботу даної програми більш докладно.

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

параметр argv є масивом рядків (точніше, масивом покажчиків на перші символи рядків), що зберігають аргументи командного рядка.

Увага, індексація елементів масиву в мові C/C++ починається з 0,

тобто індекс найпершого елемента масиву дорівнює 0, а самого останнього дорівнює N-1, де N - кількість елементів масиву.

У масиві argv елемент із індексом 0 зберігає шлях до застосування (у

випадку, якщо застосування запущене з пакетного .bat файлу, то тільки ім'я).

Тому змінна i змінюється в циклі від до argc:

for (int i = 1; i < argc; ++i)

{

}

Функція strtol (sting to long) виконує перетворення масиву символів,

покажчик на перший символ якого передається в першому аргументі функції,

у довге ціле число, записане в системі числення, переданій через 3 аргумент функції. 2 аргумент функції - адреса змінної типу, в яку буде записана адреса першого нецифрового символу (а точніше, символу, відсутнього в зазначеній системі числення), на якому зупинилася обробка переданого рядка.

Для перетворення рядка в число із плаваючою комою використовується функція strtod:

double strtod(const char * str, char ** plastchar);

У випадку, коли перетворення рядка в число пройшло без помилок, у

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

Використання даного факту дозволяє нам перевірити правильність переданого аргументу.

if ((*parg == '\0') || (*plastchar != '\0'))

У даному операторі розгалуження перевіряються 2 умови:

1. чи є самий перший символ переданого рядка нульовим символом,

іншими словами, чи є переданий рядок порожнім.

2. чи є символ, на якому було припинене перетворення рядка в число,

ненульовим. Іншими словами, чи містяться в рядку символи крім цифрових.

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

Для передачі порожнього рядка, або рядка із пробілами, програмі у вигляді аргументу командного рядка можна, уклавши рядок у подвійні лапки:

myprog.exe ”” ”argument with spaces”

Для передачі рядка, що містить символ подвійних лапок, програмі у вигляді аргументу командного рядка можна, екрануючи лапки за допомогою зворотної косої риси:

myprog.exe \”

Функція main повертає цілочислений код помилки, причому прийнято у випадку успішного завершення роботи програми повертати нульове значення, а у випадку помилки - ненульове. У випадку виявлення помилки

(нечисловий аргумент) здійснюємо примусовий вихід із програми з ненульовим кодом повернення.

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

Поліпшимо цю ситуацію, коли винесемо код перетворення рядка в число в окрему функцію (рисунок 1.15):

Рисунок 1.15 – Фрагмент лістингу програми

Функція StringToint приймає параметр err за посиланням, в який записує значення у випадку виявлення помилки при переведенні рядка в число.

Надалі, ми познайомимося з механізмом виключень, найкращим способом сигналізування про помилку.

Відмітьте також, що функція StringToint лише сигналізує про помилку,

але не виводить ніяких повідомлень в output - це обов'язок коду вищого рівня

(функція main). Делегування даного обов'язку функції дозволяє програми повідомити користувачеві про помилку більш конкретно: «і-ий аргумент командного рядка не є числом», замість абстрактного: «помилка перетворення рядка fsv9vk у число». У першому випадку користувач одержує вичерпну інформацію про помилку й може відразу вжити заходів по її усуненню, а в другому випадку користувачеві повідомляється про те, що десь в програмі відбулася помилка перетворення рядка в число.

Повідомлення користувачеві про помилку (тим більше, викликаної діями самого користувача) повинне нести високорівневий характер і

містити ключову інформацію про причину її виникнення й про заходи для її усунення.

Ніколи не слід показувати користувачеві неінформативні повідомлення,

які мають вигляд: «Incorrect argument», «Error».

Після внесених виправлень функція буде мати такий вигляд (рисунок

1.16):

Рисунок 1.16 – Лістинг модифікованої програми Написана нами програма цілком може містити помилки. Гарною

практикою є критичне відношення до знову написаної програми: програма

вважається утримуючою помилки, поки достовірно не буде доведено

зворотне.

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

що результати роботи програми (виведена програмою інформація)

відповідають очікуваним на заданому наборі вхідних даних (різні набори аргументів командного рядка).

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

виявлена помилка, тем легше її буде виправити, не зламавши чогось ще.

Перевірка програми вручну має ряд недоліків:

забирає тривалий час;

складніше відтворюється;

швидко набридає.

Спробуємо автоматизувати процес тестування за допомогою інтерпретатора мови сценаріїв командного рядка cmd.exe, вбудованого в ОС

Windows.

Створимо .bat файл за допомогою будь-якого текстового редактора

(підійде навіть «блокнот»), у якому будемо перевіряти:

код повернення нашого застосування (ми адже не даремно їх використовуємо в нашому застосуванні), запущеного з різними параметрами;

відповідність виведених нашою програмою даних очікуваному результату. Очевидно, що перевірки коду повернення застосуванням не достатньо для перевірки її роботи. Необхідно порівняти виведений програмою текст із тим, який ми очікуємо від неї одержати (помилка в програмі - невідповідність результату роботи програми (або її частини)

очікуваним результатам, тому для початку сам програміст повинен знати,

яких результатів чекати від розроблювальної програми). Виведені програмою в стандартний потік виведення можна перенаправляти у файл на диску, а

потім за допомогою утиліти fc.exe8 порівняти вміст даного файлу із заздалегідь підготовленим файлом, що містять очікуваний результат.

Пакетний файл, що вирішує дане завдання, представлене нижче

(рисунок 1.17):

8 fc.exe - утиліта, що входить до складу ОС Windows, яка виконує порівняння вмісту двох файлів і виводить відмінності між ними. Порівняння може виконуватися як у текстовому, так і у двійковому режимі. Нульовий код повернення сигналізує про відсутність відмінностей між порівнюваними файлами.

Рисунок 1.17 – Пакетний файл Крім того, нам знадобляться допоміжні файли, що містять очікуваний

результат.

-123.txt

15+2=17.txt

15+2+-8=9.txt

Для тестування нашої програми цілком достатньо було перевірити 6

варіантів її запуску. Для тестування більш складних програм буде потрібно перевірити більшу кількість варіантів. Щоб від тестів була відчутна користь,

необхідно покрити ними, щонайменше, усі вітки виконання програми. І

пам’ятайте:

тестування здатне виявити лише факт наявності помилок, а не

їхньої відсутності.

Завдання (30 балів): На основі даної програми розробіть програму eval.exe, що обчислює результат обчислення арифметичного виразу, операції й операнди якого передаються через аргументи командного рядка.

Обчислення виразу повинне здійснюватися без обліку пріоритету операторів,

результат виводиться з точністю до 3 знаків після коми. Наприклад,

результатом обчислення:

повинне бути число 9.00.

Повинні підтримуватися наступні арифметичні операції: додавання,

віднімання, множення та ділення.

Програма повинна коректно обробляти помилки в переданих аргументах

(неприпустимі значення параметрів і виразу в цілому, наприклад, ділення на

0).

У комплекті із програмою повинен поставлятися набір файлів, що дозволяє перевірити коректність її роботи в автоматичному режимі.

1.3.3 Завдання 3

Розробіть програму, що виводить у порядку зростання всі цілі числа діапазону від 1 до 1000, що діляться без залишку на суму своїх цифр.

Для розв’язання завдання можна скористатися наступним алгоритмом:

організуємо цикл від 1 до 1000, у якому обчислюємо суму цифр змінної циклу;

виводимо тільки ті значення змінної циклу, залишок ділення якої на суму її цифр дорівнює нулю.

Розглянемо розв'язок завдання по обчисленню суми цифр деякого числа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]