- •Методичні вказівки
- •«Системне програмування»
- •5.05010201«Обслуговування комп’ютерних систем і мереж»
- •Рецензія
- •Тема 3. Мова програмування Assembler ……………………………..……..135
- •1.1. Історія розвитку мов системного програмування Питання для опрацювання
- •Методичні рекомендації
- •1. Класифікація мов програмування
- •2. Розвиток мов системного програмування
- •Студент повинен
- •Питання для самоконтролю
- •Історія виникнення мови програмування с
- •2. Сфери застосування мови програмування с
- •1. Двійкова, вісімкова та шістнадцяткова системи числення.
- •2. Формати представлення чисел у різних системах числення.
- •3. Стандарти представлення чисел зі знаком.
- •Формати з плаваючою комою
- •Векторні формати
- •Приклади
- •Студент повинен
- •Питання для самоконтролю
- •Література
- •Питання для опрацювання
- •Методичні рекомендації
- •Приклад:
- •2. Керуючі послідовності
- •1. Види логічних операцій, які виконуються в комп’ютері.
- •За структурою
- •За типом запису даних
- •За архітектурними особливостями
- •За формою подання даних
- •Залежно від часу виконання операцій
- •Залежно від реалізації мікроалгоритму
- •Пристрій управління
- •Операційний пристрій
- •Регістри
- •2. Алгоритми виконання логічних операцій.
- •Побітові логічні операції
- •Бітові зсуви
- •Бітові операції як основа цифрової техніки[ред. • ред. Код]
- •Студент повинен
- •Питання для самоконтролю
- •Література
- •Питання для опрацювання
- •Методичні рекомендації
- •Студент повинен
- •Питання для самоконтролю
- •Література
- •Питання для опрацювання
- •Методичні рекомендації
- •Порядок використання вбудованих функцій під час написання програм.
- •2. Порядок практичного використання багатовимірних масивів під час створення програм.
- •Студент повинен
- •1. Порядок задання і створення масивів структур.
- •2. Порядок практичного використання масивів структур під час створення програм.
- •1. Створення динамічних масивів за допомогою вказівників.
- •2. Передача аргументів процедур та функцій з використанням вказівників.
- •3. Використання масивів вказівників.
- •Студент повинен
- •Питання для самоконтролю
- •1. Головні означення та властивості теорії графів.
- •Зображення графів на площині
- •1. Порядок переходу у графічний режим виводу інформації.
- •2. Функції для побудов геометричних фігур.
- •1. Базові поняття об’єктно‑орієнтованого програмування (ооп).
- •2. Успадкування та поліморфізм.
- •Практичні прийоми програмування з використанням об’єктів.
- •Студент повинен
- •Питання для самоконтролю
- •Література
- •Тема 3. Мова програмування Assembler
- •3.1. Спеціалізоване використання регістрів процесора Intel 8086 Питання для опрацювання
- •Методичні рекомендації
- •1. Спеціалізоване використання регістрів даних.
- •2. Спеціалізоване використання регістрів-вказівників.
- •3.2. Способи адресації пам’яті у процесорах Intel 8086
- •1. Регістрова адресація.
- •2. Безпосередня адресація.
- •3. Пряма адресація.
- •4. Непряма адресація та її різновиди.
- •Питання для самоконтролю
- •1. Особливості роботи з відеорежимами.
- •2. Порядок задання кольору для виведення даних.
- •1. Функції для керування роботою послідовного порту
- •2.Функції для керування роботою паралельного порту
2. Порядок практичного використання масивів структур під час створення програм.
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 100
int getword(char *, int);
int binsearch(char *, struct key *, int);
/* відлік ключових слів C */
main()
{
int n;
char word[MAXWORD];
while (getword(word, MAXWORD) != EOF)
if (isalpha(word[0]))
if ((n = binsearch(word, keytab, NKEYS)) >= 0)
keytab[n].count++;
for (n = 0; n < NKEYS; n++)
if (keytab[n].count > 0)
printf("%4d %s\n",
keytab[n].count, keytab[n].word);
return 0;
}
/* binsearch: знаходить слово word у tab[0]...tab[n-1] */
int binsearch(char *word, struct key tab[], int n)
{
int cond;
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high) {
mid = (low+high) / 2;
if ((cond = strcmp(word, tab[mid].word)) < 0)
high = mid - 1;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return -1;
}
Ми покажемо функцію getword за якусь мить; поки-що досить знати, що кожний її виклик знаходить нове слово, яке копійовано в масив, вказаний як її перший аргумент. Кількість NKEYSє числом ключових слів у keytab. Хоча ми могли би самі порахувати це число, набагато легше і безпечніше залишити це машині, особливо якщо список може змінитися пізніше. Однією з можливостей буде завершити список ініціалізаторів нульовим покажчиком, після чого ітерувати через keytab до досягнення кінця.
Але це вкрай потрібно, оскільки розмір масиву повністю визначається під час компіляції. Розмір масиву складає розмір одного елемента помножено на кількість елементів, тож кількість складатиме просто
розмір keytab / розмір struct key
C забезпечує унарним компіляційним оператором під назвою sizeof, який можна застосувати для визначення розміру будь-якого об'єкту. Вирази
sizeof об'єкт
і
sizeof (назва типу)
повертають ціле число, рівне розмірові в байтах вказаного об'єкту або типу. (Точніше, sizeofповертає беззнакове ціле значення, чий тип size_t визначено в файлі заголувку <stddef.h>.) Об'єктом може служити як змінна, так і масив або структура. Назва типу також може бути однією з назв основних типів, таких як int або doble, або ж назвою похідного типу, як структура або покажчик. В нашому випадку, кількість ключових слів дорівнюватиме розмірові масиву, поділено на розмір одного елемента. Це обчислення використано в твердженні #defineдля того, щоб встановити значення NKEYS:
#define NKEYS (sizeof keytab / sizeof(struct key))
Іншим шляхом буде ділення масиву на розмір певного елемента:
#define NKEYS (sizeof keytab / sizeof(keytab[0]))
Останнє має перевагу в тому, що його не потрібно міняти, якщо тип змінено. sizeof неможливо використати в рядку #if, оскільки препроцесор не розуміє назв типів. Зате вираз у #define не обчислюється препроцесором, тож цей код чинний.
Тепер, щодо функції getword. Ми написали більш узагальнену getword, ніж ця програма потребує, але вона не є складною. getword добуває наступне «слово» зі вводу, де словом може служити або ланцюжок з літер і цифр, що починається з літери, або один символ, що не являється пробілом. Функція повертає перший знак слова, або EOF у випадку кінця файла, або самий знак, якщо він не є частиною алфавіта.
/* getword: одержує наступне слово зі вводу */
int getword(char *word, int lim)
{
int c, getch(void);
void ungetch(int);
char *w = word;
while (isspace(c = getch()))
;
if (c != EOF)
*w++ = c;
if (!isalpha(c)) {
*w = '\0';
return c;
}
for ( ; --lim > 0; w++)
if (!isalnum(*w = getch())) {
ungetch(*w);
break;
}
*w = '\0';
return word[0];
}
getword використовує getch і ungetch. Коли набір буквенно-цифрових лексем закінчився, це означає, що getword зайшла на один символ задалеко. Викликungetch проштовхує символ назад на ввід для наступного виклику функції. getword також використовує isspace, для ігнорування пробілів, isalpha, щоб розпізнати літери, і isalnumдля розрізнення літер і цифр; усі зі стандартного файла заголовка <ctype.h>.
Студент повинен
знати:
Особливості роботи з масивами.
Особливості роботи із структурами.
Взаємозв’язок між масивами і структурами.
Особливості роботи з масивами структур.
вміти:
Використовувати масиви структур під час складання власних програм.
Питання для самоконтролю
Назвіть особливості роботи з масивами.
Назвіть особливості роботи із структурами.
В чому полягає взаємозв’язок між масивами і структурами?
Назвіть особливості роботи з масивами структур.
Література
[4] c. 133-137
1.10. Використання динамічної пам’яті у мові С++
Питання для опрацювання
1. Створення динамічних масивів за допомогою вказівників.
2. Передача аргументів процедур та функцій з використаннм вказівників.
3. Використання масивів вказівників.
Методичні рекомендації
Під час опрацювання даної теми студенти повинні вивчити порядок роботи із динамічною пам’яттю у С++, а також порядок використання динамічних структур даних під час складання програм.
