bigpo.ru
добавить свой файл
1
n=С. Н. Лукин Турбо-Паскаль Самоучитель для начинающих~sz=171450;pg=1;te=Задача. Во дворце 40 залов. Известны длина, ширина и высота каждого зала. Вычислить площадь пола и объем каждого зала. Сначала напишем фрагмент для одного зала~cat=~t=Задача~!~



С.Н. Лукин Турбо-Паскаль 7.0. Самоучитель для начинающих

Часть 4 Массивы.



4.1. Типичные маленькие программы.

(повторение)

Задача. Во дворце 40 залов. Известны длина, ширина и высота каждого зала. Вычислить площадь пола и объем каждого зала. Сначала напишем фрагмент для одного зала:

ReadLn (dlina, shirina, visota);
S := dlina*shirina; {Площадь пола}

V := S*visota; {Объем}

WriteLn (S,' ',V)


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


VAR i, dlina, shirina, visota, S, V: Integer;

BEGIN

for i:=1 to … ( допишите программу)


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

VAR i, dlina, shirina, visota, N, S, V: Integer;

BEGIN

WriteLn ('Введите число залов');

ReadLn(N); {N - число залов}

for i:=1 to N do begin … (допишите программу)


Задание 1

Даны стороны N кубиков. Вычислить объем каждого.


4.2. Счетчики

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

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

с:=0; {Обнуляем счетчик}

m: ReadLn(a); {Вводим очередное число}

if a>0 then c:=c+1;

WriteLn('Из них положительных -' ,с);

Goto m


Пояснения. В цикле «ДЛЯ» мы придумали переменную i, которую назвали счетчиком циклов. Здесь мы тоже придумали переменную с. Она у нас выполняет роль счетчика положительных чисел. Сердце счетчика - оператор с:=с +1. Именно он в нужный момент увели­чивает значение счетчика на единицу. Но и без if a>0 then тоже ни­как нельзя. Если бы его не было, то с подсчитывал бы все числа без разбору, то есть был бы обыкновенным счетчиком циклов. В нашем же фрагменте увеличение с на единицу выполняется не всегда, а лишь при положительном а.

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


  • ^ Запищите фрагмент с использованием оператора цикла For …


Задача 2. В компьютер вводится ровно 20 чисел. Компьютер должен подсчитать и один раз напечатать, сколько среди них по­ложительных.


Программа.

Var c,i :lnteger;

a :Real;

BEGIN

с:=0; {Обнуляем счетчик}

for i:=1 to 20 do …

Пояснение. Оператор WriteLn(‘количество положительных чисел’, с) выполняется только один раз и печатает результат.


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

Здесь мы организуем три счетчика одновременно: cW и cDv - для подсчета букв W и двоеточий соответственно, а также i - счетчик циклов, то есть общего числа введенных символов.

Программа:

VAR I, cW, cDv, procent_W, procent_Dv : Integer;

simvol :Char;

BEGIN

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

repeat {Повторяй цикл}

ReadLn (simvol); {Введи символ}

i:=i+1; {"Посчитай" его}
case simvol of

W’ :cW:=cW+1; {Если это W, увеличь счетчик символов W}

:’ :cDv:=cDv+1 {Если это: увеличь счетчик символов:}
end

until simvol = '/'; {пока не наткнешься на символ /}

procent_W :=Round(100*cW/i); {Вычисляй процент символов W}

procent_Dv :=Round(100*cDv/i); {Вычисляй процент символов:}
Writeln (procent_W,' ',procent_Dv)
END.


Задание 2

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

Задание 3

В компьютер вводятся пары целых чисел. Подсчитать, сколько среди них пар, дающих в сумме число 13. Подсчет закончить после ввода пары нулей. Напомню, что пару чисел можно ввести оператором ReadLn(a,b).


4. 3. Сумматоры

Посмотрим, как будет работать следующий фраг­мент:

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

m: ReadLn(a);

s:=s+a; {Увеличиваем сумматор}

WriteLn('Cyммa=', s);

goto m;

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


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

VAR i, N :lnteger;

a, s :Real;

BEGIN

ReadLn(N);

S:= 0;

For i := 1 to N do begin

ReadLn(a);

s:=s+a

end {for};

WriteLn(‘Cyммa равна' ,s:20:10)

END.

Задания 4- 6

Написать программы для следующих задач:

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

  2. Вычислить средний балл учеников вашего класса по физике.

  3. Вычислить произведение N произвольных чисел.



^ 4.4. Вложенные циклы в ветвления и наоборот

Изобразите фрагмент в виде блок схемы и определите, что будет на экране:

For i:=1 to 5 do begin

a:=9;

if i*i=a then for k:=5 to 8 do Write(k)

else WriteLn(1997);

end {for}


^ Вложенные цикл

Поставим себе задачу напечатать таблицу умножения. В сле­дующем виде:

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

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

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

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

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

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

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

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

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


Н
Здесь в операторе Write 5 элементов:

  • сомножитель а,

  • символ знака умножения '*',

  • сомножитель b,

  • символ '=',

  • значение произведения proizv.



ачнем с малого: пусть нужно напечатать 1*1=1

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

фрагмент 1

а : = 1;

b:=1;

proizv :=a* b;

Write(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

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

Фрагмент 2

а:=1;

for b:=1 to 9 do begin

proizv:=a*b;

Write(a, '*' ,b, '=' .proizv, ‘ ‘)

end {for}

^ Для того, чтобы печать была аккуратной, оператор Write мы до­полнили символом пробела ‘ ‘.

Он нужен для того, чтобы отдель­ные столбцы таблицы не сливались.


Следующая ступень - напечатать не одну строку таблицы, а 9. Для этого фрагмент 2 должен быть вы­полнен 9 раз, каждый раз - с новым значением а. Чтобы этого дос­тичь, "обнимем" фрагмент 2 оператором for точно так же, как мы это сделали с фрагментом 1.

Фрагмент 3

for a:=1 to 9 do

for b:=1 to 9 do begin

proizv:=a*b;

Write(a, '*' ,b, '=' .proizv,’ ‘)

end {for b}

end {for a}

Окончательный вариант программы:

VAR a, b, proizv: Integer; {1}

BEGIN {2}
for a:=1 to 9 do begin {3}
WriteLn; {4}
for b:=1 to 9 do begin {5}
proizv :=a* b; {6}
Write(a, ‘*’ ,b, ‘ = ,proizv:3,’ ‘) {7}
end {for b} {8}

end {for a} {9}

END. {10}


WriteLn нужен для того, чтобы каждая новая строка таблицы начиналась с новой строки экрана. {3}

Формат proizv:3 {7} означает, что на изображение произведения на экра­не отведено 3 позиции. Формат в нашем примере нужен для того, чтобы разные по количеству цифр произведения (например, 4 и 25) занимали на экране одинаковое по размеру место, а то не по­лучится у нас аккуратных столбиков в таблице.

^ В целом программа иллюстрирует идею вложенных циклов, когда один, внутренний, цикл вложен внутрь другого, внешнего.

У нас тело внешнего цикла (строки 4 и 5) выполняется 9 раз, а тело внутреннего (строки 6, 7 и 8) - 81 раз, так как на каждое выполнение строки 5 оно выполняется 9 раз.


Задания 7 -10

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

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

  3. Подсчитать количество таких сочетаний.

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

4.5. Поиск максимального из чисел


Задача программисту. Найти максимальное из вводимых в ком­пьютер чисел.


Задача рыбаку. Принести домой самую большую из выловлен­ных рыб.


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

Решение программиста. Программист приготовил для самого большого числа ячейку и придумал ей название, скажем max. Пер­вое число программист, не глядя, вводит в эту ячейку. Каждое сле­дующее число (назовем его chislo) он сравнивает с max. Если оно больше, то он присваивает переменной max значение этого числа.


^ Напишем программу для определения максимального из 10 вводимых чисел:

VAR i, chislo, max :lnteger;

BEGIN

ReadLn(chislo);

max := chislo; {первую рыбу - в ведро}

for i:=2 to 10 do begin {ловим остальных рыб:}

ReadLn(chislo); {поймали очередную рыбу}

if chislo>max then max:=chislo {и если она больше той что в ведре, бросаем ее в ведро}

end {for};

WriteLn(max) {несем самую большую рыбу домой}

END.


Задание 11

Найти из N чисел минимальное. Каким по порядку было вве­дено минимальное число?

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


Задание 12

У вас есть данные о росте ваших одноклассников. Правда ли что рост самого высокого отличается от роста самого низкого больше чем на 40 см?

4.6. Массивы

Переменные с индексами

В математике широко применяются так называемые индексиро­ванные переменные. На бумаге они записываются так: Xl X2 b8 yi yi.6 Zij Zi+I,J

Поскольку в алфавите Паскаля нет подстрочных букв и цифр, то те же индексированные переменные на Паскале приходится обо­значать так:

Х[1] Х[2] В[8] Y[i] Y[i-6] Z[i,j] Z[i+1,j]

Зачем нужны индексированные переменные?

Их удобно при­менять хотя бы при операциях над числовыми рядами.

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


^ 6.1 Одномерные массивы

Одна из типичных задач программирования формулируется примерно так.

Имеется большое количество данных, например температур или высот. С этими данными компьютер должен что-нибудь сделать, например, вычислить среднегодовую темпера­туру, количество морозных дней, максимально взятую высоту и т. п. Раньше мы вычисляли подобные вещи, и данные вводили в компьютер с клавиатуры одно за другим в одну и ту же ячейку па­мяти. Однако практика программирования пока­зывает, что удобно, а часто и необходимо, иметь данные в опера­тивной памяти сразу все, а не по очереди. Тогда для задачи про температуру нам понадобится 365 ячеек. Эти 365 ячеек мы и назо­вем массивом. Итак, массивом можно назвать ряд ячеек памяти, отведенных для хранения значений индексированной переменной. Вопрос о том, как большое количество значений оказывается в памяти, отложим на будущее.


^ Массив – упорядоченная совокупность однородных величин, обозначенных одним именем с различными целочисленными индексами, изменяющимися по порядку.


Рассмотрим на простом примере, как Паскаль управляется с массивами. Предположим, в зоопарке живут 3 удава. Известна длина каждого удава в сантиметрах (500, 400 и 600). Какая длина получится у трех удавов, вытянутых в линию?

Обозначим длину первого удава через dlina[1], второго - dlina[2], третьего - dlina[3]. Прикажем Паскалю отвести под эту индексиро­ванную переменную массив:

VAR dlina : array [1..3] of Integer тип данных (целые числа)




Имя массива кол-во элементов массива от1 до 3


Здесь array означает массив, или ряд,

1 - первое значение ин­декса, 3 - последнее. Две точки обозначают диапазон от 1 до 3. В целом эту строку можно перевести так: "Отвести в памяти под переменную dlina ряд ячеек типа Integer, пронумеро­ванных от 1 до 3".


1. Вот программа полностью:

VAR dlina : array [1..3] of Integer;

summa :lnteger;

BEGIN

dlina[1]:=500;

dlina[2]:=400;

dliha[3]:=600;

(В этот момент в трех ячейках памяти уже находятся числа и с ними можно выполнять арифметические действия}

summa:=dlina[1]+dlina[2]+dlina[3];

WriteLn(summa)

END.


2. Теперь запишем ту же программу в предположении, что длины удавов заранее неизвестны и мы их вводим при помощи ReadLn:

VAR dlina : array [1..3] of Integer;

summa :lnteger;

BEGIN

ReadLn(dlina[1],dlina[2],dlina[3]);

summa:=dlina[1]+dlina[2]+dlina[3];

WriteLn(summa)

END.


3. Теперь решим ту же задачу в предположении, что удавов не 3, а 1000:

VAR dlina : array [1..1000] of Integer;

summa, i :lnteger;

BEGIN

{Вводим длины тысячи удавов, хоть это и утомительно}

for i:=1 to 1000 do ReadLn (dlina[i]);

{Определяем суммарную длину тысячи удавов}

summa:= 0;

for i:=1 to 1000 do summa:=summa+dlina[i];

WriteLn(summa)

END.


Решим еще одну задачу.

4. Дан ряд из 10 произвольных чисел:

а[1], а[2], ..., а[10].

Подсчитать и напечатать суммы троек стоящих рядом чисел: а[1]+а[2]+а[3], а[2]+а[3]+а[4], а[3]+а[4]+а[5], ..., а[8]+а[9]+а[10].

VAR a :array[1..10] of Integer;

i : integer;

BEGIN

tor i:=1to 10 do ReadLn (a[i]);

for i:=1 to 8 do WriteLn (a[i]+ a[i+1]+ a[i+2])

END.


^ Задание 13-15

13. Напишите программу вычисления среднегодовой температуры (для проверки в компьютере годом можно считать неделю).

14. Подсчитайте количество морозных дней (когда температура ниже -20 градусов).

15. Каким по порядку идет самый морозный день?


^ 6.2 Двумерные массивы

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

1-й день 2-й день 3-й день 4-й день

Метеостанция 1 -8 -14 -19 -18

Метеостанция 2 25 28 26 20

Метеостанция 3 11 18 20 25


Требуется:

  1. Распечатать показания термометров всех метеостанций за 2-й день (работа со столбцами)

  2. Определить среднюю температуру на 3-й метеостанции (работа со строками)

  3. Распечатать всю таблицу.

  4. Распечатать, в какие дни, и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла (выбор данных по некоторому условию)


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

t[1,1] t[1,2] t[1,3] t[1,4]

t[2,1] t[2,2] t[2,3] t[2,4]

t[3,1] t[3,2] t[3,3] t[3,4]

Обратите внимание, что первый индекс в скобках обозначает номер строки (метеостанции), второй - номер столбца (дня) пря­моугольной таблицы.


Программа:

{В памяти отводим массив из 3*4=12 ячеек под значения типа Integer индексиро­ванной переменной t. Будем называть его двумерным массивом:}


VAR t : array [1..3,1..4] of Integer;

s, i, j : Integer;

BEGIN {Зададим значения элементов массива примитивным присваиванием:}
t[1,1]:=-8; t[1,2]:=-14; t[1,3]=-19; t[1,4]:=-18;

t[2,1]:=25; t[2,2]:=28; t[2,3]:=26; t[2,4]:=20;

t[3,1]:=11; t[3,2]:=18; t[3,3]:=20; t[3,4]:=25;

{А теперь распечатаем второй столбец массива:}

for i:=1to3 doWriteLn(t[i,^ 2]);

{Определим среднее значение элементов третьей строки:}

i:=З; s:=0;

for j:=1 to 4 do s:=s + t[i, j];

WriteLn(s/4 :10:3);


{Распечатаем всю таблицу:}

for i:=1 to 3 do

begin WriteLn;

for j:=1 to 4 do WriteLn (t[i,j]);

end


{Распечатаем станции и дни с температурой 24 -26 градусов:}

for i:=1 to 3do

for j:=1 to 4 do

if (t[i,j]>=24) AND (t[i,j]<=26) then WriteLn ('Станция ',i,' день ',j)

END.




 Задание^ 16

Вычислить разницу между максимальной и минимальной температурой во всей таблице.


Ключевые слова и операторы Паскаля.

BEGIN начало

END конец

VAR переменные

Label метка

Array массив


WriteLn(данные) вывод значения на экран

ReadLn(переменная ) ввод значения с клавиатуры

: = присвоить

Оператор ветвления

IF условие THEN оператор ELSE оператор

(если) (тогда) (иначе)




CASE переменная OF

(в случае если) (равна) Вариант 1 : оператор;

Вариант 2 : оператор;

И т.д.

^ ELSE оператор

(иначе)

END (конец оператора CASE)


Оператор циклов

Цикл «ДО»

REPEAT оператор, оператор, …….UNTIL условие

(повторяй) (до тех пор, пока)




Цикл «ДЛЯ»

FOR I: = выражение TO \ downto выражение DO оператор

(для) (присвоить ) (до ↑) \ (до↓) (делай)




Цикл «ПОКА»

WHILE условие DO оператор

(пока) (делай)


Типы данных

  • Числовые

    • целочисленные типы

Integer – целое число от –32000 до32000

Longint –целое число от -2000000 до 2000000


    • вещественные

Real (например 24,25)


  • Символьные Char

  • Строковые String