Skip to content

Программирование_Лабораторная_работа_2 #1

@veskprogrammer

Description

@veskprogrammer

Тема лабораторной работы: Указатели, арифметика указателей


Задача 1: Работа с указателями

Постановка задачи:

Внутри функции int main(void) { /*...*/ } определите указатель double ***pointer = NULL;. Инициализируйте этот указатель адресом другого указателя типа double **, который указывает на переменную double *, которая указывает на double. Используйте pointer для записи и чтения значения 2.0 в сегмент оперативной памяти для double.

Математическая модель:

  • pointer — указатель на указатель на указатель на double.
  • pointer должен быть инициализирован так, чтобы он указывал на double **, который указывает на double *, который указывает на double.

Список идентификаторов:

Имя переменной Тип данных Описание
pointer double *** Указатель на указатель на указатель на double
ptr2 double ** Указатель на указатель на double
ptr1 double * Указатель на double
value double Переменная типа double

Код программы:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    double ***pointer = NULL;
    double **ptr2 = (double **)malloc(sizeof(double *));
    double *ptr1 = (double *)malloc(sizeof(double));
    *ptr1 = 2.0;
    *ptr2 = ptr1;
    pointer = &ptr2;

    printf("Значение: %f\n", ***pointer);

    free(ptr1);
    free(ptr2);

    return 0;
}

Результаты работы программы:

Значение: 2.000000

Задача 2: Сложение двух чисел

Постановка задачи:

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

Математическая модель:

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

Список идентификаторов:

Имя переменной Тип данных Описание
a int Первое число
b int Второе число
sum int Результат сложения
ptr_a int * Указатель на первое число
ptr_b int * Указатель на второе число

Код программы:

#include <stdio.h>

int main(void) {
    int a = 5, b = 10;
    int *ptr_a = &a, *ptr_b = &b;
    int sum = *ptr_a + *ptr_b;

    printf("Сумма: %d\n", sum);

    return 0;
}

Результаты работы программы:

Сумма: 15

Задача 3: Нахождение максимума из двух чисел

Постановка задачи:

Напишите программу, которая находит максимальное число из двух чисел, используя указатели на эти числа.

Математическая модель:

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

Список идентификаторов:

Имя переменной Тип данных Описание
a int Первое число
b int Второе число
max int Максимальное значение
ptr_a int * Указатель на первое число
ptr_b int * Указатель на второе число

Код программы:

#include <stdio.h>

int main(void) {
    int a = 5, b = 10;
    int *ptr_a = &a, *ptr_b = &b;
    int max = (*ptr_a > *ptr_b) ? *ptr_a : *ptr_b;

    printf("Максимум: %d\n", max);

    return 0;
}

Результаты работы программы:

Максимум: 10

Задача 4: Динамический массив с плавающей точкой

Постановка задачи:

Напишите программу, которая создаёт одномерный динамический массив из чисел с плавающей точкой двойной точности, заполняет его значениями с клавиатуры и распечатывает все элементы этого массива, используя арифметику указателей (оператор +), а не оператор доступа к элементу массива [ ].

Математическая модель:

  • Используем динамическое выделение памяти для массива и арифметику указателей для доступа к элементам.

Список идентификаторов:

Имя переменной Тип данных Описание
arr double * Указатель на массив
n int Размер массива
i int Счётчик цикла

Код программы:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n;
    printf("Введите размер массива: ");
    scanf("%d", &n);

    double *arr = (double *)malloc(n * sizeof(double));
    if (arr == NULL) {
        printf("Ошибка выделения памяти\n");
        return 1;
    }

    printf("Введите элементы массива:\n");
    for (int i = 0; i < n; i++) {
        scanf("%lf", arr + i);
    }

    printf("Элементы массива:\n");
    for (int i = 0; i < n; i++) {
        printf("%.2f ", *(arr + i));
    }
    printf("\n");

    free(arr);

    return 0;
}

Результаты работы программы:

Введите размер массива: 3
Введите элементы массива:
1.1 2.2 3.3
Элементы массива:
1.10 2.20 3.30

Задача 5: Обратный порядок элементов массива

Постановка задачи:

Выведите элементы динамического массива целых чисел в обратном порядке, используя указатель и операцию декремента (--).

Математическая модель:

  • Используем указатель для доступа к элементам массива в обратном порядке.

Список идентификаторов:

Имя переменной Тип данных Описание
arr int * Указатель на массив
n int Размер массива
i int Счётчик цикла

Код программы:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n;
    printf("Введите размер массива: ");
    scanf("%d", &n);

    int *arr = (int *)malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("Ошибка выделения памяти\n");
        return 1;
    }

    printf("Введите элементы массива:\n");
    for (int i = 0; i < n; i++) {
        scanf("%d", arr + i);
    }

    printf("Элементы массива в обратном порядке:\n");
    for (int i = n - 1; i >= 0; i--) {
        printf("%d ", *(arr + i));
    }
    printf("\n");

    free(arr);

    return 0;
}

Результаты работы программы:

Введите размер массива: 3
Введите элементы массива:
1 2 3
Элементы массива в обратном порядке:
3 2 1

Задача 6: Побайтовый вывод переменной

Постановка задачи:

Определите переменную целого типа int a = 1234567890; и выведите побайтово её содержимое на экран, используя указатель char *.

Математическая модель:

  • Используем указатель типа char * для доступа к каждому байту переменной типа int.

Список идентификаторов:

Имя переменной Тип данных Описание
a int Переменная типа int
byte_ptr char * Указатель на байт

Код программы:

#include <stdio.h>

int main(void) {
    int a = 1234567890;
    char *byte_ptr = (char *)&a;

    printf("Побайтовый вывод переменной a:\n");
    for (int i = 0; i < sizeof(int); i++) {
        printf("Байт %d: %d\n", i, *(byte_ptr + i) & 0xFF);
    }

    return 0;
}

Результаты работы программы:

Побайтовый вывод переменной a:
Байт 0: 210
Байт 1: 2
Байт 2: 150
Байт 3: 73

Задача 7: Двумерный динамический массив

Постановка задачи:

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

Математическая модель:

  • Используем массив указателей для создания двумерного массива и освобождаем память в обратном порядке.

Список идентификаторов:

Имя переменной Тип данных Описание
arr int ** Указатель на массив указателей
rows int Количество строк
cols int Количество столбцов
i int Счётчик цикла

Код программы:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int rows = 3, cols = 4;
    int **arr = (int **)malloc(rows * sizeof(int *));
    for (int i = 0; i < rows; i++) {
        arr[i] = (int *)malloc(cols * sizeof(int));
    }

    // Заполнение массива
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            arr[i][j] = i * cols + j;
        }
    }

    // Вывод массива
    printf("Массив:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    // Освобождение памяти
    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}

Результаты работы программы:

Массив:
0 1 2 3 
4 5 6 7 
8 9 10 11 

Информация о студенте:

Киселев Г. П., 1 курс, ИВТ-1.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions