lab1_Retivih_Skorikov
.docx
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ
УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-
вычислительных систем (КИБЭВС)
АЛГОРИТМ ОПРЕДЕЛЕНИЯ КОНЦА ПРЕДЛОЖЕНИЯ В ТЕКСТАХ
Отчет по лабораторной работе №1
по дисциплине «Языки программирования»
Выполнили:
Студенты гр. 724
_______ _____ Ретивых В.А.
_______ _____ Скориков И.И.
21.09.2015
Принял:
Кандидат технических наук
кафедры КИБЭВС
_______ _____ Романов А.С.
21.09.2015
2015
1 Цель работы
Разработать алгоритм, определяющий конец предложения в тексте, написанном на русском языке.
2 Алгоритм
Рисунок 1 – Алгоритм на основе конечного автомата
3 Исходный код программы
#include <QRegExp>
#include <QFile>
#include <QTextStream>
#include <QStringList>
#include <QDebug>
#include <QTextCodec>
#include <QStringRef>
#include <iostream>
#include "main.h"
#define DICT_FILE "dict.txt"
using namespace std;
QStringList ReadFile(QString fileName) {
QStringList content;
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream textStream(&file);
while (!textStream.atEnd()) {
QString line = textStream.readLine();
content.append(line);
}
}
return content;
}
qint32 CheckGeo(QString text, qint32 end) {
QStringList dict = ReadFile(DICT_FILE);
qint32 start = end;
while (text.at(start-1).isLetter())
--start;
QStringRef subString(&text, start, end-start+1);
foreach (QString str, dict) {
if (str == subString) {
return 1;
}
}
return 0;
}
qint32 SentenceEnd(QString text) {
QRegExp rx1(QString::fromUtf8("[\\.]"));
QRegExp rx2(QString::fromUtf8("[!?]"));
QRegExp rx3(QString::fromUtf8("[ ]"));
QRegExp rx4(QString::fromUtf8("[А-Я]"));
QRegExp rx5(QString::fromUtf8("[\\w,:]"));
QRegExp rx6(QString::fromUtf8("[а-я]"));
qint32 result = text.length() - 1;
qint32 state = 1;
for (qint32 i = 0; i < text.length(); ++i) {
switch (state) {
case 0:
return result;
break;
case 1:
result = text.length() - 1;
if (rx4.exactMatch(text.at(i))) {
state = 2;
} else if (rx2.exactMatch(text.at(i))) {
state = 3;
} else if (rx1.exactMatch(text.at(i))) {
state = 4;
}
break;
case 2:
if (rx4.exactMatch(text.at(i))) {
state = 8;
} else {
state = 1;
}
break;
case 3:
if (!rx2.exactMatch(text.at(i))) {
state = 0;
result = i - 1;
}
break;
case 4:
if (rx2.exactMatch(text.at(i))) {
state = 3;
} else if (rx1.exactMatch(text.at(i))) {
state = 5;
} else if (rx5.exactMatch(text.at(i))) {
state = 1;
} else if (rx3.exactMatch(text.at(i))) {
state = 6;
} else {
state = 0;
result = i - 1;
}
break;
case 5:
if (!rx1.exactMatch(text.at(i))) {
state = 0;
result = i - 1;
}
break;
case 6:
if (rx6.exactMatch(text.at(i))) {
state = 1;
} else {
state = 7;
}
break;
case 7:
state = CheckGeo(text, i - 4);
result = i - 3;
break;
case 8:
if (rx4.exactMatch(text.at(i))) {
state = 8;
} else if (rx1.exactMatch(text.at(i))) {
state = 4;
} else if (rx2.exactMatch(text.at(i))) {
state = 3;
} else {
state = 1;
}
break;
default:
break;
}
}
return result;
}
qint32 main(qint32 argc, char** const argv) {
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));
QTextStream qtin(stdin);
QString text = qtin.readLine();;
if (!text.isEmpty())
cout << SentenceEnd(text) << "\n";
return 0;
}
4 Результат работы программы
Рисунок 2 – Результат работы программы
5 Тесты
Рисунок 3 – Тесты
6 Заключение
В процессе выполнения лабораторной работы был разработан алгоритм, определяющий конец предложения в тексте, написанном на русском языке.