|
Программирование >> Разработка устойчивых систем
string sieveChars: public: Создание строки длиной 50 и заполнение ее символов значениями Р (сокращение от Prime, то есть простое число ) SieveTestO : sieveChars(50. Р) {} void runO { fi ndPrimesO: testPrimesO: bool isPrime(int p) { if (p == 0 II p -= 1) return false: int root = int(sqrt(double(p))): for (int i = 2: i <= root: ++i) if (p X i ==0) return false: return true: void findPrimesO { По определению числа О и 1 не являются простыми. Заменяем зти элементы символами N . SieveChars.replасе(О, 2. NN ): Перебор массива: size t sieveSize = sieveChars.sizeO: int root = int(sqrt(double(sieveSize))): for (int i =2: i <- root: ++i) Поиск всех кратных чисел: for (size t factor = 2: factor * i < sieveSize: ++factor) sieveChars[factor * i] = N; void testPrimesO { size t i = SieveChars.find(P): while (i != string::npos) { test (isPrime(i++)): i = SieveChars.find(P. i): i = sieveChars.find first not of(P): while (i != string::npos) { test (!isPrime(i++)): i = sieveChars.find first not of(P. i); lendif SIEVE H /:- : C03:Sieve.cpp {L} ../TestSuite/Test linclude ../TestSuite/Test.h #include Sieve.h int mainO { SieveTest t; t.runO; return t.reportO: } /:- Функция find() перебирает содержимое string в прямом направлении; с ее помощью можно найти все вхождения символа или группы символов. Функция find first not of() ищет символы или подстроки, не соответствующие заданному критерию. В классе string не предусмотрены функции для изменения регистра символов, однако такие функции легко реализуются на базе стандартных библиотечных функций toupper() и tolower() языка С, изменяющих регистр отдельного символа. В следующем примере продемонстрирован поиск без учета регистра: : C03:F1nd.h #ifndef FINO H Idefine FIND H Unci ude <cctype> #i nclude <cstddef> #1 nclude <string> #include ../TestSuite/Test.h using std::si2e t: using std::string: using std::tolower: using std::toupper: Создание копии s в верхнем регистре string upperCaseCconst strings s) { string upper(s): for(size t i = 0: i < s.lengthO: ++i) upper[i] = toupper(upper[i]): return upper: Создание копии s в нижнем регистре string lowerCaseCconst strings s) { string lower(s): for(size t i = 0: i < s.lengthO: ++i) lower[i] = tolower(lower[i]): return lower: class FindTest : public TestSuite::Test { string chooseOne: public: FindTestO : chooseOneCEenie. Meenie. Miney. Mo ) {} void testUpperO { string upper = upperCase(chooseOne): const string LOWER = abcdefghijklmnopqrstuvwxyz : test (upper.find first of(LOWER) == string::npos): } void testLowerO { string lower = 1owerCase(chooseOne): const string UPPER = ABCOEFGHIJKLMNOPQRSTUVWXYZ : test (lower.find first of(UPPER) == string::npos): void testSearchO { Поиск с учетом регистра size t i = ChooseOne.find( een ): testji ==8): Поиск в нижнем регистре: string test = lowerCase(chooseOne); i = test.find( een ): testji ==0): i = test.find( een . ++i): test (i ==8): i = test.find( een . ++i): test (i == string::npos): Поиск в верхнем регистре test = upperCase(chooseOne): 1 = test.findCEEN ): testji ==0): 1 = test.findCEEN . testji ==8): i = test.findCEEN . ++i): test (i == string::npos): void runO { testUpperO: testLowerO: testSearchO: lendif FINO H III:- II: C03:Find.cpp {L} ../TestSuite/Test linclude Find.h linclude ../TestSuite/Test.h int mainO { FindTest t: t.runO: return t.reportO: } III:- Функции UpperCaseO и lowerCase() работают no одному принципу: они создают копию своего аргумента типа string с измененным регистром символов. Программа Find.срр не лучшим образом решает проблему изменения регистра, и мы вернемся к sToii проблеме, когда будем рассматривать сравнения строковых объектов. Поиск в обратном направлении Если поиск в строке требуется выполнять от конца к началу (чтобы искать данные от последнего вхождения к первому ), воспользуйтесь функцией rfind(): : C03:Rparse.h lifndef RPARSEJ Idefine RPARSE H linclude <cstddef> #include <string> linclude <vector> iinclude ../TestSuite/Test.h using std::Size t: using std::string: using std::vector: class RparseTest : public TestSuite::Test { Вектор для хранения слов: vector<string> strings: public: void parseForOataO { Символы : являются ограничителями string s( now.:sense:make:to:going:is:This ): Последний элемент строки: int last = s.SizeO:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |