Что такое консольное приложение в c

Обновлено: 06.07.2024

Каждый второй опытный пользователь, услышав от новичка фразу "А что такое консольная программа?", начинает скрежетать зубами. Поэтому если вы - новичок, то лучше прочитать эту статью, чтобы не напороться на этого второго из двух опытных, а если вы уже опытный пользователь, то имеет смысл подсунуть заметку новичку, чтобы тот нашёл ответ на свой вопрос.

Итак, что же скрывается за этим страшным словосочетанием - консольное приложение? Приложение, как вы знаете, это в мире Windows не то, что к чему-то прикладывается, а компьютерная программа. Word, Excel, пасьянс "Косынка" и Internet Explorer - это всё приложения. Приложения бывают разными. Не только в том смысле, что Word отличается от "Блокнота", но и по принципу организации своего пользовательского интерфейса. Интерфейс - это внешний вид программы, и в Windows он бывает двух типов. Первый - это графический, второй - текстовый. Графический интерфейс система подсовывает вам под нос ежедневно. Все программы, имеющие красивые разноцветные окна, имеют и графический интерфейс. Даже Word и "Блокнот", хоть и работают с текстом, но интерфейс имеют графический. Где же тогда в наши дни можно увидеть программу, работающую в режиме текстового интерфейса?

Дело в том, что ещё не так давно, около двадцати лет назад, мощности компьютеров, стоящих у пользователей дома и на работе, не хватало на отображение даже такой несложной графики, как окна (что и говорить о трёхмерных видеоиграх!). Поэтому компьютеру и пользователям приходилось общаться с помощью текста. Пользователь вводил специальные команды - например, команда dir в первой из систем производства Microsoft, DOS, позволяла просмотреть список файлов и папок в определённой директории, а команда ver показывала версию операционной системы, с которой работал пользователь. Программы, которые запускал пользователь, тоже, естественно, работали в текстовом режиме.

Командная строка, как вы видите, сохранилась в Windows до сих пор. Команды, которые можно выполнить из неё, подробно описаны в справке Windows. А приложения, которые выполняются в текстовом режиме, теперь называются консольными.

Почему же командная строка продолжает жить, несмотря на свой почтенный возраст? Во-первых, есть множество программ, которым не нужен графический интерфейс - например, программы по взлому паролей, которые просто подбирают комбинации символов, пока то, что закрыто паролем, не откроется. Кроме того, командная строка приходит на помощь тем пользователям, которые выучили назубок её команды и быстро набирают с клавиатуры, - для них она гораздо более быстрый способ работать с компьютером, чем графический интерфейс.

Консольных программ масса, и они используются часто для того, чтобы упростить рутинные действия пользователя. Дело в том, что с ними можно обращаться точно так же, как и с обычными командами. А те, в свою очередь, можно записать в специальный текстовый файл с расширением BAT или CMD (такой файл называется командным), и их можно потом выполнить все залпом как обычную программу - достаточно в "Проводнике" дважды кликнуть по этому файлу мышью.

Создание проекта Visual Studio


Для создания нового консольного приложения запускаем Microsoft Visual Studio 2010 Express и переходим в меню Файл->Создать->Проект

В появившемся окне выбираем Консольное приложение Win32 и задаем имя проекта и нажимаем кнопку OK.

В появившемся окне нажимаем кнопку Далее.

В следующем окне отмечаем галочку Дополнительные параметры: Пустой проект и нажимаем кнопку Далее.

В левой части появившегося окна отображается Обозреватель решений. Для добавления нового файла программы в проект выбираем по правой кнопке мыши на папке Файлы исходного кода меню Добавить->Создать элемент.

Создание элемента проекта


В появившемся окне выбираем Файл C++ (.cpp), задаем имя файла и нажимаем кнопку Добавить.

Пример программы


Для компиляции программы выбираем меню Отладка->Построить решение.

Построение решения


В случае успешного построения в нижней части окна отображается Построение: успешно 1.

Построение успешно


Для запуска приложения выбираем меню Отладка->Начать отладку.


Результат выполнения программы:

Свойства проекта

Для корректного отображения русских символов в левом верхнем углу консоли по нажатию правой кнопки мыши выбираем меню Свойства.

В появившемся окне выбрать шрифт, поддерживающий русскую кодировку для кодовой страницы 1251, например Lucida Console.


В результате получаем читаемый русский шрифт.

При желании можно изменить другие параметры окна консоли.

Освоить работу с консольными приложениями и с параметрами программы.

Консольные приложения

На сегодняшний день о программировании на Lazarus существует очень мало книг на русском языке, и все они описывают работу в основном, с консольными приложениями, хотя особой надобности в консолях сейчас нет. Но и совсем обойти эту тему нельзя. Что же такое консольное приложение ?

Консольным приложением называется программа , которая не имеет графического интерфейса - окон, и которая работает в текстовом режиме в черно-белой консоли. Команды в такой программе приходиться вводить с клавиатуры, результаты работы консольные приложения также выводят на экран в текстовом режиме.

Если вы пользуетесь операционной системой Windows , то нажмите на "Пуск" и выберите команду "Выполнить". В открывшемся окне наберите

и нажмите <Enter>. Откроется командная консоль , в которой команды нужно вводить в текстовом режиме:

Консоль cmd.exe

Собственно, вы видите окно предка Windows - операционной системы MS-DOS . Именно так выглядел экран с загруженной ОС MS-DOS , и управлять ею приходилось, вручную набивая всевозможные команды. Это уже позже корпорация Microsoft навесила на ядро MS-DOS всевозможные драйверы и утилиты, снабдила его графическим оконным интерфейсом, и появилась сначала полуграфическая ОС Windows 3.10 (русский вариант был 3.11 версии), а затем и целиком графическая Windows 95 . Но к консольному ядру системы можно обращаться и в современных ОС, в Windows для этого используется программа cmd.exe, а в ОС Linux - терминал .

Все языки высокого уровня позволяют делать и консольные приложения, другое дело - зачем? Подавляющее большинство современных программ имеет графический интерфейс , который мы с вами создавали с самой первой лекции. А консольные приложения делаются в основном, системными программистами. Несмотря на то, что Object Pascal обладает для этого всеми необходимыми инструментами, системщики обычно пользуются такими языками, как Ассемблер , C, реже - C++. Но все же знать, как создаются консольные приложения нужно, поэтому данную лекцию мы посвящаем им.

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

Создать консольное приложение можно разными способами, но проще всего так. Откройте Lazarus. Командой "Проект -> Закрыть проект" закройте текущий проект, автоматически появится окно Мастера создания проекта. В нем нажмем кнопку "Новый проект". Появится окно создания проекта, в котором можно выбрать "Программа" или "Консольное приложение". Если мы выберем "Программа", то будет создан модуль с минимальным кодом. Если же мы выберем "Консольное приложение", то кода будет больше, так как при этом создается программа с новым классом, производным от TCustomApplication . TCustomApplication обеспечивает хорошую основу и делает программирование утилит командной строки довольно простым. Например, проверку опций командной строки, написание справки, проверку переменных окружения и обработку исключений. Все программы LCL автоматически это используют.

Но нам не нужно использовать возможности класса TCustomApplication , мы делаем простую консольную программу, поэтому в окне создания проекта мы выбираем "Программа". Сформируется проект, а в Редакторе исходного кода будет минимум текста:

Обратите внимание, если нам нужно подключить к программе какие то модули, то делать это нужно до комментария

В этом случае мы ставим запятую после указанного модуля Classes и добавляем свои модули. Завершающая точка с запятой стоит после комментария, нам её ставить не нужно.

Свой код мы будем писать между скобками

А если нам потребуется указать глобальные константы , переменные или сделать объявления процедур и функций, то все это делается до begin .

Для примера мы создадим простое приложение , а по ходу дела, познакомимся с инструментами ввода-вывода информации в консольных приложениях.

WRITE и WRITELN

Процедура Write предназначена для вывода информации на экран. Она имеет следующий синтаксис :

Действует процедура следующим образом. В скобках мы можем указать какой-то текст, вывести содержимое переменных. Например:

После вывода информации на экран курсор остается на той же строчке, в позиции, где он оказался после вывода последнего символа.

Процедура Writeln действует точно также, но после вывода последнего символа курсор переходит на начало следующей строки.

Для ознакомления с процедурами создайте новый проект "Программа". Модуль можно не переименовывать, просто сохраните его в папку 21-01. Полный текст модуля следующий:

Обратите внимание: раздел переменных var мы указали до служебного слова begin , то есть, переменные a и b в пределах модуля являются глобальными. Далее мы присвоили переменным значения, затем вывели на экран приветствие, а потом содержимое переменных. На процедуру readln() пока не обращайте внимания, она нужна только, чтобы программа не закрылась сразу же после вывода текста, а была на экране, пока мы не нажмем <Enter>. Сохраните проект и запустите его на выполнение. И сразу же мы видим недостаток: вместо русских букв выходит нечто, что в Интернете называют "кракозябры":

Неправильный вывод кириллицы в консольной программе


Рис. 21.2. Неправильный вывод кириллицы в консольной программе

В "Символы и строки" мы упоминали, что в консольных приложениях Windows принято использовать кодировку CP866, тогда как в графических приложениях используется CP1251 и Юникод. Отсюда и "кракозябры". В Linux и Unix таких проблем нет. Однако решить эту проблему совсем несложно. Нажмите <Enter>, чтобы закрыть консоль , и вернитесь в Редактор кода. Щелкните по окну с кодом правой кнопкой мыши, и в открывшемся контекстном меню выберите команду "Параметры файла -> Кодировка -> CP866". Откроется окно смены кодировки, нам надо нажать кнопку "Изменить файл". Снова запустите программу на выполнение - теперь с кодировкой полный порядок :

Логического порядка в примерах нет, будут добавляться по мере написания. Для поиска на странице нужного слова используйте комбинацию клавиш Ctrl+F в своём браузере.

1. Табулирование функций

С помощью делегата Function строим таблицы значений двух различных функций одним и тем же кодом.

2. Второй класс в проекте, генерирующий случайное число

Для добавления нового класса достаточно обратиться к меню Проект -> Добавить класс и назначить новому классу имя.

Если классы располагаются в одном пространстве имён, для ссылки на метод объекта второго класса главной программе достаточно выполнить что-то вроде

3. Два класса в одном файле

Достаточно, чтобы каждый класс располагался в своих операторных скобках внутри общего namespace

4. Матрицы обычная и ступенчатая

Показаны выделение памяти, заполнение и построчный вывод элементов.

5. Шаблон класса стека

Показаны стек целых и стек вещественных чисел, использующие один и тот же шаблон класса.

6. Шаблон функции и аргументы по ссылке

Передача и возврат аргументов по ссылке, функция с переменным числом аргументов.

7. Фабрика объектов

Так называют статический метод в классе, возвращающий новый объект этого же класса. Имеет смысл, если по каким-то причинам не хотим делать конструктор класса публичным методом.

8. Статические члены класса и оценивание арифметических выражений

Описываем в классе статический счётчик созданных объектов и оцениваем арифметические выражения одной строчкой кода с проверкой корректности (метод Exec ).

9. Работаем с объектом "Таблица данных"

Программно создаём таблицу с заданными характеристиками, добавляем туда данные строк и вычисляемый столбец, считаем по формулам с помощью агрегатных выражений.

10. Запускаем десять потоков и выводим их состояние
11. Перегрузка операторов
12. Три способа преобразовать строку в число

Основные способы и простейшая обработка исключений при преобразовании.

13. Шесть способов преобразовать число в строку

Способы как с добавлением, так и без добавления дополнительного текстового содержимого к полученной строке.

14. Индексаторы, свойства и автоматически реализуемые свойства

Ограничения индексаторов таковы: значение, отдаваемое индексатором, нельзя передавать методу в качестве параметра ref или out , поскольку в индексаторе не определено место в памяти для его хранения. Индексатор должен быть членом своего класса и поэтому не может быть объявлен как static .

Cвойство сочетает в себе поле с методами доступа к нему и состоит из имени и аксессоров get и set . Аксессоры служат для получения и установки значения переменной. Имя свойства может быть использовано в выражениях и операторах присваивания аналогично имени обычной переменной, но в действительности при обращении к свойству по имени автоматически вызываются его аксессоры get и set .

Свойства не определяют место в памяти для хранения полей, а лишь управляют доступом к полям. Это означает, что само свойство не предоставляет поле, поэтому поле должно быть определено независимо от свойства. Свойство также не должно изменять состояние базовой переменной при вызове аксессора get . Исключение из этого правила составляет автоматически реализуемое свойство.

Автоматически реализуемое свойство не может быть доступно только для чтения или только для записи. При его объявлении нужно указывать оба аксессора — get и set , хотя любой из них можно сделать приватным, доступным только методам своего класса.

15. Наследование

Абстрактный, базовый и производный классы, приватные данные и публичные свойства-"обёртки" над ними, абстрактные и виртуальные методы, приватные, публичные и защищённые члены класса, неуниверсальный статический класс с расширениями, класс, запрещённый к наследованию, массив из объектов базового класса.

Далее показан вывод этого приложения:

16. Упаковка и распаковка

Когда ссылка на объект класса object используется для обращения к типу значения, такой процесс называется упаковкой. Упаковка приводит к тому, что значение простого типа сохраняется в экземпляре объекта, т.е. "упаковывается" в объекте, который затем используется как и любой другой объект. Но в любом случае упаковка происходит автоматически. Для этого достаточно присвоить значение переменной ссылочного типа object, а об остальном позаботится компилятор.

Распаковка представляет собой процесс извлечения упакованного значения из объекта. Это делается с помощью явного приведения типа ссылки на объект класса object к соответствующему типу значения. Попытка распаковать объект в другой тип может привести к ошибке времени выполнения.

В примере значение типа int передаётся в качестве аргумента методу Sqr(), который, в свою очередь, принимает параметр типа object.

Также показана работа с массивом из разнотипных элементов, точнее, из элементов базового класса object.

Читайте также: