Г. Шилдт - Полный справочник по C++ (1109478), страница 21
Текст из файла (страница 21)
Самыми распространенными среди них являются следующие. рггпс1("длина строк: Фс) ас]1п", ясг1еп(я1), ясг1еп(я2)]: 11[!ясгсюр(я1, я2)) рг1пгг("Строки олинаковы1п']; ясгсас(я1, я2); ргзпг Х ( 'Вятп", я1]; ясгсру(я1, '"Проверка. 1п'): рг1пст(я1); 11(ясгспг('Привет", 'е')) рггпст("В слове 1"Приветх" есть буква 1"е1" 1п"); 11(ясгягг('Привет", "ив")) рг1псб('В слове 1"Привет1" есть сочетание букв 1'ив1""); гесигп О," Если запустить на выполнснис эту программу и ввести строки "Привет" и "Привет", то на экран будут выведены следующие сообщению длина строк: б б Строки одинаковы ПркветПривет Проверка В слове "Привет" есть буква 'е" В слове "Привет" есть сочетание букв "ив' Обратите внимание на то, что функция всгсвр() возвращает ложное значение, только если строки одинаковы.
Если необходимо проверить, совпадают ли строки мс- „5 жду собои, следует использовать логический оператор отрицания "(". Несмотря на то что в языке С++ для строк предусмотрен отдсльныи класс, строки, завершающиеся нулевым байтом, по-прежнему весьма популярны. Возможно, зто происходит благодаря тому, что они очень эффективны и позволяют программистам полностью контролировать операции над строками.
Однако во многих ситуациях очень удобно использовать класс ввг1пвь :1 Двухмерные массивы В языке С/Сч ь предусмотрены многомерные массивы. Простейшим из них является двухмерный. По существу, двухмерный массив — это массив одномерных массивов. Объявлснис двухмерного массива б, состоящего из [О строк и 20 столбцов, выглядит следующим образом. я ьпс В[101[201; Объявляя двухмсрныс массивы, следует проявлять осторожность. В некоторых языках программирования размерности массивов отделяются запятыми.
В отличие от них, в языке С(С+ ь размерности массива заключаются в квадрат~~ив скобки. Обращение к элемснту двухмерного массива выглядит так; $ с([11[21 Учтите закжс, что отношения "больше*' и "меньше" между строками понимаются в лексикографичсском смысле. Например, значение всгстр("а"."я") равно -31 (те. строка "а" меньше с(роки "я"), а значение всгсвр("я", "а" ) равно 31. Обращто внимание на то, что значение ввгслр("ая", "ял") снова равно — 31, иными словами, функция ввгсвр возвращает разность между АНСИ-колами первых несовпадаюших между собой символов, Собственно, именно так упорядочлваются слова в адфавитном порядке. — Прим. лед.
Часть [. Основы языка С++( подмножество С Следующая программа заполняет двухмерный массив числами от 1 до !9 и выволит их на экран построчно. сзпс1иг)е <эсс)зо.]з> Епс лзазгз(ззозс)) з.пг. е, з., поза[3) [4); Еос(е=оз с<3; +во) Еос(Е=:Оз з<4; ++з) полз[с)[Е) =. (с*4)+Е+Зз / Вывел на экран "/ Е (С=оз С<Зз ++С) ( Еос(з=оз Е<4/ ввз) рззпЕЕ("азс) ", поп[с)(з.))з рскпсЕ("'зп")з ) гесисп Оз ) В данном примере элемент пша[О1 [О] равен !.
поза[с] [1] равен 2, поза[о] [а] равен 3 и тл. Значение элемента поза[а] [з] равно 12. Массив пша можно изобразить следующим образом. пиза[с] [4] О 1 2 3 О 1 2 Двухмерный массив хранится в виде матрицы, в которой первый индекс залает номер строки, а второй — номер столбца. Таким образом, при обходе элементов в порядке их размещения в лама~и правый индекс изменяется быстрее, чем левый. Графическая схема размещения двухмерного массива в памяти показана па рис. 4 2 Рис. 4.2 Двухмерный массив Глава 4.
Массивы и строки Объем пал~яти, занимаемьгй двухмерным массивом, выраженный в байтах, залается следующей формулои: количество байтов = количество стирок количество столбцов"в1аеоа(базовый тил] Считая, что целое число занимает 4 байт, можно вычислить, что для хранения массина, состоящего из 1О строк и 5 столбцов, необходимо 10'5'44 200 байт. Если двухмерный массив используется в качестве аргумента функции, то в нее передается только указатель на его первый злемент.
Олнако при атом необходимо указать, по крайней мере, количество столбцов. ([ч[ожно, разумеется, задать и количество строк, но это не обязательно.) Количество столбцов необходимо компилятору для того, чтобы правильно вычислить адрес элемента массива внутри функции, а для этого должна быть известна длина строки. Например, функция, получаюц(ая в качестве аргуменш двухмерный массив, состоящий из 10 строк и 1О столбцов, может выглядеть так.
уоЫ гцпс1(1пе х[][10]) ( Компилятор должен знать количество столбцов, иначе он не сможет правильно вычислять выражения, подобные следующему: $ х[2] [4] Если бы длина строки была неизвестна, компилятор не нашел бы начало третьей строки. Рассмотрим короткую программу, в которой двухмерный массив используется для хранения оценок, полученных студентами. Предполагается, что учитель преподает в трех группах, в которых учатся не более 30 студентов. Обратите внимание на то, как происходит обращение в массиву дтайе в каждой функции. /* Простая база данных, содерхажая оценки студентов. */ а1пс1ц((е <ят([1о.Ъ> $1пс1це]е <стуре.Ъ> $1пс1цйе <ате]11Ъ.Ь> аде11пе СЬЬЯЯЕЯ 3 абеяьпе СЕЛПЕЯ 3О 1пт дтае]е(С?АЯЯЕЯ][СЕХ)ЗЕЯ]; чо1([ епсет дтайее (чоЫ); ьпе дет дтае]е(1пе пып); чоЫ <)1ер дтадев(ьпт д [] [СЕАПЕЯ] ! 1пс паьп[чоЫ) ( спет сЬ, вот[ад); гот(;;) бо ( рт1птг("(В)вод оценок 1п"); рт1птг("(п)ечать оцеиок1п")г рт1птг("(К)оиец1п"); дете(ает); Часть!.
Основы языка С++: подмиожеспю С сЬ = соцррет(*яхт)з ) и?х1е(сь!='В' са сь!='и' аа с?з(='к')з яихесп(сЬ] ( саяе 'В': епеег дтайея()з Ьтеа]сз саяе 'П': сЫяр огас(ея(дтаз?е)з Ьгеа]хз саяе 'К': екз.с(0] з геецтп Оз ) /* Ввод оценок. "/ чоЫ епеег дгаг(ея(чоЫ! ( з.пе Гог(е=Оз СкСЬАЯЯЕЯз Е++) ргхпст["С1аяя Ф Ъг)з1п", с+1)з тот(х=Оз х<ОЕЛПЕЯз ++1) дгае)е(с)(х] = дес дга((е(х]з ) /" Считывание оценки. */ зпе дее дгаг)е[з.пе пцк0 ( спат в(00)з ргхпсг('Введите оценку студента а абз1п", очи+1) десз(з)з геецгп(аеох(з)]з /* Вывод оценок. */ чоЫ з)хяр дгае)ея(хпе д(](СЕЛВЕЯ]] ( Ые е, з.; Гог(е=оз С(СЬЛЯЯЕЯз ++С) ( ргхпей(?Группа а Ъз?з 1п", С+1)з Гог(х=Оз х<ЯВЛОЕЯЗ ++1) ргхпеО["Студент аае) хз ЪФп", 1+1, д(Е)(х)) ) Массивы строк Массивы строк используются довольно часто.
Например, сервер базы данных может сравнивать команды, введенные пользователем, с массивом допустимых команл. Для того чтобы создать массив строк, заверпзающихся нулевым байтом, необходим двухмерный массив символоа Максимальное значение левого индекса задает количество строк, а правого индекса — максимальную длину каждой строки.
В приведенном Глава 4. Массивы и строки иижс фрагменте объявлен массив, состоящий из 30 строк, каждая из которых может содержать до 79 символов и нулевой байзз й с?заг ясг аггау [30] [80] з Доступ к отделыюй строке весьма прост: нужно лишь указать левый индекс. Например, слелуюший оператор применяет фуикцию деев() к третьей строке массива вег аггау, $ деея(ягг актау[2)! С функциональной точки зрения этот оператор эквивалентен такому вызову: й дега[васк аггау[2)[0]); И все же первая из этих форм записи предпочтительнее.
Чтобы лучше понять, как устроен массив строк, рассмотрим короткую программу, в которой массив строк используется как основа лля текстового редактора. /* Очень простой текстовый релактор. "/ азпс?цде <яецзо.?з> аг?еГзле МАХ 100 ас?егъпе Г.ЕИ 80 с?заг Еехг[Ь?АХ][ЬЕИ] зпе зп[ И) [ гедзяеек зпе е, з, Зз ргтпет("для выхода введите пустую строку.'зп") Гог(г.=Оз г<илхз е++) ргзлег("Ъг?з ", е); деев[гехт.[е]); гг(!"еехе[е]) ?зкеа)гз /* выход */ ) Лог(з=О? з<гз г++) ( ?ог(З=Оз Еехг[з][]]з б++! рисе?заг(гехг[з][З]); риеспаг('зп')з ) геецгп Оз ) Ввел текста в эту программу продолжается до тех пор, пока пользователь ие введет пустую строку.
Затем все строки выволлтся иа экран по очереди. ~~ Многомерные массивы В языке С/С++ массивы могут иметь больше двух размерностей. Максимально допустимое количество размерностей заластся компилятором. Об(ций вид объявления многомерного массива таков. азии яма[Размер!] [Размер2] '(Разиерэ)., '(Разиер]т] Массивы, имею(цие больше трех размерностей, используются редко, поскольку оци занимают слишком большой объем памяти. Например, четырехмерный массив силзво- Часть!. Основы языка С+за подмнюжвство С лов размерностью 10кбк9к4 занимает 2160 байт. Если бы массив содержал лвухбитоные целые числа, потребовалось бы 4320 байт.
Если бы элементы массива имели тип поп)з1е и занимали бы 8 баит каждый, то для массива потребовалось бы ]7280 байт Размер памяти, выделяемой для массива, экспоненциально возрастает с увеличением количества размерносзей, например, если к предыдущему массиву добавить пятое измерение, в котором располагается 10 элементов, то для него понадобилось бы ]72800 баит. При обращении к многомерным массивалз компилятор вычисляет каждый индекс. Следовательно, доступ к элементам многомерного массива происходит зна нггсльно медленнее, чем к элемезпам одномерного массива. Передавая многомерный массив в функшзн, следует указывать все размеры, кроме первого.