Из одномерного массива чисел переписать отрицательные числа в новый массив - 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.