Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/302: Рейтинг темы: голосов - 302, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
1

Удаление элементов массива

04.12.2017, 22:31. Показов 60949. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста, похо разбраюсь в массивах, недавно начала только изучать программирование.

Задача:удалить все элементы меньше 3 и расположенные после первого отрицательного

Добавлено через 8 минут
Массив вещественный, Массив содержит не более 20 элементов, Вспомогательные массивы не использовать
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2017, 22:31
Ответы с готовыми решениями:

Удаление элементов массива
Помогите, пожалуйста, понять как реализовать на Си удаление повторяющихся элементов одномерного...

Удаление элементов массива
Добрый вечер! Написала код,который удаляет все элементы массива меньше 3, подскажите пожалуйста,...

Удаление элементов массива
Здравствуйте. Дан двумерный массив (N=4, M=5). Удалить из строк все отрицательные элементы,...

Удаление элементов массива
Допустим нам дан массив А . Как в данном массиве удалить , ну например 1 и 3 элементы , что бы на...

18
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
04.12.2017, 23:59 2
dashaDK, если правильно понял. Если неправильно, другой поймёт правильно.
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
///Задача:удалить все элементы меньше 3 и расположенные после первого отрицательного
#include <stdio.h>
 
 
int main()
{
    int N = 10;
    int k = N;
 
    float mass[N];
    for( int i = 0; i < N; i++ )
        scanf( "%f", &mass[i] );
    /*--------до--------*/
    for( int i = 0; i < N; i++ )
            printf( "%.3f ", mass[i] );
    for( int i = 0; i < N; i++ )
    {
        if( mass[i] < 3.0 && mass[i] > 0.0 )
            {
                for( int j = i; j < N - 1; j++  )
                        mass[j] = mass[j+1];
 
               mass[k-1] = 0.0;
               k--;
               i = -1;
 
            }
        else
            if( mass[i] < 0.0)
 
                for( int s = N - 1; s >= i; s-- )
                    mass[s] = 0.0;
 
 
    }
    putchar( '\n' );
    /*------после-------*/
    for( int i = 0; i < N; i++ )
            printf( "%.3f ", mass[i] );
    return 0;
}
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
06.12.2017, 21:13  [ТС] 3
Пробую вводить код, который вы отправили, программа выдает следующие ошибки (см. вложения)
Видимо, нужно задать константное значение, и по-моему , тут не выделена память под массив ? Или я не права?
Миниатюры
Удаление элементов массива  
0
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
06.12.2017, 22:52 4
dashaDK, ну сделайте перменную N константой
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
07.12.2017, 00:07  [ТС] 5
Мы же не знаем конкретное число элементов массива , как мы можем задавать данную переменную?
0
0 / 0 / 1
Регистрация: 01.12.2017
Сообщений: 5
07.12.2017, 00:27 6
Вы же сами написали что не больше 20
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
07.12.2017, 00:51  [ТС] 7
Я не совсем понимаю,как в этом случае задать константное значение. Вот есть код, тут он удаляет элементы меньше 3, расположенные до последнего минимального. как можно его переделать,чтобы удалял после первого отрицательного?
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
#include <stdio.h>
#include <math.h>
#include <locale.h>
#define DIM_A 20
 
double first(double *array, int *len_array);
int input(double *array, int len_array); //длина массива, тоже что и К
void output(double *array, int new_array); // ничего не возвращает
 
int main()
{
    int new_array = 0;
    double array[DIM_A], s = 0;
    setlocale(LC_NUMERIC, "eng");
    setlocale(LC_ALL, "rus");
 
    new_array = input(array, DIM_A);
    first(array, &new_array);
    output(array, new_array);
 
    return 0;
}
 
 
int input(double *array, int len_array)
{
    int i, k;
 
    printf("Введите размер массива k:\n");
    scanf_s("%d", &k);
 
 
    if (len_array <k)
    {
        printf("Error");
        return 0;
    }
    for (i = 0; i<k; i++)
    {
        printf("array[%d]=", i);
        scanf_s("%lf", &array[i]);
    }
    return k;
 
}
 
double first(double *array, int *len_array)
{
    int i = 0, j, t = 0, s;
    double  a = array[0];
 
 
    for (i = 0; i < (*len_array); i++)
    {
        if (array[i] >= a)
        {
            a = array[i];
            t = i;
        }
    }
 
 
 
    for (i = (*len_array - 1); i >= 0; i--)
        if ((array[i]<3) && (i < t)) 
        {
            for (j = i; j<(*len_array - 1); j++)
                array[j] = array[j + 1];
            t--;
            (*len_array)--; 
        }
 
 
 
    return 0;
 
}
0
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
07.12.2017, 00:56 8
Цитата Сообщение от dashaDK Посмотреть сообщение
тут не выделена память под массив
память выделена компилятором под статический массив.
Я так понимаю, вы хотите выделить её динамически. Используйте calloc malloc realloc
вместо этого
Цитата Сообщение от Michail97 Посмотреть сообщение
float mass[N];
float *mass = ( float*) malloc( sizeof(float)*N);
напишите так.
И в конце перед return в мэйне поставьте free( mass )
0
229 / 112 / 35
Регистрация: 25.11.2017
Сообщений: 389
07.12.2017, 00:59 9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int N = 20;
int arr[N];
int delete_all = 0;
 
/* функция удаления элемента с индексом i из массива */
void shift(int i)
{
  for (; i < N - 1; i++) { arr[i] = arr[i+1]; }
  N--;
}
 
for (int i = 0; i < N; i++)
{
  if (delete_all) { shift(i); i--; continue; }
  if (arr[i] >= 3) continue; /* Все что больше или равно 3 не трогаем */
  if ((arr[i] >= 0) && (arr[i] < 3)) { shift(i); i--; continue; } /* Выкидываем и на следующей итерации остаемся в том же i */
  if (arr[i] < 0) { delete_all = 1; }
}
На выходе - arr массив с N числом элементов.
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
07.12.2017, 01:02  [ТС] 10
Тут мы изначально задаем число элементов массива равное 10, а мне нужно вести с клавиатуры это количество при запуске программы
0
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
07.12.2017, 01:05 11
dashaDK,
Цитата Сообщение от Michail97 Посмотреть сообщение
int N = 10;
это замените на это
int N;
scanf( "%d", &N);
0
229 / 112 / 35
Регистрация: 25.11.2017
Сообщений: 389
07.12.2017, 01:10 12
Цитата Сообщение от Michail97 Посмотреть сообщение
это замените на это
int N;
scanf( "%d", &N);
И arr[N] заменить на arr[30] например.
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
07.12.2017, 01:22  [ТС] 13
Я, видимо совсем глупая, но ни одна из предложенных вами программ не работает верно, он не выплняет оба условия сразу

Можно как-то переделать тот код, что я отправляла выше, просто изменив цикл?
0
229 / 112 / 35
Регистрация: 25.11.2017
Сообщений: 389
07.12.2017, 01:33 14
Лучший ответ Сообщение было отмечено dashaDK как решение

Решение

Все работает. Только что под MSVS собрал и проверил

Код спрятан тут:
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int N = 20;
double arr[20];
int delete_all = 0;
 
/* функция удаления элемента с индексом i из массива */
void shift(int i)
{
    for (; i < N - 1; i++) { arr[i] = arr[i + 1]; }
    N--;
}
 
int main()
{
    for (int i = 0; i < 20; i++) arr[i] = 0.0;
    printf("Enter N: ");
    scanf_s("%d", &N);
    for (int i = 0; i < N; i++) {
        printf("Enter arr[%d] ", i);
        scanf_s("%lf", &arr[i]);
    }
 
    for (int i = 0; i < N; i++)
    {
        if (delete_all) { shift(i); i--; continue; }
        if (arr[i] >= 3) continue; /* Все что больше или равно 3 не трогаем */
        if ((arr[i] >= 0) && (arr[i] < 3)) { shift(i); i--; continue; } /* Выкидываем и на следующей итерации остаемся в том же i */
        if (arr[i] < 0) { delete_all = 1; }
    }
 
    printf("Result with N = %d\n", N);
    for (int i = 0; i < N; i++) { printf("%8.2lf ", arr[i]); }
    puts("");
}


Единственное что - я не делал проверки ввода на допустимость. Так что за пределы массива сами не вылетайте на радостях.
1
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
07.12.2017, 01:40  [ТС] 15
spvert, Спасибо большое, запустила полносью код, все работает
0
229 / 112 / 35
Регистрация: 25.11.2017
Сообщений: 389
07.12.2017, 01:59 16
Цитата Сообщение от dashaDK Посмотреть сообщение
все работает
Вы, главное, разберитесь как оно работает.
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
08.12.2017, 21:13  [ТС] 17
Сейчас стала еще раз проверять код, он удаляет в любом из случаев (т.е. либо если меньше 3, либо, когда после отрицатеьного располоены элементы), а мне нужно, чтобы одновременно выполнялись оба условия, только тогда он бы удалял. Подскажите, как исправить?
0
229 / 112 / 35
Регистрация: 25.11.2017
Сообщений: 389
08.12.2017, 23:40 18
Цитата Сообщение от spvert Посмотреть сообщение
for (int i = 0; i < N; i++) { if (delete_all) { shift(i); i--; continue; } if (arr[i] >= 3) continue; /* Все что больше или равно 3 не трогаем */ if ((arr[i] >= 0) && (arr[i] < 3)) { shift(i); i--; continue; } /* Выкидываем и на следующей итерации остаемся в том же i */ if (arr[i] < 0) { delete_all = 1; } }
Этот кусок переписываем как
C
1
2
3
4
5
    for (int i = 0; i < N; i++)
    {
        if ((delete_all) && (arr[i] < 3)) { shift(i); i--; continue; }
        if (arr[i] < 0) { delete_all = 1; }
    }
0
0 / 0 / 0
Регистрация: 04.12.2017
Сообщений: 11
09.12.2017, 01:40  [ТС] 19
А если,например,мне нужно,чтобы сам отрицательный элемент,также выводился, что нужно изменить в цикле?
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 <math.h>
#include <locale.h>
#define DIM_A 20
#include <stdlib.h>
 
 
int N = 20;
double arr[20];
int delete_all = 0;
 
/* функция удаления элемента с индексом i из массива */
void shift(int i)
{
    for (; i < N - 1; i++) { arr[i] = arr[i + 1]; }
    N--;
}
 
int main()
{
    for (int i = 0; i < 20; i++) arr[i] = 0.0;
    printf("Enter N: ");
    scanf_s("%d", &N);
    for (int i = 0; i < N; i++) {
        printf("Enter arr[%d] ", i);
        scanf_s("%lf", &arr[i]);
    }
 
    for (int i = 0; i < N; i++)
    {
        if ((delete_all) && (arr[i] < 3)) { shift(i); i--; continue; }
        if (arr[i] < 0) { delete_all = 1; }
    }
        }
    }
        
 
        printf("Result with N = %d\n", N);
        for (int i = 0; i < N; i++) { printf("%8.2lf ", arr[i]); }
        puts("");
    }
0
09.12.2017, 01:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2017, 01:40
Помогаю со студенческими работами здесь

Удаление элементов массива
Помогите пожалуйста, надо удалить элементы равные К и вывести массив, я чуток начал помогите...

Удаление схожих элементов массива
int sqeeze(char fir, char sec) /* delete all symbols in first array exist in second array */ { ...

Удаление элементов из целочисленного массива
Описать функцию RemoveX(A, N, X), удаляющую из целочисленного массива A размера N элементы, равные...

Удаление элементов динамического массива
Помогите изменить программу. Сейчас формируется двумерный массив. И добавляется в него строка с...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru