Compare commits

...

6 Commits

Author SHA1 Message Date
55e90d2356
Add README.md 2025-03-13 16:06:21 +03:00
b05e76d3d7
first version of Makefile 2025-03-13 15:59:14 +03:00
e40ce553c7
first version of t4 2025-03-13 15:58:46 +03:00
e7c81c7c16
first version of t3 2025-03-13 15:58:38 +03:00
0106cbaba2
first version of t2 2025-03-13 15:58:29 +03:00
9d5d5f5c07
first version of t1 2025-03-13 15:57:42 +03:00
6 changed files with 240 additions and 0 deletions

View File

@ -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

52
README.md Normal file
View File

@ -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
```

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}