СОЗДАНИЕ КОНСОЛЬНОГО ПРИЛОЖЕНИЯ




Консоль – это интерфейс, используемый программой, работающей в текстовом режиме. Программа имеет входной и выходной буферы. Входной буфер связан с клавиатурой, выходной с экраном. Каждая программа, работающая в текстовом режиме, взаимодействует с Windows через консоль. Для консоли Windows автоматически создает окно, которое имеет практически те же свойства, что и обычное окно Windows. Соответ­ственно консольное приложение – это приложение, работающее в текстовом режиме и не создающее собственных окон. 4.1. Запуск среды разработки Запуск осуществляется из стартового меню Windows командой Microsoft Visual C++ 6.0, которая находится в группе Microsoft Visual Studio 6.0. 4.2. Создание нового проекта Создание любого приложения начинается с создания проекта. Проект содержит имена всех исходных файлов, составляющих приложение и установки интегрированной среды разработки.

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

Для создания нового проекта выберите New… из меню File. Эта команда открывает окно диалога New (рис. 3). Здесь вы должны выполнить следующее:· выбрать тип создаваемого приложения;· выбрать место расположения папки создаваемого проекта;· указать имя проекта;· на этом шаге определяется, создается ли новое рабочее пространство WorkSpace или проект включается в рабочее пространство, открытое в данный момент в среде. Рис. 3. Создаем новый проект

Дальнейшие действия будут зависеть от типа выбранного приложения.

Чтобы закрыть проект, можно воспользоваться командой File/Close Workspace.

AppWizard позволяет создавать несколько типов приложений, приведем краткую характеристику некоторых из них:

MFC AppWizard(exe) – наиболее часто используемый тип приложения – приложение на базе библиотеки классов MFC;

MFC AppWizard(dll) – динамическая библиотека на базе библиотеки классов MFC;

Win32 Application – приложение, использующее библиотеку Win32 API;

Win32 Console Application – консольное приложение, т.е. приложение с минимальным интерфейсом, использующее для вывода результатов на экран окно, аналогичное окну MS-DOS в текстовом режиме;

Win32 Dynamic-Link Library – динамическая библиотека на базе библиотеки Win32 API;

Win32 Static Library статическая библиотека на базе библиотеки Win32 API.

Поскольку требуется создать консольное приложение, следует выбрать опцию Win32 Console Application. Информация о размещении новой рабочей области проекта вво­дится в поле Location (местоположение). Здесь укажите личную папку. Это можно сделать, воспользовавшись расположенной справа кнопкой Browse… (просмотр). Задайте имя нового проекта в поле Project Name (имя проекта), например, First. Одновременно с вводом имени проекта, это же имя автоматически добавляется в качестве подкаталога в поле Location. После выполнения описанных действий нажмите кнопку OK, в результате чего на экране появится диалоговое окно мастера соз­дания консольного приложения (рис. 4). Мастер предлагает несколько вариантов создания заготовок приложения:· An empty project (Пустой проект) для этого вида приложения мастер создает только файлы *.dsp (project - проект), *.dsw (workspace - рабочее пространство)и пустую папку Debug для отладочной версии приложения, либо Release для рабочей версии. Для выбора активной конфигурации проекта (обычно это Debug (отладочная версия) или Release (рабочая версия)) зайдите в Build\Set Active Configuration\ и выбирайте. Файлы с кодом программы не создаются, и их надо добавлять вручную. В окне Project Workspace такого проекта на диаграмме ClassView нет ни одного элемента, а диаграмма FileView содержит пустые папки Source Files, Header Files и Resource Files - для файлов исходного кода программы, заголовочных файлов и файлов ресурсов соответственно. Этот вид приложения может быть использован как для создания объектно-ориентированной программы, так и алгоритмической.· A simple application (Простое приложение) в которое включен файл, содержащий функцию main(), и служебный модуль со стандартным именем StdAfx, состоящий из двух файлов: заголовка stdafx.h и реализации stdafx.cpp. Такой проект может быть откомпилирован и выполнен несмотря на то, что функция main() не содержит никаких действий. Чтобы это приложение выполняло какие-нибудь действия, надо отредактировать функцию main() и, если надо, добавить в проект модули. Данный вид приложения может быть также использован для создания как объектно-ориентированной программы, так и алгоритмической.

Например, файл исходного кода (проект назван Listing2, поэтому и файл будет называться Listing2.cpp), причём следующего содержания вышел файл:


#include “stdafx.h” - это подключается файл stdafx.h. А он в свою очередь относится к созданному всё тем же мастером файлу stdafx.cpp. Файл stdafx.cpp ответственен за создание перекомпилированных заголовков. К нашей программе может подключаться много различных файлов заголовков. Это могут быть как стандартные файлы, которые предоставляет нам, к примеру, Microsoft, или же наши собственные. Если каждый раз в проекте компилировать все файлы заново - очень долго получается. Но мы ведь не все файлы изменять будем! Те, что не изменяются или изменяются очень редко - компилируются один раз при первой компиляции, а в последующем будут обрабатываться в уже скомпилированном виде. Заново будут компилироваться только часто изменяемые файлы, чтобы внесённые изменения отражались на работе программы. Это значительно сокращает время компиляции проекта. Так вот в файле stdafx.h и будут указываться (подключаться) те файлы, которые изменяются редко (вообще не изменяются) и которые будут использоваться как уже перекомпилированные.

 

Для указания заголовочных файлов стандартной библиотеки не требуется расширение. Они распознаются как заголовочные файлы, потому что вместо синтаксиса #include “…” используется #include <…>. И расширение .h в таком случае не указывается. Для каждого заголовочного файла стандартной библиотеки языка С существует соответствующий стандартный заголовочный файл С++. В первом случае это будет прописываться #include <*.h>, во втором #include <*>. Как правило, для включения библиотечных файлов пользуйтесь угловыми скобками < >, а для своих собственных - кавычками “ ”. Например:

 

#include <iostream> // из стандартного каталога включаемых файлов

#include “myheader.h” // из текущего каталога
Пробелы внутри < > или “ ” имеют значение!

#include < iostream > // не найдёт <iostream>

 

Функция main.

int main(int argc, char* argv[])

Часто консольные программы организуются так, что после вызова программы из командной строки, программа выдаёт нам приглашение ввести необходимые данные. Это бывает весьма неудобно для пользователя. Если таких данных немного, то возможно передать их программе ещё при её запуске. Большинство операционных систем, те же DOS и UNIX, например, позволяют передать программе при запуске несколько параметров (или один) (или ни одного). Консоль, естественно, тоже такую возможность нам предоставляет. Эти параметры называются параметрами командной строки и пишутся при вызове программы после имени самой программы через пробел. Например так:

C:\>Stebatrix.exe steb 34

Итак, функция main, как правило, имеет два параметра: целый argc и массив строк argv.

Первый параметр argc (argument counter - счётчик аргументов (параметров)) содержит в себе количество параметров командной строки.

Второй argv (argument vector - вектор (массив) аргументов) содержит в себе массив параметров командной строки. Поскольку параметры являются символьными строками, это будет массив строк, причём смысл здесь такой: argv имеет тип char* [argc+1] (не забыли про нулевой элемент массива?). Нулевым элементом массива argv будет имя программы. Список аргументов ограничен нулём, то быть argv[argc] == 0. В случае, когда командная строка выглядит так:

 

C:\>Stebatrix.exe steb 34
запустив программу вот, что получим:

Пример, Listing2.cpp

Подключение iostream и cstdlib можно объявить не в файле Listing2.cpp, а в stdafx.h. Эти файлы изменять не будем, а значит. Тогда проект компилироваться будет быстрее, хотя в случае нашего проекта это и не будет заметно. В таком случае уберите эти две строчки

#include <iostream>

#include <cstdlib>
из Listing2.cpp и вставьте их в stdafx.h вот в это место:

Эти две строки должны быть только в одном файле: или Listing2.cpp, или stdafx.h - два раза одно и то же подключать не надо!

 

При вызове из консоли программа будет принимать два параметра: первый - это строка текста, которую надо будет вывести, а второй - сколько раз надо будет её вывести.

cstdlib подключается для того, чтобы воспользоваться функцией atoi. Эта функция имеет во какую прототип:

int atoi (const char* p);

Она преобразует строку p, представляющую собой численное значение (только из цифирей состоящую) в само численное значение. То быть строка ‘12345’ будет преобразована в 12345. Весьма полезная функция. Есть ещё две: atof и atol, преобразующие строчку в double и long соответственно. Если же строчка не представляет собой число (например ‘123g4a’) то будет возвращён 0. Вот как раз с помощью функции atoi мы преобразуем символьную строчку argv[2] в целое av2. Преобразуем, а потом циклом for выводим av2 раз строку argv[1].

 

Командная строка для вызова программы будет иметь, к примеру, такой вид:

D:\Program Files\Microsoft Visual Studio\MyProjects\Listing2\Release>listing2 We_have_Matrix! 3

Только обратите внимание на то, что We_have_Matrix! пишем не через пробел, а через символ подчёркивания, т.к. пробелами разделяются параметры и прога так не поймёт (поймёт неправильно).

 

· A “Hello World!” application (Приложение “Hello World!”) Имеет такой же файловый состав, что и предыдущее приложение, только тексты файлов stdafx.h и stdafx.cpp несколько изменены. Так, в stdafx.h подключается заголовочный файл stdio.h, необходимый для вывода текста на экран с помощью функции printf(). Этот вид приложения может быть использован как образец готового приложения, а может быть отредактирован для решения какой-либо задачи.

Функция printf() осталась от языка С. Тем не менее, её очень часто можно встретить. Тем более что, хороший код на С будет прекрасно компилироваться и работать в компиляторе для С++. Даже вместе с кодом на С++ (правда в таком случае проблема совместимости всё же время от времени возникает, но она легко решаема).

Прототип функции printf():

int printf(const char*, …)

Возвращает она нам количество выведенных символов. В случае строки “Hello World!” их будет 13 (не забываем про NULL в конце строки). В качестве параметра она принимает строку в стиле С (массив символов) (или же непосредственно строку в кавычках), причём их может быть несколько, тогда просто через запятую перечислим:

printf("Hello”, “ World!”, “\n”);

Это также как в cout можете несколько раз использовать <<, а в cin >>.

Для ввода в языке С++ используется: std::cin >> и дальше имя переменной, в которую будет записано то, что мы вводим. В С этим занимается функция gets() и др.

Также в printf() могут указываться спецификаторы преобразования. Использование функции printf () имеет большой недостаток: плохой контроль типов данных (при неявных преобразованиях типов, например), что даже у опытных программистов становится иногда причиной ошибок.

· An application that supports MFC (Приложение с поддержкой MFC) применяется только для разработки объектно-ориентированных программ. Имеет более сложный файловый состав, что связано с особенностями проекта на базе MFC. MFC - Microsoft Foundation Class (базовые классы Microsoft). Пакет MFC даёт возможность разрабатывать GUI-приложения (GUI - Graphic User Interface - графический пользовательский интерфейс) для Windows на языке С++ с использованием большого набора библиотечных классов, причём эти библиотеки являются объектно-ориентированными (помимо инкапсуляции поддерживают наследование и полиморфизм). Однако, поскольку MFC в значительной степени ориентирована на работу с окнами, документами, представлениями и т.д., большая её часть остаётся невостребованной консольным приложением.

Как видно, в проектах используется модуль StdAfx, создаваемый мастером AppWizard для каждого приложения. Этот модуль предназначен для создания так называемых прекомпилированных файлов(*.pch), которые повышают производительность компиляции. Заголовочный файл stdafx.h включается в каждый исходный файл проекта первым и содержит директивы include для подключения библиотек C++. Таким образом, каждый модуль проекта имеет возможность использовать подключенные библиотеки, при этом во время его компиляции не требуется выполнять обработку файлов заголовков, поэтому, он может быть скомпилирован быстрее.

Оба файла модуля StdAfx помещаются в папку проекта. В процессе работы над проектом они могут быть отредактированы пользователем, например, в stdafx.h можно добавить подключение заголовочных файлов с помощью директивы include.

Рассмотрим два примера создания консольного приложения

Пример 1. Вычислить значение переменной y = log x, где значение переменной x вводится с клавиатуры.

Последовательность действий:

· ·открыть VC++ 6.0 и выполнить команду File/New;

· ·в окне File/Projects указать:

- тип приложения – Win32 Console Application,

- имя проекта – lab1,

- место размещения проекта – R:\work (Ваш рабочий диск!!!)

- нажать кнопку ОК;

· на следующем шаге выбрать вид консольного приложения –

An empty project;

· соглашаться со всем, что предлагает среда, в результате получим каркас проекта, в котором нет ни одного файла. При этом на диске будет создан каталог с именем lab1;

· ·добавить файл типа *.cpp для размещения функции main(): перейти в окно FileView, выделить папку Source Files (источники) и выполнить команду File/New;

· в окне File/New выбрать тип файла C++ Source File и указать его имя lab1.cpp. Этот файл будет помещен в каталог проекта lab1. На диаграмме файл lab1.cpp будет помещен в папку Source Files;

· на диаграмме Source Files дважды щелкнуть левой кнопкой мыши на файле lab1.cpp, файл будет открыт в текстовом редакторе среды.

· ввести в файл текст программы:

#include <stdio.h>

#include <math.h>

int main(void)

{

puts("Enter number");

float num;

scanf("%f",&num);

float y10=log10(num);

printf("Num=%.2f,Dec.Log=%.2f",num,y10);

return 0;

}

Замечание. В тексте программы неслучайно для сообщений, выводимых на экран, использовались латинские символы. Дело в том, что текстовый редактор использует для кириллицы кодировку Windows, а окно выполнения программы – кодировку ASCII для MS-DOS. Если использовать кириллицу для вывода сообщений, тексты на экране нельзя будет прочитать. Можно тексты сообщений ввести с помощью редактора для MS-DOS, но тогда эти тексты нельзя будет прочитать в редакторе среды.

· сохранить текст файла;

· откомпилировать проект, для этого можно воспользоваться кнопкой на панели инструментов с изображением восклицательного знака (команда Execute). Проект сначала будет откомпилирован, затем выполнен. Если в тексте программы компилятор найдет ошибки, то выведет их в окно Output панели Build. Если в панели Build дважды щелкнуть мышью на ошибке, среда покажет место ошибки в тексте программы. Исправление ошибок всегда надо начинать с первой ошибки, так как остальные ошибки могут оказаться следствием первой;

· в окне программы ввести данные, получить результат:

Num=34.00,Dec.Log=1.53 Press any key to continue

· завершить программу нажатием любой клавиши на клавиатуре.

 

Пример 1 Остановимся на варианте – выбор переключателя An empty project (пустой проект). При этом не создается никаких дополнительных файлов – только файл проекта. В дальнейшем в него нужно будет добавить файлы, содержащие текст программы. Перед началом работы мастер сообщает, какие действия он намерен сделать, и спрашивает подтверждение. Рис. 4. Диалоговое окно мастера создания консольного приложения В результате работы мастера в вашей личной папке будет создана новая папка с именем First (если не указывалось другое), в кото­рой находятся файлы нового проекта (First.msp, First.dsw и др.). 4.3. Ввод текста программы Первое, что нужно сделать для написания программы – это открыть новыйфайл. В меню File укажите пункт New.... В результате на экране появитсязнакомое диалоговое окно New, однако, на этот раз оно будет открыто навкладке Files, где представлены все типы файлов, которые можно создавать(рис.5). Флажок Add to project (добавить в проект) должен быть установлен(поставлена галочка), чтобы создаваемый файл автоматически был добавлен впроект. В списке Files выберите тип создаваемого файла – C++ Source File, а в поле File name введите имя файла, например, First. Расширение файла можно не указывать, при создании он автоматически получит расширение .срр. Рис. 5. Добавляем в проект новый файл Осталось нажать на кнопку OK. В результате будет создан файл и открыто пустое поле редактирования текста. Наберите приведенный ниже пример. Если вы знакомы с языком С++, то заметите наличие ошибок в программе. Не исправляйте их. Ошибки сделаны преднамеренно для того, чтобы на практике пока­зать различные возможности интегрированной среды разработки. // консольное приложение// программа содержит ошибки!!! #include<iostream.h>#define SIZE 5 void bsort(int iArray[], int n); void main(){ char ch; char ii; int iArray[SIZE]; for(ii=0; ii<SIZE; ii++;) { cout << "Please enter an integer: "; cin >> iArray[ii]; } cout << "\nWould you like to sort (Y/N) "; cin >> ch if (ch=='Y' || ch=='y') { bsort(iArray, SIZE); } for(ii=0; ii<SIZE; ii++;) { cout << iArray[ii] << " "; }} void bsort(int iArray[], int n)// Алгоритм пузырьковой сортировки - BubbleSort{ int i,j,k,t; for(i=0; i < n; i++) { j=i; for(k=j+1; k < n; k++) { if(iArray[k] <= iArray[j]) { j=k; } } if(i <> j) { t=iArray[j]; iArray[j]=iArray[i]; iArray[i] = t; } }} Приведенный пример программы содержит две функции. Функция main является точкой входа в программу. Потоки cin, cout открываются автоматически при запуске программы и становятся интерфейсом между программой и пользователем. Поток cin связан с клавиатурой. Поток cout связан с видеодисплеем. Программа предлагает пользователю ввести с клавиатуры несколько целых чисел и затем сортирует их в порядке возрастания с помощью функции bsort. Функция bsort использует алгоритм пузырьковой сортировки. В процессе сортировки меньшие по значению, более «легкие» элементы массива «вытесняются» из конца массива в его начало, подобно пузырькам воздуха в стакане с жидкостью выталкиваемым наверх. По этой физической аналогии алгоритм и получил свое имя. Перед переходом к следующему этапу работы не забудьте сохранить файл с введенным текстом. Для этого выполните команду Save меню File. 4.4. Создание исполняемого файла Процесс создания исполняемого файла приложения, заключающийся в компиляции и компоновке всех модулей проекта, называется по­строением.Запустите процесс построения командой Rebuild All меню Build. 4.5. Отладка программы Если программа содержит синтаксические ошибки, при выполнении построения они автоматически отображаются в окне Output, по умолчанию расположенном в нижней части окна интегрированной обо­лочки. Каждое сообщение начинается с имени исходного файла и но­мера строки (в скобках), где обнаружена ошибка или предупрежде­ние. Следом за номером строки идет краткое описание предупрежде­ния или ошибки. Лучше всего добиться, чтобы в окончательном ва­рианте не было ни того, ни другого, хотя с предупреждениями ис­полняемый файл создается и может быть запущен. Если дважды щелкнуть на строке с сообщением об ошибке, то среда автоматически переключится в окно редактирования и сама укажет на ошибочный фрагмент программы (рис. 6). Следует заметить, что компилятор может «не очень точно» локализовать место возникновения ошибки, особенно если это пропущенная скобка или точка с запятой. В этом случае внимательно проверьте текст над указанной строкой. Исправив все ошибки, повторите построение исполняемого файла. Рис. 6. Поиск ошибок 4.6. Запуск программы Для запуска программы после успешного завершения операции по­строения достаточно выполнить команду Execute меню Build. 4.7. Логические ошибки Даже если синтаксических ошибок нет, приложение может работать не так, как ожидалось. Такие ошибки называются логическими. Интегрированный отладчик среды имеет различные средства, готовые прийти вам на помощь. Наиболее эффективные из них: выполнение программы по шагам, просмотр значения любых переменных в любой точке программы, задание точек останова и др. В рассматриваемом примере программы логические ошибки преднамеренно не вводились, поэтому вам, возможно, не потребуется помощь отладчика. Хотя известное высказывание о том, что после обнаружения последней ошибки в программе остается еще хотя бы одна, для опытных программистов давно стало аксиомой. 4.8. Создание исполняемого файла без отладочной информации До этого построение приложения осуществлялось в отладочнойконфигурации (Win32 Debug) с включением в файл всей необходимойотладочной информации. После отладки и исправления всех ошибокосуществляется построение приложения в окончательной конфигура­ции. Окончательная конфигурация не содержит какой-либо отладочной информации и использует заданную оптимизацию кода. И как резуль­тат, размер исполняемого файла существенно уменьшается. Для переключения в окончательную конфигурацию выберите команду Set Active Configuration… из меню Build. На экран будет выведено диалоговое окноустановки активной конфигурации проекта (рис. 7). Выберите опцию Win32 Release и закройте диалоговое окно нажатием на кнопку OK. Рис. 7. Установка активной конфигурации проекта Повторите построение, выполнив команду Rebuild All меню Build. Каждая конфигурация проекта определяет также папки, куда будут помещены файлы с промежуточными и окончательными результатами компиляции и компоновки. По умолчанию это папки Debug и Release, которые располагаются в папке проекта. СПИСОК ЛИТЕРАТУРЫ 1. Тихомиров Ю. Visual C++ 6. СПб.: БХВ, 1998. 496 с.2. Уэйт, С. Прата, Д. Мартин. Язык Си. Руководство для начинаю­щих: Пер. с англ. М.: Мир, 1998. 512 с.3. Крис Паппас, Уильям Мюррэй. Visual C++. Руководство для про­фессионалов: Пер. с англ. СПб.: БХВ, 1996. 912 с.4. Подбельский В.В. Язык Си++. М.: Финансы и статистика, 1995.5. Страуструп Б. Язык программирования С++: Пер. с англ. В 2-х ч. Киев: ДиаСофт, 1993.


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: