Иллюстрированный самоучитель по C++ Builder

Создание консольного приложения

Начинается консольное приложение директивой #pragma hdrstop, которая запрещает выполнение предварительной компиляции подключаемых файлов. После этой директивы надо вставить директивы #inciude, обеспечивающие подключение необходимых библиотек (например, #include <stdio.h>). Директива #pragma argsused отключает предупреждение компилятора о том, что аргументы, указанные в заголовке функции, не используются.

Следует обратить внимание на то, что консольное приложение разрабатывается в Windows, а выполняется как программа DOS. В DOS и Windows буквы русского алфавита имеют разные коды (в DOS используется кодировка ASCII, а в Windows – ANSI). Это приводит к тому, что консольное приложение вместо сообщений на русском языке выводит "абракадабру".

Проблему вывода сообщений на русском языке консольными приложениями можно решить, разработав функцию перекодировки ANSI-строки в строку ASCII. Если эту функцию назвать rus, то инструкция вывода сообщения может выглядеть, например, так:

printf(rus("Скорость: %3.2f км/час"), v);

В качестве примера консольного приложения в листинге 7.1 приведена программа "Угадай число", которая для вывода сообщений использует функцию RUS. Значение функции rus – строка символов в кодировке ASCII, соответствующая строке, полученной в качестве параметра.

Листинг 7.1. Пример консольного приложения.

#pragma hdrstop
#include <stdio.h>
#include <conio.h> // для доступа к getch()
#include <stdlib.h> // для доступа к srandf), rand()
linclude <time.h> // для доступа к time_t и time 0
char* rus(char* st);
// преобразует ANSI-строку в строку ASCII tpragma argsused
int main(int argc, char* argv[])
(
int comp,
// число, "задуманное" компьютером igrok,
 // вариант игрока n=0; // число попыток
// ГСЧ – генератор случайных чисел
time_t t; // текущее время (для инициализации ГСЧ)
srandf (unsigned)time(&t)); // инициализация ГСЧ
comp = rand() % 10 + 1;
puts(rus("Хп Компьютер \"задумал\" число от 1 до 10."));
puts(rus("Вы должны его угадать за три попытки."));
do
{
printf(" › ");
scanf("%i", Sigrok);
n++; } while (igrok!= comp && n < 3);
if (igrok == comp)
printf(rus("ВЫ ВЫИГРАЛИ!"));
else {
puts(rus("Вы проиграли."));
printf(rus("Компьютер \"задумал\" число %d"), comp); }
printf(rus("\Для завершения нажмите любую клавишу…"));
getch();
 return 0; }
/*Функция rus преобразует ANSI-строку в строку ASCII
 и может использоваться для вывода сообщений
на русском языке в консольных программах.
Пример использования:
printf(rus("Скорость: %3.2f км/час"), v);
printf(rus("У лукоморья дуб зеленый\п")); */
char* rus(char* st) {
unsigned char* p = st;
/* при объявлении символов как char русские буквы
кодируются отрицательными числами */
while (*р)
<
if (*p >= 192) // здесь русская буква
if (*р <= 239) // Л,Б,… Я,а,б,… п
*р – = 64; else // p… я
*р – = 16;
Р++; } return st;
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.