Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП ЛР1 Проектирование и реализация вычислительной задачи, использующей ОО-подход.doc
Скачиваний:
24
Добавлен:
11.04.2014
Размер:
103.42 Кб
Скачать

Федеральное агентство по образованию

Волгоградский государственный технический университет

Кафедра «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ АВТОМАТИЗИРОВАННЫХ СИСТЕМ»

Выполнение лабораторных работ

по дисциплине "Объектно-ориентированное программирование"

(часть 1)

Методические указания

Волгоград

2009

УДК 004.045 ; 004.415.2

Рецензент

д-р техн. наук проф. С. А. Фоменков

Издается по решению редакционно-издательского совета

Волгоградского государственного технического университета

Выполнение лабораторных работ по дисциплине "Объектно-ориентированное программирование" (часть 1): метод. указания / сост. Д. В. Литовкин; ВолгГТУ. – Волгоград, 2009. – 39 с.

В методических указаниях изложены цели, содержание и порядок выполнения лабораторных работ по дисциплине «Объектно-ориентированное программирование».

Методические указания предназначены для студентов всех форм обучения по направлению 230100.62 «Информатика и вычислительная техника».

 Волгоградский государственный технический университет, 2009

ЛАБОРАТОРНАЯ работа №1. Проектирование и реализация вычислительной задачи, использующей ОО-подход

1. Цель работы

Ознакомиться с объектно-ориентированным подходом при создании программ. Изучить способы объявления и использования классов и объектов в одном из ООП-языков C++, C# или Java.

2. Порядок выполнения работы

2.1. Самостоятельная работа студента

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

Как результат должен быть создан протокол (см. п. 5), включающий в себя код программы. Протокол сдается в печатном и электронном видах. Дополнительно в электронном виде сдается проект программы.

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

  1. Объявить и реализовать класс “ферзь” на выбранном ООП-языке.

  2. Создать программу, создающую 8-мь ферзей, получающую решение задачи и выводящую результат.

  3. Задокументировать код программы (см. п. 4).

  4. Зафиксировать код программы в проколе лабораторной работы.

2.2. Аудиторная работа студента

  1. Сдать преподавателю на проверку протокол и код программы (проект программы).

  2. Защитить следующие проектные решения и их реализацию:

  • реализацию свойств и методов класса с точки зрения простоты реализации и расширяемости;

  • полноту документирования кода;

  • работоспособность программы.

  1. При обнаружении ошибок и недочетов принципиального характера (см. п. 3) в проектных решениях и коде программы, а также при отсутствии документирования кода необходимо внести соответствующие правки в протокол и код программы.

  2. Расставить фигуры на доске по указанию преподавателя, решить задачу и объяснить полученное решение.

3. Требования к решению задания

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

Рис. 1.1. Одно из решений задачи о 8-ми ферзях

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

Класс должен обладать следующими свойствами:

  • позиция на шахматной доске.

Класс должен обладать следующими методами:

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

Результаты решения задачи представить в текстовом или графическом режиме путем отрисовки фигур на шахматной доске (как показано на рис. 1.1).

4. Правила документирования кода

Главным принципом документирования кода является его самодокументирование, т.е. для понимания и сопровождения программы не требуется никакая дополнительная документация, кроме кода программы. Для реализации этого принципа необходимо:

  • правильно форматировать код программы, используя отступы, пустые строки и т.п.;

  • давать идентификаторам смысловые названия;

  • корректно и в полном объеме комментировать классы, их свойства и методы, а также логические блоки программы внутри методов и функций.

Ниже приводятся требования к документированию программы.

Требования к именованию идентификаторов.

  1. Наименования переменных должны быть смысловыми (отражать их назначение). Запрещаются однобуквенные переменные, за исключением простых переменных циклов (i, j), а также переменных, обозначающих математические и физические понятия с устоявшимся однобуквенным обозначением (например, x, y, m, F).

  2. Наименования переменных могут быть либо на английском языке, либо транслитерацией с русского языка. Выбранного стиля следует придерживаться на протяжении всей программы.

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

  4. В названии функции (метода) должен присутствовать глагол (отглагольное существительное), отражающий действие выполняемой функцией. Обычно глагол является первым словом в названии, например, createPyramid.

  5. В названии функции должно присутствовать существительное, показывающее над чем выполняется действие, например, fillArray.

  6. В названии метода обычно существительное не указывается, т.к. сам объект определяет над чем выполняется действие.

  7. Для функции (метода), которая возвращает логическое значение, т.е. распознает некоторую ситуацию, предпочтительней следующее название: is<название ситуации>, например, isValidInputData.

Требования к форматированию кода.

  1. В каждой строке программы записывается не более одного оператора.

  2. При применении управляющих операторов (if…else, switch…case, while, do…while, for) форматирование производится следующим образом.

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

    2. Операторы, составляющие тело цикла или условия, записываются со сдвигом вправо на 4 пробела либо 1 символ табуляции относительно начала оператора цикла или условия (и фигурных скобок).

    3. В случае оператора switch…case каждый оператор case записывается на отдельной строчке, не содержащей более ничего. Последующие операторы (включая break) располагаются со сдвигом вправо на 4 пробела либо 1 символ табуляции.

Требования к комментариям.

  1. Логические блоки программы предваряются строчкой комментария, описывающей назначение блока.

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

  3. На строке, непосредственно следующей за управляющим оператором должен содержаться комментарий, описывающий функцию (назначение) данного цикла или условия в программе.

  4. Строка, содержащая case должна содержать комментарий, описывающий рассматриваемый им случай.

  5. Для описания классов, их свойств и методов должны применяться специальные многострочные и однострочные комментарии.

Многострочные комментарии должны иметь следующий вид:

/**

комментарий

*/

Однострочные комментарии должны иметь следующий вид:

/// комментарий

Документирование классов.

/**

@class MyClass

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

*/

class MyClass : public OurClass

{

public:

/// Конструктор по умолчанию

MyClass();

/** Метод, делающий что-то. Он делает это таким-то образом.

@param [in] in_iParameter1 – параметр, отвечающий за что-то

@param [out] out_sParameter2 - параметр, отвечающий за что-то еще

@return true если все хорошо, false если все плохо

*/

bool DoSomething(int in_iParameter1,

std::string out_sParameter2);

private:

/// этот член хранит в себе какую-то информацию

int m_iParameter1;

/// этот член тоже хранит в себе какую-то информацию

std::string m_sParameter2;

}

Документирование функций.

/**

@function MyFunction

Тестовая функция для примера документирования кода. Ничего особенного не умеет, имеет один входной и один выходной параметр. Ваши функции следует документировать подобным образом.

@param [in] in_iParameter1 – параметр, отвечающий за что-то

@param [out] out_sParameter2 - параметр, отвечающий за что-то еще

@return true если все хорошо, false если все плохо

*/

bool MyFunction (int in_iParameter1,

std::string out_sParameter2);

Документирование модулей. В любом месте кода:

/**

@mainpage Этот модуль следует использовать следующим образом:

сначала его нужно собирать в VisualStudio 2005, а потом полученный dll скопировать из Bin/BCB/ в папку с .exe

*/

Пример документирования тела функции.

/* @mainpage

Поиск наибольшего числа среди массива целых чисел до первого отрицательного элемента

*/

#include "stdafx.h"

#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])

{

int Array[10]; // массив, в котором производится поиск

int i; // индекс текущего элемента массива

int Maximum; // найденное значение максимального элемента

int IndexOfMax; // номер найденного максимального элемента

//--------------------------------------------------------

// Ввод массива

input_printf("Введите элементы массива\n");

for(i=0; i<10; i++) // перебор всех элементов массива для ввода

{

input_printf("Введите %d-тый элемент \n",i+1);

scanf("%d",&Array[i]);

}

//--------------------------------------------------------

// Нахождение максимального элемента

Maximum=-1; // поскольку искомый элемент положительный,

// он точно будет больше -1

IndexOfMax=-1; // номер элемента может быть и не найден,

// тогда IndexOfMax останется -1

i=0; // начинаем с первого элемента

while(Array[i] >= 0 && i < 10) /* перебираем элементы массива

{ до первого отрицательного */

if(Array[i] > Maximum) /* если текущий элемент больше

{ любого из предыдущих, то запоминаем

его как максимальный */

Maximum = Array[i];

IndexOfMax = i;

}

i++;

}

//--------------------------------------------------------

// Вывод результатов

if(IndexOfMax == -1) // элемент не найден

printf("Массив начинается с отрицательного числа\n");

else // элемент найден

{

printf(" Искомый элемент - %d \n", Maximum);

printf(" Его номер - %d \n", IndexOfMax + 1);

}

//--------------------------------------------------------

// Задержка результатов на экране до нажатия клавиши Enter

_getch();

return 0;

}