
Национальный исследовательский институт «МИЭТ»
Кафедра ВТ
Курс: «Объектно-ориентированное программирование» для групп МП-21, 22 и 23
Лабораторная работа №1 «Данные, их обработка и элементы управления»
Часть 1 «Данные и их обработка»
Составил: доцент кафедры ВТ, к.т.н. Тельминов О.А.
Москва, 2012

2
Цель работы: получить навыки работы в среде разработки Visual Studio 2008 (С++) по взаимодействию данных и функций.
1. Подготовка консольного приложения к работе
Запустите Microsoft Visual Studio 2008. При первом запуске появиться окно «Choose your default environment settings» – «Visual С++ development settings».
Влевом верхнем углу интерактивного окна среды разработки в зоне “Recent project”
выберите “Create project…”, в окне “New project” задайте “Project type” равным “Visual C++ / Win32” и в правой части окна – шаблон “Win 32 Console Application”. В нижней части окна выберите рабочую папку (Location), задайте имя проекта и нажмите “OK”.
Вокне “Win32 Application Wizard” выберите “Application Settings” и убедитесь, что выбран тип “Console Application” и установлен флаг “Precompiled header”. Нажмите “Finish”.
Врезультате появится автоматически сгенерированный текст программы.
В настоящей работе рассматривается однобайтовый тип char вместо предложенного двухбайтового _TCHAR, поэтому нужно задать в настройках проекта Project | Properties опцию
General | Project defaults | Character Set равной “Not Set” вместо “Use Unicode Character Set”.
После этого следует изменить вручную тип аргумента _TCHAR* на char* в функции _tmain(). Теперь главная функция программы C++ способна принимать аргументы командной строки в удобной форме.
2. Прием и обработка аргументов командной строки
Операционная среда Windows позволяет принимать аргументы из командной строки и передавать их запускаемой программе.
Откройте командное окно Windows – нажмите Пуск | Выполнить или +R и введите “cmd”. Далее введите “copy /?” – появится экран с помощью по команде копирования. В данном случае “copy” – имя запускаемой программы, а “/?” – единственный ключ (аргумент командной строки) для этой программы. Ключи разделяются пробелами, но если ключ содержит пробел, то весь ключ заключается в кавычки – например, пробел в именах обеих папок:
copy “d:\my prog\z.txt” “d:\my prog2”
Возможно перенаправление вывода в текстовый файл с помощью символа “>” (записать поверх) или “>>” (дописать), например:
cd /? > d:\cdhelp.txt
Проверьте содержимое файла d:\cdhelp.txt и установите в командном окне свою рабочую папку для дальнейших экспериментов.
Задание 1. Используя помощь (ключ “/?”), изучите и законспектируйте результаты работы для каждой из команд: mkdir, copy, move, ren, del, dir.
Вернитесь к программе на C++. Доработайте ее следующим образом:

3
Здесь используется стандартное пространство имен (std), вывод на консоль осуществлен с помощью объекта “cout”. Объект “cout” – это поток, связанный с выводом на консоль. Видно, что с помощью оператора “<<” происходит помещение информации из строки argv[0] в поток, а затем манипулятора endl (end line, перевод строки). Аналогично в этот объект помещается строковая константа. Для работы с объектом cout необходимо подключить библиотеку iostream (input output stream, поток ввода-вывода). Детали работы с потоками будут объяснены в процессе изучения курса.
Для паузы используется ожидание нажатия клавиши (функция getch() объявлена в conio.h). Проверьте результат запуска программы.
Внулевом аргументе командной строки argv[0] операционная система передает полный путь
иимя исполняемого файла. Параметр argc принимает значение не меньше единицы и содержит фактическое количество переданных аргументов в программу.
Задание 2. Доработайте программу для вывода на экран всех аргументов командной строки. Задайте аргументы двумя способами:
–запустив программу в среде разработки, причем установка аргументов выполняется в поле: Projeсt | Properties, Debugging, Command Arguments,
–через командное окно с предварительной установкой в нем папки с исполняемым файлом.
Для ввода информации с консоли используется объект cin и оператор >>:
int z = 0; cin >> z;
В языках C и C++ используется представление строк с завершающим (терминирующим) символом, обозначаемым \0 (ASCII-код равен нулю). Функции обработки строк (например, strcmp(), strlen() и strcat()) просматривают строку слева направо до первого встретившегося терминирующего символа. Из примера ниже видно, что для хранения строки зарезервировано 10 байт, а сама строка равна “AB0”.
индекс |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
символ |
A |
B |
0 |
\0 |
? |
E |
\0 |
F |
G |
H |
ASCII-код |
65 |
66 |
48 |
0 |
63 |
69 |
0 |
70 |
71 |
72 |
4
Учитывая изложенное, при работе со строками необходимо выполнять 2 условия:
–выделять необходимый объем памяти для хранения строки с учетом нуль-символа (например, для хранения строки в 100 символов требуется 100+1 байт);
–выполнять инициализацию строки – функции работы со строками не имеют контроля выхода за пределы строки.
Примеры:
//память выделяется автоматически (пустые квадратные скобки)
//в соответствии с кол-вом символов в константе; //строка инициализирована
char s1[] = “AB”;
//просто указатель на строку
//память не выделена char* s2;
//выделение памяти (здесь максимум – 100 символов) s2 = new char[101];
//инициализация
strcpy(s2,”My tailor is reach.”);
//или так: s2[0]=’M’; s2[1]=’y’; //… s2[16]=’c’; s2[17]=’h’; s2[18]=’.’;
s2[19]=’\0’; // или =0, но не =’0’!
//…дальнейшая работа с s2
//освобождение памяти в конце программы или когда отпала необходимость в этой строке delete [] s2; //пустые квадратные скобки; компилятор знает, сколько освободить
//правило хорошего тона: всегда обнулять указатель после освобождения памяти s2=0; // или =’\0’
В процессе программирования удобным является хранение информации в файлах. При этом операции извлечения из потока << и помещения в поток >> остаются неизменными (пример ниже). Обратите внимание, что чтение строк из файла осуществляется функцией getline(). При этом поток проверяется на безошибочность чтения (условия в while и if). Дополнительный if не допускает двойной вывод последней строки файла.
#include <fstream> //file stream – файловый поток
//…
ofstream ofs(“d:\\data.txt”); //output file stream – поток для вывода (записи) ofs << 100; //помещение в поток – запись в файл
ofs.close(); //закрытие файла после записи
//… int z;
ifstream ifs(“d:\\data.txt”); //input file stream – поток для ввода (чтения) ifs >> z; //извлечение из потока – чтение из файла
cout << z << endl; // вывод в консоль ifs.close(); //закрытие файла после чтения
//чтение текстового файла
char s[1000];// до 999 символов в строке ifstream txt(“d:\\text.txt”);
while (txt) {txt.getline(s,1000);
if (txt) {cout << s << endl;}
}
Задание 3. Используя функции для работы со строками, разработайте программу calc.exe со следующими функциями (управление – параметрами командной строки):
–вычисление выражения (сложение и вычитание);
–вывод истории вычислений;
–вывод помощи;
–реакция на некорректную команду или вычисляемое выражение.
5
3.Указатели, ссылки и модификатор const.
Впрограмме на C++ все данные и функции хранятся в памяти. Данные имеют тип (типизированные данные), что позволяет на этапе компиляции выявить ошибки «смешение типов». Исходя из типа данных, можно определить занимаемый размер памяти. Функция также имеет конечный размер в памяти. С другой стороны, и функция, и данные имеют начальный адрес
впамяти.
Для доступа к данным или для вызова функции необходимо указать их адрес:
–непосредственно через имя переменной или имя функции;
–опосредованно через указатель;
–опосредованно через ссылку.
В C++ используются следующие встроенные типы данных:
–signed char, unsigned char;
–signed int, unsigned int;
–signed long, unsigned long;
–float, double;
Они могут агрегироваться (собираться) в массивы, перечислимые типы (enum) и объединения (unit).
Структуры (struct) и классы (class) позволяют объединять как разнородные данные, так и функции для их обработки. В примере ниже вместе с идентификатором и именем сотрудника хранятся и обрабатывающие их функции. Класс позволяет скрыть часть данных и функций от доступа извне – поля id и name недоступны вне класса. Для их записи и чтения используются функции Set() и GetName(), доступ к которым открыт – они размещены в секции public. Подробное изучение классов начнется позже.
class A
{
int id;
char [50] name;
public:
void Set(int _id, char* _name) {id = _id;
strcpy(name, _name);
}
void GetName()
{ strcpy(_name, name);
}
};
A staff[100];
int staffCNT = 0; //счетчик добавленных сотрудников
staff[staffCNT++].Set(7,”J.Bond”);
//…
for (int i=0; i<staffCNT; i++)
cout << staff[i].GetName();
Задание 4. Разработайте программу, обрабатывающую план дел на день. В плане задается набор дел в формате «Начальное время» – «Конечное время» – «Название задачи». В результате обработки выводятся промежутки времени с заданным интервалом в диапазоне 7:00 – 23:00 (например, для 15 мин. – «09:00 – 09:14», «09:15 – 09:29», …). Если промежуток занят задачей, то справа от него выводится «*».
Задание 5. Отработайте на практике и включите в конспект сведения по отладке программы:
– установка Breakpoint;
6
–задание условий для Breakpoint;
–следующий шаг с входом в функцию;
–следующий шаг без входа в функцию;
–слежение за значениями переменных.
Задание 6. В таблице ниже систематизированы варианты доступа к данным и функциям для их обработки. Для каждого случая разработайте программный пример в среде разработке и поясните в конспекте соответствующие правила. Включите в конспект карты памяти с указанием конкретных адресов размещения данных и тел функций, полученных при выполнении программы. Продемонстрируйте работу модификатора const (везде, где применимо).
|
|
Имя |
Указатель |
Ссылка |
1. |
Переменная |
int z; |
int* p; |
int z; |
|
|
|
|
int& r = z; |
2. |
Функция |
int f1(int); |
int (*pf) (int); |
int f1(int z) |
|
|
|
|
{return z;} |
|
|
|
|
int (&rf) (int) = f1; |
3. |
Аргумент функции |
int f1(int z); |
int f1(int* z); |
int f1(int& z); |
4. |
Тип возвращаемого значения |
int f1() |
int* f1() |
int& f1() |
Часть 2 настоящей лабораторной работы посвящена созданию форм Windows-приложений.
При защите лабораторной работы будьте готовы:
–предъявить конспект в электронном виде с титульным листом;
–предъявить успешно компилируемые и исполняемые исходные тексты программ в среде разработки;
–ответить на дополнительные вопросы преподавателя – как теоретические, так и практические по модификации разработанных программ.