- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
19.7. Создание консольного приложения
Как уже было сказано ранее, Win32 Console Application – консольное приложение, используемое для вывода результатов на экран окно, аналогичное окну MS-DOS в текстовом режиме.
Этапы создания консольного приложения:
выполнение команды File/New…,
настройка параметров проекта в окне AppWizard/Projects,
тип приложения – Win32 Console Application,
имя проекта (Name),
размещение проекта (Location),
флажок создания нового рабочего пространства в состоянии «установлен»,
выбор вида консольного приложения.
Мастер AppWizard позволяет создать четыре вида приложений.
An empty project – пустой проект, для этого вида приложения мастер создает только файлы *.dsp, *.dsw. Файлы с кодом программы не создаются, и их надо добавлять вручную. В окне Project Workspace такого проекта на диаграмме ClassView нет ни одного элемента, а диаграмма FileView содержит пустые папки Source Files, Header Files и Resource Files. Этот вид приложения может быть использован как для создания объектно-ориентированной программы, так и алгоритмической.
A simple application – простое приложение, в которое включен файл, содержащий функцию main(), и служебный модуль со стандартным именем StdAfx, состоящий из двух файлов: заголовка stdafx.h и реализации stdafx.cpp. Такой проект может быть откомпилирован и выполнен несмотря на то, что функция main() не содержит никаких действий. Чтобы это приложение выполняло какие-нибудь действия, надо отредактировать функцию main() и, если надо, добавить в проект модули. Данный вид приложения может быть также использован для создания как объектно-ориентированной программы, так и алгоритмической.
A "Hello, world!" project – готовое приложение, выводящее на экран сообщение "Hello, world!". Имеет такой же файловый состав, что и предыдущее приложение, только тексты файлов stdafx.h и stdafx.cpp несколько изменены. Так, в stdafx.h подключается заголовочный файл stdio.h, необходимый для вывода текста на экран с помощью функции printf(). Этот вид приложения может быть использован как образец готового приложения, а может быть отредактирован для решения какой-либо задачи.
An application that supports MFC – приложение, использующее классы библиотеки MFC, применяется только для разработки объектно-ориентированных программ. Имеет более сложный файловый состав, что связано с особенностями проекта на базе MFC.
Как видно, в проектах используется модуль StdAfx, создаваемый мастером AppWizard для каждого приложения. Этот модуль предназначен для создания так называемых прекомпилированных файлов (*.pch), которые повышают производительность компиляции. Заголовочный файл stdafx.h включается в каждый исходный файл проекта первым и содержит директивы include для подключения библиотек C++. Таким образом, каждый модуль проекта имеет возможность использовать подключенные библиотеки, при этом во время его компиляции не требуется выполнять обработку файлов заголовков, поэтому, он может быть скомпилирован быстрее.
Оба файла модуля StdAfx помещаются в папку проекта. В процессе работы над проектом они могут быть отредактированы пользователем, например, в stdafx.h можно добавить подключение заголовочных файлов с помощью директивы include. Место вставки директив помечено словами:
//TODO: reference additional headers your program requires here.
Рассмотрим два примера создания консольного приложения – на основе пустого проекта и простого приложения, использующего класс пользователя.
Пример 1. Вычислить значение переменной y = log x, где значение переменной x вводится с клавиатуры.
Последовательность действий:
открыть VC++ 6.0 и выполнить команду File/New;
в окне File/Projects указать:
- тип приложения – Win32 Console Application,
- имя проекта – lab1,
- место размещения проекта – E:\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
завершить программу нажатием любой клавиши на клавиатуре.
Как видно, остановка программы перед ее завершением специально не программировалась, но тем не менее эта возможность получена.
Пример 2. Разработать класс принтеров, характеризующийся следующими свойствами: наименование модели, год выпуска, цена. Конструктор класса должен обеспечивать создание объектов с различными значениями свойств. Класс также должен обеспечивать изменение цены принтера во время работы программы. В составе класса также надо предусмотреть метод для просмотра характеристик принтера. Результаты работы программы выводить на экран. Для решения задачи использовать консольное приложение A simple application.
Последовательность действий для решения задачи:
o открыть VC++ 6.0 и выполнить команду File/New;
o в окне File/Projects указать:
- тип приложения – Win32 Console Application,
- имя проекта – lab2,
- место размещения проекта – E:\work,
- нажать кнопку ОК;
o на следующем шаге выбрать вид консольного приложения A simple application;
o оставить без изменения настройки проекта, предложенные средой. В результате получим каркас проекта, в который будут включены файлы lab2.cpp, stdafx.h и stdafx.cpp, помещенные в каталог проекта с именем lab2, и функция main();
o добавить в проект класс Insert/New Class, в окне New Class указать информацию о классе: имя класса (окно Name) – Printer.
После выполнения этих действий в проект будут включены два файла, образующие модуль класса Printer. Первый файл Printer.h содержит объявление класса Printer, второй Printer.cpp – определения методов класса Printer. Просмотрите эти файлы и изучите состав класса, предлагаемый средой. Класс включает в себя только два члена: конструктор Printer() и деструктор ~Printer(), помещенные в раздел public, причем в файле Printer.cpp эти методы представлены в виде заготовок, которые представляют собой заголовок метода и пустое тело {} функции:
Файл Printer.h:
class Printer
{
public:
Printer();
virtual ~Printer();
};
Файл Printer.cpp:
#include "stdafx.h"
#include "Printer.h"
///////////////////////////////////////////////////
// Construction/Destruction
///////////////////////////////////////////////////
Printer::Printer()
{
}
Printer::~Printer()
{
}
отредактировать объявление класса Printer – добавим свойства класса, для этого выделим на диаграмме ClassView заголовок класса Printer, вызовем контекстное меню класса, выполним команду Add Member Variable (добавить переменную – член класса), в открывшемся окне укажем тип переменной (свойства) – char, название – model[20] (model – собственно название свойства – модель принтера, [20] – количество элементов типа char в значении свойства), укажем раздел класса, в который надо включить свойство, – private. Аналогично введем в класс свойства year (год выпуска, тип int), cost (цена принтера, тип float). Теперь просмотрим текст файла, он должен быть таким:
class Printer
{
public:
Printer();
virtual ~Printer();
private:
float cost;
int year;
char model[20];
};
отредактировать конструктор класса – изменим в объявлении класса заголовок конструктора: добавим параметры: _model, _year, _cost, типы которых соответствуют одноименным свойствам класса Printer. Отредактируем определение конструктора – добавим список параметров в заготовке и выполняемые действия (инициализацию переменных класса) в тело конструктора. Так как свойство класса model должно содержать строку текста и заполнить его можно функцией strcpy, в текст файла Printer.cpp добавим директиву include для подключения заголовочного файла string.h. Деструктор оставим без изменения или совсем удалим. В результате мы должны получить следующий текст:
Файл Printer.h:
class Printer
{
public:
Printer(char* _model,int _year,float _cost);
virtual ~Printer();
private:
float cost;
int year;
char model[20];
};
Файл Printer.cpp:
#include "stdafx.h"
#include "Printer.h"
#include <string.h>
///////////////////////////////////////////////////
//Construction/Destruction
///////////////////////////////////////////////////
Printer::Printer(char* _model,int _year,
float _cost)
{
strcpy(model,_model);
year=_year;
cost=_cost;
}
Printer::~Printer()
{
}
добавим в класс методы: show – для просмотра свойств класса; set_cost – для изменения цены принтера. Добавление метода выполним через диаграмму ClassView: выделим на диаграмме заголовок класса Printer, вызовем контекстное меню класса, выполним команду Add Member Function (добавить функцию – член класса), в открывшемся окне укажем тип функции (function type) – void, заголовок функции (function declaration) – show() (метод для просмотра свойств класса), раздел класса, в который надо включить метод – public. Если функция без параметров, в окне function declaration можно указать имя функции без скобок, скобки будут добавлены автоматически. После нажатия кнопки ОК на экране появится текст файла Printer.cpp с выделенным заголовком только что созданной функции show(). Ввести в тело функции show() следующий код:
cout << model <<" "<< year <<" "<< cost << endl;
чтобы объект-поток cout был доступен в файле Printer.cpp, подключим через директиву include заголовочный файл iostream.h;
аналогично добавим второй метод set_cost(), изменяющий значение цены принтера. Этот метод будет иметь параметр – новое значение цены принтера, поэтому при вводе информации в окно function type введите тип функции – void, в окне function declaration укажите следующее: set_cost(float new_cost), включите функцию так же, как и предыдущую, в раздел public. Добавьте код функции:
cost=new_cost;
В результате должен получиться следующий текст файла Printer.cpp:
#include "stdafx.h"
#include "Printer.h"
#include <iostream.h>
#include <string.h>
///////////////////////////////////////////////////
// Construction/Destruction
///////////////////////////////////////////////////
Printer::Printer(char* _model,int _year,
float _cost)
{
strcpy(model, _model);
year = _year;
cost = _cost;
}
Printer::~Printer()
{
}
void Printer::show()
{
cout << model <<" "<< year <<" "<< cost << endl;
}
void Printer::set_cost(float new_cost)
{
cost=new_cost;
}
отредактировать файл lab2.cpp, содержащий заготовку для функции main: добавим директиву препроцессора include для подключения заголовочного файла Printer.h, без которого невозможно создавать объекты класса Printer, затем добавим в функцию main код, выполняющий следующую последовательность действий: создание объекта класса Printer, просмотр его свойств, изменение цены принтера и повторный просмотр свойств. В результате текст файла lab2.cpp будет следующим:
#include "stdafx.h"
#include "Printer.h"
int main(int argc,char* argv[])
{
Printer printer("Canon",2003,700.0);
printer.show();
printer.set_cost(650.5);
printer.show();
return 0;
}
Замечание. Если бы функция main() использовала для вывода информации поток cout, заголовочный файл iostream.h лучше было бы подключать в файле stdafx.h, тогда поток cout был бы доступен во всех модулях, где подключен stdafx.h, и не требовалось бы дополнительного подключения iostream.h в файле Printer.cpp. Место вставки директив include, подключающих заголовочные файлы, в тексте файла stdafx.h обозначено следующим комментарием: //TODO:reference additional headers your program requires here.
