7 / 7 / 4
Регистрация: 30.11.2015
Сообщений: 107
1

Удалить из массива все элементы, которые встречаются больше двух раз

16.01.2016, 20:22. Показов 4607. Ответов 14
Метки нет (Все метки)

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

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

Удалить из последовательности слова которые встречаются больше 1 раза.
Дано последовательность слов разделенных запятыми, в конце точка. Удалить из последовательности...

Найти все элементы массива, которые больше левого соседа как минимум в два раза
На языке Ассемблера 1) Дан массив целых чисел. Найти все элементы, которые больше левого соседа...

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

14
1 / 1 / 1
Регистрация: 10.01.2016
Сообщений: 58
16.01.2016, 21:37 2
это значит что массив уже записан и его не нужно вводить с клавиатуры?
по-моему это немного не по теме вопрос
0
Эксперт Hardware
Эксперт Hardware
5442 / 1981 / 361
Регистрация: 29.07.2014
Сообщений: 2,898
Записей в блоге: 4
16.01.2016, 23:04 3
Цитата Сообщение от Dialkord228 Посмотреть сообщение
Удалить из массива все элементы, которые встречаются больше двух раз.
Если искомые элементы расположены подряд, то сравнивай с предыдущим..
Если валяются в массиве вразброс, то берёшь первый элемент и сканиш всю строку. Берёшь второй элемент, и опять ищешь его по-всей строке, ...и так для всех элементов массива. Как найдёшь - увеличивай счётчик, и проверяй его на 3.
Как-то так, наверное...
1
7 / 7 / 4
Регистрация: 30.11.2015
Сообщений: 107
22.01.2016, 22:05  [ТС] 4
Дан целочисленный массив размера N. Удалить из массива все элементы, которые встречаются больше двух раз. Помогите пожалуйста!
0
Эксперт Hardware
Эксперт Hardware
5442 / 1981 / 361
Регистрация: 29.07.2014
Сообщений: 2,898
Записей в блоге: 4
22.01.2016, 23:17 5
Dialkord228 ..как сам планируешь решать задачку? Варианты есть?
Может попробовать считать элемент и сравнивать его в цикле с последующими?
0
7 / 7 / 4
Регистрация: 30.11.2015
Сообщений: 107
23.01.2016, 00:16  [ТС] 6
R71MT, нашел в какой-то книге пример инициализации массива, но он как-то вообще криво работает...
Assembler
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
MODEL tiny
.code
org 100h
 
.code
main:
    mov ds,ax
    xor ax,ax   ;обнуление ax
    mov cx,10   ;значение счетчика цикла в cx
    mov si,1    ;индекс начального элемента в cx
go:             ;цикл инициализации
    mov bh,i    ;i в bh
    mov mas[si],bh  ;запись в массив i
    inc i       ;инкремент i
    inc si      ;продвижение к следующему
                ;элементу массива
    loop    go  ;повторить цикл
;вывод на экран получившегося массива
    mov cx,10
    mov si,0
    mov ah,09h
    lea dx,mes
    int 21h
show:
    mov ah,02h  ;функция вывода значения
                ;из al на экран
    mov dl,mas[si]
    add dl,30h  ;преобразование числа в символ
    int 21h
    inc si
    loop    show
exit:
    mov ax,4c00h    ;стандартный выход
    int 21h
mes db  0ah,0dh,'Массив- ','$'
mas db  10 dup (?) ;исходный массив
i   db  0
end main        ;конец программы
0
Эксперт Hardware
Эксперт Hardware
5442 / 1981 / 361
Регистрация: 29.07.2014
Сообщений: 2,898
Записей в блоге: 4
23.01.2016, 00:28 7
Цитата Сообщение от Dialkord228 Посмотреть сообщение
которые встречаются больше двух раз
..значит, если имеется 2 одинаковых элемента в массиве, то их оставить..., а если 3 - то удалить.
Так что-ли?

Не по теме:

..утро вечера мудренее

0
7 / 7 / 4
Регистрация: 30.11.2015
Сообщений: 107
23.01.2016, 15:40  [ТС] 8
R71MT, именно
0
Ушел с форума
Автор FAQ
15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,386
23.01.2016, 15:50 9
Dialkord228,
для упрощения задачи -- отсортируй элементы массива по возрастанию или убыванию (как сортировать смотри в https://www.cyberforum.ru/asse... 90127.html) одинаковые элементы окажутся рядом, вот тогда и удаляй их
2
Эксперт Hardware
Эксперт Hardware
5442 / 1981 / 361
Регистрация: 29.07.2014
Сообщений: 2,898
Записей в блоге: 4
23.01.2016, 18:34 10
Лучший ответ Сообщение было отмечено Dialkord228 как решение

Решение

Цитата Сообщение от Mikl___ Посмотреть сообщение
отсортируй элементы массива по возрастанию, одинаковые элементы окажутся рядом, вот тогда и удаляй их
Точно..., можно-же было сделать так! Век живи - век учись..
А я пошёл чуть по-другому пути. Читал очередной элемент и смотрел, сколько раз он встретиться в массиве. Если меньше двух, то записывал его в буфер:
Assembler
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
96
ORG 100h
JMP start
 
mess0    DB  'RESULT: $'
massiv   DB  88,27,1,62,10,33,91,2,1,10,13,1,88,10,10,33,1,88
size     =   $ - massiv     ; длина массива
buff     DB  32 DUP(0)      ; буфер для результата
 
start:
   MOV   AH,9               ;
   MOV   DX,mess0           ;
   INT   21h                ;
   MOV   DI,buff            ; сюда будем писать
   MOV   SI,massiv          ; от сюда - читать
   MOV   DX,size            ; кол-во повторов (длина строки)
 
compare:                    ;
   MOV   AH,BYTE[SI]        ; Берём число
   CALL  count_Digit        ; сколько раз оно встретилось в массиве?
   CMP   BX,3               ; проверка на 3.
   JAE   next               ; если больше/равно, то пропускаем число
   XCHG  AH,AL              ; иначе: текущее число у нас в AH
   STOSB                    ; кидаем его в AL, и записываем в буфер!
next:                       ;
   INC   SI                 ; следующее число массива..
   DEC   DX                 ; уменьшаем его длину
   OR    DX,DX              ; это последнее число в массиве?
   JNZ   compare            ; нет - мотаем цикл..
 
   MOV   CX,DI              ; Отсеянные числа у нас в буфере.
   SUB   CX,buff            ; СХ = его длина
   MOV   SI,buff            ; травим SI на буфер (для LODSB)
print:                      ;
   XOR   AH,AH              ; обнуляем мусор
   LODSB                    ; читаем число из буфера
   MOV   BX,10              ; выводить на экран будем в DEC
   CALL  HEX2ASC            ; есть контакт!
   MOV   AL,','             ; вставим разделитель
   INT   29h                ;
   LOOP  print              ; мотаем цикл СХ-раз...
 
exit:                       ;
   XOR   AX,AX              ;
   INT   16h                ;
   INT   20h                ; на выход!
 
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
; Процедура:  "count_Digit" считает кол-во одинаковых символов в строке   ;
;  На входе:  АН = число/символ для поиска                                ;
;             СХ = длина строки                                           ;
;             SI = адрес строки                                           ;
; На выходе:  ВХ = количество найденых символов                           ;
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
count_Digit:                ;
   PUSH  SI                 ; SI нам нужен. сохраним его
   MOV   SI,massiv          ;
   MOV   CX,size            ;
   XOR   BX,BX              ; сбросим счётчик в нуль
@@1:                        ;
   LODSB                    ; читаем в AL из SI
   CMP   AH,AL              ;
   JNZ   @@2                ; прыг, если не совпало с фактором
   INC   BX                 ; иначе: счётчик +1
@@2:                        ;
   LOOP  @@1                ; обрабатываем строку до конца...
   POP   SI                 ;
RET                         ;
 
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
;   Функция:  "HEX2ASC" выводит на экран слово в различных СС             ;
;  На входе:  АХ = число для вывода                                       ;
;             ВХ = система счисления                                      ;
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн;
HEX2ASC:                    ;
   PUSHA                    ;
   MOV   BX,10              ;
   XOR   CX,CX              ;
isDiv:                      ;
   XOR   DX,DX              ;
   DIV   BX                 ;
   PUSH  DX                 ;
   INC   CX                 ;
   OR    AX,AX              ;
   JNZ   isDiv              ;
isOut:                      ;
   POP   AX                 ;
   CMP   AL,9               ;
   JLE   noHex              ;
   ADD   AL,7               ;
noHex:                      ;
   ADD   AL,30h             ;
   INT   29h                ;
   LOOP  isOut              ;
   POPA                     ;
RET                         ;
;============================ E O F ======================================|
1
0 / 0 / 0
Регистрация: 15.05.2021
Сообщений: 1
06.06.2021, 17:46 11
R71MT, не подскажете рабочий код для этого задания? мне нужно как-то организовать чтобы еще с клавиатуры вводились значения, то есть неизвестное количество элементов.
преподаватель лекции только скидывал, но там ничего хоть немного схожего по сложности или типу этого задания не нашла:(
Насколько поняла алгоритм:
1. ввести количество элементов
2. ввести элементы и занести их в массив
3. отсортировать
4. проверяем элементы
равен ли текущий следующему
если да то счетчик+1
если нет то обнуляем
если счетчик достигнет 3 то текущий элемент удаляется
0
Модератор
Эксперт по электронике
8291 / 4194 / 1597
Регистрация: 01.02.2015
Сообщений: 13,037
Записей в блоге: 4
06.06.2021, 19:12 12
nekl, ассемблер - такой же модульный язык программирования, как и C/Delphi/Perl/Python.
Т.е. для ряда повторяющихся действий код можно вынести в подпрограммы и использовать, многократно вызывая.

Если программируете при помощи TASM или MASM для DOS, будут полезны закреплённые темы
Ввод и вывод чисел в различных системах счисления
Программа для сортировки любого массива

Если программируете в SASM (NASM), MASM32, Emu8086, то эти пакеты имеют собственные готовые библиотеки ввода и вывода, достаточно удобные.

По организации программирования - начните с простейшей программы и последовательно наращивайте её сложность. Мегапрограммы никто на уроках не пишет.
1. вывод строки
2. вывод числа
3. вывод массива
4. ввод числа и его контрольный вывод
5. ввод массива и его контрольный вывод
6. теперь нужно отработать алгоритм на массиве, заданном в коде (без ввода) - исходный массив выводите, сортируете, выводите итоговый массив
7. продолжаете - после сортировки обрабатываете массив и выводите его третий раз
8. объединяете два кода - ввод и обработка

Весь код набирать не буду, он достаточно большой получится, мне так же, как и вам, лень его делать, но у вас выбора нет. Пробуйте. Будут вопросы - подскажу.

Добавлено через 8 минут
Сам алгоритм выявления чисел, которые встречались в массиве более 2 раз, будет чуть другим.
Решал недавно для masm32 (Windows) с использованием готовой библиотечной сортировки и без ввода - только вывод исходного, обработка и вывод результата.
Удалить из массива все элементы, встречающиеся более двух раз

Если массив можно изменять, то
1. сортировать массив
2. используя 2 указателя копировать элементы массива, примерно следующим алгоритмом (набирал в браузере, мог ошибиться)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int left=0;
int indx=left+2;
int deleted=0;
do{
  int temp=a[indx++];
  if(a[left]==temp)
    deleted++;
  else
  {
    a[left+2]=temp;
    left++;
  }
}while(indx<n);
n-=deleted;
Смысл алгоритма - т.к. массив отсортирован, то если a[left]==a[left+2], значит нужно удалить элемент с индексом left+2. Чтобы не сдвигать весь массив при каждом удалении, вводим "скользящий" индекс indx, который сначала равен left+2, а по мере удаления количества элементов будет отдаляться от индекса left.
В принципе, indx==left+2+deleted, поэтому можно какую-то переменную не заводить.

Добавлено через 14 минут

Не по теме:

nekl, также добавлю, что R71MT сейчас преподаёт ассемблер в колледже или ВУЗе, т.е. принципиально не будет "подсказывать рабочий код для этого задания".

Другими словами, настоятельно рекомендую вам приступать к выполнению работы.

0
Эксперт Hardware
Эксперт Hardware
5442 / 1981 / 361
Регистрация: 29.07.2014
Сообщений: 2,898
Записей в блоге: 4
07.06.2021, 12:10 13
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
также добавлю, что R71MT сейчас преподаёт ассемблер в колледже или ВУЗе
угу.. ещё чё придумаешь, дезинформатор?
пипец.. от куда вы только такие берётесь - хз.
0
Модератор
Эксперт по электронике
8291 / 4194 / 1597
Регистрация: 01.02.2015
Сообщений: 13,037
Записей в блоге: 4
07.06.2021, 13:16 14
R71MT, прошу прощения, перепутал.
0
Модератор
Эксперт по электронике
8291 / 4194 / 1597
Регистрация: 01.02.2015
Сообщений: 13,037
Записей в блоге: 4
07.06.2021, 19:35 15
nekl, без ввода массива - это сделаете самостоятельно
Assembler
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
.model  medium
 
.stack  200h
 
.data
        CrLf            db      0Dh, 0Ah, '$'
        N               dw      10
        Array           dw      2, 73, 26, 7, 7, 18, 59, 121, 7, 68
        msgArrayLen     db      ' array length: ', '$'
        msgInnocence    db      'Innocence array:', 0Dh, 0Ah, '$'
        msgResult       db      0Dh, 0Ah, 'Result array:', 0Dh, 0Ah, '$'
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
.code
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
        ;вывод исходных данных
        mov     ah,     09h
        lea     dx,     [msgInnocence]
        int     21h
        call    ShowData
        ;обработка массива
        ; - сортировка
        lea     si,     [Array]
        mov     cx,     [N]
        call    BubbleSort
        ; - удаление элементов, встречающихся более двух раз
        push    ds
        pop     es
        lea     si,     [Array]
        mov     cx,     [N]
        sub     cx,     1
        jbe     @@Skip
        xor     dx,     dx
        mov     bx,     [si]
        add     si,     2
        mov     di,     si
        _do:                                            ;do{
                lodsw                                   ;  temp=a[indx++]
                cmp     bx,    ax                       ;  if(a[left]==temp)
                jne     _no_equal
                        inc     dx                      ;    deleted++;
                        jmp     _next
                _no_equal:                              ;  else
                        cmp     dx,     2
                        jb      _no_delete
                        inc     dx
                        sub     [N],    dx
                        shl     dx,     1
                        sub     di,     dx
                _no_delete:
                xor     dx,     dx
        _next:
                stosw
                mov     bx,     ax
        loop    _do                                     ;}while(indx<n)
        cmp     dx,     2
        jb      @@Skip
        inc     dx
        sub     [N],    dx                              ;n-=deleted
@@Skip:
        ;вывод результата
        mov     ah,     09h
        lea     dx,     [msgResult]
        int     21h
        call    ShowData
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
        mov     ah,     00h
        int     16h
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
ShowData        proc
        mov     ah,     09h
        lea     dx,     [msgArrayLen]
        int     21h
        mov     ax,     [N]
        call    ShowUInt16
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
        lea     dx,     [Array]
        mov     cx,     [N]
        call    ShowArray
        ret
ShowData        endp
 
;Вывод массива слов (word)
;на входе:
;  cx - количество выводимых элементов
;  ds:dx - адрес массива слов
ShowArray       proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        jcxz    @@Exit          ;если массив пустой - завершить
 
        mov     si,     1       ;индекс элемента массива
        mov     di,     dx      ;адрес текущего элемента массива
        @@ForI:
                mov     ax,     [di]
                call    ShowUInt16
                mov     ah,     02h
                mov     dl,     ' '
                int     21h
                ;переход к следующему элементу
                inc     si
                add     di,     2
        loop    @@ForI
@@Exit:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowArray       endp
 
;Вывод на экран целого 16 разрядного беззнакового числа
;на входе:
;  ax - целое 16 разрядное беззнаковое число
ShowUInt16       proc
        push    ax
        push    bx
        push    cx
        push    dx
        mov     bx,     10              ;делитель (основание системы счисления)
        mov     cx,     0               ;количество выводимых цифр
        @@div:
                xor     dx,     dx      ;делим (dx:ax) на bx
                div     bx
                add     dl,     '0'     ;преобразуем остаток деления в символ цифры
                push    dx              ;и сохраняем его в стеке
                inc     cx              ;увеличиваем счётчик цифр
                test    ax,     ax      ;в числе ещё есть цифры?
        jnz     @@div                   ;да - повторить цикл выделения цифры
        @@show:
                mov     ah,     02h     ;функция ah=02h int 21h - вывести символ из dl на экран
                pop     dx              ;извлекаем из стека очередную цифру
                int     21h             ;и выводим её на экран
        loop    @@show                  ;и так поступаем столько раз, сколько нашли цифр в числе (cx)
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowUInt16       endp
 
;Сортировка "пузырьком" массива слов
;на входе
;  ds:si - адрес массива слов
;  cx    - длина массива
BubbleSort      proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     bx,     si
        mov     dx,     cx
        dec     dx
        shl     dx,     1               ;приведение dx=N к размерности элементов
        dec     cx                      ;for i:=1 to N-1 do
        mov     si,     0
@@ForI:
        mov     di,     dx              ;  j:=N
@@ForJ:                                 ;  repeat
        mov     ax,     [bx+di-2]       ;    (a[j] < and a[j - 1])
        cmp     ax,     [bx+di]
        jbe     @@NextJ                 ;    if r<0 then
        xchg    ax,     [bx+di]         ;      temp:=a[j]
        xchg    ax,     [bx+di-2]       ;      a[j]:=a[j-1]
        xchg    ax,     [bx+di]         ;      a[j-1]:=a[j]
@@NextJ:
        sub     di,     2               ;    dec(j)
        cmp     di,     si              ;  until j<=i;
        ja      @@ForJ
        add     si,     2               ;  end; for i равноценно inc(i)
        loop    @@ForI
 
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
BubbleSort      endp
 
end     main
Алгоритм "два указателя". Один указатель неуклонно перемещается вправо по массиву, рассматривая элемент за элементом. Второй указатель является указателем на позицию в массиве, в которую производится запись очередного элемента, если выясняется, что этот элемент уже встречался более 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
int left=1;
int right=left;
int len=n;  //для цикла запоминаем исходную длину массива
int prev=array[0]; //предыдущий элемент
 
int length=0; //длина серии одинаковых элементов
for(i=1; i<len; i++)
{
  int temp=array[right++]
  if(temp==prev)
    length++;
  else
  {
    if(length>=2)
    {
      n-=length;//обновление длины массива
      left -= length; //индекс для записи "возвращаем" обратно на длину подмассива с одинаковыми элементами
    };
    length=0;
  };
  array[left++] = temp;
  prev=temp;
}
Можно улучшить алгоритм - если подмассив одинаковых элементов превышает 2, то запись по индексу left можно не производить и лишь корректировать длину.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2021, 19:35
Помогаю со студенческими работами здесь

Удалить из массива все элементы которые встречаются менее двух раз.
Дан целочисленный массив ,состоящий из n элементов. Удалить из массива все элементы которые...

Удалить элементы массива, которые встречаются более двух раз
Дан массив, состоящий из 12 двоичных чисел. Удалить элементы, кото- рые встречаются более двух раз.

Обнулить все элементы массива, которые встречаются более двух раз
Есть масив розмером n. Обнулить все елементы масива , что встречаются более 2 раз. Подскажите в...

дописать ( Из массива А удалить все элементы, которые встречаются в В ровно 2 раза. Из В переписать в С те элементы, которые совпадают с оставшимися)
нужно чтоб на экран еще выводило перед новым массивом А, числа,которые повторяются в массиве В 2...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru