Из одномерного массива чисел переписать отрицательные числа в новый массив - C (СИ)
Формулировка задачи:
Подскажите как действовать. Ошибка появляется при записи во 2ой массив отрицательные эл-ты из 1го
На скриншоте видно, что записывается 1 эл-т, а остальные нет ( вместо них- мусор )
#include <stdio.h> // подключение библиотек #include <locale.h> #include <stdlib.h> #include <math.h> #include <time.h> #define BORDER_HIGH 100 // константы для рандома чисел #define BORDER_LOW -100 bool arrUnic(float *arr, int countValue, float value) // функция на проверку уникальности элементов { for (int i = 0; i < countValue; i++) { if (arr[i] == value) return false; } return true; } void main() { setlocale(LC_ALL, "RUS"); float* arr; // первый массив float* arr2 ; // второй массив, в который нужно записать отрицательные числа int length; // кол-во эл-тов массива int countValue = 0, otrel = 0; short a; printf("Введите кол-во эл-тов массива: "); scanf_s("%d", &length); arr = (float *)malloc(length * sizeof(float)); printf("Как заполнить массив? \n 1) с клавиатуры \n 2) рандомно \n 3)выйти \n "); scanf_s("%hd", &a); switch (a) { case 1: { printf("Заполните массив: \n"); for (int i = 0; i < length; i++) { float value; scanf_s("%f", &value); while (!arrUnic(arr, countValue, value)) { printf("Введите значение еще раз: "); scanf_s("%f", &value); } arr[i] = value; countValue++; } } break; case 2: { printf("Массив заполняется рандомно! \n"); srand((unsigned)(time(NULL))); for (int i = 0; i < length; i++) { float value; value = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX); while (!arrUnic(arr, countValue, value)) { printf("Рандомим еще раз: "); value = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX); } arr[i] = value; countValue++; } }; break; case 3: exit(3); break; default: break; } printf("Заполненный массив: \n"); for (int i = 0; i < length; i++) // выводим массив первый, и одновременно подсчитываем кол-во отрицательных эл-тов, чтобы узнать, сколько памяти нужно выделить для 2го массива { if (arr[i] < 0) { otrel++; } printf("a[%d]=%.2f \n", i, arr[i]); } printf("\n\n \n"); arr2 = (float *)malloc(otrel * sizeof(float)); // выделение памяти для 2го массива for (int i = 0; i < length; i++){ // ищем отрицательные эл-ты и записываем во 2ой массив ( тут как раз и непонятности появляются ) if (arr[i] < 0) arr2[i] = arr[i]; } printf("Кол-во отрицательных элеметов: %d \n", otrel); printf("Массив В, в котором хранятся отрицательные элементы \n"); for (int y= 0; y< otrel;y++) // выводим 2ой массив из отрицательных чисел { printf("b[%d]=%.2f \n", y, arr2[y]); } delete arr; delete arr2; system("pause"); }
Решение задачи: «Из одномерного массива чисел переписать отрицательные числа в новый массив»
textual
Листинг программы
for (int i = 0, j=0; i < length; i++){ // ищем отрицательные эл-ты и записываем во 2ой массив ( тут как раз и непонятности появляются ) if (arr[i] < 0) arr2[j++] = arr[i];
Объяснение кода листинга программы
- Объявляется два массива arr и arr2
- В первой строке цикла i инициализируется нулем, а j - нулем.
- Цикл выполняется до тех пор, пока i меньше длины массива arr.
- Если значение элемента массива arr с индексом i меньше нуля, то этот элемент копируется в массив arr2 с инкрементом j.
- После выполнения цикла, в массиве arr2 будут содержаться все отрицательные числа из массива arr.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д