Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Работа 3. СИМВОЛЬНЫЙ И СТРОКОВЫЙ ТИПЫ ДАННЫХ




Цель работы:

– изучить приемы работы с символьными и строковыми типами данных;

– изучить подпрограммы для работы с символьными и строковыми данными;

– освоить приёмы работы с перечисляемым типом данных.

 

I. Теоретический раздел

Символьный тип данных

Любой текст состоит из символов. Для хранения одного символа предназначен тип данных char. Переменную типа char можно рассматривать двояко: как целое число, занимающее 1 байт и способное принимать значения от 0 до 255 (тип unsigned char) или от -128 до 127 (тип signed char) и как один текстовый символ. Сам же тип char может оказаться как знаковым, так и беззнаковым, в зависимости от операционной системы и компилятора. Поэтому использовать тип char не рекомендуется, лучше явно указывать будет ли он знаковым (signed) или беззнаковым (unsigned).

Как и целые числа, данные типа char можно складывать, вычитать, умножать, делить, а можно выводить на экран в виде одного символа. Именно это и происходит при выводе символа через объект cout. Если же нужно вывести числовое значение символа (также называемый ASCII-кодом), то значение символа необходимо преобразовать к типу int. Например:

#include<iostream>

using namespace std;

int main()

{

    unsigned char c='A'; // Константы char заключаются в одинарные кавычки

    cout<<c<<" "<<(int)c<<endl;

    c=126; // char можно присвоить и числовое значение

    cout<<c<<" "<<(int)c<<endl;

    return 0;

}

В этом примере переменной с типа char присваивается значение, равное символу 'A' (константы типа char записываются как символы в одинарных кавычках), затем на экран выводится значение c, как символа и его ASCII-код, потом переменной c присваивается значение 126 (то есть символ с ASCII-кодом 126) и снова выводится на экран символ и его ASCII-код.

Организовать последовательное посимвольное считывание всего входного потока можно при помощи цикла while:

#include<iostream>

using namespace std;

int main()

{

    unsigned char c;

    while(cin>>c) // Цикл пока считывание успешно

    { // Делаем необходимые действия

    }

    return 0;

}

В этом примере программа будет посимвольно считывать входной поток (по умолчанию — ввод с клавиатуры), пока не встретит признак конца файла. Для того, чтобы сообщить программе о завершении файла при вводе с клавиатуры необходимо нажать клавиши Ctrl-d в системе Linux и Ctrl-z в системе Windows.

Эта программа при считывании данных будет игнорировать символы–разделители: пробелы, символы новой строки и табуляции. Если нужно, чтобы в переменную c считывались все символы, в том числе и разделители, то необходимо для потока ввода cin установить манипулятор noskipws при помощи инструкции cin>>noskipws;.

 

Строковый тип данных

Строка представляет собой массив значений типа char, завершающийся нулевым байтом. Каждый символ в строке — это на самом деле целое битовое значение кода ASCII, соответствующее отображаемому символу или операции, например возврату каретки или переводу строки.

Однако массивы типа char - символьные массивы - занимают в языке особое место. Во многих языках есть специальный тип данных - строка символов (string). В языке С отдельного типа строки символов нет, а реализована работа со строками путем использования одномерных массивов типа char.

В языке С символьная строка - это одномерный массив типа char, заканчивающийся нулевым байтом. Нулевой байт - это байт, каждый бит которого равен нулю. Для нулевого байта определена специальная символьная константа '\0'. Это следует учитывать при описании соответствующего массива символов. Так, если строка должна содержать N символов, то в описании массива следует указать N+1 элемент.  

Например, описание char str[11] предполагает, что строка содержит 10 символов, а последний байт зарезервирован под нулевой байт. Конечно, был задан обычный одномерный массив, но если трактовать его как строку символов, то это будет строка максимум из 10 элементов.

Хотя в языке С нет специального типа строки, язык допускает строковые константы. Строковая константа - это список литер, заключенных в двойные кавычки. Например,

"Borland СИ", "Это строковая константа".

Есть два простых способа ввести строку с клавиатуры. Первый способ -воспользоваться функцией scanfO со спецификатором ввода %s. Надо помнить, что функция scanf() вводит символы до первого пробельного символа. Второй способ - воспользоваться специальной библиотечной функцией gets(), объявленной в файле stdio.h. Функция gets() позволяет вводить строки, содержащие пробелы. Ввод оканчивается нажатием клавиши Enter. Обе функции автоматически ставят в конец строки нулевой байт. Не забудьте зарезервировать для него место. В качестве параметра в этих функциях используется просто имя массива.

Вывод строк производится функциями printfO или puts(). Обе функции выводят содержание массива до первого нулевого байта. Функция puts() добавляет в конце выводимой строки символ новой строки. В функции printf() переход на новую строку надо предусматривать в строке формата самим.

Для работы со строками в С имеется богатая библиотека строковых функций (все они начинаются с букв str) string.h. Рассмотрим основные из них.

Функция strlen(s) возвращает длину строки, выраженную в символах.

Функции копирования:

- char *strcpy (char* s1, const char* s2) строку s2 копирует в s1;

- char *strncpy (char* s1,const char* s2, size_t count) копирует не более count символов из строки s2 в s1;

- char *strdup (const char *s) выделяет память для хранения копии строки, на которую указывает s, копирует эту строку в выделенную область и возвращает указатель на неё.

Функции соединения строк:

- char *strcat (char* s1, const char* s2) строку s2 присоединяет к строке s1;

- char *strncat (char* s1, const char* s2, size_t count) не более count символов из строки s2 присоединяет к строке s1.

Функции поиска:

- char * strchr ( const char* s, char c) находит первое вхождение символа с в строку s. Возвращает указатель на найденный символ или NULL, если символ не обнаружен;

- char * strrchr ( const char* s, char c) находит последнее вхождение символа с в строку s. Возвращает указатель на найденный символ или NULL, если символ не обнаружен;

- char * strstr ( const char* s, const char* substr) ищет в s первое вхождение подстроки substr. Возвращает указатель на первый символ найденной подстроки или NULL, если такая подстрока не найдена;

- char *strpbrk ( const char *s1, const char *s2) — возвращает указатель на первый символ в строке s1, совпадающий с каким-нибудь из символов строки s2. При этом нулевые символы в конце строки в рассмотрение не включаются;

- char * strtok ( const char* s1, const char* s2) возвращает указатель на следующую лексему (часть строки) в строке s1. Символы строки s2 используются как ограничители, определяющие лексему. Как и в других функциях поиска, если лексема не найдена, возвращается NULL.

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

- char * strupr ( char* s) английские буквы нижнего регистра (“маленькие”) строки, на которую указывает s, преобразует в соответствующие буквы верхнего регистра (в “большие”). Остальные символы не меняются;

- char * strlwr ( char* s) английские буквы верхнего регистра (прописные) строки, на которую указывает s, преобразует в соответствующие буквы ниж-него регистра (в “маленькие”). Остальные символы не меняются.

 

Перечисляемый тип данных

Перечислимый тип (enumeration) - это множество поименованных целых констант. Перечислимый тип определяет все допустимые значения, которые могут иметь переменные этого типа. Основная форма объявления типа следующая:

enum имя_типа (список_названий) список переменных:

Список переменных может быть пустым. Пример определения перечислимого типа и переменной данного типа:

enum seasons { win, spr, sum, aut };

enum seasons s;

Ключом к пониманию сущности перечислимого типа является то, что каждое из имен win, spr, sum и aut представляет собой целую величину. Если эти величины не определены по-другому, то по умолчанию они соответственно равны нулю, единице, двум и трем. Оператор

printf ("%d %d", win, aut);

выдаст на экран числа 0 и 3. Во время объявления типа можно одному или нескольким символам присвоить другие значения, например:

enum value {one=l, two, three, ten=10, thousand=1000, next};

Если теперь напечатать значения

prinlf ("%d %d %d %d %d\n", one, two, ten, thouthend, next);

то на экране появятся числа 1 2 10 1000 1001, т. е. каждый следующий символ увеличивается на единицу по сравнению с предыдущим, если нет другого присваивания.

С переменными перечислимого типа можно производить следующие операции:

- присвоить переменную типа enum другой переменной того же типа;

- провести сравнение с целью выяснения равенства или неравенства;

- арифметические операции с константами типа enum (i = win - aut).

Нельзя использовать арифметические операции и операции ++ и -- к переменных типа enum.

Основная причина использования перечислимого тина - это улучшение читаемости программ.

 










Последнее изменение этой страницы: 2018-05-10; просмотров: 208.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...