Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_8_метод_указания.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
623 Кб
Скачать
☆

Выделение подстроки, метод substr

#include <string>

int main()

{

string s1("123456");

string s2;

s2 = s1.substr(2,3); //в s2 заносятся 3 символа s1 с позиции 2

cout<<"s2="<< s2<<endl;

s2 = s1.substr(3); //в s2 заносятся все символы s1 с позиции 3

cout<<"s2="<< s2<<endl;

s2 = s1.substr(); //s2=s1

cout<<"s2="<< s2<<endl;

_getch();

return 0;

}

Обеспечение ввода символов только из заданного набора

#include <string>

int main()

{

string s = "ABCDEFGH";

char symb;

cout<< "symbol=?";

while (1) { //цикл не допустит ввод символов не из строки s

cin >> symb;

if (s.find(symb)==-1) {

cout<< "ne tot symbol;\n symbol=?";

continue;

}

cout<< "OK!!!" << endl;}

_getch();

return 0;

}

Подсчет количества вхождений слова в текст

Определить, сколько раз встретилось заданное слово в текстовом файле.

Определим слово в тексте как последовательность алфавитно-цифровых символов, после которых следует либо знак пунктуации (точка, запятая, вопросительный знак, восклицательный знак), либо разделитель (один или несколько пробелов, символов табуляции ‘\t’ и символ конца строки ‘\n’. Для хранения заданного слова (оно вводится с клавиатуры) определим переменную word типа string.

Поскольку максимальная длина строки в файле неизвестна, будем читать файл пословно, помещая каждое очередное прочитанное слово в переменной сurword типа string. Такое чтение можно реализовать с помощью операции >>, которая в случае операнда типа string игнорирует все разделители, предваряющие текущее слово, и считывает символы текущего слова в переменную сurword, пока не встретится очередной разделитель. «Опознание» текущего слова должно осуществляться с учетом возможного наличия после него одного из знаков пунктуации. Для решения этой задачи определим глобальную функцию

bool equal(const string& cw, const string& w);

которая возвращает значение true, если текущее слово cw совпадает с заданным словом w с точностью до знака пунктуации, в противном случае – false.

// stdafx.h

#pragma once

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <tchar.h>

// TODO: reference additional headers your program requires here

#include <string>

#include <fstream>

#include <iostream>

#include <conio.h>

using namespace std;

bool equal(const string& cw, const string& w);

////////////////////////////////////////////////////////////////////////

// main.cpp

#include "stdafx.h"

int main ()

{

string word, curword;

cout << "input" << endl; cin >> word;

ifstream fin ("infile.txt", ios::in);

if(!fin) {cout << "error" << endl; _getch(); return 1;}

int count =0;

while (!fin.eof()) {

fin >> curword;

if (equal(curword, word)) count++;

}

cout << count << endl;

_getch();

return 0;

}

bool equal(const string& cw, const string& w)

{

char punct[]= {'.',',','?','!'};

if (cw==w) return true;

for (int i=0; i< sizeof(punct); ++i)

if (cw==w + punct[i]) return true;

return false;

}

Вывод вопросительных предложений

Считать текст из файла и вывести из него только вопросительные предложения.

Имеем текстовый файл неизвестного размера, состоящий из неизвестного количества предложений. Предложение может занимать несколько строк, поэтому читать файл построчно неудобно (сложный алгоритм). Будем читать файл пословно в переменную word типа string и отправлять каждое прочитанное слово в строковый поток sentence типа ostringstream, который будет хранилищем предложения. Так как при чтении из файла с помощью операции fin >> word, происходит потеря разделителей, то будем «заглядывать» в следующую позицию файлового потока fin с помощью операции peek(). При обнаружении символа-разделителя его нужно отправить в поток sentence и переместиться в потоке fin на следующую позицию, используя метод seekg(). Обнаружение символа-разделителя реализуем в глобальной функции isLimit().

// stdafx.h

#pragma once

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <tchar.h>

#include <string>

#include <fstream>

#include <iostream>

#include <fstream>

#include <sstream>

#include <conio.h>

using namespace std;

bool isLimit(char c);

////////////////////////////////////////////////////////////////////////

// main.cpp

#include "stdafx.h"

int main ()

{

ifstream fin ("aaaaa.txt", ios::in);

if(!fin) {cout << "error" << endl; _getch(); return 1;}

int count =0;

string word;

ostringstream sentence;

while (true) {

char symb;

while (isLimit(symb = fin.peek())) { //если разделитель

sentence << symb; //записывем его в поток

if (symb=='\n') break;

fin.seekg(1, ios::cur);

}

fin >> word; //читаем из файла слово

if (fin.eof()) break;

sentence << word; //записываем слово в строковый поток

char last = word[word.size() - 1]; //выделяем последний символ слова

if ((last=='.')|| (last == '!')) { //если предложение не ?

sentence.str(""); //очистка строкового потока

continue;

}

if (last=='?') {

cout << sentence.str(); //вывод содержимого потока

sentence.str(""); //очистка потока

count++;

}

}

if (!count) cout << "? net " << endl;

_getch();

return 0;

}

bool isLimit(char c) {

char lim[]= {' ','\t','\n'};

for (int i=0; i< sizeof(lim); ++i)

if (c==lim[i]) return true;

return false;

}