Из одномерного массива чисел переписать отрицательные числа в новый массив - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Подскажите как действовать. Ошибка появляется при записи во 2ой массив отрицательные эл-ты из 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");
}
На скриншоте видно, что записывается 1 эл-т, а остальные нет ( вместо них- мусор )

Решение задачи: «Из одномерного массива чисел переписать отрицательные числа в новый массив»

textual
Листинг программы
for (int i = 0, j=0; i < length; i++){ // ищем отрицательные эл-ты и записываем во 2ой массив ( тут как раз и непонятности  появляются )
    if (arr[i] < 0) 
    arr2[j++] = arr[i];

Объяснение кода листинга программы

  1. Объявляется два массива arr и arr2
  2. В первой строке цикла i инициализируется нулем, а j - нулем.
  3. Цикл выполняется до тех пор, пока i меньше длины массива arr.
  4. Если значение элемента массива arr с индексом i меньше нуля, то этот элемент копируется в массив arr2 с инкрементом j.
  5. После выполнения цикла, в массиве arr2 будут содержаться все отрицательные числа из массива arr.

Оцени полезность:

11   голосов , оценка 3.727 из 5
Похожие ответы