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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. В целом годно. Не вчитывался, посмотрел по диагонали. Картинки красивые.

    Функции типа giveMemoryToArr я бы не писал (хотя, на вкус и цвет…).
    Если уж их оставлять, то ИМХО double* freeMemory(double* ptrArr) должна возвращать void. Зачем она возвращает у вас всегда ноль?

    Пример бы какой-нибудь еще (более объемный)… Шашки (человек против человека) что-ли…

    В целом, молодец. Пиши еще :)

  2. Админу огромное спасибо, за то, что дает не только задачи, а и решения с подробными комментариями к коду. Я читала уроки по C++ на нескольких сайтах. На вашем – мне нравится больше всего. Удобное содержание главной страницы, задачи с решениями на отдельной странице. При чем задачи сгруппированы по темам, а не все скопом и вперемешку.
    Не останавливайтесь! Пишите еще! :)

  3. Так-то наверное можно задачу 3 и без буферов решить:
    void mixmass(int sz, int *arr)
    {
    for (int i = 1; i < sz; i++)
    {
    if (arr[i] % 2 == 0)
    arr[i] = i-1;
    }
    }
    ————————————————————–
    for (int i = 0; i < sz; i++)
    {
    mass [i] = i+1;
    std::cout << mass [i] << std::ends;
    };

    mixmass(sz, mass);

    Но уменя не доходит..

  4. В первой задачи куча непонятных конструкций, в предыдущих уроках не было объяснений по них, так зачем же решать задачу способом, который не понятен ученикам?

    1. В 1-й задаче вообще нет никаких “конструкций” – нужно только хорошо понимать то, что:
      a). указатель содержит адрес того, на что он указывает,
      б). а операция разименования указателя (префиксная операция *) означает: “взять значение того, на что указывает указатель”.

      1. Это я знаю, это было в уроке.Но 4 строку, где в скобках стоит void, вообще не могу понять, в уроках никогда в скобках ничего не было;
        Строка 6, где вообще ничего не понятно, таких конструкций в уроках не было. Задачи должны быть такими, что прочитав все предыдущие статьи их можно было легко понять. Но первая задача совсем не такая.

  5. 3 задача

    #include
    using namespace std;

    int main()
    {
    setlocale(LC_ALL, “rus”);
    system(“color E0”);

    int* array = new int[12];
    for (int i = 0; i < 12; i++)
    {
    array[i] = i + 1;
    cout << array[i] << " ";
    }

    cout << endl;

    int b = 0;
    int j = 1;
    int save = 0;
    for (int i = 0; i < 6; i++)
    {
    save = array[b];
    array[b] = array[j];
    array[j] = save;

    b = b + 2;
    j = j + 2;
    }

    for (int i = 0; i < 12; i++)
    {
    cout << array[i] << " ";
    }

  6. Ребята, если не сложно помогите с задачкой: Даны матрицы А и В размера k×m и m×l соответственно. Найти произведение АВ. Перемножение матриц реализовать в виде функции.

    1. Сама задача умножения матриц – “если не сложно” (и даже элементарно – 2 вложенных цикла).
      Но:
      1. Есть разные варианты представления 2-мерных матриц (как 2-х мерных массивов, как массивов указателей, как STL контейнеров – вектор векторов и т.д. … до 10 разных способов или более). В зависимости от выбранного способа вычисления будут записываться совсем по-разному.
      2. Гораздо больше по объёму, чем само умножение, займёт у вас а). ввод исходных матриц + б). вывод результата + в). тестовая задача main() которая будет наглядно демонстрировать процесс и результат.

      Так что задача очень простая, но писать всё для неё обрамление – совсем не просто, там механической работы много.

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

    int *givemmry (int **boob, int size1,int size2)
    {
    **boob = new int* [size1];
    for (int i = 0; i < size1; i++)
    {
    boob[i] = new int[size2];
    }
    return **boob;
    }

    так он выдает ошибку


    1. int** givemmry( int size1, int size2 ) {
      int **boob = new int* [ size1 ];
      for( int i = 0; i < size1; i++ )
      boob[ i ] = new int[ size2 ];
      return boob;
      }

      Или проще:

      int** givemmry( int size1, int size2 ) {
      return (int**)new int* [ size1 * size2 ];
      }

      1. Во 2-м решении копированием вкралась ошибка, должо быть, естественно:

        int** givemmry( int size1, int size2 ) {
        return (int**)new int [ size1 * size2 ];
        }

  8. Спасибо! как я понял, не обязательно указывать тип и индекс массива (boob) в аргументе функции, мы просто возвращаем значение?

    1. Здесь параметр оказывается просто лишний – вы его значение всё-равно затрёте после new, а тип его (и элементов массива) изменить всё-равно не можете.

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

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