Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55e90d2356
|
||
|
|
b05e76d3d7
|
||
|
|
e40ce553c7
|
||
|
|
e7c81c7c16
|
||
|
|
0106cbaba2
|
||
|
|
9d5d5f5c07
|
No files matched your search
@@ -0,0 +1,26 @@
|
|||||||
|
# Компилятор
|
||||||
|
CC = gcc
|
||||||
|
|
||||||
|
# Флаги компиляции (для математической библиотеки в задаче 4)
|
||||||
|
CFLAGS = -Wall
|
||||||
|
|
||||||
|
# Объявляем цели как .PHONY, чтобы make всегда выполнял команды
|
||||||
|
.PHONY: all task1 task2 task3 task4 clean
|
||||||
|
|
||||||
|
# Цель по умолчанию – сборка всех проектов
|
||||||
|
all: task1 task2 task3 task4
|
||||||
|
|
||||||
|
task1:
|
||||||
|
$(CC) $(CFLAGS) task1/main.c -o task1/task1
|
||||||
|
|
||||||
|
task2:
|
||||||
|
$(CC) $(CFLAGS) task2/main.c -o task2/task2
|
||||||
|
|
||||||
|
task3:
|
||||||
|
$(CC) $(CFLAGS) task3/main.c -o task3/task3
|
||||||
|
|
||||||
|
task4:
|
||||||
|
$(CC) $(CFLAGS) task4/main.c -lm -o task4/task4
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f task1/task1 task2/task2 task3/task3 task4/task4
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# Проект "Работа с указателями, динамической памятью и массивами в C"
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
```
|
||||||
|
pr3_sysprog/
|
||||||
|
├── task1/
|
||||||
|
│ └── main.c
|
||||||
|
├── task2/
|
||||||
|
│ └── main.c
|
||||||
|
├── task3/
|
||||||
|
│ └── main.c
|
||||||
|
├── task4/
|
||||||
|
│ └── main.c
|
||||||
|
└── Makefile
|
||||||
|
```
|
||||||
|
|
||||||
|
## Описание задач
|
||||||
|
|
||||||
|
### Task 1: Работа с указателями на целые переменные
|
||||||
|
- Программа считывает два целых числа, направляет указатели на них и изменяет значения: увеличивает первую переменную в 2 раза, а вторую уменьшает в 2 раза.
|
||||||
|
|
||||||
|
### Task 2: Динамическое выделение памяти
|
||||||
|
- Описываются три указателя `float`. Для них выделяется динамическая память, присваиваются произвольные значения, а затем первые две переменные меняются местами.
|
||||||
|
|
||||||
|
### Task 3: Поиск отрицательных элементов массива
|
||||||
|
- Программа создает динамический массив, находит индексы отрицательных элементов и вычисляет их среднее арифметическое.
|
||||||
|
|
||||||
|
### Task 4: Создание нового массива и сортировка
|
||||||
|
- Из массива `b(n)` создается новый массив `C(n)`, содержащий квадратные корни из положительных элементов массива `b(n)`, деленные на 5. Затем массив `C(n)` сортируется методом выбора.
|
||||||
|
|
||||||
|
## Компиляция и запуск
|
||||||
|
|
||||||
|
### Компиляция
|
||||||
|
Для сборки всех подзадач используйте команду:
|
||||||
|
```sh
|
||||||
|
make all
|
||||||
|
```
|
||||||
|
|
||||||
|
Если make сообщает, что "Nothing to be done", выполните очистку и пересборку:
|
||||||
|
```sh
|
||||||
|
make clean
|
||||||
|
make all
|
||||||
|
```
|
||||||
|
|
||||||
|
### Запуск программ
|
||||||
|
Исполняемые файлы создаются в соответствующих подкаталогах. Для запуска используйте команды:
|
||||||
|
```sh
|
||||||
|
./task1/task1 # Запуск Task 1
|
||||||
|
./task2/task2 # Запуск Task 2
|
||||||
|
./task3/task3 # Запуск Task 3
|
||||||
|
./task4/task4 # Запуск Task 4
|
||||||
|
```
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int a, b;
|
||||||
|
int *p_a, *p_b;
|
||||||
|
|
||||||
|
printf("Введите два целых числа: ");
|
||||||
|
scanf("%d %d", &a, &b);
|
||||||
|
|
||||||
|
// Присваиваем указателям адреса переменных
|
||||||
|
p_a = &a;
|
||||||
|
p_b = &b;
|
||||||
|
|
||||||
|
// Изменяем значения через указатели
|
||||||
|
*p_a = *p_a * 2;
|
||||||
|
*p_b = *p_b / 2;
|
||||||
|
|
||||||
|
printf("Новая a = %d, новая b = %d\n", a, b);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
float *p1, *p2, *p3;
|
||||||
|
|
||||||
|
// Выделение динамической памяти для трёх переменных
|
||||||
|
p1 = (float*) malloc(sizeof(float));
|
||||||
|
p2 = (float*) malloc(sizeof(float));
|
||||||
|
p3 = (float*) malloc(sizeof(float));
|
||||||
|
|
||||||
|
if (!p1 || !p2 || !p3) {
|
||||||
|
printf("Ошибка выделения памяти.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Присваиваем произвольные значения
|
||||||
|
*p1 = 3.14f;
|
||||||
|
*p2 = 2.71f;
|
||||||
|
*p3 = 1.41f;
|
||||||
|
|
||||||
|
// Обмен значениями между p1 и p2
|
||||||
|
float temp = *p1;
|
||||||
|
*p1 = *p2;
|
||||||
|
*p2 = temp;
|
||||||
|
|
||||||
|
printf("Значения после обмена:\n");
|
||||||
|
printf("p1 = %f\np2 = %f\np3 = %f\n", *p1, *p2, *p3);
|
||||||
|
|
||||||
|
// Освобождаем динамическую память
|
||||||
|
free(p1);
|
||||||
|
free(p2);
|
||||||
|
free(p3);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int n;
|
||||||
|
printf("Введите размер массива: ");
|
||||||
|
scanf("%d", &n);
|
||||||
|
|
||||||
|
int *a = (int*) malloc(n * sizeof(int));
|
||||||
|
if (!a) {
|
||||||
|
printf("Ошибка выделения памяти.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Введите %d элементов массива:\n", n);
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
scanf("%d", &a[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sum = 0, count = 0;
|
||||||
|
printf("Индексы отрицательных элементов: ");
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (a[i] < 0) {
|
||||||
|
printf("%d ", i);
|
||||||
|
sum += a[i];
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
if (count > 0)
|
||||||
|
printf("Среднее арифметическое отрицательных элементов = %f\n", (float)sum / count);
|
||||||
|
else
|
||||||
|
printf("Отрицательных элементов не найдено.\n");
|
||||||
|
|
||||||
|
free(a);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int n;
|
||||||
|
printf("Введите размер массива b: ");
|
||||||
|
scanf("%d", &n);
|
||||||
|
|
||||||
|
int *b = (int*) malloc(n * sizeof(int));
|
||||||
|
if (!b) {
|
||||||
|
printf("Ошибка выделения памяти.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Введите %d элементов массива b:\n", n);
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
scanf("%d", &b[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Определяем количество положительных элементов
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (b[i] > 0) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Выделяем память для массива C
|
||||||
|
double *C = (double*) malloc(count * sizeof(double));
|
||||||
|
if (!C) {
|
||||||
|
printf("Ошибка выделения памяти для массива C.\n");
|
||||||
|
free(b);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Заполняем массив C
|
||||||
|
int j = 0;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (b[i] > 0) {
|
||||||
|
C[j] = sqrt(b[i]) / 5.0;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сортировка массива C методом выбора
|
||||||
|
for (int i = 0; i < count - 1; i++) {
|
||||||
|
int minIndex = i;
|
||||||
|
for (int k = i + 1; k < count; k++) {
|
||||||
|
if (C[k] < C[minIndex])
|
||||||
|
minIndex = k;
|
||||||
|
}
|
||||||
|
// Обмен значениями
|
||||||
|
double temp = C[i];
|
||||||
|
C[i] = C[minIndex];
|
||||||
|
C[minIndex] = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Отсортированный массив C:\n");
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
printf("%f ", C[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
free(b);
|
||||||
|
free(C);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in new issue
Block a user