Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» icon

Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование»






Скачать 236.58 Kb.
НазваниеПояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование»
Петров С.В
Дата конвертации21.07.2013
Размер236.58 Kb.
ТипДокументы
ФГБОУ ВПО «Чувашский государственный университет им. И.Н. Ульянова»

Кафедра вычислительной техники


Пояснительная записка

к курсовой работе по дисциплине

«Объектно-ориентированное программирование»

на тему:

«Программа проверки сбалансированности скобок в тексте»


Выполнил: студент группы ИВТ-42-10

Петров С.В.

Принял: доцент Обломов И.А.


Чебоксары 2013

Оглавление


Постановка задачи 2

Теоритические сведения 3

Выбор способа решения задачи 4

Автоматы с магазинной памятью. 4

Таблица переходов автомата. 5

Типы данных 6

Элементы ООП 7

Использование классов и инкапсуляция данных 7

Наследование 8

Полиморфизм 9

Тестирование программы 9

Выводы по работе 11

Список использованной литературы 12

Листинг программы 13



Постановка задачи


Задан исходный текст на русском языке. Составить программу для проверки сбалансированности скобок в тексте. Возможные виды скобок: (), [], {}. В файле результатов должен быть исходный текст и его первый фрагмент, начиная с несбалансированной скобки и до конца текста.

Имена входного и выходного файла передаются через командную строку. При отсутствии параметров в командной строке имена файлов назначаются по умолчанию.

При разработке должны быть использованы основные принципы объектно-ориентрованного программирования: инкапсуляция, наследование и полиморфизм.


Теоритические сведения


Для сбалансированности скобок необходимо:

  1. Количество открывающихся и закрывающихся скобок каждого вида должны быть равны.

  2. Первой скобкой обязательно должна быть открывающаяся скобка.

  3. Скобка некоторого вида должна закрывать скобку такого же вида.


Примеры:

Сбалансированные скобки:

{Весна, весна! [Как] (воздух) чист}!

Несбалансированные скобки:

  1. {Весна, весна! [Как( ]воздух) чист}!

  2. {Весна, весна! [Как] (воздух) чист!

  3. )Весна, весна! [Как] (воздух) чист}!



Выбор способа решения задачи


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

Автоматы с магазинной памятью.


Автомат с магазинной памятью (МП-автомат) имеет рабочую ленту, которая организована в виде магазина.

МП-автомат - это семерка вида: M = (К, Σ, Г, δ, p0, F, B0), где

  • К - конечное множество состояний;

  • Σ - алфавит;

  • Г - алфавит магазина;

  • δ - функция переходов;

  • p0 - начальное состояние;

  • F - множество заключительных состояний;

  • B0 - символ из множества Г для обозначения маркера дна магазина.


В общем случае команда(δ) выглядит так: pi, σ, γ → pj, λ , где

  • pi∈ K – состояние автомата до выполнения команды,

  • σ∈Vt – символ на входной ленте,

  • γ∈Γ - символ верхушки магазина,

  • pj∈ K – состояние автомата после выполнения команды,

  • λ∈Γ - символ, который записывается в магазин.


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

  • К = {q0, q1};

  • Σ = {‘(‘, ‘{‘, ‘[‘, ‘)’, ‘}’, ‘]’};

  • Г = {ø, ‘(‘, ‘{‘, ‘[‘};

  • p0 – q1;

  • F – {q0};

  • B0 - ø.



Таблица переходов автомата.




Команда

1

q1, {, X → q1, {X

2

q1, [, X → q1, [X

3

q1, (, X → q1, (X

4

q1, }, ø → q0, ø

5

q1, ], ø → q0, ø

6

q1, ), ø → q0, ø

7

q1, }, { → q1, ø

8

q1, }, [ → q0, ø

9

q1, }, ( → q0, ø

10

q1, ], [ → q1, ø

11

q1, ], ( → q0, ø

12

q1, ], { → q0, ø

13

q1, ), ( → q1, ø

14

q1, ), [ → q0, ø

15

q1, ), { → q0, ø


Автомат имеет два состояния:

  • q0 – произошла ошибка, т.е. имеется несбалансированная скобка;

  • q1 – ошибки нет.


Символ Х из таблицы соответствует одному из символов алфавита автомата.

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


Типы данных


Для реализации магазина автомата реализован собственный тип данных «Стек», который имеет следующие поля и методы:

Поля:

  • countElements - количество элементов в стеке;

  • Brackets - вид скобки.

Методы:

  • bool Empty(); - проверка стека на пустоту;

  • BracketsForStack pop(); - извлечь элемент из стека;

  • void push(int kind_bracket, int num_str, int num_ch); - занести элемент в стек.


class CStack

{

int countElements;

vector Brackets;

public:

void push(int kind_bracket, int num_str, int num_ch);

BracketsForStack pop();

bool Empty();

};


Элементы ООП

Использование классов и инкапсуляция данных


Для сканирования и анализа входного файла реализован класс «CScaner». Имеет следующие поля и методы:

  • unsigned char currCh; - текущий символ файла

  • bool isValidChar(); - проверка символа на принадлежность текущему контексту.

  • bool isBracket(); - является ли символ скобкой.

  • void analizeBracket(char bracket); - анализ скобки.

  • void outMsg(int i); - вывод сообщения для пользователя на экран.

  • CScaner(){} – конструктор по умолчанию.

  • CScaner(char *inputFile):CFile(inputFile){} – конструктор с одним параметрами, происходит явный вызов конструктора базового класса, для этого используется список инициализации.

  • CScaner(char *inputFile, char *outputFile):CFile(inputFile, outputFile){} – конструктор с двумя параметрами, происходит явный вызов конструктора базового класса.

  • void outAndAnalizeFile(); - запись в выходной файл и анализ входного файла

  • void outFromUnbalancedBracket(); - запись в выходной файл, начиная с несбалансированной скобки.



Элементы класса currCh, isValidChar(), isBracket(), analizeBracket(…), outMsg(…) являются закрытыми и доступ к ним разрешён только внутри класса.


Наследование


В данной работе реализовано множественное наследование.


Рисунок . Иерархия классов.
CAnalizer

Класс «Анализатор»


CStack

Класс «Стек»


CFile

Класс «Работа с файлами»


CScaner

Класс «Сканер»







class CScaner: public CFile, public CAnalizer, public CStack

{

};

Полиморфизм


Реализован абстрактный класс «CAnalizer», который содержит два чисто виртуальных метода. Эти методы определены в базовом классе «CScaner».


class CAnalizer

{

protected:

bool existUnbalancedBracket;

CAnalizer()

{

existUnbalancedBracket = false;

}

virtual bool isBracket() = 0;

virtual void analizeBracket(char bracket) = 0;

};






Тестирование программы


  1. Входные данные:

Командная строка: KursWork.exe

Входной файл input.txt:

Весна, {весна! Как высоко,

На крыльях (ветерка,

Ласкаясь [к] солнечным) лучам,

Летаю}т облака!

Выходные данные:

Выходной файл result.txt:

Весна, {весна! Как высоко,

На крыльях (ветерка,

Ласкаясь [к] солнечным) лучам,

Летаю}т облака!

Сообщение пользователю: Все скобки сбалансированы.

  1. Входные данные:

Командная строка: KursWork.exe in.txt

Входной файл in.txt:

Весна, [весна! Как {воздух чист!]

Как ясен небосклон!

Своей (лазурию) живой}

Слепит мне очи он.

Выходные данные:

Выходной файл result.txt:

Весна, [весна! Как {воздух чист!]

Как ясен небосклон!

Своей (лазурию) живой}

Слепит мне очи он.


{воздух чист!]

Как ясен небосклон!

Своей (лазурию) живой}

Слепит мне очи он.

Сообщение пользователю:

(строка – 1, символ - 20): несбалансированная скобка.



  1. Входные данные:

Командная строка: KursWork.exe in.txt out.txt

Входной файл in.txt:

)Весна, [весна! Как воздух чист!]

Как ясен небосклон!

Своей (лазурию) живой

Слепит мне очи он.

Выходные данные:

Выходной файл out.txt:

)Весна, [весна! Как воздух чист!]

Как ясен небосклон!

Своей (лазурию) живой

Слепит мне очи он.


)Весна, [весна! Как воздух чист!]

Как ясен небосклон!

Своей (лазурию) живой

Слепит мне очи он.

Сообщение пользователю:

(строка – 1, символ - 1): несбалансированная скобка.

  1. Входные данные:

Командная строка: KursWork.exe in.txt out.txt

Входной файл input.txt:

Весна, [весна! Как воздух чист!]

Как ясен небосклон!

Своейv (лазурию) живой

Слепит мне очи он.

Выходные данные:

Сообщение пользователю:

(строка – 3, символ - 6): строка не принадлежит текущему

контексту.


Выводы по работе


В результате выполнения курсовой работы были углублены и закреплены теоретические знания и навыки практического применения основных принципов объектно-ориентированного программирования, были закреплены знания языка С++.

Применение объектно-ориентированного подхода улучшило читабельность кода и структуру всей программы. Каждый класс разработан для конкретных определённых действий и реализован в отдельных модулях программы.


Список использованной литературы


  1. Герберт Шилдт «Полный справочник по C++» – 4-е изд, 2006 г., изд.: Вильямс, ISBN: 5-8459-0489-7

  2. Павловская Т. А. «C/C++. Программирование на языке высокого уровня» – 2003 г., изд.: Питер, ISBN: 5-94723-568-4





Листинг программы


main.cpp

#include "CScaner.h"


CScaner *scaner = new CScaner();


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

{

// передача параметров из командной строки

if(argc == 2) scaner = new CScaner(argv[1]);

if(argc == 3) scaner = new CScaner(argv[1], argv[2]);


setlocale(LC_ALL, "rus");

// вывод и анализ всего файла

scaner->outAndAnalizeFile();

// вывод файла, начиная с первой несбалансированной скобки

scaner->outFromUnbalancedBracket();


return 0;

}


CFile.h

#pragma once

#include

using namespace std;


// Класс для работы с входным и выходными файлами

class CFile

{

protected:

int numStr; // номер строки

int numCh; // номер символа

char *inputFileName; // имя входного файла

char *outputFileName; // имя выходного файла

ifstream inputFile; // входной файл

ofstream outputFile; // выходной файл


public:

CFile()

{

numStr = 1;

numCh = 0;

inputFileName = "input.txt";

outputFileName = "result.txt";

}


CFile(char *input)

{

numStr = 1;

numCh = 0;

inputFileName = input;

outputFileName = "result.txt";

}


CFile(char *input, char *output)

{

numStr = 1;

numCh = 0;

inputFileName = input;

outputFileName = output;

}


// открыть все файлы

void openFiles();

// закрыть все файлы

void closeFiles();

// прочитать символ из входного файла

char readChar();

// записать символ в выходной файл

void writeChar(char);

};

CFile.cpp

#include "CFile.h"

#include

using namespace std;


void CFile::openFiles()

{

inputFile.open(inputFileName);

outputFile.open(outputFileName);

if(!inputFile||!outputFile)

{

cout << "Не удалось открыть некоторый файл..." << endl;

closeFiles();

system("pause");

exit(0);

}

}


void CFile::closeFiles()

{

inputFile.close();

outputFile.close();

}


char CFile::readChar()

{

char temp;

temp = inputFile.get();

return temp;

}


void CFile::writeChar(char ch)

{

outputFile << ch;

return;

}


CAnalizer.h

#pragma once


// Абстрактный класс "Анализатор"

class CAnalizer

{

protected:

bool existUnbalancedBracket; // существует несбалансированная скобка


CAnalizer()

{

existUnbalancedBracket = false;

}

virtual bool isBracket() = 0;

virtual void analizeBracket(char bracket) = 0;

};


CScaner.h

#pragma once

#include "CFile.h"

#include "CStack.h"

#include "CAnalizer.h"


// Производный класс "Сканер"

class CScaner: public CFile, public CAnalizer, public CStack

{

unsigned char currCh; // текущий символ

// является ли символ русской буквой

bool isValidChar();


// является ли символ скобкой

bool isBracket();


// анализ скобки

void analizeBracket(char bracket);


// вывод сообщения

void outMsg(int i);

public:

// конструкторы

CScaner(){}

CScaner(char *inputFile):CFile(inputFile){}

CScaner(char *inputFile, char *outputFile):CFile(inputFile, outputFile){}


// запись в выходной файл и анализ входного файла

void outAndAnalizeFile();


// запись в выходной файл, начиная с несбалансированной скобки

void outFromUnbalancedBracket();

};


CScaner.cpp

#include "CScaner.h"


bool CScaner::isValidChar()

{

if((currCh>=65 && currCh<=90)||(currCh>=97 && currCh<=122))

return false;

else return true;

}


bool CScaner::isBracket()

{

if((currCh=='(')||(currCh==')')||(currCh=='[')||(currCh==']')||(currCh=='{')||(currCh=='}'))

return true;

else return false;

}


void CScaner::analizeBracket(char bracket)

{

BracketsForStack temp(0, 0, 0);

switch(bracket)

{

case '(': push(0, numStr, numCh); break;

case '[': push(1, numStr, numCh); break;

case '{': push(2, numStr, numCh); break;

case ')':

if(!Empty())

{

temp = pop();

if(temp.kindBracket != 0)

{

existUnbalancedBracket = true;

numStr = temp.numStr;

numCh = temp.numCh;

}

}

else existUnbalancedBracket = true;

break;

case ']':

if(!Empty())

{

temp = pop();

if(temp.kindBracket != 1)

{

existUnbalancedBracket = true;

numStr = temp.numStr;

numCh = temp.numCh;

}

}

else existUnbalancedBracket = true;

break;

case '}':

if(!Empty())

{

temp = pop();

if(temp.kindBracket != 2)

{

existUnbalancedBracket = true;

numStr = temp.numStr;

numCh = temp.numCh;

}

}

else existUnbalancedBracket = true;

break;

}

}


void CScaner::outAndAnalizeFile()

{

openFiles();


// чтение символа

currCh = readChar();

do

{

if(!existUnbalancedBracket)

{

numCh++;

if(currCh == '\n')

{

numStr++;

numCh = 0;

}

}

// если символ не русский, то вывод сoобщения и выход

if(!isValidChar())

outMsg(0);


// если это скобка и не сущ-ет несбалансированной скобки, то анализируем её

if(isBracket() && (!existUnbalancedBracket))

analizeBracket(currCh);


// записываем символ в выходной файл

writeChar(currCh);


currCh = readChar();


} while(!inputFile.eof());


inputFile.close();

}


void CScaner::outMsg(int i)

{

// 0 - символ не является русским

// 1 - несбалансированная скобка

// 2 - все скобки сбалансированы

switch(i)

{

case 0: cout << "(строка - " << numStr << ", символ - " << numCh << "): " <<

"cимвол не принадлежит текущему контексту." << endl;

closeFiles();

openFiles();

closeFiles();

break;

case 1: cout << "(строка - " << numStr << ", символ - " << numCh <<

"): несбалансированная скобка." << endl;

break;

case 2: cout << "Все скобки сбалансированы." << endl;

}

system("pause");

exit(0);

}


void CScaner::outFromUnbalancedBracket()

{

char str[255];

if(!existUnbalancedBracket && !Empty())

{

BracketsForStack temp(0, 0, 0);

while(!Empty())

temp = pop();

numStr = temp.numStr;

numCh = temp.numCh;

existUnbalancedBracket = true;

}


if(existUnbalancedBracket)

{

inputFile.open(inputFileName);

// сдвиг указателя чтения входного файла на первую

// несбалансированную скобку

for(int i = 0; i < numStr-1; i++)

{

inputFile.getline(str, 255);

inputFile.get();

}

for(int i = 0; i < numCh-2; i++)

readChar();


writeChar('\n');

writeChar('\n');


currCh = readChar();

do

{

writeChar(currCh);

currCh = readChar();

} while(!inputFile.eof());


closeFiles();

outMsg(1);

}

else outMsg(2);

}


CStack.h

#pragma once

#include

#include


using namespace std;


// Класс "Скобки"

class BracketsForStack

{

public:

short int kindBracket; // вид скобки: 0 = '(', 1 = '[', 2 = '{'

int numStr; // номер строки

int numCh; // номер символа в строке

BracketsForStack(int kind_bracket, int num_str, int num_ch)

{

kindBracket = kind_bracket;

numStr = num_str;

numCh = num_ch;

}

};


// Класс "Стек скобок"

class CStack

{

int countElements; // количество элементов в стеке

vector Brackets; // элементы - скобки


public:

CStack()

{

countElements = 0;

}


void push(int kind_bracket, int num_str, int num_ch)

{

BracketsForStack temp(kind_bracket, num_str, num_ch);

countElements++;

Brackets.push_back(temp);

}

BracketsForStack pop()

{

if(!Empty())

{

countElements--;

}

else

{

cout << "Ошибка: стек пуст, извлечение невозможно..." << endl;

system("pause");

exit(0);

}

BracketsForStack temp = Brackets.at(countElements);

Brackets.pop_back();

return temp;

}


bool Empty()

{

if(countElements == 0)

return true;

else return false;

}

};


Ваша оценка этого документа будет первой.
Ваша оценка:

Похожие:

Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconШаблон иерархической структуры данных в памяти Пояснительная записка к Курсовой работе по дисциплине «Объектно-ориентированное программирование»
175.2kb.  
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconОтчет по курсовой работе по дисциплине «Объектно ориентированное программирование» студент гр. Б03-781-1 Кузьмин И. А
85.1kb.  
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconОтчет по лабораторной работе №1 «Объектно-ориентированное программирование» по дисциплине
257.6kb.  
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconКурсовая работа по дисциплине «Объектно-ориентированное программирование»
45.5kb.  
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconПояснительная записка к Курсовой работе по дисциплине «Функциональное и логическое программирование»
98.1kb.  
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconПояснительная записка к курсовой работе по дисциплине “Программирование” на тему “Расчет макроэкономических индексов цен”
168.5kb.  
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconПояснительная записка к курсовой работе по дисциплине «Программирование» на тему: «Создание программы для работы с последовательностями»
376.1kb.  
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconАлгоритм Форда-Фалкерсона по дисциплине Программирование
162.4kb.   Пояснительная записка к курсовой работе: 18с., 5 рис., 0 табл., 3 разделов, 2 приложения
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconОтчет по лабораторной работе №4 по дисциплине «Технология разработки по» на тему: «Объектно-ориентированное проектирование» 6
11.3kb.  
Пояснительная записка к курсовой работе по дисциплине «Объектно-ориентированное программирование» iconПояснительная записка к курсовой работе по курсу «Системное программирование»
424.6kb.  
Разместите кнопку на своём сайте:
Рефераты


База данных защищена авторским правом ©CoolReferat 2000-2018
обратиться к администрации | правообладателям | пользователям
Основная база рефератов
Рефераты