Из одномерного массива чисел переписать отрицательные числа в новый массив - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д