Указатели в C++ и Си

На занятии объясняется тема «Работа с указателями в Си и C++»

Ссылочные переменные в C++

Для того чтобы результат изменения значений формальных параметров был заметен в точке их вызова, необходимо использовать передачу параметров по ссылке.
Рассмотрим простой пример:

Лабораторная работа №1:
Описать две функции для обмена значениями двух переменных, соответственно, целого и вещественного типа.
 
* Я. М. Демяненко, М. И. Чердынцева «Методы процедурного программирования в с++» учебное пособие, Ростов-на-дону, 2014, стр. 18

Выполнение:
  1. Создайте главный и заголовочный файлы. Подключите необходимые библиотеки и заголовочный файл.
  2. В код заголовочного файла добавьте описание и реализацию двух функций с одинаковым названием — my_swap(): для обмена значений переменных целого типа и для обмена значений переменных вещественного типа:
  3. // объявление функций
    void my_swap(double &a, double &b);
    void my_swap(int &a, int &b);
     
    // определение (реализация) функций
    void my_swap(double &a, double &b) {
     double r = a;
     a=b;
     b=r;
    }
    void my_swap(int &a, int &b) {
     int r=a;
     a=b;
     b=r;
    }
    • Объявление двух функций с одинаковыми именами означает, что имеет место перегрузка имени функции.
    • Перегрузка функции — возможность определить несколько функций с одним и тем же именем.
    • Перегруженные функции обязательно должны иметь разные сигнатуры, т. е. должны отличаться своими списками спецификации параметров.

    В объявлении и определении функций используется передача параметров по ссылке, о чем указывает символ &. Ссылочные переменные позволяют сохранять результат изменения значений формальных параметров таким образом, чтобы он был «виден» в точке их вызова.

     
  4. В код главного файла в тело функции main() добавьте описание и ввод необходимых переменных, а также вызов функций:
  5. int main() {
     int k,m;
     cout<<"введите два целочисленных значения:";
     cin>>k>>m;
     cout<<k<<" "<<m<<endl;
     my_swap(k, m);
     cout<<k<<" "<<m<<endl;
     double a,b;
     cout<<"введите два вещественных значения:";
     cin>>a>>b;
     cout<<a<<" "<<b<<endl;
     my_swap(a,b);
     cout<<a<<" "<<b<<endl;
     
     system("pause");
     return 0;
    }
    • В операторе вызова функции my_swap(k,m) в качестве фактических параметров используются две целые переменные k и m. В таком случае компилятор вызовет ту версию перегруженной функции, у которой параметрами являются целые переменные.
    • Оператор вызова функции my_swap(a,b) использует два фактических параметра вещественного типа. Для него будет осуществлен вызов функции с двумя вещественными параметрами.

Лабораторная работа № 2:

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

Указания:

  • Использовать механизм встраиваемых (inline) функций
  •  
    * Я. М. Демяненко, М. И. Чердынцева «Методы процедурного программирования в с++» учебное пособие, Ростов-на-дону, 2014, стр. 25


    Выполнение:
    1. Создайте главный и заголовочный файлы. Подключите необходимые библиотеки и заголовочный файл.
    2. В код заголовочного файла добавьте описание и реализацию трех функций с одинаковым названием — max(), но с разным количеством параметров и их типом (объявление функций добавьте самостоятельно, пользуясь кодом их определения):
    3. inline int max(const int a, const int b) {
        return a>b?a:b;
      }
      inline int max(const int a, const int b, const int c) {
        int d=a>b?a:b;
        return d>c?d:c;
      }
      inline double max(const double a, const double b) {
        return a>b?a:b;
      }
    4. Вызовы функций порой приводят к снижению производительности программы. В C++ для минимизации такого эффекта предусмотрен механизм встраиваемых (inline) функций, которые иногда еще называют подставляемыми.
    5. Спецификация inline перед указанием типа результата в объявлении предлагает компилятору сгенерировать копию кода функции в соответствующем месте, чтобы избежать вызова этой функции. В результате получается множество копий кода функции, вставленных в программу, вместо единственного экземпляра кода, которому передается управление при каждом вызове функции.

    Задание 1:

    Реализовать перегруженные функции для сортировки нескольких значений (двух, трех, четырех), возможно, разных типов.

    • Аргументы по умолчанию — значения, которые автоматически подставляются компилятором при вызове функции, если аргумент не был указан при вызове.
    • Аргументы по умолчанию могут быть расположены только в конце списка формальных параметров.
    int max(int a, int b = 1);

    Задание 2:
    Создать проект с функцией сортировки трех значений с возможностью задать направление сортировки. Реализовать тестирующую программу.

    Подробно:
    Создать функцию:

    void sort ( double &a, double &b, double &c, bool asc = 0);

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

    Параметры функции:
    a, b, c – значения для сортировки.
    asc — флаг направления сортировки:
    false — по убыванию (по умолчанию),
    true — по возрастанию.

    Возвращаемое значение: нет

    Результат:
    a, b, c отсортированные в соответствии со значением asc.


    Задание 3:
    Дано целое число. Определить количество и сумму цифр в десятичной записи этого числа. Выдать само число и число, получающееся из него при вычеркивании первой и последней цифр.

    Указания:
    Оформить в виде функций каждое из действий:

  • определение количества цифр в десятичной записи числа:
  • int count_dig(int a); //параметр передается по значению
  • вычисление суммы цифр числа:
  • int sum_dig(int a); //параметр передается по значению
  • преобразование числа путем вычеркивания из него первой и последней цифры:
  • void del_last_dig(int& a); //параметр передается по ссылке
    int del_first_dig(int& a); //параметр передается по ссылке

     
    * Я. М. Демяненко, М. И. Чердынцева «Методы процедурного программирования в с++» учебное пособие, Ростов-на-дону, 2014, стр. 29

    Поделитесь уроком с коллегами и друзьями:

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    *
    *

    Вставить формулу как
    Блок
    Строка
    Дополнительные настройки
    Цвет формулы
    Цвет текста
    #333333
    Используйте LaTeX для набора формулы
    Предпросмотр
    \({}\)
    Формула не набрана
    Вставить