Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 21

cout<<"\n Количество четных цифр: "<<chet;

cout<<"\n Количество нечетных цифр: "<<nechet;

}

Результат

Введите строку, состоящую из цифр и букв латинского алфавита

ytr568iu7777iuy135

Количество символов в строке: 18

Количество четных цифр: 2

Количество нечетных цифр: 8

Анализ

Если цифра четная, то и код ее четен. Например, код цифры 2 – 50, 4 – 52 и т. д.

2.  При решении задач вариантов 2, 4, 5, 7,10, 11, 17, 20 необходимо работать с отдельными словами исходной строки. Ниже приведен один из вариантов кода программы, которая позволяет разбивать исходную строку на подстроки (слова) согласно символам разделителям. Причем эти символы могут находиться не только внутри строки, но и в ее начале и конце.

Пример 9

#include <iostream>

#include <vector>

#include <string>

using namespace std;

void main()

{

setlocale(LC_ALL,"rus_rus.1251");

string s("И/дым: отечества, нам сладок и приятен!++");// Исходная строка

stringdelim(": ,/!++ ");// Символы разделители

vector<int> WordBegPos,WordLength;//Массивы начал слов и их длин

int CurBeg = 0;// Позиция начала строки на текущей итерации

while(1)

{  // Пропускаем все разделители перед началом текущего слова

while(s.find_first_of(delim,CurBeg)==CurBeg)

++CurBeg;

              // Помещаем в массив позцию начала текущего слова

  WordBegPos.push_back(CurBeg);

//Позиция, следующая за последним символом текущего слова

int CurFin = s.find_first_of(delim,CurBeg);

 if(CurFin == string::npos)// Условие выхода из цикла

{// Определяем длину последнего слова и заносим ее в массив

                        WordLength.push_back(s.size()-CurBeg);

break;

}

            // Определяем длину текущего слова и заносим ее в массив

            WordLength.push_back(CurFin-CurBeg);

CurBeg = CurFin+1;// Определяем позицию, с которой начнется

// следующая итерация

}

//Нулевая длина последнего слова говорит о наличии разделителей

//в конце строки

if(WordLength.back() == 0)

{ WordBegPos.pop_back();WordLength.pop_back();// Удаляем

// записи о них

}

cout<<endl<<"В исходной строке "<<WordBegPos.size()<<"слов"<<endl;

for(unsigned int i = 0; i<WordBegPos.size();++i)

{cout<<"\""<<s.substr(WordBegPos[i],WordLength[i])<<"\""<<endl;

}

}

Результат

Исходная строка:" И/дым: отечества, нам сладок и приятен!++"

В исходной строке 7 слов

"И"

"дым"

"отечества"

"нам"

"сладок"

"и"

"приятен"

Анализ

Функция str.find_first_of(sub,pos),начиная с позиции pos ищет в строке strи возвращает позицию первого символа, совпадающего с любым символом из подстроки sub. Если pos не задано, то оно равно нулю, т. е. поиск будет вестись с начала строки.

Функция str.substr(pos,length) выделяет подстроку строки str, начиная с позиции pos длиной length.

Исходная строка содержит символы разделители в начале, внутри и в конце строки.

В массивы WordBegPosи WordLengthпомещаются позиции, с кото-рых начинаются слова в строке, и их длины.

Используя информацию, хранящуюся в этих массивах, с помощью функции s.substrвыделяем отдельные слова из строки.

Если функция поиска не нашла требуемого вхождения, то она возвращает константу nposкласса string. Чаще всего она равна –1, но не стоит полагаться на это, поскольку числовые значения подобных констант не определены стандартом языка, а значит, могут зависеть от конкретного компилятора.

3.  При решении задач вариантов 3, 6 и 9 необходимо из отдельных слов исходной строки сформировать массив. В примере 10 функция vtokкак раз и решает эту проблему.

Пример 10

#include <iostream>

#include <vector>

#include <string>

 using namespace std;

// Функция разбиения строки на слова

vector<string> vtok(const string &s, const string &delim)

{  vector<int> WordBegPos,WordLength;//Массивы начал слов и их длин