Compare commits
6 Commits
4407abacbe
...
55e90d2356
| Author | SHA1 | Date | |
|---|---|---|---|
| 55e90d2356 | |||
| b05e76d3d7 | |||
| e40ce553c7 | |||
| e7c81c7c16 | |||
| 0106cbaba2 | |||
| 9d5d5f5c07 |
26
Makefile
26
Makefile
@ -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
52
README.md
Normal 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
|
||||
```
|
||||
20
task1/main.c
20
task1/main.c
@ -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;
|
||||
}
|
||||
36
task2/main.c
36
task2/main.c
@ -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;
|
||||
}
|
||||
38
task3/main.c
38
task3/main.c
@ -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;
|
||||
}
|
||||
68
task4/main.c
68
task4/main.c
@ -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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user