МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Институт – Институт кибернетики
Направление – Информационные системы и технологии
Кафедра – Вычислительная техника
Обработка строк и символов
Отчет по лабораторной работе № 1
по курсу «Программирование на ЯВУ»
Вариант № 8
Выполнил: студент гр. 8И12 | ________ | ___.___._____ | А.В. Матвиенко |
Проверил: ассистент кафедры ВТ | ________ | ___.___._____ | А.В. Лепустин |
Томск – 2011
ЦЕЛЬ
Приобрести практические навыки в разработке и программной реализации алгоритмов обработки строк с использованием функций стандартных библиотек.
ЗАДАНИЕ
С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина строки текста не должна превышать 70 символов). Имя файла должно иметь расширение DAT. Написать программу, которая:
1) выводит текст на экран дисплея;
2) определяет количество символов в самом коротком слове;
3) по нажатию произвольной клавиши поочередно выделяет каждое слово текста, содержащее минимальное количество символов.
- ЛИСТИНГ ПРОГРАММЫ
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include <conio.h>
HANDLE hConsole;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
using namespace std;
void SetColor(int text, int background);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0, "RUS"); // Руссификация
system("mode con cols=100 lines=40"); // Изменение размеров окна
SetColor(15, 0); // Установить цвет вывода текста
int SizeShortWord = -1; // Длина короткого слова
int TempSize; // Длина текущего считанного слова
bool IsFinishSearch = false; // Признак
bool exit = false; // Признак завершения программы
bool ColorWordIsWrite = false;
int Symbols = 0;
// Считывание текста из файла
string fileName = "input.dat", buffer;
ifstream InputFile(fileName.c_str());
// Если файл не существует - завершить программу с ошибкой
if (!InputFile)
{
cout << "Файл не может быть открыт:(\n";
system("pause");
return 1;
}
cout << "Содержимое файла: \n\n";
string str; // Текущее выделенное слово
char ch; // Символ, следующий за словом
// Поиск самого короткого слова
do
{
InputFile >> str;
Symbols += str.size();
cout << str;
TempSize = 0;
for (int i = 0; i < str.size(); i++)
{
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z') || (ch >= 'а' && ch <= 'я') || (ch >= 'А' && ch <= 'Я'))
{
TempSize++;
}
else
{
if (str[i] == '-' && str.size() > i + 1)
{
TempSize++;
}
else
{
break;
}
}
}
if ((SizeShortWord > TempSize || SizeShortWord == -1) && TempSize!= 0)
{
SizeShortWord = TempSize;
}
do
{
InputFile.get(ch);
if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch >= 'а' && ch <= 'я') || (ch >= 'А' && ch <= 'Я')))
{
cout << ch;
Symbols++;
if (ch == '\n')
Symbols++;
}
else
{
if (!InputFile.eof())
InputFile.seekg(Symbols - 1);
break;
}
}
while (!InputFile.eof());
}
while (!InputFile.eof());
cout << "\n\n";
cout << "Самое короткое слово состоит из " << SizeShortWord << " символа(ов).\n\n";
cout << "Нажмите любую клавишу для выделения слова.\n";
InputFile.clear(); // Обнулить eof
InputFile.seekg(0, std::ios::beg); // Переместить указатель в начало файла
int NowOutWord = 0;
int OutWord = 0;
int NowWord;
do
{
_getch();
system("cls");
Symbols = 0;
cout << "Содержимое файла: \n\n";
NowWord = 0;
NowOutWord = 0;
ch = '^';
// Вывод
do
{
InputFile >> str;
Symbols += str.size();
NowWord++;
// Проверяем все слова, пока не встретим слово, которое требуется выделить
if (!IsFinishSearch)
{
TempSize = 0;
for (int i = 0; i < str.size(); i++)
{
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= '0' && str[i] <= '9') || (ch >= 'а' && ch <= 'я') || (ch >= 'А' && ch <= 'Я'))
{
TempSize++;
}
else
{
if (str[i] == '-')
{
TempSize++;
}
else
{
break;
}
}
}
if (TempSize == SizeShortWord)
{
if (NowOutWord == OutWord)
{
IsFinishSearch = true;
OutWord++;
for (int i = 0; i < str.size(); i++)
{
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z') || (ch >= 'а' && ch <= 'я') || (ch >= 'А' && ch <= 'Я'))
{
SetColor(0, 14);
}
else
{
if (!(str[i] == '-' && str.size() > i + 1))
SetColor(15, 0);
}
cout << str[i];
}
ColorWordIsWrite = true;
}
NowOutWord++;
}
}
if (!ColorWordIsWrite)
{
SetColor(15, 0);
cout << str;
}
else
{
ColorWordIsWrite = false;
}
SetColor(15, 0);
do
{
InputFile.get(ch);
if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch >= 'а' && ch <= 'я') || (ch >= 'А' && ch <= 'Я')))
{
cout << ch;
Symbols++;
if (ch == '\n')
Symbols++;
}
else
{
if (!InputFile.eof())
InputFile.seekg(Symbols - 1);
break;
}
}
while (!InputFile.eof());
if (InputFile.eof() &&!IsFinishSearch)
{
exit = true;
}
}
while (!InputFile.eof());
cout << "\n\n";
cout << "Самое короткое слово состоит из " << SizeShortWord << " символа(ов).\n\n";
cout << "Нажмите любую клавишу для выделения слова.\n";
IsFinishSearch = false;
InputFile.clear();
InputFile.seekg(0, std::ios::beg); // Переместить указатель в начало файла
}
while (!exit);
InputFile.close();
SetColor(15, 0);
cout <<"\n\n";
system("pause");
return 0;
}
void SetColor(int text, int background)
{
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ
Таблица 1
Содержимое файла:
Lorem Ipsum is simply dummy text of the printing and typesetting
industry. Lorem Ipsum has been the industry's standard dummy text
ever since the 1500s, when an unknown printer took galley of type
and scrambled it to make type specimen book. It has survived not
only five centuries, but also the leap into electronic typesetting,
remaining essentially unchanged. It was popularised in the 1960s
with the release of Letraset sheets containing Lorem Ipsum passages,
and more recently with desktop publishing software like Aldus
PageMaker including versions of Lorem Ipsum.
Самое короткое слово состоит из 2 символа(ов).
Нажмите любую клавишу для выделения слова.
ВЫВОД
В ходе лабораторной работы улучшены навыки работы с файлами и изучены функции работы со строками из библиотеки <string.h>, реализована программа, решающая задачу поиска минимальной длины слова и поочерёдного выделения слов минимальной длины по нажатию любой клавиши.
Для считывания слов были использованы стандартные функции чтения строк из потока по словам (до пробела) и метод get класса ifstream для считывания следующего символа. Для навигации в потоке использован метод seekg класса ifstream. Для обнуления признака окончания файла использован метод clear.