Хотя эта книга посвящена программированию
Хотя эта книга посвящена программированию в Windows, нельзя обойти вниманием так называемые консольные приложения. Консольное приложение — это приложение, которое для взаимодействия с пользователем не использует графический интерфейс. Устройством, обеспечивающим взаимодействие с пользователем, является консоль — клавиатура и монитор, работающий в режиме отображения символьной информации (буквы, цифры и специальные знаки).
В операционной системе консольное приложение работает в окне командной строки.
Консольные приложения удобны как иллюстрации при рассмотрении общих вопросов программирования, когда надо сосредоточиться на сути проблемы, а также как небольшие утилиты "для внутреннего потребления".
Ввод/вывод
Перед тем как приступить к созданию консольного приложения, рассмотрим функции, обеспечивающие вывод на экран и ввод с клавиатуры.
Наиболее универсальными функциями, обеспечивающими вывод и ввод информации в
консольных приложениях, являются функции printf и scanf.
Для того чтобы программа могла их использовать, в начало программы надо включить директиву
#include <stdio.h>.
Функция printf
В общем виде инструкция вызова функции printf выглядит так:
printf(УправляющаяСтрока, СпмсокПеременных)
Параметр УправляющаяСтрока задает способ отображения (формат) значений переменных, имена которых задает параметр список переменных. Помимо спецификаторов формата, параметр УправляющаяСтрока может содержать символы и управляющие последовательности.
Параметр Списокпеременных не является обязательным и представляет собой последовательность разделенных запятыми имен переменных, значения которых должны быть выведены.
Спецификатор формата задает вид вывода. Например, значение переменной типа float можно вывести как десятичное число с точкой (%f) или как число в формате с плавающей точкой (%е). В спецификаторе формата можно задать размер поля вывода (количество позиций экрана), а для формата f — размер поля для вывода целой и дробной частей числа. Если во время работы программы окажется, что выводимое значение не умещается в поле, указанном в спецификации, то для его вывода будет использовано столько позиций, сколько необходимо.
В табл. 7.1 приведены наиболее часто используемые спецификаторы формата. Необязательный параметр л, вместо которого надо подставить десятичное число, задает размер поля вывода; параметр m — размер поля для вывода цифр дробной части.
Таблица 7.1. Спецификаторы формата
Спецификатор |
Тип переменной |
Форма вывода |
%nd |
int |
Десятичное со знаком |
%n.mf |
float или double |
Дробное с десятичной точкой |
%ne |
float или double |
Дробное в виде числа с плавающей точкой |
%nc |
char |
Символ |
%ns |
  | Строка |
При выводе одной инструкцией значений нескольких переменных значение первой переменной выводится в соответствии с первым по порядку спецификатором формата из управляющей строки, второй со вторым и т. д.
Следует обратить внимание на то, что компилятор не проверяет, соответствует ли количество переменных, значения которых должны быть выведены, количеству спецификаторов в управляющей строке, а также соответствие типа переменной — спецификатору. Например, если переменная
х объявлена как float, то в инструкции printf ("x=%i", x) компилятор не обнаружит ошибку.
Если надо вывести символ, который не может быть помещен в строку вывода обычным образом путем набора на клавиатуре, — например, символ новой строки или двойная кавычка, которая в языке C/C++ используется для ограничения в тексте программы строк, — то вместо этого символа применяется специальная последовательность символов. Специальная (управляющая) последовательность начинается символом обратной наклонной черты. Во время работы программы символы специальной последовательности на экран не выводятся, а выполняется действие, обозначаемое этой последовательностью. В табл. 7.2 приведены наиболее часто используемые управляющие последовательности.
Таблица 7.2. Управляющие последовательности
Последовательность |
Действие |
\n |
Переводит курсор в начало следующей строки |
\r |
Переводит курсор на следующую строку текущей колонки |
\t |
Переводит курсор в следующую позицию табуляции |
\" |
Выводит двойную кавычку |
\\ |
Выводит обратную наклонную черту |
\0xШестнадцатеричноеЧисло |
Выводит символ, код которого указан |
Для вывода на экран сообщений часто используют функцию puts, которая, в отличие от
printf, после вывода автоматически переводит курсор в начало следующей строки. У функции
puts один параметр — сообщение. В простейшем случае в качестве параметра функции
puts используется строковая константа. Например, функция
puts("У лукоморья дуб зеленый,ХпЗлатая цепь на дубе том.")
выводит две строчки стихотворения, каждую на отдельной строке, и переводит курсор в начало следующей строки.
Чтобы вывести цветной текст, надо использовать функции cprintf и cputs. Они ничем не отличаются от рассмотренных ранее printf и puts, за исключением того, что цвет символов, выводимых этими функциями, можно задать, вызвав функцию textcolor, а цвет фона — textbackground.
В общем виде инструкции вызова указанных выше функций выглядят так:
textcolor(Цвет) ;
textbackground(Цвет) ;
Параметр цвет — параметр целого типа, в качестве которого обычно используют одну из именованных констант (табл. 7.3).
Таблица 7.3. Константы, в качестве параметра цвет
Цвет |
Константа |
Значение константы |
Черный |
BLACK |
0 |
Синий |
BLUE |
1 |
Зеленый |
GREEN |
2 |
Бирюзовый |
CYAN |
3 |
Красный |
RED |
4 |
Сиреневый |
MAGENTA |
5 |
Коричневый |
BROWN |
6 |
Светло-серый |
LIGHTGRAY |
7 |
Серый |
DARKGRAY |
8 |
Голубой |
LIGHTBLUE |
9 |
Светло-зеленый |
LIGHTGREEN |
10 |
Светло-бирюзовый |
LIGHTCYAN |
11 |
Алый |
LIGHTRED |
12 |
Светло-сиреневый |
LIGHTMAGENTA |
13 |
Желтый |
YELLOW |
14 |
Белый (яркий) |
WHITE |
15 |
Следует обратить внимание на то, что в качестве параметра функции textcolor можно использовать символьные константы со значением от О до 15, а в качестве параметра функции
textbackground — только от 0 до 7.
При выводе на экран весьма полезна функция cirscr, которая очищает экран, закрашивая его цветом фона, установленным функцией
textbackground.
Функции textcolor, textbackground, cirscr и приведенные выше константы объявлены в файле
conio.h, поэтому, чтобы они были доступны, в текст
Программы нужно включить директиву
#include <conio.h>.
Функция scanf
Наиболее универсальной функцией, которая позволяет ввести данные с клавиатуры, является функция
scanf. В общем виде инструкция вызова функции scanf для ввода значения одной переменной выглядит так:
scanf(Формат,& Переменная);
где:
Формат — это строка, которая содержит спецификатор формата, определяющий то, как должна интерпретироваться строка, введенная с клавиатуры. Наиболее часто используемыми спецификаторами являются: %1 — для ввода целых, %f — для ввода дробных, %s — для ввода строк; &переменная — это адрес переменной, значение которой вводится. Например, инструкция
scanf("%i", Skol);
вводит целое число, а инструкция
scanf("%i%f", &kol, Scena);
вводит целое и дробное.
При вызове функции scanf происходит следующее. Программа приостанавливает работу и ждет, пока пользователь наберет на клавиатуре строку символов и нажмет клавишу <Enter>. До нажатия <Enter> можно редактировать вводимую строку (например, нажав клавишу <Back Space> можно удалить последний введенный символ). После нажатия клавиши <Enter> функция scanf преобразует введенную строку в данные и записывает их в переменную, адрес которой указан. Преобразование выполняется в соответствии со спецификатором формата. Например, в результате выполнения инструкции scanf ("%f", scena) и набора на клавиатуре строки 25.99 значение переменной сеnа будет равно 25.99.
Следует обратить внимание, что при использовании функции scanf наиболее частой ошибкой, причем не обнаруживаемой компилятором, является отсутствие символа & перед именем переменной.
Если введенная пользователем строка не соответствует типу ожидаемых данных — например, программа ждет ввода целого числа, а пользователь ввел дробное, — то функция scanf обрабатывает только ту часть введенной строки, которая может быть преобразована в требуемые данные. Например, в программе для ввода данных о стоимости покупки используется инструкция scanf("%i%f", &kol, scena), которая предполагает, что пользователь введет в одной строке сначала количество предметов, а затем цену предмета. Если во время работы программы вместо строки 3 24.99 (три предмета по 24.99) ввести строку 24.99 3, то значение переменной koi будет равно 24, а переменной сеnа — 99.
Создание консольного приложения
Консольное приложение создается следующим образом. Сначала нужно из меню File выбрать команду
New | Other Application и на вкладке New появившегося диалогового окна
New Items щелкнуть на значке Console Wizard
(рис. 7.1). В результате этих действий на экране появится окно Console Wizard (рис. 7.2). В этом окне можно выбрать язык программирования и указать, будет ли использоваться та или иная библиотека. После того как будут заданы параметры создаваемого консольного приложения, надо щелкнуть на кнопке
ОК. В результате C++ Builder создаст проект консольного .приложения и на экране появится окно редактора кода, в котором находится шаблон консольного приложения — функция
main (рис. 7.3).
Рис. 7.1. Чтобы приступить к созданию консольного приложения, надо щелкнуть на значке Console Wizard
Рис. 7.2. В окне Console Wizard надо задать характеристики консольного приложение
Начинается консольное приложение директивой #pragma hdrstop, которая запрещает выполнение предварительной компиляции подключаемых файлов. После этой директивы надо вставить директивы
#inciude, обеспечивающие подключение необходимых библиотек (например, #include <stdio.h>). Директива
#pragma argsused отключает предупреждение компилятора о том, что аргументы, указанные в заголовке функции, не используются.
Рис. 7.3. Шаблон консольного приложения
Следует обратить внимание на то, что консольное приложение разрабатывается в 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 О
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( гиз("\Для завершения нажмите любую клавишу..."));
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;
}
Компиляция консольного приложения выполняется обычным образом, т. е. выбором из меню Project команды Compile.
После успешной компиляции программа может быть запущена выбором из меню Run команды Run. При запуске консольного приложения на экране появляется стандартное окно командной строки. На рис. 7.4 приведен вид окна командной строки, в котором работает консольное приложение, созданное в C++ Builder.
Процесс сохранения проекта консольного приложения стандартный. В результате выбора из меню File команды Save Project на экране сначала появляется окно Save Project, в котором нужно ввести имя проекта, а затем — окно Save Utit, в котором надо задать имя модуля.
Получить доступ к модулю консольного приложения (тексту программы) для того, чтобы внести изменения в программу, несколько сложнее. Сначала, выбрав в меню File команду Open Project, нужно открыть файл проекта. Затем надо открыть окно Project Manager (команда View | Project Manager), раскрыть список файлов, выбрать срр-файл и из контекстного меню выбрать команду Open (или сделать двойной щелчок на имени срр-файла) (рис. 7.5).
Рис. 7.4. Окно командной строки, в котором работает консольное приложение
Рис. 7.5. Чтобы внести изменения в программу, надо в окне Project Manager выбрать срр-файл и из контекстного меню выбрать команду Open