Создание консольного приложения
Начинается консольное приложение директивой #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; }