Указания по выполнению заданий c (Задания для самостоятельного выполнения)
Описание файла
Файл "Указания по выполнению заданий c" внутри архива находится в папке "Задания для самостоятельного выполнения". PDF-файл из архива "Задания для самостоятельного выполнения", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МАИ. Не смотря на прямую связь этого архива с МАИ, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "информатика" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
Строки и файлы В С++ есть два вида строк: С-строкн н класс стандартной библиотеки С++ зСг1пд. С-строка представляет собой массив символов, завершающийся символом с кодом 0'. Класс зтг1 п0 более безопасен в использовании, чем С-строки, но и более ресурсоемок. Для грамотного использования этого класса требуется знание объектно-ориентированного программирования, поэтому мы рассмотрим его во второй части практикума, а на этом семинаре ограничимся рассмотрением С-строк.
Описание строк Память подстроки, как и под другие массивы, может выделяться как компилятором, так и непосредственно в программе. Длина динамической строки может задаваться выражением, длина не-динамической строки должна быть толыео константным выражением. Чаще всего длина строки задается частным случаем константного выражения — константой. Удобно задавать длину с помощью именованной константы, поскольку такой вариант, во-первых, лучше читается, а во-вторых, прн возможном изменении длины строки потребуется изменить программу только в одном месте: сопзС тпС 1еп зтг = 80; снаг зСгНеп зСг3: При задании длины необходимо учитывать завершающий нуль-символ.
Например, в строке, приведенной выше, можно хранить не 80 символов, а только 79. Строки можно при описании инициализировать строковыми константами, при этом нуль-символ в позиции, следующей за последним заданным символом, формируется автоматически: сваг а[1003 - "Нетег СгоиЫе Сгои01е": Этот вид отрок, как вы догадались, пришел в Сее из языка С. Если строка при определении инициализируется, ее размерность можно опускать (компилятор сам выделит память, достаточную для размещения всех символов строки и завершаюшего нуля): снаг аП - ейечег СгоцЫе тгоцЫе"; // 22 синвола Для разметцения строки в динамической памяти надо описать указатель на сна г, а затем выделить память с помощью псы или шЫ1ос (первый способ предпочтительнее): слаг *р = псы спаг [гп]: спас *ц = (сваг *)ша11ос( гв * 5тдео[(спаг)); Естественно, что в этом случае длина строки может быть переменной и задаваться на этапе выполнения программы.
Динамические строки, как и другие динамические массивы, нельзя инициализировать при создании. Оператор спаг *5[и =, "1«ечег СгоцЫе Сгоц01е" создает не строковую переменную, а указатель на строковую константу, изменить которую невозможно. Ввод-вывод строк Для ввода-вывода строк используются как уже известные нам объекты сто и сонг, так и функции, унаследованные из библиотеки С.
Рассмотрим сначала первый способ: (гтпс1цг)е «овсгеаш.и> тпс шато()( ссп51 тпт п = 80; спаг 5[п]; стп » 5; соцС сс 5 сс епг)1; гсгцги 0; Как видите, строка вводится точно так же, как и переменные известных нам типов. Запустите программу и введите строку, состоящую из одного слова. Запустите программу повторно и введитс строку из нескольких слов. Во втором случае выводится только первое слово. Это связано с тем, что ввод выполняется до первого пробельного символа (то есть пробела, знака табуляции или символа перевода строки 'г,гт') г. Можно ввести слова входной строки в отдельные строковые переменные; т)тпс1цсе «1о51геаш.п> 1пг мати()( соп51 тп[ и = 80: спаг 5[п], С[п], г[п]: стп» 5» 1» г; соцс «5 «епг(1 «1 «епЫ «г «епг)1; гедцгп 0: Если требуется ввести строку, состоящую из нескольких слов, в одну строковую переменную, используются методы дет1 тле или дег класса т 51геаш, объектом кото- рого является ст и.
Во второй части практикума мы изучим, что такое методы клас- са', а пока можно пользоваться ими как волшебным заклинанием, не вдумываясь в смысл. Единственное, что нам пока нужно анатьь это синтаксис вызова метода— после имени объекта г:тавится точка, а затем пишется имя метода; 1)тпс1цг)е стозвгеаг.й> тпт шдтп()( соп51 тпг п = 80; спаг 5[п]; стп.де11тие(5, и); соцт « 5 « епЫ . с)п.дев(5, и); соцС « 5 « епФ; гетцгп О; ) Метод де111пе считывает из входного потока п - 1 символов или менее (если сим- вол перевода строки встретится раньше) и записывает их в строковую перемен- ную 5.
символ перевода строки' также считывается (удаляется) из входного потока, но не записывается в строковую переменную, вместо него размешается заверша- ющий О. Если в строке исходных данных более п — 1 символов, следующий ввод будет выполняться из той же строки, начиная с первого несчитанного символа. Метод дед работает аналогично, но оставляет в потоке символ перевода строки. В строковую переменную добавляется завершающий О; Никогда не обращайтесь к разновидности метода дес с двумя аргументами два раза подряд, нс удалив тп из входного потока.
Например: сти.де1(5, п); // 1 - считывание строки соцС « 5 « еп01: // 2 - вывод строки стп.де1(5. п); // 3 - считывание строки соцс « 5 « епг)1; // 4 - вывод строки стп.дег(5. п): // 5 - считывание строки соис 5 « еп01; // б — вывод строки соцс « "Конец — делу венец" епЫ . О 7 11ри выполнении этого фрагмента вы увидите на экране первую строку, выведен- ную оператором 2, а затем завершающее сообщение, выведенное оператором 7.
Какие бы прекрасные строки вы ни ввели с клавиатуры в надежде, что они будут прочитаны операторами 3 и 5, метод де1 в данном случае «уткнется» в символ 1П. оставленный во входном потоке от первого вызова этого метода (оператор 1). В ре- зультате будут считаны и, соответственно, выведены на экран пустые строки (стро- ки, содержащие О символов). А символ тп так и останется «торчать» во входном потоке. Возможное решение этой проблемы — удалить символ тп из входного по- тока путем вызова метода дед без параметров, то есть после операторов 1 и 3 нужно вставить вызов ст п. дед (), Если вп вводимой строк«больше символов, чем может вместить выделенная дли сс хранении об- ласть, поведение программы нс определено. Скорее всего, она аавсршнтсл аварийно. Синонимом термина «метод» является «фуннннв-члсн клааса». Символ перевода строки ' Гп' появляется во входном потоке, когда вы нажимаете клавишу 5 птег. Однако есть и более простое решение — использовать в таких случаях метод де511пе, который после прочтентия строки не оставляет во входном потоке символ 1П.
Если в программе требуется ввести несколько строк, метод де[1 т ие удобно йспользовать в заголовке цикла, например: (ттпс1оде <1оэтгеаэ.й> 1пт пати()( соп55 1пс п - 80: спаг 5[п]; ттпт!е (С1п.дес11ие(5, и)) ( сонг « 5 « епб1; /т' обработка строки геспгп 0: ) Рассмотрим теперь способы ввода-вывода строк, перекочевавшие в С++ из языка С.
Во-первых, можно использовать для ввода строки известную нам функцию эсапт, а для вывода — ргт ПСГ, задав спецификацию формата 55: ()тпс1обе <550)о.)т> '1пг яа1п()( соп55 1ПС п 10: спаг 5[и]; 5сапт('55", 5); рг1пст("55'. 5); гегогп 0; Имя строки, как и любого массива, является указателем на его начало, поэтому использовавшаяся в предыдущих примерах применения функции 5сапт операция взятия адреса (а ) опущена. Ввод будет выполняться так же, как и для классов ввода-вывода — до первого пробельного символа.
Чтобы ввести строку, состоящую из нескольких слов, используется спецификация у«с (символы) с указанием максимального количества вводимых символов, например: 5сапт("Ж10с". 5); Количество символов может быть только целой константой. При выводе можно задать перед спецификацией хэ количество позиций, отводимых под строку: рГ) пСП "$155" . 5): Строка при этом выравнивается по правому краю отведенного поля. Если заданное количество позиций недостаточно для размещения строки, оно игнорируется, и строка выводится целиком.
Спецификации формата описаны в Учебнике на с. 387, а сами функции семейства рг1 пгт — на с. 411 и далее. Библиотека содержит также функции, специально предназначенные для ввода- вывода строк: де55 и рита. Предыдущий пример с использованием этих функций выглядит так: (т1пс1эбе <5501о.)т> 1ПС яа1П()( сопэс 1пг и 10; с)тдг 5[п]: дега(5); ро55(5): гетогп 0: Функция де55(5) читает символы с клавиатуры до появления символа новой строки и помещает их в строку 5 (сам символ новой строки в строку не включается, вместо него в строку заносится нуль-символ). Функция возвращает указатель на строку 5, а в случае возникновения ошибки или конца файла — йд[С Функция рос5(5) выводит строку 5 на стандартное устройство вывода, заменяя завершающий 0 символом новой строки.
Возвращает неотрицательное значение при успехе или ЕОЕ при ошибке. Функциями семейства ргт пгт удобнее пользоваться в том случае, если в одном операторе требуется ввести или вывести данные различных типов. Если же работа выполняется только со строками, проще применять специальные функции для ввода-вывода строк дет5 и ро55. Операции со строками Для строк не определена операция присваивания, поскольку строка является не основным типом данных, а массивом.
Присваивание выполняется с помощью функций стандартной библиотеки или посимвольно «вручную» (что менее предпочтительно, так как чревато ошибками). Например, чтобы присвоить строке р строку а, можно воспользоваться функциями 55 гору или 5сгпсру: с))аг а[100] = сдетег (Гоиб)е Сгооб)е"; с)таг *р - пеэ спаг [э]: 5ггсру(р, а): 55гпсру(р, а, 5СГ!еп(а) « 1): Для использования этих функций к программе следует подключить заголовочный файл <5ггтпд.
п>. Функция 5сгсру(р, а) копирует все символы строки, указанной вторым параметром (а ), включая завершающий О, в строку, указанную первым параметром (р). Функция 55гпсру(р. а, и) выполняет то же самое, но не более и символов, то есть числа символов, указанного третьим параметром. Если нуль-символ в исходной строке встретится раньше, копирование прекращается, а оставшиеся до п символы строки р заполняются нуль-символами. В противном случае (если п меныпе или равно длине строки а) завершающий нуль-символ в р не добавляется. Обе эти функции возвращают указатель на результирукяцую строку. Если области памяти, занимаемые строкой-назначением и строкой-источником, перекрываются, поведение программы не определено.