Читайте также:
|
|
Написать программу, которая считывает текст из файла и выводит на экран только предложения, состоящие из заданного количества строк. UML-диаграмма этого алгоритма приведена на рисунке 8.1.
Рисунок 8.1 - UML-диаграмма деятельности для примера 8.4
Листинг 8.5
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
cout<<"\n"
<<"Задание: Считать текст из файла. Вывести на экран только предложения, \n"
<<"\tсостоящие из заданного количества слов\n"
<<"----------------------------------------\n";
ifstream fin("text.txt",ios::in);
if (! fin)
{
cout<<"Ошибка открытия файла"<<endl;
return 1;
}
int nword;
cout<<"Введите искомое число слов в предложении: ";
cin>>nword;
fin.seekg(0,ios::end);
int len=fin.tellg();
char *buf=new char [len+1];
fin.seekg(0,ios::beg);
fin.read(buf,len);
buf[len]='\0';
int l_beg=0,i=0,n=0,j=0;
bool exist;
exist=false;
while (buf[i])
{
if (buf[i]==' ') n++;
if (buf[i]=='.')
{
n++;
if (n==nword)
{
for(j=l_beg;j<=i;j++)
cout<<buf[j];
exist=true;
cout<<endl;
}
l_beg=i+2;
i=i+2;
n=0;
}
i++;
}
if (!exist) cout<<"Таких предложений не найдено"<<endl;
fin.close();
return 0;
}
Рисунок 8.2 – Файл для входных данных
Пример 8.5. Вывод предложений, содержащих максимальное количество знаков пунктуации
Написать программу, которая считывает текст из файла и выводит на экран только предложения, содержащие максимальное количество знаков пунктуации. UML-диаграмма этого алгоритма приведена на рисунке 8.3.
Рисунок 8.3 - UML-диаграмма деятельности для примера 8.5
Листинг 8.6
#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-26; просмотров: 344 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пример 7.9. Перегрузка функций | | | Пример 8.6. Определение количества слов в файле, состоящих не более чем из четырех букв |