- •Елементи мови с.Основні символи
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Лексеми
- •Коментарі
- •Умовні оператори. Логічні вирази
- •Форми оператора if
- •Оператор вибору switch
- •Перерахування типів
- •Перетворення типів
- •Оператори циклу
- •Оператор while
- •Оператор for
- •Оператор do-while
- •Оператори переходу
- •Cтруктури
- •Об'єднання (суміші)
- •Робота з структурами.
- •Ініціалізація структур
- •Робота з обєднаннями
- •Визначення об'єктів та типів
- •Методи доступу до елементів масивів
- •Покажчики на багатовимірні масиви
- •Операції з вказівниками
- •Робота з покажчиками.
- •Покажчики на структуру
- •Масиви структур
- •Динамічне розміщення масивів
- •Робота з динамічними масивами
- •Робота з непрямою адресацією
- •Робота з покажчиками як параметрами функцій
- •Використання вказівників
- •Операції з вказівниками
- •Використання вказівників в програмі
- •Робота з файлами
- •Відкриття файлу
- •Обробка відкритого файлу
- •Перевірка ознаки кінця файлу
- •Закриття файлу
- •Функції введення-виведення
- •Робота з текстовими файлами
- •Функція форматованого виведення printf ()
- •Основні формати
- •Модифікації форматів
- •Функція форматованого введення scanf ()
- •Робота функції scanf ()
- •Призначеня функцій бібліотеки введення-виведення
- •Макрокоманди
- •Потокові інтерфейси введення-виведення
- •Ближні покажчики (near)
- •Дальні покажчики (far)
- •Покажчики huge
- •Функції для роботи з рядками
- •Динамічні рядки, клас string
- •Визначення поточної робочої директорії
- •Визначення поточного каталогу диска
- •Визначення / встановленн поточного диска
- •Пошук файлу
- •Створення, видалення, зміна директорій
- •Приклад програми для роботи з директоріями
- •Перегляд каталогу диска
- •Параметри структури ffblk
- •Робота з клавіатурою
- •Робота з файлами
- •Послідовний доступ до елементів двійкових файлів
- •Організація довільного доступу до елементів двійкових файлів
- •Робота динамічних структур даних.
- •Функції управління пам'яттю
- •Атрибути файлів.
- •Параметри
- •Динамічні структури даніх
- •Лінійні списки
- •Стек. Загальні поняття.
- •Приклад використання стеку
- •Основні визначення
- •Приклад використання дерев
Параметри структури ffblk
Параметр attrib - це використовуваний в MS-DOS байт атрибуту файлу, який вживається при виборі відповідних для пошуку файлів. Параметр attrib може бути однією з наступних визначених у файлі dos.h констант:
FA_NORMAL = 0x00 - Звичайний файл без атрибутів
FA_RDONLY = 0x01 - Атрибут "тільки читання".
FA_HIDDEN = 0x02 - Прихований файл.
FA_SYSTEM = 0x04 - Системний файл.
FA_LABEL = 0x08 - Мітка тому.
FA_DIREC = 0x10 - Каталог.
FA_ARCH = 0x20 - Архів.
Відзначимо, що ff_ftime і ff_fdate містять бітові поля для визначення дати та часу. Ці структури підтримуються DOS. Обидві 16-бітові структури діляться на 3 поля:
ff_ftime:
біти 0-4 Секунди, поділені на 2. (Тобто 10 відповідає 20 секундам).
біти5-10 хвилини
біти 11-15 години
ff_fdate:
біти 0-4 день
біти 5-8 місяць
біти 9-15 рік з 1980 (тобто 9 відповідає 1989)
При успішному завершенні, тобто при успішному значення пошуку файлу, відповідного параметру pathname, функція findfirst повертає значення 0. Якщо підходящих файлів більше не існує, або в імені файлу допущена помилка, функція повертають значення -1 і глобальна змінна errno отримує одне з наступних значень:
ENOENT - Маршрут доступу або ім'я файлу не знайдені,
а змінної doserrno присвоюється одне з наступних значень:
ENOENT - Маршрут доступу або ім'я файлу не знайдені.
ENMFILE - Немає більше файлів.
Функція findnext використовується для вибірки послідовності файлів, відповідних параметру pathname, що задається функцією findfirst.
ffblk - це той же самий блок, який заповнюється при виклику функції findfirst. Даний блок містить всю необхідну інформацію для продовження пошуку.
При кожному виклику функції findnext буде повертатися одне ім'я файлу до тих пір, поки файли, відповідні параметру, pathname не закінчаться.
При успішному завершенні, тобто при успішному значення пошуку файлу, відповідного параметру pathname, функція findnext повертає значення 0. Якщо підходящих файлів більше не існує, або в імені файлу допущена помилка, функція повертає значення -1 і глобальна змінна errno отримує одне з наступних значень:
ENOENT - Маршрут доступу або ім'я файлу не знайдені,. а змінної doserrno присвоюється одне з наступних значень:
ENOENT - Маршрут доступу або ім'я файлу не знайдені.
ENMFILE - Немає більше файлів.
Приклад:
# Include <stdio.h>
# Include <dir.h>
int main (void)
{
struct ffblk ffblk;
int done;
printf ("Лістинг каталогу *. * \ n");
done = findfirst (**. **, & ffblk, 0);
while (! done) {
printf ("% s \ n", ffblk.ff_name);
done = findnext (& ffblk);
}
return 0;}
Питання для контролю:
1.Як зробити перегляд каталогу диску?
2. Які параметри має структура ffblk?
3. Що визначає параметр ff_ftime?
Література:
1. Т.Сван, “ Освоение BORLAND C++ 4.5 Практический курс”, Киев, “Диалектика”, 1996 г.- с. 272-274
Урок №57
(згідно робочої навчальної програми)
Тема:Робота з системними областями
Питання:
1.Робота з клавіатурою
Робота з клавіатурою
Для роботи З клавіатурою використовуються бібліотечні функції Keypad_Init, Keypad_Read і Keypad_Released.
Опис цих функцій:
Опис функції Keypad_Init
Прототип - void Keypad_Init (unsigned * port)
Повертає значення - Немає
Опис - ініціалізує порт для роботи з клавіатурою. Повинна викликатися перед використанням інших функцій даної бібліотеки
Вимоги - немає
Приклад - Keypad_Init (& PORTB)
Опис функції Keypad_Read
Прототип - unsigned short Keypad_Read (void)
Повертає значення - 1 -16 в залежності від натиснутої клавіші і 0, якщо немає натиснутих клавіш.
Опис - перевіряє натиснення клавіші. Функція повертає 1 -16 в залежності від натиснутої клавіші і 0, якщо немає натиснутих клавіш
Вимоги - порт повинен бути попередньо ініціалізованим першим за допомогою функції Keypad_Init.
Приклад - kp = Keypad_Read ()
Опис функції Keypad_Released
Прототіп - unsigned short Keypad_Released (void)
Повертає значення - Повертане значення 1 - 16 залежно від клавіші
Опис - виклик функції Keypad_Released - блокуючий: функція чекає, поки клавіша не буде натиснута і відпущена. При відпусканні функція повертає код від 1 до 16 в залежності від клавіші
Вимоги - порт повинен бути попередньо ініціалізованим першим за допомогою функції Keypad_Init
Приклад - kp = Keypad_Released ()
Наступний програмний код може бути використаний для перевірки клавіатури. Він підтримує клавіатури з матричною організацією від 1 до 4 рядків і від 1 до 4 стовпців. Код, повернений бібліотечними функціями, перекодовується в ASCII-коди [0 .. 9, A.. F]. Додатково використовується однобайтовий лічильник для виведення загальної кількості натискань на клавіші у другому рядку РКІ.
unsigned short kp, cnt;
char txt [5];
void main () {
cnt = 0;
Keypad_Init (& PORTC);
Lcd_Init (& PORTB); / / Ініціалізація LCD на PORTC
Lcd_Cmd (LCD_CLEAR); / / Очищення дисплея
Lcd_Cmd (LCD_CURSOR_OFF); / / Відключення курсора
Lcd_Out (1, 1, "Key:");
Lcd_Out (2, 1, "Times:");
do {
kp = 0; / / Очікування натискання клавіші
do
/ / Закоментувати невживану функцію опитування клавіатури kp = Keypad_Released ();
/ / Kp = Keypad_Read ();
while (! kp);
cnt + +; / / підготувати значення для виведення
if (kp> 10)
kp + = 54;
else
kp + = 47;
/ / Вивід його на LCD
Lcd_Chr (1, 10, kp);
WordToStr (cnt, txt);
Lcd_Out (2, 10, txt);
}
while (1);
}
/ / Кінець прорамми
Приклад програми, яка блокує клавіатуру при натиснені клавіші "3" при натиснені комбінації Left Shift+Right Ctr+F3. При повторному натиснені клавіатура розблокується.
#include <dos.h>
void interrupt (*old9)();
void interrupt new();
void *readvect(int in);
void writevect(int in,void *h);
unsigned char F3_code=61;
unsigned char key3_code=4;
char f=0;
union regs rr;
struct sregs sr;
void main()
{
char string[80];
textbackground(0);
clrscr;
textattr(0x0a);
cprintf("________________________________________");
cprintf(" Низькорівневе програмування ");
cprintf("________________________________________");
cprintf("________________________________________");
cprintf(" Керування клавіатурою ");
cprintf("________________________________________");
old9=readvect(9);
writevect(9,new9);
textattr(0x0c);
cprintf("\n\n\r\"горяча\"комбінація:");
textattr(0x0a);
cprintf("Left Shift,Right Ctr,F3\n\r");
textattr(0x0b);
cprintf("Клавіша,яка блокується");
textattr(0x0f);
cprintf("3");
textattr(0x07);
cprintf("\r\nВвести рядок символів>");
scanf("%s",string);
writevect(9,old9);
}
void *readvect(int in)
{
rr.a.ah=0x35;
rr.a.al=in;
intdosx(&rr,&rr,&sr);
return(MK_FP(sr.es,rr.x.bx));
}
void writevect(int in,void *h)
{
rr.h.ah=0x25;
rr.h.al=in;
sr.ds=FP_SEG(h);
rr.x.dx=FP_OFF(h);
indosx(&rr,&rr,&sr);
}
void interrupt new9()
{
unsigned char c,x,y;
unsigned char byte17,byte18;
unsigned char mask=0x02;
unsigned char mask17=0x04;
unsigned char mask18=0x01;
byte17=peekb(0x40,0x17);
byte18=peekb(0x40,0x18);
if((inportb(0x60)==F3_code)&&(byte17&mask)&&
(byte17&mask17)&&(!(byte18&mask18)))
{
cputs("\7");
x=wherex();
y=wherey();
gotoxy(55,3);
textattr(0x1e);
if(f==0)
{
f=1;
cprintf("Клавіша \"3\" заблокована");
}
else
{
f=0;
cprintf("Клавіша \"3\" разблокована");
}
gotoxy(x,y);
textattr(0x07);
(*old9)();
}
if((f==1)&&(inportb(0x60)==key3_code))
{
c=inportb(0x61);
outportb(0x61,c|0x80);
outportb(0x61,c);
outportb(0x20,0x20);
}
else
(*old9)();
}
Питання для контролю:
1.Які є функції для роботи з клавіатурою?
2. Що робить функція Keypad_Init?
3. Що робить функція Keypad_Released?
Література:
1. Павловская Т.А., Щупак Ю.А. С/С++. Практикум. –СПб.: Питер, 2002. –204 с.- с. 274-279
Урок №61
(згідно робочої навчальної програми)
Тема:Нетрадиційні методи обробки файлів
Питання:
1.Робота з файлами
2.Послідовний доступ до елементів двійкових файлів
3.Організація довільного доступу до елементів двійкових файлів.
