Справочник от Автор24
Поделись лекцией за скидку на Автор24

Строки, структуры, объединение, перечисление

  • 👀 301 просмотр
  • 📌 281 загрузка
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Строки, структуры, объединение, перечисление» pdf
Лекция 4. Строки, структуры, объединение, перечисление План лекции: • Строки. Множества. • Структуры. • Объединения. • Перечисление. Строковые данные Базовый тип данных «строка» в C/C++ отсутствует. С точки зрения компилятора и стандартной библиотеки, строка — это массив элементов типа char, последним элементом которого является символ '\0' (символ, код которого равен нулю). 08:01 СТРОКИ Можно обращаться к отдельным символам строки, написав после её имени в квадратных скобках номер символа. Нумерация символов в строке начинается с нуля, так же как и в векторах. Когда мы выводим переменную типа char, то выводится символ. Хотя на самом деле char – числовая переменная и обозначает номер символа в кодовой таблице. По аналогии с переводом вещественных чисел в целые мы можем сделать перевод из типа char в тип int, чтобы узнать код символа. Вывод кода символа выглядит так: char c = ‘A’; cout << (int) c; 08:01 Строки Для управления наборами объектов в стандартной библиотеке C++ определены контейнеры. Контейнер представляет коллекцию объектов определенного типа. Последовательный же контейнер (sequential container) позволяет контролировать порядок, в котором элементы располагаются в коллекции, и управлять доступом к этим элементам. Типы последовательных контейнеров: • vector: массив переменного размера (поддерживает произвольный доступ к любому элементу в контейнере, обеспечивает добавление и удаление элементов из любого места контейнера) • string: представляет контейнер, аналогичный вектору, который состоит из символов, то есть строку С другими типами контейнеров познакомимся позже. Для использования определенного контейнера в программу необходимо добавить соответствующий заголовочный файл, который, как правило, называется по имени класса контейнера. 08:01 Для хранения строк в C++ применяется тип string. Для использования этого типа его необходимо подключить в код с помощью директивы #include Пример: Пользователь вводит свое имя, а программа здоровается с ним. Полное решение будет записано так: 08:01 Строки Если при определении переменной типа string мы не присваиваем ей никакого значения, то по умолчанию данная переменная содержит пустую строку string s; Можно инициализировать переменную строчным литералом, который заключается в двойные кавычки: string s2 = “hello “; string s3 = (“hello “); string s4 = (5, ‘c’); // пять одинаковых символов ‘c’ 08:01 Операции над строками символов Конкатенация строк string s1 = "hello"; string s2 = "world"; string s3 = s1 + " " + s2; // hello world cout << s3 << endl; Сравнение строк bool result = s1 == s2; // false bool result2 = s1 > s2; // false Размер строки - методы size() и empty() cout << s1.size() << std::endl; // 5 string s4 = ""; if(s4.empty()) cout << "String is empty" << std::endl; 08:01 Чтение строки с консоли Слова в строке могут быть разделены любым количеством пробелов, табуляций и переводом строк. Но при использовании cin чтение идет только до разделительного символа. Т.е. если слова в строке разделены пробелами, то прочитается только первое слово! Все остальные символы остаются внутри cin, ожидая следующего извлечения. Для чтения всей строки используется специальная функция getline(cin, s). Первый параметр в этой функции указывает на поток ввода (cin), а второй – на строку, в которую нужно считывать. Или такой вид: Функция getline извлекает данные из входного потока до строкового разделителя (обычно \n), который не записывается в строку. 08:01 Пример 08:01 Когда вы запустите эту программу и введете возраст, она не будет ожидать ввода строки с именем, а сразу выведет результат (просто пробел вместо вашего имени)! Оказывается, когда вы вводите числовое значение, поток cin захватывает вместе с вашим числом и символ новой строки. Так что, когда мы ввели 18, cin фактически получил 18\n. Затем он извлёк значение 18 в переменную, оставляя \n (символ новой строки) во входном потоке. Затем, когда getline() извлекает данные для myName, он видит в потоке \n и думает, что мы, должно быть, ввели просто пустую строку! Правило: При вводе числовых значений не забывайте удалять символ новой строки из входного потока данных 08:01 Удаление символа новой строки ‘\n’ из входного потока 08:01 Количество цифровых символов в строке 08:01 Получение и изменение символов строки 08:01 Длина строки 08:01 Поиск подстроки в строке Если подстрока нашлась, то find() возвращает число, равное номеру символа, с которого началось первое вхождение подстроки в строку. А если подстроки не нашлось, то этот метод возвращает -1. 08:01 Символьные массивы Массив символов, последний элемент которого представляет нулевой символ '\0', может использоваться как строка: Однако подобное использование массива строк унаследовано от языка Си, а при написании программ на С++ при работе со строками следует отдавать предпочтение встроенному типу string, а не массиву символов. 08:01 Максимальная длина слова 08:01 Количество слов начинающихся и оканчивающихся на одну и ту же букву (обработка слов в стиле Си) 08:01 Множества Множества — это математические структуры, которые могут хранить в себе уникальные элементы (то есть, каждый элемент может входить в множество только один раз). Для работы с множествами нужно подключить одноимённую библиотеку #include Множества создаются по аналогии с векторами. Пишем ключевое слово set, за ним — название типа каждого из элементов множества (в треугольных скобках), а после этого указываем имя для нового множества. Так мы получаем пустое множество. Добавление элементов в него происходит с помощью метода insert. Чтобы проверить, входит ли элемент во множество, используется метод find. Если элемент в множестве не нашелся, то он выдает то же значение, что и метод end. Удаление отдельного элемента из множества выполняется с помощью метода erase. 08:01 Пример: даны N запросов трёх типов: добавить элемент во множество; проверить, входит ли элемент во множество; удалить элемент из множества. 08:01 08:01 Или вывод так: 08:01 В данном случае now — это не очередной элемент, а указатель на него. Метод begin возвращает указатель на самый маленький элемент множества, end — это конец множества (он идёт после самого большого элемента), а операция ++ осуществляет переход к указателю на следующий элемент. Чтобы посмотреть, что за элемент хранится по указателю, нужно перед его именем написать символ *. 08:01 Структуры • Структура – это именованная совокупность переменных возможно разных типов, расположенная в памяти последовательно друг за другом. • Структуры называются пользовательскими типами данных и помогают в организации сложных данных, поскольку позволяют группу связанных между собой переменных трактовать не как множество отдельных элементов, а как единое целое. • Структуры могут копироваться, над ними могут выполняться операции присваивания, их можно передавать функциям в качестве аргументов, а функции могут возвращать их в качестве результата. • Для структур допускается инициализация. 08:01 Структуры Объявление структуры начинается с ключевого слова struct и содержит список объявлений, заключенный в фигурные скобки: struct имя_структуры { список объявлений; }; Элементами структур могут быть: – переменные и массивы базовых типов, – переменные и массивы пользовательских типов, кроме типа самой структуры имя_структуры, – указатели на любые типы, включая и тип самой структуры имя_структуры, – функции. 08:01 Структуры Пример структуры time: В приведенном примере элементами структуры будут hour и minutes. Объявление структуры не резервирует памяти. Оно является информацией компилятору о введении пользовательского типа данных. Память выделится при определении структурных переменных. Доступ к отдельному элементу структуры осуществляется посредством бинарной операции «точка». 08:01 Структуры Структуры могут быть вложены друг в друга. Например, структура chronos содержит две структуры time – begin и end: struct chronos { struct time begin, end; }; struct chronos timer = {{2,4}, {10, 10}}; Выражение timer.begin.minutes обращается к минутам minutes времени begin из timer. Ключевое слово struct при объявлении структурных переменных можно опускать, то есть допустима и общепринята запись chronos timer; 08:01 Структуры Над структурами возможны следующие операции: • присваивание, • взятие адреса с помощью &, • осуществление доступа к ее элементам. Существует, по крайней мере, три подхода передачи структуры в функцию: передавать компоненты по отдельности, передавать всю структуру целиком и передавать указатель на структуру. Каждый подход имеет свои плюсы и минусы. 08:01 Указатели на структуры Так как имя структурного типа обладает всеми правами имен типов, то разрешено определять указатели на структуры: имя_структурного_типа * имя_указателя_на_структуру; Если функции передается большая структура, то, чем копировать ее целиком, эффективнее передать указатель на нее. Указатели на структуры ничем не отличаются от указателей на обычные переменные. Объявление time *pt; сообщает, что pt - это указатель на структуру типа struct time. Если pt указывает на структуру time, то *pt - это сама структура, а (*pt).hour и (*pt).minutes - ее элементы. Скобки в (*pt).hour необходимы, поскольку приоритет операции . (точка) выше, чем приоритет операции разыменования * (звездочка). 08:01 Указатели на структуры Указатели на структуры используются весьма часто, поэтому для доступа к ее элементам была придумана операция «обращение к элементу структуры по указателю». Если t — указатель на структуру, то t -> элемент-структуры есть ее отдельный элемент. Операции . и -> выполняются слева направо. Таким образом, при наличии объявления следующие четыре выражения будут эквивалентны: chronos ch, *cht = &ch; ch.begin.hour cht->begin.hour (ch.begin).hour (cht->begin).hour 08:01 Указатели на структуры Операции доступа к элементам структуры . и -> вместе с операторами вызова функции () и индексации массива [] занимают самое высокое положение в иерархии приоритетов и выполняются раньше любых других операторов. Например, если задано объявление struct { int len; char *str; } *p; то ++p->len увеличит на 1 значение элемента структуры len, а не указатель p, поскольку в этом выражении как бы неявно присутствуют скобки: ++(p->len). 08:01 Указатели на структуры • Чтобы изменить порядок выполнения операций, нужны явные скобки. Так, в (++р)->len, прежде чем взять значение len, программа прирастит указатель p. • В (р++)->len указатель p увеличится после того, как будет взято значение len (в данном случае скобки не обязательны). • По тем же правилам *p->str обозначает содержимое объекта, на который указывает str; *p->str++ увеличит указатель str после получения значения объекта, на который он указывал, (*p->str)++ увеличит значение объекта, на который указывает str; *p++->str увеличит p после получения того, на что указывает str. 08:01 Указатели на структуры Часто возникает проблема, при объявлении структуры объявить там указатель на эту же структуру. Несмотря на то, что описание структуры еще не завершено, формат языка это позволяет. Например, опишем структуру List, представляющую собой однонаправленный список (будет рассмотрено позже), где в качестве данных опишем переменную типа int. struct List{ int dat; List* next; }; 08:01 Массивы структур Возможно определение массива структур struct key { char *word; int count; }; key keytab[NKEYS]; объявляет структуру типа key и определяет массив keytab, каждый элемент которого является структурой этого типа и которому где-то будет выделена память. struct key { char *word; int count; } keytab[NKEYS]; 08:01 Объединения Объединение подобно структуре, однако в каждый момент времени может использоваться только один из элементов объединения. Тип объединения может задаваться в следующем виде: union {описание элемента 1; ... описание элемента n;}; Главной особенностью объединения является то, что для каждого из объявленных элементов выделяется одна и та же область памяти, достаточная для размещения наиболее длинного элемента, т.е. они перекрываются. Когда используется элемент меньшей длины, то переменная типа объединения может содержать неиспользуемую память. 08:01 Объединения Пример: union { char name[30]; char addres[80]; int age; int phone; } inform; При использовании объекта inform типа union можно обрабатывать только тот элемент, который получил значение, т.е. после присвоения значения элементу inform.name, не имеет смысла обращаться к другим элементам. 08:01 Объединения union { int ax; char al[4]; } ua; Объединение ua позволяет получить отдельный доступ к каждому байту числа ua.ax, который занимает в памяти 4 байта. 08:01 Перечисления Перечисления (enum) представляют еще один способ определения своих типов. Их отличительной особенностью является то, что они содержат набор числовых констант. Для определения перечисления применяется ключевое слово enum, после которого идет название перечисления. Затем в фигурных скобках идет перечисление констант через запятую. Каждой константе по умолчанию будет присваиваться числовое значение начиная с нуля. То есть в данном случае spring=0, a winter=3. 08:01 Перечисления могут использоваться, когда у нас есть ряд логически связанных констант, которые естественно лучше определить в одном общем типе данных. Если нас не устраивают значения по умолчанию для констант, то мы можем явным образом задать значения. Например, установить начальное значение: Также можно задать значение для каждой константы: 08:01 Перечисление Переменная этого типа может принимать значение из некоторого списка значений 08:01 Перечисление 08:01 Объявление типа Любой тип может быть объявлен с использованием ключевого слова typedef, включая типы указателя, функции или массива. Имя с ключевым словом typedef для типов указателя, структуры, объединения может быть объявлено, прежде чем эти типы будут определенны, но в пределах видимости объявителя. typedef char FIO[40] // FIO - массив из сорока символов FIO person; // Переменная person // Это - массив из сорока символов эквивалентно объявлению char person[40]; При объявлении переменной и типа здесь было использовано имя типа (FIO). Помимо этого, имена типов могут еще использоваться в трех случаях: в списке формальных параметров, в объявлении функций, в операциях приведения типов и в операции sizeof (операция приведения типа). 08:01
«Строки, структуры, объединение, перечисление» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot