Мегаобучалка Главная | О нас | Обратная связь


Глава 10. Типичные приемы программирования



2015-11-11 814 Обсуждений (0)
Глава 10. Типичные приемы программирования 0.00 из 5.00 0 оценок




Каждому программисту известны такие понятия, как счетчик, сумматор, минимум, максимум, вложенные циклы и другие подобные, составляющие основу элементарной техники программирования. Без них не обходится ни одна реальная программа, и если мы хотим идти дальше, то нам без них тоже не обойтись. В этой главе я не буду вводить новых операторов VB, а вместо этого покажу, как программировать типичные задачи, в том числе и те, что используют упомянутые понятия.

Вычисления в цикле

Вычисления в цикле встречаются очень часто и поэтому, несмотря на то, что никакой особой техники тут не требуется, я рассмотрю пример.

Пример

Во дворце 40 залов. Компьютер запрашивает длину, ширину и высоту каждого зала. Вычислить площадь пола и объем каждого зала.

Сначала напишем фрагмент для одного зала:

Dlina = InputBox("Введите длину") 'Начало фрагмента

Shirina = InputBox("Введите ширину")

Visota = InputBox("Введите высоту")

S = Dlina * Shirina 'Площадь пола

V = S * Visota 'Объем

Debug.WriteLine("Площадь пола = " & S & " Объем зала = " & V) 'Конец фрагмента

Для решения задачи этот фрагмент нужно выполнить 40 раз, для чего вполне естественно вложить его внутрь оператора For:

Dim Dlina, Shirina, Visota, S, V As Double

Dim i As Integer

For i = 1 To 40

Dlina = InputBox("Введите длину") 'Начало фрагмента

Shirina = InputBox("Введите ширину")

Visota = InputBox("Введите высоту")

S = Dlina * Shirina 'Площадь пола

V = S * Visota 'Объем

Debug.WriteLine("Площадь пола = " & S & " Объем зала = " & V) 'Конец фрагмента

Next

Полужирным шрифтом я выделил новые по сравнению с предыдущим фрагментом строки.

Чтобы программа подходила для любого числа залов, нужно вместо строки

For i = 1 To 40

написать две строки:

N = InputBox("Сколько залов во дворце?")

For i = 1 To N

Задание 44.

Построить диаграмму численности населения городов (см. Рис. 10.1).

Рис. 10.1

Подробнее: Компьютер запрашивает количество городов на диаграмме. Затем спрашивает название города и число его жителей, после чего строит первый столбец диаграммы с надписью. Затем запрашивает данные о втором городе, строит второй столбец и так далее. Неплохо бы под столбцом указывать число жителей.

Роль ошибокв программе

Пусть во дворце три зала размерами 20*15*4, 30*20*5 и 10*5*3. В этом случае, выполняя программу предыдущего подраздела, мы вводим N=3 и оператор For выполняет цикл три раза.

Мы знаем, что по ошибочной программе компьютер выдает ошибочные результаты. Попробуйте угадать результаты, если в программе мы вместо V=S*visota напишем V=S+visota. Ответ:

Площадь пола = 300 Объем зала = 304

Площадь пола = 600 Объем зала = 605

Площадь пола = 50 Объем зала = 53

Если же вы случайно вместо For i=1 To N напишете For i=2 To N и не заметите этого, то результаты будут такими:

Площадь пола = 300 Объем зала = 1200

Площадь пола = 600 Объем зала = 3000

На этом программа закончит работу и не спросит размеров третьего зала. Вам не кажется странным, что она посчитала 1 и 2 залы, а не 2 и 3? Если кажется, то учтите, что вы ничего не знаете об ошибке в программе, а компьютер не говорит вам, размеры какого по счету зала нужно вводить.

Задание 45.

Определите без компьютера, что он напечатает, если

А. Строку For i=1 To N поместить на три строки ниже, а именно – перед строкой S=Dlina*Shirina

Б. Поменять местами строки Debug.WriteLine и Next

Если задания не получаются, введите программы в компьютер и используйте пошаговый режим.

Счетчики и сумматоры

Счетчики и сумматоры похожи друг на друга.

Счетчики

Счетчик- это переменная величина, в которой вы что-нибудь подсчитываете. Для чего нужны счетчики? Ну хотя бы для того, чтобы подсчитать количество жизней главного персонажа в компьютерной игре.

Задача 1: В компьютер с клавиатуры вводятся числа. Компьютер после ввода каждого числа должен печатать, сколько среди них уже введено положительных.

Фрагмент, решающий задачу:

Dim a, c As Integer

c = 0 'Обнуляем счетчик

Do

a = InputBox("Введите очередное число")

If a > 0 Then c = c + 1

Debug.WriteLine("Введено положительных чисел - " & c)

Loop

Пояснения: Нам уже приходилось сталкиваться со счетчиком. Это был счетчик циклов. Тогда мы просто придумали некую переменную, которую и назвали счетчиком циклов. Здесь мы тоже придумали переменную c. Она у нас выполняет роль счетчика положительных чисел. Сердце счетчика – оператор c=c+1. Именно он в нужный момент увеличивает счетчик на 1. Но и без части If a>0 Then тоже никак нельзя. Если бы ее не было, то c подсчитывал бы все числа без разбору, то есть был бы обыкновенным счетчиком циклов. В нашем же фрагменте увеличение с на 1 выполняется не всегда, а лишь при положительном а.

Обязательно покрутите программу в пошаговом режиме.

В сложных программах не забывайте обнулять счетчик перед входом в цикл, а не то он начнет считать вам не с нуля, а бог знает с чего. А это нехорошо. Как бы вам понравилось, если бы таксист в начале поездки не обнулил счетчик?

Задача 2: В предыдущем фрагменте значения счетчика печатаются при каждом выполнении цикла. Изменим задачу: В компьютер вводится ровно 200 чисел. Компьютер должен подсчитать и в конце один раз напечатать, сколько среди них положительных.

Программа:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim a, c, i As Integer

For i = 1 To 200

a = InputBox("Введите очередное число")

If a > 0 Then c = c + 1

Next i

Debug.WriteLine("Из них положительных - " & c)

End Sub

Пояснения:Путь рассуждений здесь тот же, что и в первой задаче. В результате применения оператора For тело цикла выполняется ровно 200 раз, благодаря чему счетчик с накапливает нужное значение. Оператор Debug.WriteLine выполняется только один раз и печатает последнее накопленное значение, потому что в ячейке с в момент печати будет находиться именно оно..

Задание 46.

«Ошибки». Что будет, если

А. Вместо c=0 написать c=10

Б. Вместо c=c+1 написать c=c+2

В. Строки Nextи Debug.WriteLine поменять местами

Г. Строки c=0 и For поменять местами

Д. Строки Forи InputBoxпоменять местами

 

Задача 3: А в следующей программе мы используем уже два счетчика. Изменим задачу: В компьютер вводится ровно 200 чисел. Компьютер должен подсчитать и один раз напечатать, сколько среди них положительных чисел и сколько нулей.

Программа:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim a, i, c_полож, c_нулей As Integer

c_полож = 0 'Обнуляем счетчик положительных чисел

c_нулей = 0 'Обнуляем счетчик нулей

For i = 1 To 200

a = InputBox("Введите очередное число")

If a > 0 Then c_полож += 1

If a = 0 Then c_нулей += 1

Next i

Debug.WriteLine("Из них положительных - " & c_полож & " нулей - " & c_нулей)

End Sub

 

Задача 4: Подсчитывать можно не только числа, но и строки и данные любых других типов. Как, например, узнать, насколько Лев Толстой любил слово «добро»? Для этого можно подсчитать, сколько раз встречается это слово в его произведениях. Решим похожую задачу:

В компьютер один за другим вводятся произвольные символы. Ввод заканчивается символом "/". Подсчитать, какой процент от общего числа введенных символов составляют символ «W» и символ «:» по отдельности.

Здесь мы организуем три счетчика одновременно: сW – для подсчета букв W, сDv – для подсчета двоеточий, а также i – счетчик общего числа введенных символов, кроме «/».

Программа:

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

Dim i, cW, cDv As Integer

Dim simvol As String

i = 0 : cW = 0 : cDv = 0 'Обнуляем все три счетчика

Do

simvol = InputBox("Введи символ")

If simvol <> "/" Then i = i + 1 'Если это не /, то "посчитай" его

Select Case simvol

Case "W" 'Если это W, то

cW = cW + 1 'увеличь счетчик символов W

Case ":" 'Если это : , то

cDv = cDv + 1 'увеличь счетчик символов :

Case "/" 'Если это /, то

Exit Do 'завершай работу цикла

End Select

Loop

Debug.WriteLine("Символов W было " & Format(cW / i, "P") & " Двоеточий было " & Format(cDv / i, "P"))

End Sub

Печатаются результаты в таком виде:

Символов W было 48,39% Двоеточий было 3,23%

Здесь cW/i дает долю символов W в общем числе символов, а формат "P" преобразовывает эту долю в проценты.

Задание 47.

В компьютер вводится N чисел. Подсчитать из них по-отдельности количество положительных, отрицательных и тех, что превышают число 10.

Задание 48.

В компьютер вводятся пары целых чисел. Подсчитать, сколько среди них пар, дающих в сумме число 12. Подсчет закончить вводом пары нулей.

Задание 49.

«Считаем звезды». Возьмите решенную нами задачу о звездном небе и подсчитайте заодно, сколько звезд из 100 попадет в левую часть неба (конкретнее, сколько звезд отстоят от левого края формы не более, чем на половину ее ширины). Пусть компьютер тут же ответит и на вопрос: где больше звезд – в левом верхнем квадрате неба размером 100 на 100 или в левом нижнем квадрате того же размера (см. Рис. 10.2)? Указание: Вам придется использовать переменные величины – координаты звезд.

Рис. 10.2

Сумматоры

Сумматор– это переменная величина, в которой вы подсчитываете сумму чего-либо. Для чего нужны сумматоры? Ну хотя бы для того, чтобы подсчитать общее количество золота, которое вы нашли в нескольких кладах в компьютерной игре.

Если вы поняли идею счетчика, то понять идею сумматора будет нетрудно. Посмотрим, как работает следующий фрагмент:

s = 0 'Обнуляем сумматор. Это не менее важно, чем обнулить счетчик

Do

a = InputBox("Введите очередное число")

s = s + a 'Увеличиваем сумматор

Debug.WriteLine("Сумма= " & s)

Loop

В ячейке s накапливается сумма вводимых чисел a, поэтому назовем эту ячейку сумматором. Отличие сумматора от счетчика в том, что счетчик увеличивается на 1 оператором c=c+1, а сумматор – на суммируемое число оператором s=s+a.

Задача: В компьютер вводится N чисел. Вычислить и один раз напечатать их сумму.

Программа:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim a, s, i, N As Integer

N = InputBox("Сколько чисел будем складывать?")

s = 0

For i = 1 To N

a = InputBox("Введите очередное число")

s = s + a

Next i

Debug.WriteLine("Сумма равна " & s)

End Sub

Задание 50.

«Ошибки». Пусть N=2, a =5 и 3. Тогда по вышеприведенной программе VB напечатает 8. Определите без компьютера, что он напечатает, если:

А. Вместо s=0 написать s=10.

Б. Вместо s=s+a написать s=s+a+1.

В. Строки Nextи Debug.WriteLineпоменять местами.

Г. Строки s=0 и For поменять местами.

Д. Строки For и a=InputBoxпоменять местами.

Е. Строки s=s+a и Next поменять местами.

Ж. Вместо For i=1 To N написать For i=2 To N.

Задание 51.

Во дворце 40 залов. Известны длина и ширина каждого зала. Вычислить площадь пола всего дворца.

Задание 52.

Вычислить средний балл учеников вашего класса по физике. Указание: Средний балл находится делением суммы баллов на число оценок.

Задание 53.

Вычислить произведение N произвольных чисел. Подсказка: Несмотря на то, что произведение – не сумма, эта программа будет отличаться от программы суммирования всего лишь одним числом и одним значком, а структура обеих программ совершенно одинакова.

Вложенные операторы

Реальная процедура на VB может представлять собой сложную мозаику из циклических и разветвляющихся частей, вложенных друг в друга. Мы уже видели в 7.5.1 как в оператор ветвления был вложен оператор ветвления, а в 10.2.1. – как в оператор цикла был вложен оператор ветвления. В свою очередь в них могут быть вложены другие операторы цикла или ветвления, и так до бесконечности. Вам нужно привыкнуть разбираться в этой матрешке.

Пример

Для тренировки определите без компьютера, что напечатает следующий фрагмент:

a = 9

For i = 1 To 6

If i * i = a Then

For k = 5 To 6

Debug.Write(k)

If 3 > 2 Then a = 16

Next k

Else

Debug.WriteLine(2004)

End If

Next i

Здесь внутрь For i вложен If i*i=a , внутрь которого вложен For k, внутрь которого в свою очередь вложен If 3>2. Обратите внимание на различную величину отступов от левого края листа.

Ответ:

Вложенные циклы – «Таблица умножения»

Вложенные циклы или «цикл внутри цикла» – весьма распространенная конструкция при программировании.

Поставим себе задачу – вычислить и напечатать таблицу умножения (см. Рис. 10.3).

Рис. 10.3

Сразу же рисовать прямоугольники и писать на форме нам будет сложно, поэтому пока будем печатать таблицу в окне Output при помощи оператора Debug.Write.

Начнем с малого – пусть нужно напечатать

1*1=1

Вот фрагмент программы:

Фрагмент 1

a = 1

b = 1

proizv = a * b

Debug.Write (a & "*" & b & "=" & proizv)

Здесь в операторе Debug.WriteLine 5 элементов:

* сомножитель a

* символ знака умножения "*"

* сомножитель b

* символ "="

* произведение proizv

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

Печатаем строку. Попробуем заставить компьютер напечатать первый ряд таблицы:

1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 1*10=10

Замечаем, что здесь нам нужно решить 10 элементарных задач на вычисление произведения, первую из которых решает фрагмент 1. Все они очень похожи и различаются лишь значением второго сомножителя. Таким образом, для решения каждой из 10 задач подошел бы наш фрагмент 1, если бы в нем в операторе b=1 вместо единицы стояло нужное число. В данном случае идеально подходит оператор For:

Фрагмент 2

a = 1

For b = 1 To 10

proizv = a * b

Debug.Write(a & "*" & b & "=" & proizv & " ")

Next

Обратите внимание, что для пробела между столбцами будущей таблицы в оператор Debug.Write добавился 6-й элемент – " ".

Прокрутите программу в пошаговом режиме.

Обратите внимание, что если бы я не использовал во фрагменте 1 переменную b, то фрагмент 2 просто не получился бы.

Мы предвидим, что скоро таких рядов нужно будет печатать десяток, поэтому для того, чтобы каждый следующий ряд печатался с новой строки, добавим во фрагмент 2 оператор Debug.WriteLine(""), все назначение которого – перевести строку, когда ряд напечатан (он сам ничего не печатает, ведь между кавычками – пусто).

Фрагмент 3

a = 1

For b = 1 To 10

proizv = a * b

Debug.Write(a & "*" & b & "=" & proizv & " ")

Next

Debug.WriteLine("")

 

Печатаем всю таблицу. Следующая ступень усложнения – последняя – напечатать не один ряд таблицы, а десять. Для этого фрагмент 3 должен быть выполнен 10 раз, каждый раз – с новым значением a. Чтобы этого достичь, «обнимем» фрагмент 3 оператором For точно так же, как мы обнимали фрагмент 1.

Программа

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim a, b, proizv As Integer

For a = 1 To 10

For b = 1 To 10

proizv = a * b

Debug.Write(a & "*" & b & "=" & proizv & " ")

Next

Debug.WriteLine("")

Next

End Sub

Прокрутите программу в пошаговом режиме, для удобства заменив 10 на 4. Прочувствуйте, что пустой Debug.WriteLine("") мы поместили именно в нужное место, строчкой выше или ниже он все бы испортил.

Вот результат. Пока в таком неприглядном виде:

 

1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 1*10=10

2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 2*10=20

3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 3*10=30

4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 4*10=40

5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 5*10=50

6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 6*10=60

7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 7*10=70

8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 8*10=80

9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 9*10=90

10*1=10 10*2=20 10*3=30 10*4=40 10*5=50 10*6=60 10*7=70 10*8=80 10*9=90 10*10=100

 

Как видите, печатает фрагмент 4 плохо. Аккуратных столбцов не получается. А нам и не очень хотелось. Задачу создания красивой таблицы умножения я вынес в Задание 72.

В целом программа иллюстрирует идею вложенных циклов, когда один, внутренний, цикл вложен внутрь другого, внешнего. У нас тело внешнего цикла выполняется 10 раз, а тело внутреннего – 100 раз, так как на каждое выполнение внешнего цикла он выполняется 10 раз.

Нельзя. Бессмысленно и нельзя переменные внешнего и внутреннего цикла называть одним именем. Так, следующий фрагмент

Dim i, a As Integer

For i = 1 To 10

For i = 1 To 10

a = 0

Next

Next

не пройдет. Переменная i во внутреннем цикле будет подчеркнута. Вообще, не рекомендуется внутри цикла как-то менять ее переменную.

Задание 54.

А. Распечатать все возможные сочетания из двух цифр – первая цифра может быть любой от 3 до 8, вторая - любой от 0 до 7. Например, 36, 44, 80.

Б. Распечатать все возможные сочетания из четырех цифр, каждая из которых может принимать значения 1,2,3. Например, 2123, 3312, 1111. Получилось? А теперь подсчитайте количество таких сочетаний.

В. Подсчитать из них количество неубывающих сочетаний, то есть таких, где каждая следующая цифра не меньше предыдущей – 1123, 1223, 2222 и т.п., но не 3322. Распечатать все такие сочетания.



2015-11-11 814 Обсуждений (0)
Глава 10. Типичные приемы программирования 0.00 из 5.00 0 оценок









Обсуждение в статье: Глава 10. Типичные приемы программирования

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (814)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)