Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Поняття технології створення програмного забезпечення та основні технологічні етапи. Приклади технологій.

Поиск

Технологія програмування – сукупність узагальнених і систематизованих знань про оптимальні способи проведення процесу програмування, що забезпечує у певних умовах одержання програмної продукції із заданими властивостями. Технологія програмування у загальному випадку залежить від подальшого використання створених застосувань. Для систем АНД можна виділити такі етапи створення ПЗ:

розробка, узгодження та затвердження ТЗ на створюваний програмний комплекс;

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

обґрунтування необхідної технології розробки;

написання програмного комплексу;

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

налагоджування та тестування ПЗ;

створення необхідної програмної документації;

верифікація ПЗ – здійснення перевірки ПЗ на кожному етапі проектування системи АНД на предмет виконання вимог, сформульованих на попередньому етапі;

атестація та валідація ПЗ – здійснення тестування та оцінки інтегрованої системи АНД (апаратного та програмного забезпечення) на предмет відповідності функціональним вимогам, а також вимогам до інтерфейсу та продуктивності;

проведення попередніх випробувань створеного програмного комплексу;

проведення міжвідомчою комісією його приймальних випробувань;

створення та затвердження технічних умов на програмний проект;

сертифікація створеного ПЗ.

Деякі етапи можуть бути відсутні, або навпаки – введені додаткові.

Приклади технологій:

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

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

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

багаторівневе структурне програмування поєднує спадне і структурне програмування.

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


Взаємозв’язок імен масивів та вказівників в мові програмування Сі. Операції над вказівниками. Приклади для одно- та двомірних масивів.

Масив складається з кількох елементів одного і того ж типу. Можна вибирати будь-який елемент масиву. Для цього необхідно задати індекс, який вказує відносну позицію елемента. число елементів масиву задається при його оголошенні і надалі не змінюється. Якщо масив оголошений, до будь-якого його елементу можна звернутися наступним чином: вказати ім'я масиву та індекс його елементу в квадратних дужках.

Масиви оголошуються так само, як і змінні. Наприклад:

1. int a[100] - масив а з 100 елементів цілого типу: а[0], a[1],..., a[99] (індексація починається з нуля).

2. float c[10][20] - двовимірний масив дійсного типу. Двовимірний масив представляється як одновимірний, елементи якого є теж масивами. У перших квадратних дужках вказується кількість рядків у масиві, по-друге - кількість стовпців.

Вказівник - тип даних в комп'ютерних мовах програмування. Значення вказівника посилається на інше значення, що записане будь-де в пам'яті комп'ютера (фактично це адреса).

Вказівник описується наступним чином. Спочатку вказується тип покажчика (це певний тип мови Сі). В даному випадку він визначає тип об'єкта, на який вказує покажчик. Слідом за цим через пробіл ставиться зірочка - *. Вона означає, що наступна за нею змінна є покажчиком. Виходить досить проста формула: тип * <проста змінна>

Наприклад: char *ch;

int *temp, i, *j, *k;

float *pf, fon;

Тут вказівники: ch, temp, j, k pf.

Розглянемо команди з вказівниками.

Команда pf = & x означає "взяти адресу числа, що знаходиться в x і записати його в pf.

Команда y = *pf дозволяє записати значення, розташоване за вказаною в pf адресою, в y.

Командою * pf + + відбувається зміна адреси. Виконується команда + + збільшення на 1.

Над вказівниками можна виконувати операції з цілочисельними аргументами. До вказівників можна застосовувати операцію привласнення або використовувати покажчики в арифметичних діях: y = * pf або y = 1 + * pf * y. Дії над вказівниками завжди виконуються в одиницях типу, на який вказує вказівник.

 

Операція Зміст
ptr1 = = ptr2 Порівняння на рівність
ptr1! = ptr2 Порівняння на нерівність
ptr1 < ptr2 Порівняння на менше
ptr1 < = ptr2 Порівняння на не більше
ptr1 > ptr2 Порівняння на більше
ptr1 > = ptr2 Порівняння на не менше
ptr1 - ptr2 Кількість елементів певного типу між вказівниками
ptr1 + ptr2 Обчислення вказівника від ptr1 на відповідну кількість елементів в сторону зменшення адреса

Вказівники та двовимірні масиви.

Припустимо, що у нас є опис: int z[4][2];

int pz;

Тоді pz = z вказує на нульовий стовпець нульової рядка, тобто pz = & z[0][0];

Розглянемо варіанти звернення до елемента arr[1][2]: arr[1][2], *(arr[1]+2), *(*(arr+1)+2), (*(arr+1))[2].

В Сi існує тісний зв'язок між вказівниками і масивами. Будь-який доступ до елемента масиву, здійснюваний операцією індексування, може бути виконаний за допомогою покажчика.

Розглянемо int a[10]. Запис a[i] посилається до i-того елементу. Якщо ра є вказівник (визначений як int * pa;),

то в результаті присвоювання

pa = & a[0];

pa буде вказувати на нульовий елемент масиву а (ра буде містити адресу елемента a[0])

Тепер присвоювання x =*pa; буде копіювати вміст а[0] в х.

Якщо ра вказує на деякий елемент масиву, то ра +1 вказує на наступний елемент. Таким чином, якщо ра вказує на a[0], то (ра +1) є вміст a[1], ра +1 - адреса a[1], * (ра + i) - вміст a[i].

Оскільки ім'я масиву є адресою його початкового елемента, то присвоювання pa = & a[0]; можна також записати в наступному вигляді: pa = a;

Оскільки ра - вказівник, то у виразах його можна використовувати з індексом, тобто запис pa[i] еквівалентний запису *(pa + i). Елемент масиву однаково дозволяється зображати і у вигляді вказівника зі зміщенням, і у вигляді імені масиву з індексом.

Між ім'ям масиву і вказівником, виступаючим в ролі імені масиву, існує одна відмінність. Вказівник - це змінна, тому можна написати pa = a або pa + +. Але ім'я масиву не є змінною, і запис типу a = pa не допускається.

Приклад 1.

 

Результати роботи:

 

 

Пояснимо використання команд

Команда pf = & x означає "взяти адресу числа, що знаходиться в x і записати його в pf.

Наступна команда y = * pf дозволяє записати значення, розташоване за вказаною в pf адресою, в y. Тому в першому рядку результатів зазначеної програми: x = 10.100000 y = 10.100000.

Далі в команді * pf + + відбувається зміна адреси.

Наступна команда y = * pf дозволяє записати значення, розташоване за адресою, вказаною в pf. Ця адреса щойно була збільшена на 1 у попередній команді. Тому у другому рядку результатів програми в y знаходиться вже інше число, а саме нуль.

Наступна команда y = 1 + *pf *y додає до одиниці добуток адреси з pf на вміст y. Як показано в попередньому поясненні, до цього часу в y знаходиться число нуль. Тому в третьому рядку роботи програми маємо саме такі результати.

Приклад 2. Вивести значення масиву звичайним способом і з використанням покажчиків.

# Include <stdio.h>

int a[6] = {10,20,30,40,50,60}; / Оголошення і ініціалізація масиву /

main ()

{

int i, * p;

for (i = 0; i <6; i + +)

printf ("% d", a [i]); / вивід масиву звичайним способом /

for (p = & a [0]; p <= & a [5]; p + +)

printf ("% d", * p) / вивід масиву з використанням покажчика /

for (p = & a [0], i = 0; i <6; i + +)

printf ("% d", p [i]); / ще один варіант з використанням покажчика /

}

Приклад 3. Задано матриця а. Вивести на екран елементи головної діагоналі, першого рядка і значень перших елементів кожного рядка матриці, застосувавши для цього покажчики.

# Include <stdio.h>

int a[3][3] = {{10,20,30}, {40,50,60}, {70,80,90}}; /Оголошення і ініціалізація двовимірного масиву /

int *pa[3] = {a[0], a[1], a[2]}; / Оголошення і ініціалізація покажчика ра на рядки масиву а і присвоєння початкових значень: pa[0] = a[0]; pa[1] = a[1]; pa[2] = a[2] /

int p = a[0]; / оголошення покажчика на нульовий елемент нульової рядка масиву а /

main ()

{Int i;

for (i = 0; i <9; i + = 4)

printf ("% d", * (p + i)); / вивід на екран елементів головної діагоналі /

for (i = 0; i <3; i + +)

printf ("% d", * p [i]); / вивід на екран елементів першого рядка /

for (i = 0; i <3; i + +)

printf ("% d", pa [i]); / вивід на екран перших елементів кожного рядка матриці/

}

Зробимо деякі пояснення для першого оператора циклу. Уявімо матрицю у вигляді одновимірного масиву, записаного по рядках: a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2], a[2][0], a[2][1], a[2][2].


 



Поделиться:


Последнее изменение этой страницы: 2016-07-14; просмотров: 298; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.124.28 (0.008 с.)