Основи програмування на С ++ для початківців

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

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

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

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

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

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

задача з рішенням, покажчики С ++

Знову ж – шукаємо найкоротший рішення. Автор:  

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

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

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

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

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

40 думки про "Задачі та рішення: Указатели C

  1. Не понял рішення першого завдання
    Або я погано читав і дивився відсів, або я просто щось забув, але як я зрозумів, цей покажчик – покажчик на покажчик, верно?
    Тобто, одним рядком коду ми створюємо два покажчика, один з яких вказує на інший покажчик, який в свою чергу вказує на 2.
    Послухати так маячня
    У мене багато питань,
    Як покажчик вказує просто на двійку? Або там ще і змінна створюється?
    чому спочатку, там потрібно поставити * а потім немає?
    *(*(р = новий подвійний *) = Новий подвійний) = 2;
    І що взагалі відбувається в цьому рядку я так і не розібрався
    Хто в цьому розбирається допоможіть будь ласка, нічого не розумію

    1. Вказівником p присвоюється адреса динамічно виділеної пам'яті в якій зберігається покажчик на double, далі ми разадресуем p і отримуємо покажчик на тип double і динамічно виділяємо йому пам'ять, разадресаціей отримуємо значення цього осередку пам'яті (з подвійною) і присвоюємо йому значення 2.Чи записати по іншому:
      р = новий подвійний *;
      *р = новий подвійний;
      **р = 2;

      1. Спасибо, впринципі я приблизно так і думав, тільки у мене в голові це здавалося набагато складніше

  2. за 4 завданням можете підказати з-за чого виникає ця помилка
    “викликав спрацьовування точки зупину”
    не кожен раз .

  3. Прочитав уроки і подивився відео до цього моменту, зі скрипом намагаюся зрозуміти:
    по 2 завданню, //double* pArrForFill = 0;// як ми таким чином покажчик на масив зробили? типо адресу першого осередку?
    Ще, чому так:
    //double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
    {
    ptrArr = new double[sizeOfArr];//
    а не ось так?
    //double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
    {
    double * ptrArr = новий double[sizeOfArr];//

    1. double* pArrForFill = 0
      ми створюємо покажчик але він просто порожній
      //double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
      {
      double * ptrArr = новий double[sizeOfArr];//
      таким чином ми заново створюємо покажчик, а навіщо нам це робити коли він у нас вже є і ми його передаємо в функцію?

  4. 3 задача:
    #include

    using namespace std;
    void fillArr(int * parr);

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

    int arr[12]{};
    cout << "Массив до функции:\n";
    cout << "___________________________\n";
    for (int i = 0; i < 12; i )
    {
    arr[i] = i + 1;
    cout << arr[i] <<"|";
    }
    fillArr(arr);
    cout << "\n___________________________\n";
    cout << "\nМассив после функции: \n";
    cout << "___________________________\n";
    for (int i = 0; i < 12; i )
    {
    cout << arr[i] << "|";
    }
    cout << "\n___________________________\n";
    return 0;
    }
    void fillArr(int * parr)
    {

    for (int i = 1; i < 12; i = 2)
    {
    int j = парр[i – 1];
    парр[i – 1] = парр[i];
    парр[i] = j;
    }
    }

  5. завдання № 3
    #include
    using namespace std;

    void FillArray(INT * обр, int size)
    {
    for (int i = 0; i < size; i )
    {
    arr[i] = rand() % 100;
    }
    }

    порожнеча OutputArray(INT * обр, int size)
    {
    for (int i = 0; i < size; i )
    {

    cout << + 1 << ": " << arr[i] << "\t";
    }
    cout << endl;
    }

    int main()
    {
    int size = 12;
    INT * обр = новий INT[size];
    FillArray(arr, size);
    OutputArray(arr, size);
    for (int i = 0; i < size; i )
    {
    if ((+ 1) % 2 == 0)
    {
    arr[i] = arr[i] + arr[i – 1];
    arr[i – 1] = arr[i] – arr[i – 1];
    arr[i] = arr [i] – arr[i – 1];
    }
    }
    OutputArray(arr, size);
    return 0;
    }

  6. завдання №3
    я бачу рішення таке, більш просте як мені здається
    порожнеча фуу(int * pmas)
    {
    for (int i = 0; i < 12; i )
    {
    pmas[i] = i + 1;
    cout << " | " << pmas[i];
    }
    cout << "\n\n============================================\n\n";
    for (int ix = 0; ix 0)
    pmas[ix] = pmas[ix] + 1;
    else
    pmas[ix] = pmas[ix] – 1;
    }

    }
    void main()
    {
    setlocale(LC_ALL, “rus”);
    int * mas = новий int[12];
    фуу(але);
    for (int i = 0; i < 12; i )
    {
    cout << " | " << але[i];
    }
    }

  7. А чи не простіше зробити рішення 3 завдання так?:
    //бібліотеки
    #include
    //std
    using namespace std;

    void swapOddAndShow(INT * &p, int size) {
    for (int i = 0; i < size; i ) {
    if (p[i] % 2 == 0) {
    p[i – 1] = p[i];
    p[i] = p[i – 1] – 1;
    }
    }
    for (int i = 0; i < size; i ) { //після
    cout << p[i] << endl;
    }

    }

    int main()
    {
    Const INT розмір = 12;
    int* pArr = новий int[size];
    for (int i = 0; i < size; i ) { //раніше
    молодий лосось[i] = i + 1;
    cout << молодий лосось[i] << endl;
    }

    cout << "=======================" << endl;

    swapOddAndShow(молодий лосось, size);

    delete[] молодий лосось;
    }
    Загалом у мене досвіду трохи, тому я можу помилятися.

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *