Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС - Методичка по лабам.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
319 Кб
Скачать
☆

1.2.4Визначення типу тексту і перетворення типу кодування тексту

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

Для цього можно використовувати функцію IsTextUnicode:

BOOL IsTextUnicode( CONST VOID* pBuffer, int cb, LPINT lpi );

де:

pBuffer – буфер з символами;

cb - кількість символів в буфері;

lpi - ознаки, по яким визначається тип кодування. Кожна ознака задається одним бітом. На вході зазвичай задають 1 в усіх бітах, тобто число -1. На виході в 1 установлені ті біти, ознаки для яких підтверджені.

Відкрийте допомогу для цієї функції і розгляньте ці ознаки!

Функція повертає TRUE, якщо текст по більшості ознак типу Unicode, FALSE для типу ANSI.

Функція для перетворення ANSI в Unicode MultiByteToWideChar :

int MultiByteToWideChar(

UINT CodePage, // Кодова сторінка, звичайно задається CP_ACP

DWORD dwFlags, // 0

LPCSTR lpMultiByteStr, // Рядок, який перетворюється

int cbMultiByte, // Розмір (в байтах)

LPWSTR lpWideCharStr, // Рядок - результат

int cchWideChar // Розмір в wchar_t символах.

);

Функція повертає кількість символів в рядку-результату.

Функція для перетворення Unicode в ANSI

int WideCharToMultiByte(

UINT CodePage, // Кодова сторінка, звичайно задається CP_ACP

DWORD dwFlags, // 0

LPCWSTR lpWideCharStr, // Рядок, який перетворюється

int cchWideChar, // // Розмір

LPSTR lpMultiByteStr, // Рядок - результат

int cbMultiByte, // // Розмір

LPCSTR lpDefaultChar, // Адреса символу, яким заміняється

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

// відображений. Дорівнює NULL, якщо використовується

// символ за замовчуванням.

LPBOOL lpUsedDefaultChar // Покажчик на прапорець, який вказує на

// те, чи використовувався символ за замовчуванням у

// попередньому параметрі. Може бути NULL.

);

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

1.3Завдання до лабораторної роботи. Порядок виконання

  1. Складіть програму для програмної перевірки типу кодування, заданого за замовчуванням (визначте довжину в байтах типу TCHAR).

  2. Визначте тип кодування по заданих макросах в командному рядку. Для цього визначимо командний рядок для трансляції програми:

Properties→C/C++→Command Line

Усі змінні, які задаються при трансляції, задаються параметром /D. Якщо визначено змінну UNICODE, то використовується режим UNICODE, якщо така змінна не задана, то використовується режим ANSI.

  1. Перемикніть режим завдання символу на протилежний. Для перемикання режиму з UNICODE в режим ANSI використовують:

Properties→General→Character Set→Use Multi-Byte Character Set

Для перемикання з режиму ANSI в режим UNICODE використовують: Properties→General→Character Set→UseUnicode Character Set.

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

(Після трансляції!!!)

  1. Задайте ПІБ членів своєї сім’її в ANSI та виведіть задані значення. Для виведення букв кирилиці необхідно встановити локальні режими. Для цього використовуються файл заголовку і функція:

#include <locale.h>

…

TCHAR * _tsetlocale ( int category, const TCHAR *locale );

де:

category – зазвичай (LC_ALL);

locale – рядок, який визначається мовою, для якої встановлюється:

_T("Russian") – російська мова;

_T("Ukrainian") – українська мова.

Функція повертає 0, якщо функція не може бути виконана.

  1. Переведіть задані рядки в UNICODE за допомогою функції (MultiByteToWideChar).

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

  • функція _tprintf, якщо встановлено локальні режими;

  • функція MessageBox

int MessageBox (0, <Рядок, який виводиться>, <Заголовок вікна>, MB_OK)) ;

  1. Виконайте упорядкування масиву рядків, заданих в UNICODE. Для сортування використовувати універсальну стандартну функцію qsort:

void qsort(

void *base, // Масив, що упорядковуємо

size_t num, // Кількість елементів масиву;

size_t width, // Ширина елементу масиву;

int (__cdecl *compare )(const void *, const void *) );

// Функція для порівняння елементів масиву

  1. Виконайте зворотне перетворення масиву з Unicode в ANSI.

  2. Виведіть отриманий результат

  3. Задано текстовий файл. Незалежно від способу кодування символів в цьому файлі, переставити ці символи в зворотньому порядку. Символи кінця рядка залишити в правильному порядку (це завдання для отримання найвищої оцінки).

1.4Зміст звіту

Звіт повинен вміщувати:

  • повний опис усіх типів і функцій, які використовуються для забезпеченості універсальності кодування;

  • повний опис усіх типів і функцій, які використовуються для виведення інформації в консольному режимі на російській (українській) мові;

  • тексти розробленої програми з коментарями;

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

  • Висновки по роботі

1.5Контрольні запитання і завдання

  1. Навіщо створювати універсальні додатки для роботи з ANSI, UNICODE?

  2. Як забезпечити універсальність об’явлення символу?

  3. Які функції використовуються для введення та виведення універсальних типів даних?

  4. Як встановити локальні характеристики для виведення інформації російською(українською) мовами?

  5. Що треба змінити в програмі для упорядкування масиву ANSI символів?

2СТВОРЕННЯ ТА ВИКОРИСТАННЯ БІБЛІОТЕК

2.1 Мета роботи

Вивчити прийоми та методи створення та використання статичний та динамічних бібліотек

2.2Підготовка до роботи

2.2.1Загальна характеристика статичних бібліотек

Статичні бібліотеки (файл з розширенням lib) компонується разом з додатком, в якому використовується ця бібліотека.

Переваги статичних бібліотек:

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

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

Недоліки статичних бібліотек:

  • бібліотеки залежать від середовища, в якому вони створені. Так бібліотека, яку було створено в середовищі С++ Builder, не можна використовувати в середовищі Visual Studio та навпаки;

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

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