Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <locale>
using namespace std;
int main()
{ setlocale(LC_ALL, "Russian");
locale loc ("Russian_Russia");
cout << "Задание:\nНаписать программу, которая считывает текст\n из файла и выводит на экран предложения, \n содержащие максимальное количество знаков пунктуации.\n";
/*устанавливаем русскую локаль - чтобы писать русскими буквами =)*/
//открываем файл для чтения
ifstream FileInput("file.txt",ios::in);
//если файл не обнаружен, то аварийно выходим
if (!FileInput)
{
cout << "Ошибка! Файл не открыт!" << endl;
return 1;
}
cout << "Текст,в котором осуществляется поиск предложения с max кол-вом знаков пунктуации\n";
cout << "Чтение из файла выполняется функцией fread(buf, size, num, file) блоками по size байт!Требуется также задать количество блоков num.В программе размер блока задан в переменной равным 1024, поскольку размер кластера кратен степени двойки.В общем случае чем более длинными блоками мы читаем информацию, тем быстрее будет выполнен ввод.Для того, чтобы обеспечить чтение всего файла, к количеству блоков добавляется 1 для округления после деления.\n";
//устанавливаем позицию курсора в конец файла
FileInput.seekg(0,ios::end);
/*узнаем длину файла методом tellg(), который сообщает о позиции курсора в файле (т.е. сколько байт прошел курсор)*/
int LengthOfFile = FileInput.tellg();
//создаем переменную для хранения содержимого файла
char *str = new char [LengthOfFile+1];
//устанавливаем позицию курсора в начало файла
FileInput.seekg(0,ios::beg);
/*считываем содержимое файла в переменную str на заданное число байт LengthOfFile*/
FileInput.read(str,LengthOfFile);
//добавляем символ конца строки в переменную str
str[LengthOfFile]='\0';
/*pos - текущая позиция в файле;
counter - текущее кол-во пунктационных знаков;
max - текущее максимальное кол-во пунктационных знаков;
l - число символов в предложении;
begin, end - начало и конец предложения с макс. кол-вом пункт. знаков*/
int pos = 0,l = 0,end = 0,begin = 0;
int counter = 0,max = 0;
//поиск предложения c макс кол-вом пункт. знаков
while (str[pos])
{
/*если текущий символ явл-ся пунктационным, то счетчик увеличиваем на 1*/
if (ispunct(str[pos],loc)) counter++;
//если достигнут конец предложения, то...
if (str[pos]=='.' || str[pos]=='!' || str[pos]=='?')
/*...при условии максиммального кол-ва пунктационных символов вычисляем начало и конец данного предложения...*/
if (counter>max)
{
max = counter;
counter = 0;
/*здесь вычисляем начало предложения из текущего положения вычитаем кол-во прошедших символов*/
begin = pos - l;
end = pos;
l = 0;
}
/*...иначе обнуляем количество пунктационных символов и количество символов в пердложении*/
else {counter = 0; l = 0;}
l++;
pos++;
}
l = begin;
//Вывод предложения с максимальным количеством пунктационных знаков
for(l; l < end + 1; l++)
cout << str[l];
return 0;
}
Рисунок 8.4 – Файл для входных данных
Дата публикования: 2015-10-09; Прочитано: 361 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!