Основы программирования на С++ для начинающих

Задачи и решения: Указатели C++

Тему Указатели в C++ мы рассмотрели в двух статьях:

–  Часть 1: Указатели С++

– Часть 2: Указатели С++

Теперь вам придется много практиковаться, чтобы закрепить знания и до конца разобраться. Решим несколько задач для начала.

1.  Задачка элементарная, но требует хорошего понимания что такое указатели. Дан указатель: double **p = 0; Выполните следующие задания (решения можно оформлять внутри функции main):
* создайте конструкцию, изображенную на рисунке;
* выведите число, указанное в квадратике, на экран;
* после этого удалите все динамические объекты.

задача с решением, указатели С++

Опять же – ищем самое короткое решение. Автор:  

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

3. Объявите указатель на массив типа int и выделите память память для 12-ти элементов. Необходимо написать функцию, которая поменяет значения четных и нечетных ячеек массива. Например есть массив из 4-х элементов:

задачи и решения указатели c++

задачи и решения указатели c++

4.  Объявить и заполнить двумерный динамический массив случайными числами от 10 до 50. Показать его на экран. Для заполнения и показа на экран написать отдельные функции. (подсказка: функции должны принимать три параметра – указатель на динамический массив, количество строк, количество столбцов).  Количество строк и столбцов выбирает пользователь.

40 thoughts on “Задачи и решения: Указатели C++

  1. а так сойдет?

    1. Разбираться с чужим кодом гораздо сложнее и противнее, чем написать свой (тем более, если редактор этого сайта искажает ваш код).
      Ответ на вопрос “а так сойдет?” ищите всегда компиляцией и выполнением вашего кода, лучше на разных наборах входных данных.

  2. Может быть в третьей задаче заместо добавления переменной менять местами без добавления переменной?
    Arr[i] += Arr[i + 1];
    Arr[i + 1] = Arr[i] – pArr[i + 1];
    Arr[i] -= Arr[i + 1];
    Что лучше: создание переменной или вот такие операции?

  3. Функция “void swapDataInCells(int* ptrArr, int sizeOfArr)” по замене элементов в третьей задаче.
    В цикле “for (int i = 0; i < sizeOfArr; i++)" нужно отнять от sizeOfArr единицу:
    for (int i = 0; i < sizeOfArr – 1; i++).

      1. Глупости… в цикле for (), выражение i < sizeOfArr показывает до какого значения изменяется i (индекс элемента). Отняв единицу вы "уменьшаете" количество перебираемых индексов элементов массива, но не сам массив

  4. 3.

  5. 4.

  6. Здравствуйте! написал элементарную прогу для сдвига элементов в массиве влево, количество э-ов – n задается, шаг смещения d тоже задается, но такая проблема, что последние d элементов непонятно что получается, подскажите в чем проблема?!
    #include
    #include
    #include

    using namespace std;

    void zaz(int s, int *ar);
    int main(){
    int n,d;
    srand(time(0));
    cout <> n;
    int *p = new int[n];
    int *z = new int[n];

    for (int i = 0; i < n; i++){
    p[i] = rand() %100 ;
    cout << p[i] << " ";
    }
    z = p;

    cout <> d;
    for (int i = 0; i < n; i++){
    p[i] = p[i + d];
    if (i == n – d)
    for (int k = 0; i < d; i++){
    p[k+n-d] = z[k];
    }
    }
    cout << p[10];
    //zaz(n, p);
    cout << endl;
    system("pause");
    return 0;
    }

    void zaz(int s, int *ar)
    {
    for (int i = 0; i < s; i++){
    cout << ar[i] << " ";
    }

    }

  7. 3. Объявите указатель на массив типа int и выделите ПАМЯТЬ ПАМЯТЬ для 12-ти элементов. Необходимо написать функцию, которая поменяет значения четных и нечетных ячеек массива. Например есть массив из 4-х элементов:

  8. Третье задание на замену четных и нечетных элементов. Сделал через копирование массива.

    int changeelements(int* arr,int*arr2, int size) //функция замены местами элементов
    {
    for (int i = 0; i < size; i++)
    {
    if (i % 2 == 0)
    {
    arr2[i] = arr[i + 1];
    }
    else if(i%2!=0)
    {
    arr2[i] = arr[i – 1];
    }
    }

    return *arr2;
    }

    int fillarray(int* arr, int size) //функция заполнения массива
    {
    srand(time(NULL));
    for (int i = 0; i < size; i++)
    {
    arr[i] = rand() % 100;
    }
    return *arr;
    }
    void showarray(int* arr, int size) //функция вывода массива
    {
    cout << endl;
    for (int i = 0; i < size; i++)
    {
    cout << arr[i] << " ";
    }
    }
    int main()
    {
    int size;
    cout << "Enter massive's size" <> size; //вводим размер массива
    cout << "Massive's size = " << size << endl;
    int* arr = new int[size];
    int* arr2 = new int[size]; //создали второй массив,чтобы скопировать элементы
    fillarray(arr,size);
    showarray(arr, size);
    changeelements(arr,arr2, size);
    showarray(arr2, size);
    delete[]arr;
    delete[]arr2;
    }

    1. Это же задание только для нечетного количества элементов

      using namespace std;
      int changeelements(int* arr,int*arr2, int size)
      {
      for (int i = 0; i < size; i++)
      {
      if (i % 2 == 0 && i + 1 == size) // условие выполнится, если элементов нечетное количество
      {
      arr2[i] = arr[i];
      }
      else if (i % 2 == 0)
      {
      arr2[i] = arr[i + 1];
      }
      else if(i%2!=0)
      {
      arr2[i] = arr[i – 1];
      }

      }

      return *arr2;
      }

      int fillarray(int* arr, int size) //функция заполнения массива
      {
      srand(time(NULL));
      for (int i = 0; i < size; i++)
      {
      arr[i] = rand() % 100;
      }
      return *arr;
      }
      void showarray(int* arr, int size)//функция вывода массива
      {
      cout << endl;
      for (int i = 0; i < size; i++)
      {
      cout << arr[i] << " ";
      }
      }
      int main()
      {
      int size;
      cout << "Enter massive's size" <> size;
      cout << "Massive's size = " << size << endl;
      int* arr = new int[size];
      int* arr2 = new int[size];
      fillarray(arr,size);
      showarray(arr, size);
      changeelements(arr,arr2, size);
      showarray(arr2, size);
      delete[]arr;
      delete[]arr2;
      }

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

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