Главная страница
Навигация по странице:

  • Рис. 5.1. Кодовая таблица 866 (экран программы из листинга5.1)Листинг 5.1: Таблица символов cp866 i n c l u d e using namespace

  • Листинг 5.2: Отображение кода введённого символа i n c l u d e i n c l u d e i n t main(){char c;do

  • 5.2. Строки Строка представляет собой массив символов, заканчивающийся нулевым байтом. Варианты описания строковой переменной i n t n= 10;char

  • 5.3. Пользовательские типы данных Переименование типов. Иногда удобно определить синоним для ка- кого-либо типа данных для этого используется ключевое слово typedef:typedef

  • Структуры. Набор элементов различных типов, доступ к которым осуществляется по имени, называется структурой. Для определения структуры используется ключевое слово struct:s t r u c t

  • 6. Основы объектно-ориентированного программирования 6.1. Классы

  • СИ. Программирование на языке CC Часть Структурное программирование


    Скачать 1.65 Mb.
    НазваниеПрограммирование на языке CC Часть Структурное программирование
    Дата11.02.2022
    Размер1.65 Mb.
    Формат файлаpdf
    Имя файлаAlgLangCpp.pdf
    ТипУчебное пособие
    #359040
    страница10 из 11
    1   2   3   4   5   6   7   8   9   10   11
    90
    ђ








    љ
    >
    њ
    ´
    к
    ћ
    џ
    A0
    Ў
    ў
    J
    ¤
    Ґ
    ¦
    §
    Ё
    © Є Ї
    B0
    °
    ±
    I
    i
    ґ
    𝜇

    ·
    ё

    є
    »
    j
    Ѕ
    ѕ
    ї
    C0
    А
    Б
    В
    Г
    Д
    Е
    Ж
    З
    И
    Й
    К
    Л
    М
    Н
    О
    П
    D0
    Р
    С
    Т
    У
    Ф
    Х
    Ц
    Ч
    Ш
    Щ
    Ъ
    Ы
    Ь
    Э
    Ю
    Я
    E0
    а б
    в г
    в еж з
    и й
    к л
    м но пр ст уф х
    ц ч
    ш щ
    ъ ы
    ь э
    ю я
    Первая (стандартная) часть кодовой таблицы ASCII включает 128 символов (с кодами от 0 до 127): цифры, заглавные и строчные буквы латинского алфавита, знаки препинания (табл. Символ пробела имеет код, те. Заглавные символы латинского алфавита коды с
    0x41
    по
    0x5A
    ; строчные:
    с
    0x61
    по
    0x7A
    ; цифры с
    0x30
    по
    0x39
    Вторая часть (расширенная таблица) содержит символы национальных алфавитов и другие специальные знаки. Существует несколько вариантов кодирования второй части кодовой таблицы. Например, в русской версии операционной системы Microsoft Windows используется кодировка табл, а в консольных окнах — кодовая таблица Для работы с символами в языке C используются функции из стандартной библиотеки

    (или

    ).
    Функция преобразует символ к нижнему регистру, если это возможно (в противном случае возвращает неизменённое значение. Функция преобразует символ к верхнему регистру.
    Функция возвращает ненулевое значение, если аргумент является заглавным символом функция возвращает ненулевое значение, если аргумент является строчным символом. Функция возвращает ненулевое значение, если аргумент является цифрой.
    Для вывода символьной переменной на экран с помощью функции printf используется спецификатор формата
    %c
    Пример 5.1. Вывод на экран таблицы символов. Напишем программу, которая позволяет вывести на экран все символы кодовой таблицы
    (листинг
    5.1
    ). На рис.
    5.1
    показано консольное окно с результатом работы программы. Обращаем внимание, что выводимая на экран кодовая таблица соответствует текущей кодировке, установленной в операционной системе,
    т. е. если бы перед выполнением программы мы изменили кодировку с помощью команды chcp
    , то результат был бы другим.
    Рис. 5.1. Кодовая таблица 866 (экран программы из листинга
    5.1
    )
    Листинг 5.1: Таблица символов cp866
    # i n c l u d e

    using namespace
    std
    ;
    i n t
    main
    (){
    f o r
    (
    i n t
    i
    =0
    x80
    ;
    i
    <=0
    xFF
    ;
    i
    ++){
    i f
    (!(
    i
    % 16))
    // водной строке 16 символов cout
    <<
    endl
    <<
    endl
    ;

    — 132 —
    cout
    << "␣" <<
    char
    (
    i
    );
    // printf(" %c", Вводить и выводить символы можно с помощью функций getchar и. При использовании getchar в конце ожидается нажатие

    ,
    вводимые символы отображаются на экране. Функция getch
    , определённая в заголовочном файле, позволяет вводить символы без отображения их на экране и без использования

    Пример 5.2. Отображение кода введённого символа. В листинге
    5.2
    приведена программа, которая ожидает нажатие клавиши и выводит на экран соответствующий символ и его код (в текущей кодировке. После нажатия клавиши

    выполнение программы завершается.
    Листинг 5.2: Отображение кода введённого символа i n c l u d e

    # i n c l u d e

    i n t
    main
    (){
    char
    c
    ;
    do
    {
    c
    =
    getch
    ();
    // ввод символа без эха printf
    ("%c␣-␣%d\n",
    c
    ,
    c
    );
    }
    while
    (
    c
    != 0
    x1B
    );
    // пока не нажали Функция getche работает аналогично getch
    , но вводимый символ отображается на экране, поэтому тело цикла do из листинга
    5.2
    можно переписать следующим образом

    — 133 Если в программе используются потоки ввода-вывода, то для ввода любого символа (включая символ пробела) рекомендуется использовать метод cin.get()
    5.2. Строки
    Строка представляет собой массив символов, заканчивающийся нулевым байтом. Варианты описания строковой переменной i n t

    n
    = 10;
    char
    s1
    [
    n
    ];
    ¬
    char
    s2
    [
    n
    ] = "Hello!";
    ­
    char
    s3
    [] = "Привет — длина строки должна быть константным выражением (значение которого известно на момент компиляции. Здесь для переменной выделено байт, 9 из которых можно занять символами, а последний нулевой — можно использовать инициализатор в виде строкового литерала.
    Здесь для переменной выделено 10 байт. Первые семь байт инициализированы символами
    ’H’
    ,
    ’e’
    ,
    ’l’
    ,
    ’l’
    ,
    ’o’
    ,
    ’!’
    и


    0’
    ® — при использовании инициализатора допускается не указывать длину строки (компилятор отведёт ровно столько места, сколько необходимо для хранения всех символов плюс нуль-символ в конце. Здесь в памяти для переменной выделено 7 байт (номера символов — от 0 до Для размещения строки в динамической памяти надо описать указатель на char
    , выделить память и присвоить адрес начала выделенного участка памяти данному указателю n t

    m
    ;
    cin
    >>
    m
    ;

    — 134 —
    char
    *
    p1
    =
    new
    char
    [
    m
    ];
    // вариант 1
    char
    *
    p2
    = (
    char
    *)
    malloc
    (
    m
    *
    s i z e o f
    (
    char
    ));
    // вариант Строки в динамической памяти, как и массивы, нельзя инициализировать.
    Например, если написать "Привет!";
    то будет создана не динамическая строка, а строка–константа, изменить которую невозможно адресе начала будет присвоен указателю.
    Для вывода строковой переменной на экран с помощью функции printf используется спецификатор формата = "Hello!";
    char
    *
    s2
    = "Привет!";
    printf
    ("%s\n%s",
    s1
    ,
    s2
    );
    Пример ввода строки с клавиатуры с помощью функции scanf
    :
    const i n t
    n
    = Строка считается массивом символов, а имя массива в языке C представляет адрес его самого первого байта, поэтому традиционный
    ’&’
    во втором параметре функции scanf не требуется. Следует иметь ввиду, что функция scanf читает только часть строки, до первого пробельного символа, остальное игнорируется.
    Чтобы ввести всю строку, вместе со всеми пробелами, придётся использовать спецификатор, указав максимальное число ожидаемых символов i n t
    n
    = Пробельным символом считается сам пробел, символ табуляции и символ конца строки

    — 135 Но лучше использовать функции языка C, специально предназначенные для ввода и вывода строки ввели строку puts
    (
    s1
    );
    // вывели строку
    Потоки ввода-вывода cin и также могут быть использованы при работе со строками:
    cin
    >>
    s1
    ;
    cout
    <<
    s1
    <<
    endl
    ;
    но при вводе будет прочитана только часть строки до первого пробельного символа. Поэтому для ввода рекомендуется применять специальный метод getline
    :
    const i n t
    n
    = 20;
    char
    s1
    [
    n
    ];
    cin Функция cin.getline(s1, читает из входного потока
    (n-1)
    символов
    (или менее, если символ перевода строки встретится раньше) и записывает их в строковую переменную s1
    , в конце добавляется нулевой символ.
    Присваивание строк не допускается (поскольку они рассматриваются компилятором как массивы символов. Для работы со строками в языке следует использовать функции стандартной библиотеки

    (или

    )
    1
    . Для копирования строк предназначены функции strcpy и. Функция strcpy(s2, копирует все символы строки включая последний нулевой символ) в строку s2
    . Функция strncpy(s2, s1, делает тоже самое, но копирует не более символов. Пример i n t
    n
    = В языке C++ удобнее использовать класс string
    , рассматриваемый во второй части пособия Если значение меньше или равно длине копируемой строки, то остаток строки не копируется, завершающий нуль-символ в конце не добавляется.
    При использовании обеих функций области памяти, отводимые для строки- источника и строки-приёмника, не должны пересекаться. Переполнение строк при копировании (как и при операциях с массивами, компилятором не кон- тролируется.
    Функция возвращает длину строки (количество символов),
    не учитывая последний нулевой символ.
    Конкатенация (сцепление) двух строк выполняется с помощью функции Для сравнения строк используется функция n t
    strcmp
    (
    const char
    *
    str1
    ,
    const Она возвращает число, большее (меньшее) нуля, если строка расположена после (до) строки по алфавиту. Если строки равны, то возвращается Для поиска символа в строке используется функция char
    *
    str
    ,
    i n Возвращается указатель на первое вхождение символа, заданного младшим байтом параметра Для преобразования строк в числа используются функции из библиотеки

    (или

    ):
    double
    atof
    (
    const char
    *);
    // преобразование строки в double
    i n t
    atoi
    (
    const char
    *);
    // преобразование строки в int
    long
    atol
    (
    const char
    *);
    // преобразование строки в Если строку нельзя преобразовать в число, то возвращается

    — 137 Для обратного перевода из числа в строку используется функция sprintf
    5.3. Пользовательские типы данных
    Переименование типов.
    Иногда удобно определить синоним для ка- кого-либо типа данных для этого используется ключевое слово typedef
    :
    typedef
    тип_данных новое_имя
    ;
    Для определения массива:
    typedef
    тип новое_имя
    [
    размерность
    ] Здесь квадратные скобки являются частью синтаксиса (а не обозначают необязательный элемент, как обычно).
    Примеры:
    typedef unsigned long
    ULONG
    ;
    // длинное целое без знака char

    MyStr
    [50];
    // строка из 49 символов
    После определения новый тип можно использовать, как обычный a
    ,
    b
    ;
    // Числа s1
    ;
    // Строка ss
    [10];
    // Массив из 10 строк
    Определение типов помогает сократить текст программы и повысить его наглядность, а также делает программу переносимой если все типы, зависящие от платформы, заменить синонимами, то при переходе на другую платформу достаточно будет скорректировать определения.
    Перечисления.
    При моделировании объектов любой предметной области часто требуется кодировать различные состояния (номер ошибки, номер этапа некоторого процесса и т. д. Для этого удобно использовать перечисляемый тип данных, который определяется с помощью служебного слова enum
    :
    enum
    имя_типа
    {
    список_констант
    } ;

    — 138 Обозначения констант указываются через запятую. Для каждой константы может быть указан инициализатор. Те константы, для которых инициализатор не указан, будут кодироваться целыми числами в порядке возрастания.
    Имена перечисляемых констант должны быть уникальными, а значения могут совпадать.
    Пример:
    enum
    MyErr
    {
    ERR_READ
    = 1,
    ERR_WRITE
    ,
    ERR_CONVERT
    };
    MyErr error1
    ;
    // ...
    switch
    (
    error1
    ) {
    case
    ERR_READ
    :
    // ...
    break
    ;
    case
    ERR_WRITE
    :
    // ...
    break
    ;
    case
    ERR_CONVERT
    :
    // Здесь мы определили новый тип и описали переменную Данная переменная может принимать три возможных значения:
    ERR_READ
    ,
    ERR_WRITE
    и
    ERR_CONVERT
    . Эти три константы компилятор будет заменять значениями 1, 2 и 3 соответственно.
    Структуры.
    Набор элементов различных типов, доступ к которым осуществляется по имени, называется структурой. Для определения структуры используется ключевое слово struct
    :
    s t r u c t
    [
    имя_типа
    ] {

    — 139 тип элемент_1
    ;
    тип_2 элемент_2
    ;
    тип_n элемент [
    список_описателей
    ];
    Если отсутствует имя типа, то указывается список определений переменных,
    указателей или массивов. Если указано имя нового типа, то список описателей может отсутствовать. Элементы структуры называются полями.
    Примеры:
    s t r u c t
    Student
    {
    char
    fio
    [50];
    // Фамилия, имя, отчество n t
    group
    ;
    // Номер группы l o a t
    rate
    ;
    // Средний балл s1
    , *
    ps
    ,
    ss
    [25];
    Student s2
    = {"Петров␣Максим␣Сергеевич", 12, 4.7};
    s t r u c t
    MyComplex
    {
    double
    re
    ,
    im
    ;
    };
    MyComplex x
    ,
    y
    , *
    pc
    ;
    MyComplex a
    [3] = {{1, 2.5}, {-2, 1.2}, {3.2, 1.7}};
    MyComplex a
    [2][3] = {
    {{3, 1.5}, {1, 1.2}, {-2, 4.5}},
    {{1, 2.5}, {-2, 1.2}, {5.2, Если переменные имеют один и тот же структурный тип, то для них определена операция присваивания (поэлементного копирования. Доступ к полям структуры осуществляется с помощью операции выбора (точка для обычных переменных, стрелка для указателей "Сергеев␣Николай␣Петрович";

    — 140 —
    s2
    rate
    = 3.75;
    ss
    [7].
    group
    = 10;
    (*
    ps
    ).
    group
    = 8;
    ps
    ->
    group
    = Элементом (полем) структуры может являться другая структура или указатель на эту же структуру. Имена полей структуры должны быть уникальными. Поля разных структур могут иметь совпадающие имена.
    Размер структуры в памяти, возвращаемый функцией sizeof()
    , необязательно равен сумме размеров её полей, т. к. начало каждого поля может быть выровнено компилятором по границе машинного слова.
    Битовые поля.
    Элементами структур могут являться битовые поля. Битовое поле — это набор двоичных разрядов. Каждый разряд (бит) имеет два возможных значения 0 или 1. При определении структур размер каждого поля в битах указывается через двоеточие, например t r u c t
    MyFlags
    {
    bool centerX
    :1;
    bool centerY
    :1;
    unsigned i n Здесь определена структура, в состав которой входят три поля два однобитных поля и одно 4-битное поле color
    Объединения.
    Объединение — это структура, все поля которой располагаются по одному и тому же адресу. Объединение требует столько места в памяти, сколько занимает наибольший из его элементов. Описание объединения имеет тот же синтаксис, что и структура, но вместо struct используется ключевое слово union
    . Пример n t

    i
    ;
    };

    — 141 —
    MyType a
    ;
    a x
    = 4.75;
    a i
    = В переменной можно хранить вещественное или целое число, обращаясь к полю или соответственно. Разумеется, после второго присваивания предыдущее значение 4.75 теряется.
    Объединение не может содержать битовые поля. При описании перемен- ной-объединения может быть проинициализировано значение только первого поля a
    = {4.75};
    5.4. Работа с файлами
    Для работы с файлами в языке C надо подключить заголовочный файл

    или

    Перед тем, как работать с файлом, его требуется сначала открыть для чтения или записи с помощью функции fopen
    :
    FILE
    *
    fopen
    (
    const char
    *
    filename
    ,
    const Здесь filename
    — имя файла (необходимо помнить о том, что символ



    обозначает начало управляющей последовательности, поэтому его необходимо удваивать режим файл открывается для чтения (read);
    "w"
    — файл открывается для записи (write), если такой файл уже существует, то вся информация в нём стирается файл открывается для добавления информации в его конец (append);
    "r+"
    — файл открывается для чтения и записи (файл уже должен существовать открывается пустой файл для чтения и записи (если такой файл существует, то хранящаяся в нём информация стирается

    — 142 —
    "a+"
    — файл открывается для чтения и добавления информации в его конец
    (append).
    Строка mode также может содержать символ или b
    , что означает соответственно текстовый (text) или двоичный (binary) режим. По умолчанию действует текстовый режим.
    При успешном открытии функция fopen возвращает указатель на структуру типа, в которой содержится вся информация, необходимая для работы с файлом. Если при попытке открыть файл происходит ошибка, то возвращается нулевой указатель. Ошибка может возникнуть из-за того, что файл заблокирован (открыт для записи) другой программой, из-за отсутствия свободного места на диске и т. д.
    Пример открытия для чтения и записи двоичного файла расположенного в каталоге на диске, "Если указывается только имя файла и расширение (без полного пути, то имеется ввиду текущий каталог текущего диска.
    По окончании работы с файлом его необходимо закрыть с помощью функции. Это разблокирует файл для доступа из других программа также освободит область памяти, занимаемую служебной информацией, связанной с этим файлом.
    Чтение (
    fread
    ) и запись (
    fwrite
    ) файлов, открытых в двоичном режиме,
    происходит блоками заданного размера fread
    (
    void
    *
    buf
    ,
    size_t m
    ,
    size_t k
    ,
    FILE
    *
    f
    );
    size_t fwrite
    (
    const void
    *
    buf
    ,
    size_t m
    ,
    size_t Здесь buf
    — указатель на буфер в памяти (из которого читаются или в который записываются байты размер одного элемента данных (количество байт количество элементов для чтения или записи. Обе функции возвращают число прочитанных или записанных элементов. При чтении возвращаемое значение может оказаться меньше заданного k
    , если достигнут конец

    — 143 файла или произошла ошибка чтения. При записи — из-за ошибки записи
    (например, нет свободного места на диске. Напомним, что size_t является базовым беззнаковым целочисленным типом (разрядное целое без знака для разрядных систем

    — 144 —
    6. Основы объектно-ориентированного
    программирования
    6.1. Классы
    Класс — пользовательский тип данных, представляющий собой модель некоторого объекта предметной области, инкапсулирующий данные и функции для работы с этими данными.
    Данные класса называются полями или данными-членами класса, а функции класса — методами или функциями-членами (класса).
    Поля класса могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс могут быть описаны с модификатором const
    , при этом они инициализируются только один раз (с помощью инициализатора конструктора, см. ниже) и не могут изменяться;
    могут быть описаны с модификатором static
    , ноне как auto
    ,
    extern или Инициализация полей класса при описании не допускается.
    Классы могут быть глобальными (объявленными вне любого блока) и локальными (объявленными внутри некоторого блока, например, внутри функции или другого класса).
    Класс описывается следующим образом l a s s

    имя_класса
    {
    элементы_класса
    ;
    };
    Точка с запятой в конце ставится обязательно. Здесь имя_класса
    — любой допустимый идентификатор;
    элементы_класса
    — объявления и/или определения данных-членов (полей класса) и функций-членов (методов класса).
    Поля и/или методы могут отсутствовать. Класс, не имеющий ни полей, ни методов, называется пустым классом

    — 145 Спецификаторы доступа частный, закрытый) и общедоступный, публичный) управляют видимостью элементов класса. Элементы
    (поля и методы, описанные после служебного слова private
    , видимы только внутри класса. Этот вид доступа применяется по умолчанию, те. спецификатор подразумевается во всех случаях, когда спецификатор доступа не указан явно. После служебного слова public описывается так называемый
    интерфейс класса, те. открытые (публичные) поля и методы, доступные вне класса l a s s
    имя_класса
    {
    1   2   3   4   5   6   7   8   9   10   11


    написать администратору сайта