Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.11.2022
Сообщений: 76

Найти наибольший отрицательный элемент одномерного массива и удалить его, сдвинув оставшиеся элементы к началу массива

02.01.2023, 12:16. Показов 921. Ответов 10

Студворк — интернет-сервис помощи студентам
Условие: Найти наибольший отрицательный элемент одномерного массива и удалить его, сдвинув оставшиеся элементы к началу массива. Если в массиве несколько элементов имеют наибольшее отрицатель- ное значение, удалить их все. Массив, все элементы которого отрицательны и равны между собой, признается некорректным.

Выводить сообщение об ошибке при некорректных и равных значениях получается, а вот удалить максимальный элемент — нет. Не понимаю, как доработать код, чтобы задача была корректной.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 7
 
int main() {
    srand(time(NULL));
    int a[N], max = -100000;
 
    for (int i = 0; i < N; i++)
    {
        a[i] = rand()%100-50;
        printf("%5d", a[i]);
    }
    printf("\n");
 
    for (int i = 0; i < N; i++)
    {
        if (a[i] < 0)
        {
            if (a[i] > max)
            {
                max = a[i];
 
                for (int i = 0; i < N - 1; i++)
                {
                    if ((a[i] < 0 && a[i+1] < 0) || a[i] == a[i+1])
                    {
                        printf("Error");
                        break;
                    }
                    else
                    {
                        max = a[i+1];
                    }
                }
            }
        }
    }
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2023, 12:16
Ответы с готовыми решениями:

Удалите из массива наименьший и наибольший элементы, сдвинув все оставшиеся элементы к началу массива
Дан массив. Удалите из массива наименьший и наибольший элементы, сдвинув все оставшиеся элементы к началу массива.

Найти наибольший отрицательный элемент одномерного массива и удалить его
Найти наибольший отрицательный элемент одномерного массива и удалить его, сдвинув оставшиеся элементы к началу массива. Если в массиве...

Найти наибольший отрицательный элемент одномерного массива и удалить его
Найти наибольший отрицательный элемент одномерного массива и удалить его, сдвинув оставшиеся элементы к началу массива. Если в массиве...

10
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.01.2023, 14:50
Основная идея:
C
1
2
3
4
5
int max=-1000;
for (int i=N; i-->0;) if (a[i]<0 && max<a[i]) max=a[i];
int j=0;
for (; j<N && max!=a[j]; ++j); 
for (int i=j+1; i<N; ++i) if (max!=a[i]) a[j++]=a[i];
Добавлено через 7 минут
Легко заметить, что можно немного упростить:
C
1
2
3
int max=-1000, j=-1;
for (int i=N; i-->0;) if (a[i]<0 && max<a[i]) { max=a[i]; j=i; }
for (int i=j+1; i<N; ++i) if (max!=a[i]) a[j++]=a[i];
1
0 / 0 / 0
Регистрация: 17.11.2022
Сообщений: 76
02.01.2023, 15:10  [ТС]
Все равно не очень понимаю механизм работы программы. Получается, что мы создаем новый массив, из которого удаляем максимальный отрицательный. Реализовать печать нового массива нужно в последнем цикле?

C
1
2
3
4
5
6
7
8
9
for (int i=j+1; i<N; ++i)
    {
        if (max!=a[i])
        {
            a[j++]=a[i];
            printf("%5d", a[j]);
        }
 
    }
Добавлено через 2 минуты
Общее решение сейчас выглядит вот так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 7
 
int main() {
    srand(time(NULL));
    int a[N], max = -100000, j = 0;
 
    for (int i = 0; i < N; i++)
    {
        a[i] = rand()%100-50;
        printf("%5d", a[i]);
    }
    printf("\n");
 
    for (int i=N; i-->0;)
    {
        if (a[i]<0 && max<a[i])
        {
            max=a[i];
        }
    }
 
    for (; j<N && max!=a[j]; ++j);
    for (int i=j+1; i<N; ++i)
    {
        if (max!=a[i])
        {
            a[j++]=a[i];
            printf("%5d", a[j]);
        }
 
    }
    
    return 0;
}
Если честно, то я не до конца понимаю, как задается цикл for (int i=N; i-->0 и for (int i=j+1; i<N; ++i). Чем в данном случае является переменная j и почему она принимает значение i+1?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
02.01.2023, 16:50
Я б отделил мух от котлет...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main() {
#define N 7
    int a[N], n=N, max=-100000;
 
    srand(time(NULL));
    for (int i=0; i<N; ++i)
        a[i]=rand()%100-50;
 
    printf("A =\n");
    for (int i=0; i<N; ++i) printf("%5d",a[i]); printf("\n");
 
    for (int i=N; i-->0;)
        if (a[i]<0 && max<=a[i]) {
            max=a[i]; n=i;
        }
    for (int i=n+1; i<N; ++i)
        if (max!=a[i])
            a[n++]=a[i];
 
    printf("A'=\n");
    for (int i=0; i<n; ++i) printf("%5d",a[i]); printf("\n");
    
    return 0;
}
Цитата Сообщение от Boiycha Посмотреть сообщение
задается цикл
Вопрос непонятен.

Добавлено через 11 минут
9-11: инициализация массива,
13-14, 24-25: вывод исходного и измененного массива,
16-19: поиск первого из отрицательных максимальных и его индекса,
20-22: оставим в массиве только те элементы, что не равны max, заодно в n получим новую длину.

Добавлено через 2 минуты
Если цикл в 16-19 не нравится, можно записать его обычно:
C
16
17
18
19
    for (int i=0; i<N; ++i)
        if (a[i]<0 && max<a[i]) {
            max=a[i]; n=i;
        }
Добавлено через 10 минут
Ах да, по условиям нужно выполнить проверку... Правда условие некорректности немного странное, тем не менее:
C
23
    if (n==0)  //  все отрицательны и равны между собой
0
 Аватар для crazykreis
37 / 21 / 17
Регистрация: 13.04.2016
Сообщений: 106
04.01.2023, 18:46
Boiycha, если можно использовать дополнительный массив:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int del_dublicat(int arr[], int n);
 
int main(void)
{
    srand(time(NULL));
    unsigned int SIZE;
    printf("Введите желаемое количество элементов массива: ");
    scanf("%d",&SIZE);
    int * array, i,sign;
 
    array = (int *)malloc(sizeof(int) * SIZE);
 
    printf("%s","Исходный массив:     ");
    for(i = 0; i < SIZE; i++)
    {
        sign = rand() % 2;
        switch(sign)
        {
        case 0: array[i] = rand() % 10 + 1;
        break;
        case 1: array[i] = (rand() % 10 + 1) * (-1);
        break;
        }
 
        printf("%d  ",array[i]);
    }
 
    printf("\n");
 
    for(i = 0; i < SIZE; i++)
    if(array[i] < 0 && array[i] == array[i+1])
      {
        fprintf(stderr,"ОШИБКА: в этом массиве все элементы отрицательны "
                "и равны между собой, что по условию задания недопустимо.\n");
        exit(1);
       }
 
    SIZE = del_dublicat(array,SIZE);
 
    printf("%s","Получившийся массив: ");
    for(i = 0; i < SIZE; i++)
        printf("%d  ",array[i]);
 
    printf("\n");
 
    free(array);
 
    return 0;
}
 
 
int del_dublicat(int arr[], int n)
{
    int * temp, size, i = 0, j = 0, max = 1,count = 0;
 
    for(i = 0; i < n; i++)
                if(arr[i] < 0 && (arr[i] > max || max == 1))
                max = arr[i];
 
            for(i = 0; i < n; i++)
                if(arr[i] == max)
                    count++;
 
    size = n - count;
    temp = (int *)malloc(sizeof(int) * size);
 
   for(i = 0; i < n;)
   {
       if(arr[i] != max)
       {
       temp[j] = arr[i];
       i++;
       j++;
       }
       if(arr[i] == max)
           i++;
   }
 
   free(arr);
 
   arr = (int *)malloc(sizeof(int) * size);
   for(i = 0; i < size; i++)
       arr[i] = temp[i];
 
   free(temp);
 
   printf("Удаляемый элемент:   %d\n",max);
 
   return size;
 
}
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
04.01.2023, 19:15
crazykreis,
слишком много ошибок...

Добавлено через 2 минуты
Посмотрите, что будет, если
C
33
  array[0]=array[1]=-1;
Добавлено через 12 минут
Ну и нерациональностей тоже хватает...
Например, вместо 20-27 достаточно:
C
20
  array[i] = (rand() % 10 + 1) * (rand() % 2 * 2 - 1);
Хотя не совсем понятно, зачем бы исключать нули, ни в условии ничего подобного нет, ни алгоритм этого не требует.
0
 Аватар для crazykreis
37 / 21 / 17
Регистрация: 13.04.2016
Сообщений: 106
04.01.2023, 19:43
bormant,
Цитата Сообщение от bormant Посмотреть сообщение
Хотя не совсем понятно, зачем бы исключать нули, ни в условии ничего подобного нет, ни алгоритм этого не требует.
Не зачем, я это сделал просто потому что захотел. Чтобы числа для наглядности были от 1 до 10.
Проверку все ли равные отрицательные числа переделать 2 мин, я просто поздно вспомнил что она тоже должна быть в коде, надо было уже выходить. Это вообще не критичные участки.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
04.01.2023, 20:33
Цитата Сообщение от crazykreis Посмотреть сообщение
Это вообще не критичные участки
Это только пара примеров.

Думаете новый arr, выделенный в строке 85, сможет вернуться из функции?
Согласитесь, это достаточно критично.

А кажется, что работает, только потому, что malloc() в строке 85 по счастливой случайности выдает тот же адрес, что и malloc() в строке 15


Добавлено через 6 минут
Но если строки 83, 85 убрать, то код хоть формально корректным в этой части станет, хоть и по-прежнему неэффективным...
0
 Аватар для crazykreis
37 / 21 / 17
Регистрация: 13.04.2016
Сообщений: 106
04.01.2023, 20:41
да кстати вы правы. Я тоже думал, что arr не вернется из функции, пробовал удалять его) Там в итоге если SIZE вернуть прежний новый массив на старый наложиться вроде.
0
 Аватар для crazykreis
37 / 21 / 17
Регистрация: 13.04.2016
Сообщений: 106
05.01.2023, 12:11
Boiycha, вот этот код можешь смело использовать:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
 
bool check(int arr[], unsigned int size)
{
    for (int i = 1; i < size; i++)
        if (arr[0] != arr[i])
            return false;
    return true;
}
 
int main(void)
{
    srand(time(NULL));
    int * array, *new_array, new_size, i, j, min, max, value = 1, count = 0;
    unsigned int SIZE;
    printf("Введите желаемое количество элементов массива: ");
    scanf("%d",&SIZE);
    printf("Давайте сгенерируем случайный набор чисел.\n");
    printf("Введите минимальное число из вашего диапазона: ");
    scanf("%d",&min);
    printf("Теперь введите максимальное число из вашего диапазона: ");
    scanf("%d",&max);
    array = (int *)malloc(sizeof(int) * SIZE);
    printf("%s","Исходный массив:     ");
    for(i = 0; i < SIZE; i++)
    {
        array[i] = (rand() % (max + 1 - min)) + min;
        printf("%d  ",array[i]);
    }
 
    printf("\n");
 
        if(check(array,SIZE) == true)
      {
        fprintf(stderr,"ОШИБКА: в этом массиве все элементы отрицательны "
                "и равны между собой, что по условию задания недопустимо.\n");
        exit(1);
       }
 
    for(i = 0; i < SIZE; i++)
                    if(array[i] < 0 && (array[i] > value || value == 1))
                    value = array[i];
 
                for(i = 0; i < SIZE; i++)
                    if(array[i] == value)
                        count++;
 
                new_size = SIZE - count;
                new_array = (int *)malloc(sizeof(int) * new_size);
 
                   for(i = 0; i < SIZE;)
                   {
                       if(array[i] != value)
                       {
                       new_array[j] = array[i];
                       i++;
                       j++;
                       }
                       if(array[i] == value)
                           i++;
                   }
 
    printf("%s","Получившийся массив: ");
    for(i = 0; i < new_size; i++)
        printf("%d  ",new_array[i]);
 
    printf("\n");
 
    printf("Удалённый элемент:   %d\n",value);
 
    free(new_array);
    free(array);
 
    return 0;
}
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
05.01.2023, 13:31
crazykreis,
так не получше вместо 54-64:
C
54
55
56
    for(i=0; i<SIZE; ++i)
      if (array[i]!=value)
        new_array[j++] = array[i];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2023, 13:31
Помогаю со студенческими работами здесь

Найти наибольший отрицательный элемент массива А(23) и удалить его
Найти наибольший отрицательный элемент массива А(23) и удалить его.На языке Си

Найти наибольший отрицательный элемент одномерного массива
помогите пожалуйста составить программу по задаче дан одномерный массив из 22 чисел, надо найти значение и номер наибольшего...

Найти наибольший отрицательный и наименьший положительный элементы одномерного массива
В заданном векторе (одномерном массиве) найти: наибольший отрицательный и наименьший положительные элементы.

Массивы. Удалить из массива все элементы, превосходящие х, а оставшиеся сдвинуть к началу
Введите с клавиатуры число х и удалите из массива все элементы, превосходящие х, а оставшиеся сдвинтек началу массива с сохранением...

FASM - Среди элементов одномерного массива найти наибольший отрицательный и наименьший положительный элементы
Среди элементов одномерного массива найти наибольший отрицательный и наименьший положительный элементы. Массив задать в сегменте данных....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru