Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2018, 13:12   #1
Firstaid
Пользователь
 
Регистрация: 05.04.2018
Сообщений: 27
Восклицание [Visual Basic 6.0] Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-135,175]. Удалить из него все элементы, первая и последняя цифра.

Добрый день всем. Я уже создавал эту тему раньше, но на нее никто не ответил, поэтому решил создать новую с другим именем но этим же заданием(модерам просьба удалить ту тему по ссылке: http://www.programmersforum.ru/showthread.php?t=319416 и оставить эту)

Теперь к самому заданию.

1. Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-135,175]. Удалить из него все элементы, первая и последняя цифра которых четная.

2. Вставить число К1 после всех элементов, больших заданного числа, а число К2 – после всех элементов, кратных пяти.

3. Перенести первые k элементов в конец: a[k+1], a[k+2], .. ,a[n], a[2], .., a[k].


Вот собственно код:

Цитата:
Dim am(50) As Double
Private Sub Command1_Click()

n = Val(Text1)
m = Val(Text3)
k1 = Val(Text4)

Am_Min = -135
Am_Max = 175

For i = 0 To n - 1

am(i) = Am_Min + Int(Rnd * (Am_Max - Am_Min))

If am(i) Mod 2 <> 0 Then Text2.Text = Text2.Text & Str(am(i))
If am(i) > m Then am(i + 1) = k1
Text2.Text = Text2.Text & Str(k1)
Next

End Sub
А теперь, собственно, в чем нужна помощь.

1. Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-135,175]. Удалить из него все элементы, первая и последняя цифра которых четная.

Как видно в коде, массив я уже сгенерировал, и даже выполнил одно условие вывода - последняя цифра не должна быть четной. Вот эта строка:

Цитата:
If am(i) Mod 2 <> 0 Then Text2.Text = Text2.Text & Str(am(i))
Теперь не знаю что придумать, чтобы первая цифра была то же нечетной, не зависимо от того, двухзначное число, однозначное или трехзначное. Здесь нужна помощь. Пробовал делить на 100 нацело, но тогда он не будет выводить двузначные числа с нечетными первой и последней цифрой.

2. Вставить число К1 после всех элементов, больших заданного числа, а число К2 – после всех элементов, кратных пяти.


k1 у меня вставляется здесь:

Цитата:
If am(i) > m Then am(i + 1) = k1
Text2.Text = Text2.Text & Str(k1)
Но в итоге получается фигня, которая видна на скрине, т.е. идет число, после него 8888 и т.д. А должно быть так, например:

83 8 21 5 33 8

Почему у меня код пихает восьмерки куда попало, а не туда, где элемент больше заданного числа?

Из-за этого у меня также не получется это реальзовать и с числами, кратными 5.

3. Перенести первые k элементов в конец: a[k+1], a[k+2], .. ,a[n], a[2], .., a[k].

Вот это я вообще не понимаю, как их перенести. Чем оперировать?
Изображения
Тип файла: png Таб2.PNG (38.4 Кб, 131 просмотров)
Firstaid вне форума Ответить с цитированием
Старый 03.05.2018, 13:16   #2
Firstaid
Пользователь
 
Регистрация: 05.04.2018
Сообщений: 27
По умолчанию

Пардон, не тот скрин загрузил, вот этот надо:
Изображения
Тип файла: png Массив.PNG (20.8 Кб, 129 просмотров)
Firstaid вне форума Ответить с цитированием
Старый 03.05.2018, 16:12   #3
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Код:
Private Sub CommandButton1_Click()
    Dim am() As Double
    Dim am_new() As Double
    Dim n As Integer, m As Integer, k1 As Integer, i, amL
    Dim Am_Min, Am_Max
    n = Val(TextBox1)
    m = Val(TextBox3)
    k1 = Val(TextBox2)
    Am_Min = -135
    Am_Max = 175
    amL = -1
    ReDim am(n)
    For i = 0 To n - 1
        am(i) = Am_Min + Int(Rnd * (Am_Max - Am_Min))
        Debug.Print am(i)
        If Not isFirstSameAsLast(am(i)) Then
            amL = amL + 1
            ReDim Preserve am_new(amL)
            am_new(UBound(am_new)) = am(i)
        End If
    Next i
    am = am_new
    printArray am
    am = addK1After(m, k1, am)
    printArray am
End Sub

Function isFirstSameAsLast(d As Double)
    Dim fC As String, lC As String
    fC = Left(Abs(d), 1)
    lC = Right(Abs(d), 1)
    If fC = lC Then
        isFirstSameAsLast = True
    Else
        isFirstSameAsLast = False
    End If
End Function

Function addK1After(m As Integer, k As Integer, am() As Double)
    Dim i As Integer
    Dim j As Integer
    Dim a() As Double
    Dim l As Integer
    a = am
    i = 0
    Do While i <= UBound(a)
        If a(i) > m Then
            ReDim Preserve a(UBound(a) + 1)
            For j = UBound(a) To i + 1 Step -1
                a(j) = a(j - 1)
            Next j
            a(i + 1) = k
        End If
        i = i + 1
    Loop
    addK1After = a
End Function


Цитата:
Сообщение от Firstaid Посмотреть сообщение
Вот это я вообще не понимаю, как их перенести. Чем оперировать?
гуглом, за критерием Shift array или смещение елементов массива
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 03.05.2018, 16:49   #4
Firstaid
Пользователь
 
Регистрация: 05.04.2018
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
Код:
Private Sub CommandButton1_Click()
    Dim am() As Double
    Dim am_new() As Double
    Dim n As Integer, m As Integer, k1 As Integer, i, amL
    Dim Am_Min, Am_Max
    n = Val(TextBox1)
    m = Val(TextBox3)
    k1 = Val(TextBox2)
    Am_Min = -135
    Am_Max = 175
    amL = -1
    ReDim am(n)
    For i = 0 To n - 1
        am(i) = Am_Min + Int(Rnd * (Am_Max - Am_Min))
        Debug.Print am(i)
        If Not isFirstSameAsLast(am(i)) Then
            amL = amL + 1
            ReDim Preserve am_new(amL)
            am_new(UBound(am_new)) = am(i)
        End If
    Next i
    am = am_new
    printArray am
    am = addK1After(m, k1, am)
    printArray am
End Sub

Function isFirstSameAsLast(d As Double)
    Dim fC As String, lC As String
    fC = Left(Abs(d), 1)
    lC = Right(Abs(d), 1)
    If fC = lC Then
        isFirstSameAsLast = True
    Else
        isFirstSameAsLast = False
    End If
End Function

Function addK1After(m As Integer, k As Integer, am() As Double)
    Dim i As Integer
    Dim j As Integer
    Dim a() As Double
    Dim l As Integer
    a = am
    i = 0
    Do While i <= UBound(a)
        If a(i) > m Then
            ReDim Preserve a(UBound(a) + 1)
            For j = UBound(a) To i + 1 Step -1
                a(j) = a(j - 1)
            Next j
            a(i + 1) = k
        End If
        i = i + 1
    Loop
    addK1After = a
End Function




гуглом, за критерием Shift array или смещение елементов массива
А попроще нельзя никак?
Firstaid вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан массив из 10 целых чисел (сформирован случайным образом ). Найти сумму,произведение и среднее арифметическое элементов массива. Ruzben Паскаль, Turbo Pascal, PascalABC.NET 2 26.06.2017 13:01
Паскаль Абс Дан массив целых чисел (n=15) случайным образом. zhagalchin Помощь студентам 2 23.12.2014 15:04
Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-60,60] (Delphi) trender Помощь студентам 4 26.12.2013 13:57
Дан одномерный массив из 10 целых чисел заполненный случайным образом. denpanov Помощь студентам 3 31.10.2012 21:42
Дан массив целых чисел из 25 элементов,заполненный случайным образом числами из промежутка [-35,75] Vinam* Паскаль, Turbo Pascal, PascalABC.NET 3 23.12.2011 13:00