МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Лекции по C++

    переменной типа, специфицированного об"явлением, становится синонимом

    имени типа. Об"явление typedef не создает типов. Оно создает синонимы для

    существующих имен типов, которые были специфицированы другим способом.

    Любой тип может быть об"явлен с typedef, включая типы указателя,

    функции и массива. Имя с ключевым словом typedef для типов указателя,

    структуры или совмещения может быть об"явлено прежде чем эти типы будут

    определены, но в пределах видимости об"явления.

    Примеры:

    /******************** Example 1 ********************/

    typedef int WHOLE;

    /******************** Example 2 ********************/

    typedef struct club {

    char name[30];

    int sise, year;

    } GROUP;

    /******************** Example 3 ********************/

    typedef GROUP *PG;

    /******************** Example 4 ********************/

    typedef void DRAWE(int, int);

    В первом примере об"является WHOLE как синоним для int .

    Во втором примере об" является GROUP как структурный тип с тремя

    элементами. Так как специфицирован также тег clab, то имя GROUP и тег club

    могу быть использованы в об"явлениях.

    В третьем примере используется предидущее имя typedef для об"явления

    адресного типа. Тип PG об"является как указатель на тип GROUP, который в

    свою очередь определен как структурный тип.

    В последнем примере представлен тип DRAWE для функции не

    возвращающей значения и требующей два аргумента типа int. Это означает,

    например, что об"явление DRAWE box; эквивалентно об"явлению void box(int,

    int);

    Имена типов

    Имя типа специфицирует особенности типа данных. Имена типов

    используются в трех контекстах: в списках типов аргументов, при

    об"явлении функций, в вычислениях cast (преобразованиях типов), и в sizeof

    операциях. Списки типов аргументов рассматривались в

    разделе 4.5. "Об"явления функций". Преобразования cast и операция sizeof

    обсуждаются в разделах 5.7.2. и 5.3.4. соответственно.

    Именами для основных, перечисляющих, структурных и совмещающих типов

    являются спецификаторы типа для каждого из них. Имена для типов

    указателя, массива и функции задаются следующей синтаксической формой:

    Абстрактный декларатор - это декларатор без

    идентификатора, состоящий из одного или более модификаторов указателей,

    массивов и функций. Модификатор указателя (*) всегда появляется перед

    идентификатором в деклараторе, в то время как модификатор массива ([]) или

    функции ( () ) появляются после идентификатора. Таким образом, чтобы

    правильно интерпретировать абстрактный декларатор, нужно начинать

    интерпретацию с подразумеваемого идентификатора.

    Абстрактные деклираторы могут быть составными. Скобки в составном

    абстрактном деклараторе специфицируют порядок интерпретации, подобно тому

    как это делается при интерпретации составных деклараторов об"явлений.

    Абстрактный декларатор, состоящий из пустых круглых скобок () не

    допускается, поскольку это двусмысленно. В этом случае невозможно

    определить находится ли подразу-

    меваемый идентификатор внутри скобок, и в таком случае- это

    немодифицированный тип, или перед скобками, тогда- это тип функции.

    Спецификаторы типа, установленные посредством об"явлений typedef, также

    рассматриваются как имена типов.

    Примеры:

    long * /* Example 1 */

    int (*) [5] /* Example 2 */

    int (*) (void) /* Example 3 */

    В первом примере задано имя типа как указатель на тип long. Во втором

    и третьем примерах показано каким образом скобки

    модифицируют составные абстрактные деклараторы. В примере 2 задано имя

    типа для указателя на массив иэ пяти злементов. В третьем примере именуется

    указатель на функцию, не требующую аргументов и возвращающую значение типа

    int.

    КОНТРОЛЬНЫЕ ВОПРОСЫ:

    1. Какие ошибки содержат следующие операторы?

    enum State { on, off };

    enum YesNo { yes, no};

    enum DiskDriveStatus { on, off };

    2. Верно или нет, что объявление следующего перечислимого типа неправильно?

    enum YesNo { no = 0, No = 0, yes = 1, Yes = 1 };

    3. Что не так в следующей программе?

    #include

    int main()

    {

    int *p = new int;

    cout > *p;

    cout )

    // обязателен тип возвращаемого значения

    {

    < объявление данных >

    < тело функции>

    return возвращаемоеЗначение; // - если возвращаемыйТип не void

    }

    - Выход из функции осуществляется по оператору return. Void-функции

    могут не возвращать значения.

    Список параметров:

    [const] тип1 параметр1, [const] тип2 параметр2, ...

    - Ключевое слово const предохраняет передаваемые по ссылке аргументы от

    случайного изменения.

    Программа USERINFO.CPP иллюстрирует использование модификатора

    // const в списке параметров

    */

    struct userInfo

    {

    int age;

    char name[150];

    };

    void processUserInfo(/*const*/ userInfo &ui)

    // при снятии комментария будет сообщение об ошибке,

    // поскольку модификатор const запрещает изменение параметра

    {

    if ( ui.age < 18 ) {

    cout );

    При объявлении функции имена параметров могут быть опущены.

    - Передача аргумента по ссылке позволяет функции изменять значение

    переданного аргумента и экономит память, так как при этом не создается

    локальная копия аргумента:

    [const] тип1& параметр1, [const] тип2& параметр2, ...

    void foo(int &); // - объявление функции - это ее прототип

    int main()

    {

    int value = 5;

    foo(value);

    cout (n2)) ? (n1) : (n2))

    double num1 = 50, num2 = 5, rslt;

    rslt = min(num1 / 2, num2 * 2);

    - При объявлении функции с модификатором inline компилятор заменяет вызов

    функции ее телом. В этом смысле эти функции похожи на макросы.

    Отличие состоит в том, что встроенные функции выполняют проверку типов

    данных.

    Программа INLINE.CPP, иллюстрирующая применение встроенной функции

    - Используя аргументы по умолчанию для некоторых параметров, при вызове

    функции вы можете не задавать аргументы для этих параметров; тогда им

    автоматически будут присваиваться значения по умолчанию.

    Программа DEFARGS.CPP, иллюстрирующая применение аргументов по умолчанию

    - Рекурсивными называются функции, которые вызывают сами себя. Количество

    рекурсивных вызовов должно быть ограничено, чтобы не столкнуться с

    проблемой нехватки памяти. По этой причине каждая рекурсивная функция

    должна выполнять проверку условия на окончание рекурсии.

    Пример программы FACTOR.CPP, использующей рекурсивную функцию

    - Перегрузка функций позволяет вам иметь несколько функций с одним именем,

    но с разными списками аргументов (список аргументов еще называется

    сигнатурой функции). Тип возвращаемого функцией значения не является частью

    сигнатуры.

    Программа OVERLOAD.CPP, иллюстрирующая перегрузку функции

    ТИПОВЫЕ ВОПРОСЫ С ОТВЕТАМИ

    Можно ли в С++ объявлять вложенные функции?

    Нет, так как это приводит к большим накладным расходам во время

    выполнения программы.

    В каких случаях нужно использовать статические глобальные переменные?

    Можете использовать их, где хотите. Когда вы объявляете статической

    глобальную переменную (которые я вам не советую использовать вообще), вы

    даете указание компилятору сделать ее невидимой для функций из других

    файлов. Такая переменная недоступна из других файлов вашего проекта.

    Как расходуется память при обслуживании вызовов рекурсивной функции?

    Исполняющая система использует стек для хранения временных данных, в том

    числе необходимых для генерирования вызова рекурсивной функции. Как и

    другие ресурсы, стек ограничен в своем размере. В результате при длинной

    цепочке вызовов рекурсивной функции стек может переполниться, что приведет

    к остановке программы из-за ошибок выполнения или переполнения стека.

    ПРАКТИКУМ

    Контрольные вопросы

    1. Каков будет результат работы следующей программы? Что вы можете сказать

    по поводу функции swap?

    */

    # include

    void swap(int i, int j)

    {

    int temp = i;

    i = j;

    j = temp;

    }

    int main()

    {

    int a = 10, b = 3;

    swap (a, b);

    cout

    void swap(int &i, int &j)

    {

    int temp = i;

    i = j;

    j = temp;

    }

    int main()

    {

    int a = 10, b = 3;

    swap (a, b);

    cout

    int main()

    {

    double x = 5.2;

    cout

    const int MAX = 0x1FFF; //64K/8 - максимальный размер массива типа double

    ***

    int main()

    {

    double array[MAX]; // объявление одномерного массива

    ***

    int num_elem;

    // Ввод количества обрабатываемых данных

    do

    {

    cout > num_elem;

    cout MAX);

    // Ввод данных

    for (int ix = 0; ix < num_elem; ix++)

    {

    cout > array[ix];

    }

    // Расчет среднего значения

    double sum = 0;

    for (ix = 0; ix < num_elem; ++ix)

    sum += array[ix];

    cout

    const int MAX = 10; //50

    int main()

    {

    double array[MAX] = { 12.2, 45.4, 67.2, 12.2, 34.6, 87.4,

    83.6, 12.3, 14.8/*, 55.5*/ };

    int num_elem = MAX;

    //double array[] = { 12.2, 45.4, 67.2, 12.2, 34.6, 87.4,

    // 83.6, 12.3, 14.8, 55.5 };

    //int num_elem = sizeof(array) / sizeof(array[0]);

    double sum = 0;

    for (int ix = 0; ix < num_elem; ++ix)

    {

    sum += array[ix];

    cout |

    |04 | |

    |05 |int main() |

    |06 |14 |

    Пример программной сессии:

    Введите три числа через пробел: 123

    Сумма чисел = 6

    Среднее этих чисел = 2

    Введите три символа: ABC

    Вы ввели символы 'A', 'B', 'C'

    Введите число, символ, и число: 12A34.4

    Вы ввели 12 A 34.4

    Введите символ, число и символ: A3.14Z

    Вы ввели A 3.14 Z

    В программе из листинга 2 объявляется четыре переменных типа double и три

    переменных типа char. Оператор вывода в строке 10 предлагает вам ввести три

    числа. Оператор ввода в строке 11 помещает введенные вами числа в

    переменные х, у и z. He забывайте, что при вводе чисел их нужно разделять

    пробелами. Либо вводите каждое число с новой строки. Первое введенное вами

    число будет помещено в переменную х, второе — в у, а третье окажется в

    переменной z. Данные в переменные заносятся в том порядке, в котором

    переменные перечислены в операторе ввода в строке 11. Оператор в строке 12

    вычисляет сумму значений переменных х, у и z. Оператор вывода в строках 13

    и 14 выводит сумму и среднее значение введенных вами величин.

    Оператор вывода в строке 15 предлагает вам ввести три символа. Оператор

    (ввода в строке 16 последовательно размещает введенные символы в переменных

    с1, с2, с3. Использовать пробел для разделения вводимых символов не

    обязательно. Например, вы можете ввести данные и таким образом: 1А2, Bob и

    1 D d. Оператор вывода в строках 17—19 выводит введенные вами символы,

    разделенные пробелами и заключенные в одинарные кавычки.

    Оператор вывода в строке 20 предлагает вам ввести число, символ и число.

    Оператор ввода в строке 21 помещает ваши данные в переменные х, с1 и у.

    Пробел-разделитель здесь нужен только в том случае, если символ может быть

    интерпретирован как часть числа. Например, если вам нужно ввести число 12,

    символ «точка» и число 55, вам нужно набрать на клавиатуре 12 . 55.

    Вводимый символ «точка» лучше «заключить» в пробелы, чтобы быть уверенным,

    что поток вода не воспримет эту точку как точку, разделяющую в вещественном

    числе целую и дробную части. Оператор вывода в строке 22 выводит введенные

    вами данные разделенные пробелами.

    Оператор вывода в строке 23 предлагает вам ввести символ, число и символ.

    Оператор ввода в строке 24 последовательно размещает введенные значения в

    переменных с1, х, с2. Пробел-разделитель здесь нужно использовать только в

    том случае, если символ может быть интерпретирован как часть числа.

    Например, если вам нужно ввести символ «-», число 12 и цифру 0, вам нужно

    набрать на клавиатуре 12 0. Оператор вывода в строке 25 выводит введенные

    вами данные, разделяя их пробелами.

    Функция printf

    Просматривая программы, написанные разными людьми, вы часто можете

    встретить функцию printf. Этот стандартный оператор вывода пришел из языка

    С. Так как C++ является расширением С, эта функция поддерживается и в этом

    языке. Многие программисты до сих пор предпочитают использовать старую

    функцию printf, а не потоки ввода/вывода C++. Вот почему вам эта функция

    наверняка уже знакома. Но, помимо этого, эта функция имеет несколько очень

    мощных возможностей, и в ряде случаев она оказывается удобнее функций

    потоков. Прототип функций можно найти в заголовочном файле STDIO.H.

    Функция printf

    Общая форма объявления функции printf:

    int printf(const char *format[, argument,... ]);

    Параметр format является символьным массивом, содержащим выводимый текст.

    Кроме этого обязательного параметра, могут быть необязательные аргументы.

    Массив format может содержать специальные форматирующие символы, которые

    выполняют преобразование необязательных аргументов при выводе.

    Функция printf является очень мощной функцией с богатыми возможностями

    форматирования вывода. В качестве первого шага в освоении ее возможностей

    рассмотрим Esc-последовательности, позволяющие представлять специальные

    символы. Esc-последовательность начинается с символа «\» — «обратная косая

    черта». Esc-коды представлены в таблице 1.

    Таблица 1. Еsс - последовательности

    |Последовательн|Десятичное |Шестнадцатеричное |Название |

    |ость |значение |значение | |

    |\а |7 |0х07 |Звонок |

    |\b |8 |0х08 |Возврат назад |

    |\f |12 |0х0С |Перевод страницы |

    |\n |10 |0х0А |Новая строка |

    |\г |13 |0x0D |Возврат каретки |

    |\t |9 |0х09 |Табуляция |

    |\v |11 |0х0В |Вертикальная табуляция|

    |\\ |92 |0х5С |Обратная черта |

    |\' |44 |0х2С |Апостроф |

    |\" |34 |0х22 |Кавычка |

    |\? |63 |0х3 F |Знак вопроса |

    |\0 | | |Восьмеричное число, от|

    | | | |1 до 3 цифр |

    |\XHHH и \xhhh | |0xhhh |Шестнадцатеричное |

    | | | |число |

    Функция printf имеет специальные форматирующие спецификации (символы) для

    вывода переменных. Общий вид этих спецификаций таков:

    % [flags] [width] [.precision] [F | N | h | l | L ]

    Опции flags могут определять выравнивание, отображение знака числа при

    выводе, вывод десятичной точки и символов заполнения. Кроме того, эти флаги

    определяют префиксы для восьмеричных и шестнадцатеричных чисел. Возможные

    значения флагов приведены в таблице 2.

    Таблица 7.2. Значения флагов строки формата функции printf

    |Символ |Назначение |

    |- |Выравнивать вывод по левому краю поля |

    |+ |Всегда выводить знак числа |

    |Пробел |Выводить пробел перед положительным числом и знак |

    | |минус — перед отрицательным |

    |# |Не влияет на вывод десятичных целых, для |

    | |шестнадцатеричных чисел выводит префикс 0х или 0Х, |

    | |перед восьмеричными целыми выводит ноль, десятичную |

    | |точку для вещественных чисел. |

    Спецификация width определяет минимальное количество выводимых символов.

    Если необходимо, используются заполнители — пробелы или нули. Когда

    значение для width начинается с нуля, printf использует в качестве

    заполнителей нули, а не пробелы. Если в качестве значения для width

    используется универсальный символ *, а не число, то printf подставляет на

    место этого символа значение, которое должно содержаться в списке

    аргументов. Это значение ширины поля должно предшествовать выводимому

    значению. Ниже приведен пример вывода числа 2, занимающего три позиции,

    согласно значению второго аргумента printf:

    printf("%*d", 3, 2);

    Спецификатор precision определяет максимальное количество выводимых цифр. В

    случае целого числа он определяет минимальное количество выводимых

    символов. Для precision также можно применить символ *, вместо которого

    будет подставлено значение из списка аргументов. Это значение точности

    представления должно предшествовать выводимому значению. Ниже приведен

    пример вывода числа с плавающей точкой 3.3244 с использованием десяти

    Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.