Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Короткі теоретичні відомості




1. Модульна організація програмного забезпечення Зазвичай програмний код для зручності налагодження та використання поділяють на логічно зв’язані частини - модулі. В мові С++ даний механізм реалізовано за допомогою файлів заголовків (розширення «.h» та «.hpp») та файлів реалізації (файли «.c» та «.cpp»). Наприклад, модульну структуру має стандартна бібліотека С++, в якій за допомогою файлів заголовків представлено модулі математичних операцій (math.h), потокового введення/виведення (stdio.h) та інші. Реалізація стандартної бібліотеки С++ для середовища Windows міститься у бібліотечному файлі msvcrtxx.dll, де хх – версія середовища виконання С++.Як правило, у файлі заголовків містяться оголошення функцій, структур, класів та глобальних змінних, а у файлі реалізації – код функцій, які оголошені у файлі заголовків. Також до складу файлу заголовків можуть входити препроцесорні константи та макроси. Розглянемо, наприклад модуль для обробки масиву рядків. Даний модуль реалізує пошук певного рядка в масиві та порівняння елементів масиву (рядків) між собою. Заголовний файл «StringManip.h» буде мати вигляд: #ifndef STRINGMANIP_H // захист від повторного#define STRINGMANIP_H // оголошення вмісту файлу int FindStr (char** stringArray, unsigned int arraySize, const char* string, bool reverse);int IsEqual (char** stringArray, unsigned int arraySize, unsigned int firstStrNum, unsigned int secondStrNum); #endif Код відповідного файлу реалізації «StringManip.cpp» наведений нижче: #include "StringManip.h"#include <string.h> int FindStr (char** stringArray, unsigned int arraySize, const char* string, bool reverse){ if (reverse!= true){// якщо шукаємо з початку масиву for (unsigned int i = 0; i < arraySize; ++i) if (strcmp(stringArray[i], string) == 0) return i; } else{ // в іншому випадку for (unsigned int i = arraySize - 1; i >= 0;--i) if (strcmp(stringArray[i], string) == 0) return i; } return -1; } int IsEqual (char** stringArray, unsigned int arraySize, unsigned int firstStrNum, unsigned int secondStrNum){ if(firstStrNum >= arraySize || secondStrNum >= arraySize) return -1; else if(strcmp(stringArray[firstStrNum], stringArray[secondStrNum])!= 0) return 0; return 1; } Для застосування модуля необхідно включити файл заголовку до файлу реалізації основного коду програми, файлу заголовку або реалізації іншого модуля. У якості прикладу розглянемо файл реалізації основного коду програми «main.cpp»: #include <iostream>#include <Windows.h>#include "StringManip.h" using namespace std; int main (void){ char* stringArr[5]; stringArr[0] = "One"; stringArr[1] = "Two"; stringArr[2] = "Three"; stringArr[3] = "One"; stringArr[4] = "Four"; cout << "The number of first string \"One\"" << " in forward order is: " << FindStr(stringArr, 5, "One", false)<< endl; cout << "The number of first string \"One\"" " in reverse order is: " << FindStr(stringArr, 5, "One", true) << endl; cout << "The result of \"IsEquals(stringArr, " << "5, 0, 2)\" is: "<< IsEqual(stringArr, 5, 0, 2) << endl; system("pause"); return 0; } Результатом виконання такого коду буде: The number of first string “One” in forward order is: 0The number of first string “One” in reverse order is: 3The result of “IsEquals(stringArr, 5, 0, 2)” is: 0 2. Реалізація та використання макросів та макровизначень Перед компіляцією вихідний код оброблюється препроцесором. Даний модуль компілятора відповідає за перетворення вихідного коду у код на мові С++ з урахуванням обмежень та налаштувань, які встановлено в коді програмістом. За допомогою директив препроцесора можна визначити будь-яку константу (макровизначення) або замінити блок коду літералом (макрос). Також директиви препроцесора дозволяють керувати ходом компіляції програми: вимикати показ попереджень, або навпаки – робити будь-яке попередження помилкою (якщо необхідно явно позбавитись всіх попереджень), замінювати один блок коду іншим в залежності від архітектури процесора або інших умов і т.д.Макровизначення відрізняється від змінної тим, що воно не потребує оперативної пам’яті для свого збереження, оскільки записується до вихідного коду програми на етапі обробки вихідного коду препроцесором. Використовується макровизначення як звичайна константа, а оголошується за допомогою директиви «#define» за наступним синтаксисом: #define Назва_Макровизначення Значення Макровизначення може бути любого вбудованого типу або замінювати літерал з великою назвою. При оголошенні макровизначення-константи необхідно додатково визначати тип константи для того, щоб компілятор знав як саме необхідно дану константу представляти та оброблювати. Виконується дана операція додаванням суфікса до значення самої константи. Перелік типів констант та відповідні їм суфікси зведені до табл. 9.1. Таблиця 9.1 – Перелік типів констант та відповідні їм суфікси
Тип константи Суфікс
Ціле Немає
Ціле без знаку u або U
Довге ціле l або L
64-бітне ціле ll або LL
З плаваючою точкою одинарної точності f або F
З плаваючою точкою подвійної точності Немає
З плаваючою точкою розширеної точності l або L
Символьна або строкова константа Немає
Суфікси можна, які призначено для визначення типу та для визначення наявності знаку можна об’єднувати, наприклад #define SOME_UL 3214567890ul // 32-бітне ціле без знаку Якщо необхідно оголосити символьну або строкову константу в кодуванні UTF-16 використовують префікс “L”, наприклад #define WCHAR_STRING L”Wide character string.” Макроси також оголошуються за допомогою директиви «#define». Відмінність від макровизначень складається в тому, що макроси, як і функції, можуть мати аргументи. Однак, при оголошенні макросу типи аргументів вказувати не потрібно. Синтаксис визначення макросу: #define Ім’я_макросу[(Перелік_аргументів)] рядок_з_кодом[\ рядок_з_кодом\...] Наприклад, макрос, який встановлює length елементів масиву dst рівними 0 можна оголосити наступним чином: #define ZeroMemory(dst, length) size_t len = length; \ while(len > 0l) \ dst[--len] = 0; При оголошенні та використанні макросів варто пам’ятати, що аргументи макросу є лише текстом, а отже – відповідним аргументом замінюються всі його входження до коду макросу. Така поведінка може призвести до небажаних наслідків при неправильній організації коду макросу або невірному виклику. Наприклад, якщо наведений вище макрос реалізувати як вказано нижче, виникне помилка компіляції при передачі константи в якості аргументу length: #define ZeroMemory(dst, length) while(length > 0l)\ dst[--length] = 0; Переробимо код, представлений у п.1 з використанням макровизначень: До файлу «StringManip.h» додамо наступний код: #define STRING_NOT_FOUND -1 / рядку в масиві немає#define FALSE 0 / результат - негативний#define TRUE 1 / результат - позитивний Вихідний код файлу «StringManip.cpp» змінимо наступним чином: #include "StringManip.h"#include <string.h> int FindStr(char** stringArray, unsigned int arraySize, const char* string, bool reverse){ if (reverse!= true){ // якщо шукаємо з початку масиву for (unsigned int i = 0; i < arraySize; ++i) if (strcmp(stringArray[i], string) == 0) return i; } else{ // в іншому випадку for (unsigned int i = arraySize - 1; i >= 0;--i) if (strcmp(stringArray[i], string) == 0) return i; } return STRING_NOT_FOUND;} int IsEqual(char** stringArray, unsigned int arraySize, unsigned int firstStrNum, unsigned int secondStrNum){ if(firstStrNum >= arraySize || secondStrNum >= arraySize) return STRING_NOT_FOUND; else if(strcmp(stringArray[firstStrNum], stringArray[secondStrNum])!= 0) return FALSE; return TRUE;} Результати, отримані при виконанні коду в main.cpp не зміняться, однак такий код є більш зрозумілим. 3. Механізм перевантаження функцій Досить часто у програміста виникає необхідність у створенні кількох функцій схожого призначення, логіка яких залежить від переліку аргументів. У якості прикладу повторно розглянемо код модуля «StringManip», який наведено у п.1 даної роботи. Функція IsEqual порівнює між собою два рядки, кожен із яких входить до масиву stringArray. Однак, часто виникає потреба порівняти, наприклад, рядок з масиву зі строковою константою, або рядком, що не входить до складу зазначеного масиву. Також необхідною може бути опція вибору типу порівняння (з урахуванням регістрів літер чи без такого). Для вирішення проблеми, зазначеної вище мовою С++ передбачений механізм під назвою перевантаження функцій. Даний механізм надає програмісту можливість реалізувати необхідну кількість функцій з однаковими іменами, що значно спрощує інтерфейс модуля. Єдиним обмеженням до функцій, що перевантажуються, є відмінність переліків типів їх аргументів. Перевантажимо функцію IsEqual з урахуванням функціоналу, зазначеного вище: bool IsEqual (char** stringArray, unsigned int arraySize, unsigned int strNum, const char* strToCompare, bool caseSensitive);Код реалізації даної версії функції матиме наступний вигляд: bool IsEqual (char** stringArray, unsigned int arraySize, unsigned int strNum, const char* strToCompare, bool caseSensitive){ if (strNum >= arraySize) return STRING_NOT_FOUND; if (caseSensitive == true){ if(strcmp(stringArray[strNum], strToCompare) == 0) return FALSE; return TRUE; } else{ if(strcmpi(stringArray[strNum], strToCompare) == 0) return FALSE; return TRUE; }} Перевантаження можливе лише у випадку відмінностей у списках аргументів двох версій однієї функції. Якщо ж відрізняються лише типи змінних, що повертаються – виникне помилка компіляції. Завдання на лабораторну роботу

 

Частина 1

1. Розробити програмний модуль, який реалізує наступні функції:

- (1)Генерування масиву з n випадкових чисел в діапазоні [0;100] з сідом рівним n, де n – номер варіанта;

- (2)Зміна числа, що міститься в аргументі, якщо воно кратне номеру варіанта;

- (3)Обчислення та виведення величини згідно табл. 9.2.

 

Таблиця 9.2 – Завдання до лабораторної роботи

№ вар. Величина, яку необхідно обчислити
  Середнє арифметичне елементів зі значеннями [m-5;m+5]
  Добуток всіх елементів масиву
  Сума всіх елементів масиву
  Кількість непарних елементів масиву
  Добуток елементів масиву, які кратні m
  Середнє геометричне всіх елементів масиву
  Куб суми найбільшого та найменшого елементів масиву
  Індекс крайнього елемента масиву, який кратний m
  Найменший елемент масиву

 

продовження табл. 9.2

№ вар. Величина, яку необхідно обчислити
  Залишок від ділення найбільшого елементу масиву на m
  Сума елементів масиву з парними індексами
  Середньоквадратичне найбільшого та найменшого елементів масиву
  Середнє арифметичне всіх елементів масиву
  Сума елементів масиву, які менші за m
  Найбільший елемент масиву
  Індекс елемента масиву, найближчого до m
  Середнє геометричне елементів масиву, які не кратні m
  Добуток елементів масиву з непарними індексами
  Середньоквадратичне всіх елементів масиву
  Кількість парних елементів масиву

 

Примітка: Число m задається користувачем в процесі виконання програми та має входити до діапазону [0;100].

 

2. Розробити перевантажений варіант функції з табл.9.2, який оброблює елементи, індекси яких входять до діапазону [start;end], де start – індекс початкового елемента з діапазону [0;n], end - індекс кінцевого елемента з діапазону [start;n].

 

Частина 2

На базі модуля, який був реалізований в частині 1, розробити програму, яка виконує наступні дії:

1. генерує масив за допомогою функції (1);

2. змінює вміст масиву за допомогою функції (2);

3. обчислює та виводить величину згідно табл.9.2 за допомогою основної та перевантаженої версій функції (3).

Вихідний масив, результати перетворень та обчислень записуються до файлу з ім’ям «results.txt» в текстовому режимі. Числа, які входять до складу масивів записуються через пробіл; масиви та результати розрахунків – з нового рядка у форматі <тип величини> = <значення>. Наприклад, для середнього арифметичного всіх елементів, рівного 50 та елементів з індексами з діапазону [5;10], рівного 30 маємо запис:

 

Average = 50

Average for arr[5] to arr[10] = 30




Поделиться с друзьями:


Дата добавления: 2015-06-28; Просмотров: 347; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.