Need help!!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ST@SON
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.07.2004 (Вс) 18:59
Откуда: СУНЦ МГУ

Need help!!

Сообщение ST@SON » 04.07.2004 (Вс) 19:27

Я столкнулся с такой задачей и она вызвала у меня большое затруднение:
Пусть одномерный массив, состоящий из не более чем 1000 элементов, заполнен случайным образом целыми числами. На любом известном вам языке программирования написать фрагмент программы, печатающий только те значения элементов массива, которые встречаются более одного раза, но каждое такое значение должно быть напечатано один раз. Дополнительных массивов не использовать. Элементы массива не изменять и не менять местами.
Если кто может помочь в решении....помогите пожайлуста!

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Re: Need help!!

Сообщение Approximator » 05.07.2004 (Пн) 1:37

ST@SON писал(а):Я столкнулся с такой задачей и она вызвала у меня большое затруднение:
Пусть одномерный массив, состоящий из не более чем 1000 элементов, заполнен случайным образом целыми числами. На любом известном вам языке программирования написать фрагмент программы, печатающий только те значения элементов массива, которые встречаются более одного раза, но каждое такое значение должно быть напечатано один раз. Дополнительных массивов не использовать. Элементы массива не изменять и не менять местами.
Если кто может помочь в решении....помогите пожайлуста!

А спеть и сплясать при этом не требуется? :)
Вообще, задумайся, числа эти печатать нужно только один раз, а запоминать их негде... Без дополнительного массива "в числах" эта задача неразрешима. Можно, конечно пойти "через зад" приблизительно таким образом (твой массив называется Arr()):
Код: Выделить всё
Dim lOutputStr as String, lTempStr as String, lV as Variant
lOuotputStr="Первая точка с запятой необходима для того, чтобы затем сравнивать именно числа, а не их фрагменты ; " & Str(Arr(LBound(Arr))
For Each lV in Arr
lTempStr="*" & Str(lV) & "*"
If Not(lOuotputStr Like lTempStr) Then lOuotputStr=lOuotputStr & "; " & Str(lV)
Next lV
Me.Print lOuotputStr
С уважением, Approximator.

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 05.07.2004 (Пн) 6:44

Есть бредовая идея как это сделать... :lol:
Dim A(1000) As Integer
Randomize

Rem Создаем массив
For I = 0 To 1000
A(I) = Rnd * 10000
Next
Rem Ищем максимальное число в массиве
Dim Max As Integer
Max = 0
For I = 0 To 1000
If A(I) > Max Then Max = A(I)
Next
Rem Теперь идем в массиве от 0 до макс числа
For I = 0 To Max
For i1 = 0 To 1000
If A(i1) = I Then
Print I
GoTo 1
End If
Next
1
Next

Просили хоть как и не нарушая правила - пожалуйста
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

ST@SON
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.07.2004 (Вс) 18:59
Откуда: СУНЦ МГУ

Сообщение ST@SON » 05.07.2004 (Пн) 12:38

Почти правильно, толлько в цикл должен проверять эл. массива не от 0, а от Min элемента массива к Max путём прибавления 1.

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 05.07.2004 (Пн) 13:36

Не понял тебя немного... ну вставь
For I = min To max
А переберается он и так по единицы за шаг. Уточняй задачу - и все будет понятно
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

ST@SON
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.07.2004 (Вс) 18:59
Откуда: СУНЦ МГУ

Сообщение ST@SON » 05.07.2004 (Пн) 13:40

Задачу я выложил как есть. А дополнил я твоё решение только тем, что необязательно min=0.
А так... спасибо за помощь!

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 06.07.2004 (Вт) 1:44

Мда, и сколько проходов будет делать программа (особливо если Max-Min>1000)???
(Max-Min)*1000?!
Уже при разнице в 10000 (а она максимум у вас может составить 256^2-1) задержка будет приличной.
Я бы за такое решение не задумываясь двойку поставил.
С уважением, Approximator.

Tin
Woodsman
Woodsman
Аватара пользователя
 
Сообщения: 1001
Зарегистрирован: 08.12.2001 (Сб) 11:00
Откуда: Kazakhstan

Сообщение Tin » 06.07.2004 (Вт) 5:59

2Aprokakoyto:

А зря... Условия были поставлены конкретные... Они выполняются... А не нарушая условий ускорить это дело врят ли полцчится.

2Стасон:

Мин действительно надо не от нуля ставить - мин определяется после нахождения мин=макс, и запускается новый цикл типа нахождения макса...
888888__88__88____88
__88________8888__88
__88____88__88__8888
__88____88__88____88

ST@SON
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.07.2004 (Вс) 18:59
Откуда: СУНЦ МГУ

Сообщение ST@SON » 06.07.2004 (Вт) 10:09

2Tin: Спасибо!

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 06.07.2004 (Вт) 12:09

Неееет! :D Еще не все.
Вот так можно. Берешь каждый элемент и просматриваешь свой массив на наличие такого же. Тоже долго, но по моему проще:

dim Ms() ' это твой массив, заполнить ты его сможешь сам :) потом берешь и...
For j=0 to Ubound(Ms)
For i=0 to Ubound(Ms)
If Ms(J)=Ms(i) and j<>i then debug.print Ms(j): Exit For
next
next
:shock: о как 8)

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Сообщение Shurrik » 07.07.2004 (Ср) 12:14

Уважаемый MOV твой код выдаст повторяющиеся числа более одного раза, а по условию надо только один раз. Этот вопрос был уже на форуме для начинающих. Смотри "Практика для начинающих :D"

Код: Выделить всё
CONST m=1000
DIM mm%(m)
FOR i=1 to m:mm(i)=100*RND:NEXT ' Создаем массив
FOR i=1 to m-1 ' Перебираем все элементы
pp=0 ' признак печати
FOR j=m to 1 STEP -1
  IF mm(i)=mm(j) AND j>i THEN
    pp=1:j=i-1 ' Есть совпадение
  END IF
  IF j=i AND pp=0 THEN
    EXIT FOR ' совпадений нет, закрыть цикл
  END IF
  IF mm(i)=mm(j) AND j<i THEN
    pp=0:EXIT FOR ' Совпадение уже печаталось
  END IF
NEXT j
IF pp=1 THEN PRINT pp
NEXT i
Колесо: Хочешь жить? Умей вертеться.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 07.07.2004 (Ср) 14:50

:? Да. Дал косяка. Но и твой код вообще не работатет, во всяком случае, если задать обычный массив например (нафиг RND):
mm(0) = 123
mm(1) = 10
mm(2) = 15
mm(3) = 123
mm(4) = 123
mm(5) = 12
mm(6) = 12
mm(7) = 10
mm(8 ) = 123
mm(9) = 12
mm(10) = 10
mm(11) = 15
mm(12) = 10
то он ничего не выдаст - точнее я не догоню где он должен выводить неповторяющиеся эелементы то 8) ?

А вот рабочий вариант все-таки по моему проще :D
Код: Выделить всё
'задаем массив
Dim Ms(17) As String * 5
Ms(0) = 123
Ms(1) = 10
Ms(2) = 15
Ms(3) = 123
Ms(4) = 123
Ms(5) = 12
Ms(6) = 12
Ms(7) = 10
Ms(9) = 123
Ms(10) = 12
Ms(11) = 10
Ms(12) = 15
Ms(13) = 10
' ************   а это сам вывод
For j = 0 To 16
    For i = j + 1 To 16
        If Ms(j) = Ms(i) And Left(Ms(i), 1) <> "0" Then
            Debug.Print Ms(j)
            For h = i + 1 To 16
                If Ms(i) = Ms(h) Then Ms(h) = "0" + Ms(h)
            Next
            Exit For
        End If
    Next
Next


Да так нечестно, записывать целые числа в строки (но кто мешает - главное, чтобы они были целые (по заданию)? :D ).
И еще минус - этот код не выведет нули, хотя это, при желании, тоже легко добавить.
:? мда... Approximator уже писал про это. Плагиат у меня какой-то :D :D :D

ST@SON
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.07.2004 (Вс) 18:59
Откуда: СУНЦ МГУ

Сообщение ST@SON » 13.07.2004 (Вт) 16:39

Вот что реально работает:
Private Sub Form_Click()
Dim A(1 To 1000)
For i = 1 To 1000
A(i) = Int((1500) * Rnd - 300)
Next i
Max = A(1)
Min = A(1)
For i = 2 To 1000
If A(i) > Max Then Max = A(i)
If A(i) < Min Then Min = A(i)
Next i
For i = Min To Max
k = 0
For i1 = 1 To 1000
If A(i1) = i Then k = k + 1
Next i1
If k > 1 Then Print "Эллемент массива встречающийся боллее одного раза- "; i
Next i
End Sub


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 28

    TopList  
cron