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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. В цілому придатно. Чи не вчитувався, подивився по діагоналі. картинки красиві.

    Функції типу giveMemoryToArr я б не писав (хоча, на смак і колір…).
    Якщо вже їх залишати, то ІМХО подвійний * FreeMemory(double* ptrArr) повинна повертати void. Навіщо вона повертає у вас завжди нуль?

    Приклад б який-небудь ще (більш об'ємний)… Шашки (людина проти людини) чи що…

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

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

  3. Так-то напевно можна задачу 3 і без буферів вирішити:
    недійсний mixmass(ІНТ С.З., int *arr)
    {
    for (int i = 1; i < С.З.; i )
    {
    if (arr[i] % 2 == 0)
    arr[i] = Я-1;
    }
    }
    ————————————————————–
    for (int i = 0; i < С.З.; i )
    {
    маса [i] = + 1;
    std::cout << маса [i] << std::кінці;
    };

    mixmass(С.З., маса);

    Але у мене не доходить..

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

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

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

  5. 3 задача

    #include
    using namespace std;

    int main()
    {
    setlocale(LC_ALL, “rus”);
    system(“колір E0”);

    INT * масив = новий INT[12];
    for (int i = 0; i < 12; i )
    {
    array[i] = i + 1;
    cout << array[i] << " ";
    }

    cout << endl;

    INT B = 0;
    int j = 1;
    ІНТ зберегти = 0;
    for (int i = 0; i < 6; i )
    {
    зберегти = масив[b];
    array[b] = масив[j];
    array[j] = зберегти;

    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 ** бовдура, INT size1, внутр size2)
    {
    **бовдура = новий INT * [size1];
    for (int i = 0; i < size1; i )
    {
    бовдур[i] = new int[size2];
    }
    повернутися ** бовдура;
    }

    так він видає помилку


    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. Спасибо! як я зрозумів, не обов'язково вказувати тип і індекс масиву (бовдур) аргументи функцій, ми просто повертаємо значення?

    1. Тут параметр виявляється просто зайвий – ви його значення все-одно затрёте після new, а тип його (і елементів масиву) змінити все-одно не можете.

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

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