Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VB_NET

.pdf
Скачиваний:
9
Добавлен:
22.02.2016
Размер:
3.43 Mб
Скачать

4. Структуровані типи даних

81

ElseIf a(і) = 1 Then ' кількість 1 k1 +=1

End If Next i

For i= 0 To n-1 ' заповнення всього масиву 2 a(і) = 2

Next i

For i= 0 To k0-1 ' початкове заповнення 0 a(і) = 0

Next i

For i= k0 To k0+k1-1 ' заповнення 1 a(і)=1

Next i

Перелічимо деякі стандартні задачі на одновимірні масиви:

1)визначення найбільшого/найменшого елемента;

2)визначення суми/добутку елементів (безумовне й умовне);

3)підрахунок/заміна елементів, що задовольняють заданій умові;

4)визначення заданого розташування елементів;

5)вилучення елемента, введення елемента в задану позицію;

6)перерозташування (інвертування, циклічне зсування) елементів;

7)випадкова вибірка елементів (з повтореннями і без повторень);

8)злиття двох упорядкованих масивів;

9)пошук заданого елемента (використання методу IndexOf);

10)сортуваня масиву (використання методу Sort).

До стандартних задач належить і задача обчислення значення многочлена у деякій точці х, оскільки коефіцієнти многочлена зазвичай зберігають в одновимірному масиві.

Приклад 4.10. Обчислення значення многочлена степеня n у точці х, коефіцієнти якого перебувають у масиві А, за схемою Горнера:

Pn(х) = А0 хn + А1 хn–1 +... + Аn–1 х + Аn =

= (...(((0 х+А0) х + А1) х + А2) х +... + Аn–1) х + Аn.

p = 0

For i = 0 To n

p = p * x + a(i)

Next i

82

Програмування мовою Visual Basic.NET

Приклад 4.11. Дано натуральне число n і послідовність дійсних чисел а1, а2,..., аn. Знайти перше від початку найменше число аі (і=1..n) і останнє за порядком найбільше число аj (j=1..n) та поміняти їх місцями (спочатку визначаємо порядкові номери цих чисел).

Module Module2 Sub main()

Dim a(), x As Integer

Dim n, i, kmin, kmax As Byte

Do

n = InputBox("Введіть n>2 і n<21")

Loop Until n > 2 And n < 21

ReDim a(n - 1) For i = 0 To n - 1

a(i) = InputBox("Введіть елемент масиву!") Console.Write(a(i) & " ") ' початковий масив

Next i Console.WriteLine() kmin = 0 : kmax = 0 For i = 1 To n - 1

If a(kmin) > a(i) Then kmin = i If a(kmax) <= a(i) Then kmax = i

Next i

x = a(kmin) : a(kmin) = a(kmax) : a(kmax) = x For i = 0 To n - 1

Console.Write(a(i) & " ") ' кінцевий масив

Next i Console.WriteLine() Console.ReadLine()

End Sub

End Module

Приклад 4.12. Дано натуральне число n і послідовність дійсних чисел а1, а2,..., аn. Знайти суму додатних чисел і середнє арифметичне від’ємних чисел. Значення суми присвоїти першому елементу масиву, а середнє арифметичне – останньому елементу масиву.

Module Module2

Sub main()

Dim a(), sd, sv As Integer

Dim n, i, nv As Byte

4. Структуровані типи даних

83

Do

n = InputBox("Введіть n>2 і n<21")

Loop Until n > 2 And n < 21

ReDim a(n - 1)

sd = 0 : sv = 0 : nv = 0 For i = 0 To n - 1

a(i) = InputBox("Введіть елемент масиву!")

If a(i) > 0 Then sd += a(i)

If a(i) < 0 Then sv += a(i) : nv += 1 Console.Write(a(i) & " ") ' початковий масив

Next i Console.WriteLine() a(0) = sd

If nv = 0 Then MsgBox("Немає від'ємних") _ Else a(n - 1) = sv / nv

For i = 0 To n - 1

Console.Write(a(i) & " ") ' кінцевий масив

Next i Console.WriteLine() Console.ReadLine()

End Sub

End Module

Приклад 4.13. Дано натуральне число n і послідовність цілих чисел а1, а2,..., аn. Визначити, скільки разів трапляється у цій послідовності найменше число. Замінити цим найменшим числом відповідну кількість елементів від початку масиву.

Module Module2 Sub main()

Dim a(), min As Integer Dim n, i, nmin As Byte

Do

n = InputBox("Введіть n>2 і n<21")

Loop Until n > 2 And n < 21

ReDim a(n - 1) For i = 0 To n - 1

a(i) = InputBox("Введіть елемент масиву!") Console.Write(a(i) & " ") ' початковий масив

Next i Console.WriteLine()

84

Програмування мовою Visual Basic.NET

 

 

 

 

 

 

 

min = a(0) : nmin = 1

 

 

 

For i = 1 To n - 1

 

 

 

If a(i) < min Then

 

 

 

min = a(i) : nmin = 1

 

 

 

ElseIf a(i) = min Then

 

 

 

nmin += nmin

 

 

 

End If

 

 

 

Next i

 

 

 

For i = 0 To nmin - 1

 

 

 

a(i) = min

 

 

 

Next i

 

 

 

For i = 0 To n - 1

 

 

 

Console.Write(a(i) & " ") ' кінцевий масив

 

 

 

Next i

 

Console.WriteLine()

Console.ReadLine()

End Sub

End Module

На перший погляд здається, що для визначення кількості однакових найменших значень треба організувати два цикли:

перший – для визначення найменшого значення (мінімуму);

другий – для визначення кількості повторень цього мінімуму. Однак, скориставшись спеціальним прийомом скидання на-

копиченого значення, можна обійтися одним циклом. Якщо умова a(i)<min справджується, то знайдено нове найменше число і відлік кількості повторень найменшого числа необхідно починати з одиниці (скидання накопиченого значення кількості повторень).

Якщо ж умова a(i)< min не справджується, то з двох можливих значень (a(i)=min чи a(i)>min) нас цікавить одне: a(i)=min

означає, що визначено елемент, який збігається з поточним найменшим числом (збільшуємо лічильник кількості повторень).

Скидання накопиченого значення деякої величини – досить поширений прийом, який використовують при розв’язуванні багатьох задач. Скористаємося ним і при розв’язанні наступного прикладу.

4. Структуровані типи даних

85

Приклад 4.14. Дано натуральне число n і послідовність цілих чисел а1, а2,..., аn. Записати програму визначення найбільшої кількості однакових чисел, розташованих поруч.

Module Module1 Sub main()

Dim a() As Integer Dim n, i, k, q As Byte

Do

n = InputBox("Введіть n>2 і n<21")

Loop Until n > 2 And n < 21

ReDim a(n - 1) For i = 0 To n - 1

a(i) = InputBox("Введіть елемент масиву!") Console.Write(a(i) & " ") ' початковий масив

Next i Console.WriteLine()

k = 1 ' Кількість елементів поточної серії q = 1 ' Шукана величина

For i = 1 To n - 1

If a(i) = a(i - 1) Then

K += +1 ' Продовження/початок серії Else ' Кінець серії

If q < k Then q = k ' Формування max k = 1 ' Нова ініціалізація

End If Next i

If q < k Then q = k ' Врахування останньої серії

MsgBox("Максимум повторів= " & Str(q))

End Sub

End Module

Приклад 4.15. Дано натуральне число n і послідовність цілих чисел а1, а2,..., аn. Визначити, чи у послідовності розташовані поруч два однакових числа, що дорівнюють 12. Записати відповідний фрагмент програми.

i = –1 : f = False

Do

i = i + 1 : If a(i)=12 Then i=i+1 : f = a(i)=12

Loop Until f Or i >= n - 2

If f Then MsgBox("Так") Else (MsgBox "Ні")

86

Програмування мовою Visual Basic.NET

Приклад 4.16. Введення нового елемента у задану позицію k.

При введенні нового елемента (див. рис. 4.1) необхідно попередньо розсунути масив, тобто пересунути підмасив аk,..., аn вправо на одну позицію. Переміщення підмасиву треба виконувати з кінця і перевіряти, чи достатньо памяті виділено під масив.

 

6

 

9

5

1

12

 

18

 

24

 

 

 

 

6

 

9

5

1

1000

 

12

 

18

24

 

 

 

 

 

Рис. 4.1. Введення елемента (1000) у п’яту позицію

 

 

 

 

 

 

 

 

 

 

 

 

 

Module Module1

 

 

 

 

 

 

 

 

 

 

Sub main()

 

 

 

 

 

 

 

 

 

 

 

 

Dim a(), x, i As Integer

 

 

 

 

 

 

 

 

Dim n, k As Byte

 

 

 

 

 

 

 

 

 

 

Do

 

 

 

 

 

 

 

 

 

 

 

 

 

n = InputBox("Введіть n>0 і n<20")

 

 

 

 

 

Loop Until n > 0 And n < 20

 

 

 

 

 

 

 

 

ReDim a(n - 1)

 

 

 

 

 

 

 

 

 

 

 

For i = 0 To n - 1

 

 

 

 

 

 

 

 

 

 

 

a(i) = InputBox("Введіть елемент масиву!")

 

 

 

 

Console.Write(a(i) & " ")

' початковий масив

 

 

 

Next i

 

 

 

 

 

 

 

 

 

 

 

 

Console.WriteLine()

 

 

 

 

 

 

 

 

 

 

x = InputBox("Введіть новий елемент масиву")

 

 

 

Do

 

 

 

 

 

 

 

 

 

 

 

 

k = InputBox("Введіть позицію k>=1 і k<=" & n)

 

 

 

Loop Until k >= 1 And k <= n

 

 

 

 

 

 

 

ReDim Preserve a(n)

 

 

 

 

 

 

 

 

 

 

For i = n - 1 To k - 1 Step -1

 

 

 

 

 

 

 

 

a(i + 1) = a(i)

 

 

 

 

 

 

 

 

 

 

Next i

 

 

 

 

 

 

 

 

 

 

 

 

a(k - 1) = x

 

 

 

 

 

 

 

 

 

 

 

For i = 0 To n

 

 

 

 

' кінцевий масив

 

 

 

 

Console.Write(a(i) & " ")

 

 

 

Next i

 

 

 

 

 

 

 

 

 

 

Console.ReadLine()

End Sub

End Module

4. Структуровані типи даних

87

Зауваження. При видаленні k-го елемента з масиву необхідно зсунути підмасив аk+1,..., аn вліво на одну позицію.

Циклічне зсування масиву характерне тим, що розмір масиву не змінюється. Циклічне зсування масиву вліво на одну позицію зображено на рис. 4.2. При зсуванні вправо напрям перегляду масиву і команди присвоювання у циклі такі ж самі, як і при включенні елемента у масив, а при зсуванні вліво – такі ж самі, як і при видаленні елемента з масиву.

 

6

 

9

5

 

1

12

 

18

24

23

 

22

 

 

9

 

5

1

 

12

18

 

24

23

22

 

6

 

 

 

Рис. 4.2. Циклічне зсування масиву вліво на одну позицію

 

 

 

Приклад 4.17. Циклічне зсування масиву вліво на k позицій

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Module Module1

 

 

 

 

 

 

 

 

 

 

Sub main()

 

 

 

 

 

 

 

 

 

 

 

 

 

Dim a(), i, j, x As Integer

 

 

 

 

 

 

 

 

Dim n, k As Byte

 

 

 

 

 

 

 

 

 

 

 

Do

 

 

 

 

 

 

 

 

 

 

 

 

 

n = InputBox("Введіть n>0 і n<=20")

 

 

 

 

 

 

Loop Until n > 0 And n <= 20

 

 

 

 

 

 

 

 

ReDim a(n - 1)

 

 

 

 

 

 

 

 

 

 

 

For i = 0 To n - 1

 

 

 

 

 

 

 

 

 

 

a(i) = InputBox("Введіть елемент масиву!")

 

 

 

 

Console.Write(a(i) & " ")

' початковий масив

 

Next i : Console.WriteLine()

Do

k = InputBox("Кількість зсувів k>=1 і k<" & n)

Loop Until k >= 1 And k < n For j = 1 To k

x = a(0)

For i = 0 To n – 2 : a(i) = a(i + 1) : Next i a(n - 1) = x

Next j

For i = 0 To n - 1

Console.Write(a(i) & " ") ' кінцевий масив Next i : Console.ReadLine()

End Sub

End Module

88

Програмування мовою Visual Basic.NET

Приклад 4.18. Дано натуральне число n і послідовність дійсних чисел а1, а2,..., аn. Переставити члени послідовності так, щоб спочатку розмістилися всі її невід’ємні члени, а потім – усі від’ємні. Порядок розташування як серед невід’ємних членів, так і серед від’ємних має зберегтися.

Module Module1 Sub main()

Dim a(),x As Single Dim n, i, j, k As Byte

Do

n = InputBox("Введіть n>0 і n<=20")

Loop Until n > 0 And n <= 20

ReDim a(n - 1) For i = 0 To n - 1

a(i) = InputBox("Введіть елемент масиву!") Console.Write(a(i) & " ") ' початковий масив

Next i : Console.WriteLine()

i = 0 ' початковий індекс невід'ємного члена

For k = 0 To n – 1

If a(i) < 0 Then

x = a(i) ' збереження від'ємного члена ' зсування масиву вліво на 1 позицію

For j = i To n - 2 a(j) = a(j + 1)

Next j

a(n–1) = x ' від'ємний член у кінець масиву

Else

i = i + 1

End If

Next k

For i = 0 To n - 1

Console.Write(a(i) & " ") ' кінцевий масив Next i : Console.ReadLine()

End Sub

End Module

Якщо a(i)<0, то ми розміщуємо його наприкінці масиву, попередньо зсунувши підмасив від a(i+1) до a(n–1) на одну позицію вліво. Перший від’ємний член спочатку займе останнє

4. Структуровані типи даних

89

місце, а в подальшому при виявленні нового від’ємного члена зсуватиметься на одну позицію вліво.

Приклад 4.19. Дано натуральне число n і послідовність дійсних різних чисел а1, а2,..., аn. Вибрати випадковим чином k (1 k n) елементів

цього масиву так, щоб жодне з них не повторилося.

Module Module1 Sub main()

Dim a(),x As Single Dim n, i, j, k As Byte

' Введення n та елементів масиву - див. приклад 4.18!

Do

k = InputBox("Кількість вибраних чисел <=" & n)

Loop Until k <= n

For i = 0 To k - 1

j = i + Rnd() * (n - i - 1) ' випадковий індекс x = a(j) : a(j) = a(i) : a(i) = x ' обмін

Next i

Console.WriteLine("Вибрані числа: ") For i = 0 To k - 1

Console.Write(a(i) & " ")

Next i

Console.WriteLine("Кінцевий масив: ") For i = 0 To n - 1

Console.Write(a(i) & " ") Next i : Console.ReadLine()

End Sub

End Module

Вибираємо випадковий індекс j з проміжку [0; n–1] і відповідний йому елемент a(j) міняємо місцями з нульовим елементом масиву. Наступного разу індекс j обирають з проміжку [1; n–1] і елемент a(j) міняють місцями з першим елементом масиву і т.д. Обрані елементи розташовуються на початку масиву, вони не беруть участі у подальших вибірках (вибірка без повторень).

Приклад 4.20. Дано натуральні числа n, m і два масиви дійсних чисел а1, а2,..., аn і b1, b2,..., bm, впорядковані за неспаданням. Утворити з елементів цих масивів впорядкований за неспаданням масив с.

 

90

Програмування мовою Visual Basic.NET

 

 

 

 

 

 

 

Module Module1

 

 

 

 

Sub main()

 

 

 

 

Dim a(), b(), c(), x As Single

 

 

 

 

Dim n, m, i, j As Byte

 

 

 

 

Do

: n = InputBox("Введіть n>0 і n<=20")

 

 

Loop Until n > 0 And n <= 20

 

 

 

 

ReDim a(n - 1)

 

 

 

 

Console.WriteLine("Елементи масивів не мають спадати!")

 

 

For i = 0 To n - 1

 

 

 

 

 

a(i) = InputBox("Введіть елемент 1-го масиву!")

 

 

 

Console.Write(a(i) & " ")

' 1-й

масив

 

 

Next i : Console.WriteLine()

 

 

 

 

Do

m = InputBox("Введіть m>0 і

m<=20")

 

 

Loop Until m > 0 And m <= 20

 

 

 

 

ReDim b(m - 1)

 

 

 

 

For i = 0 To m - 1

 

 

 

 

 

b(i) = InputBox("Введіть елемент 2-го масиву!")

 

 

 

Console.Write(b(i) & " ")

' 2-й

масив

 

 

Next i : Console.WriteLine()

 

 

 

 

ReDim c(n + m - 1)

 

 

 

i = 0 : j = 0

Do While i < n And j < m

If a(i) <= b(j) Then

c(i + j) = a(i) : i = i + 1

Else

c(i + j) = b(j) : j = j + 1

End If Loop

While i < n

c(m + i) = a(i) : i = i + 1

End While

While j < m

c(n + j) = b(j) : j = j + 1

End While

Console.WriteLine("Кінцевий масив: ") For i = 0 To n + m - 1

Console.Write(c(i) & " ") Next i : Console.ReadLine()

End Sub

End Module

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]