Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП / ООП / OOP-Lab1_2012

.pdf
Скачиваний:
14
Добавлен:
18.02.2017
Размер:
432.46 Кб
Скачать

Национальный исследовательский институт «МИЭТ»

Кафедра ВТ

Курс: «Объектно-ориентированное программирование» для групп МП-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-приложений.

При защите лабораторной работы будьте готовы:

предъявить конспект в электронном виде с титульным листом;

предъявить успешно компилируемые и исполняемые исходные тексты программ в среде разработки;

ответить на дополнительные вопросы преподавателя – как теоретические, так и практические по модификации разработанных программ.

Соседние файлы в папке ООП