Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Исторические сведения о языке «Паскаль»Стр 1 из 8Следующая ⇒
Введение В настоящем пособии рассмотрены уроки по программированию. При составлении этих уроков имелось в виду, что изучение программирования и технологий идет параллельно. Именно поэтому в данном пособии практически нет уроков, посвященных обучению работы на компьютере и знакомству с ним. Имеется в виду, что, пока изучается тема алгоритмы и исполнители, на уроках, посвященных компьютерным технологиям, учащиеся ознакомятся с устройством ЭВМ и изучат основные приемы работы с компьютером. В пособии значительное место отводится практическим и лабораторным работам, на которых учащиеся, непосредственно работая с программами, знакомятся с работой операторов, структурами программ и другими вопросами, занимаются исследованием. Уроков решения задач (программирования на бумаге) сравнительно немного. В основном эти задачи решаются во время проведения практических работ, с обязательной записью решения в тетрадь. В пособии приведены примеры решения задач по различным темам. Предлагаемые материалы могут быть применены при работе практически по любой программе, в которой на изучение основ информатики и ВТ на первом курсе отводится два часа в неделю.
Текстовой редактор языка. Исторические сведения о языке «Паскаль» Язык программирования Паскаль получил своё название в честь великого французского математика и физика Блеза Паскаля, который в 1642г. изобрёл счётную машину для арифметических операций, так называемое " паскалево колесо". В конце 1968 г. профессор Вирт и его сотрудники из швейцарского федерального института технологии в Цюрихе разработали первую версию языка Паскаль. Спустя два года - первый вариант компилятора. В 1971 г. Вирт выпустил описание своего языка. Создавая Паскаль Вирт преследовал две цели: ¨ во-первых, разработать язык пригодный для обучения программированию как систематической дисциплины; ¨ во-вторых, реализация языка должна быть эффективной и надёжной. Одним из достоинств языка Паскаль является то, что он полностью воплотил в себя идею структурного программирования, суть которой заключается в том, что с помощью нескольких конструкций можно выразить в принципе любые алгоритмы.
Запуск языка «Паскаль» Для запуска языка Паскаль нужно загрузить файл PASCAL.EXE находящийся, как правило, в каталоге PASCAL. Например: D: \PASCAL\PASCAL.EXE
Интерфейс программы. На синем фоне будем писать программу. На сером фоне написаны строки подсказки. Верхняя строка содержит раскрывающиеся меню: Ф айл, Т екст, В ыполнение, К омпиляция, Р ежимы, О тладка, Н аблюдение. Для перехода в верхнее меню нажимаем F10. Нажатие клавиши alt и первой буквы любого из слов верхнего меню раскрывает окно. (пример alt + B)
Текстовой редактор. Ввод программы в компьютер представляет собой ввод текста в компьютер. Ниже перечислены наиболее часто используемые команды текстового редактора Турбо Паскаля. Смещение курсора PgUp - на страницу вверх; PgDn - на страницу вниз; Home - в начало строки; End - в конец строки; Ctrl-PgUp - в начало текста; Ctrl-PgDn - в конец текста. Команды редактирования Backspace (← ) - стереть символ слева от курсора; Del - стереть символ, на который указывает курсор (справа от курсора); Ctrl-Y - стереть строку, на которой располагается курсор; Enter - вставить новую строку, разрезать старую; Ctrl-Q L - восстановить текущую строку (действует, если курсор не покидал изменённую строку).
Работа с блоком Ctrl-K B - пометить начало блока; Ctrl-K K - пометить конец блока; Ctrl-K Y - стереть блок; Ctrl-K C - копировать блок; Ctrl-K V - переместить блок; Ctrl-K W - записать блок в дисковый файл; Ctrl-K R - прочитать блок из дискового файла; Ctrl-K P - напечатать блок; Ctrl-K H - убрать выделение блока. Вопросы для повторения: 1. В каком году появилась первая версия языка программирования Pascal? 2. Какими достоинствами обладает язык Pascal? 3. Какие клавиши удобно использовать для быстрого перемещения курсора по программе из верхнего левого угла экрана в нижний правый угол? (а если наоборот? ) 4. Что необходимо сделать, чтобы скопировать часть программы? 5. Можно ли восстановить изменения сделанные в тексте программы? Задания для самостоятельной работы: ü Загрузите язык программирования Pascal. Ввод и редактироование текста в редакторе языка Pascal. ü Введите следующий текст: Данный текст не является программой. Ввод текста мы осуществляем для изучения ТЕКСТОВОГО РЕДАКТОРА ЯЗЫКА PASCAL. ü Отредактируйте текст к следующему виду: Данный текст не может является программой. Мы вводим его для изучения ТЕКСТОВОГО РЕДАКТОРА языка " Паскаль". Специальные символы языка + - * / = > < [ ] {} ( )‘., : ; ^ @ $ # Работа с блоком и копирование. ü Скопируйте последнюю строку 10 раз. ( Для копирования необходимо проделать 3 действия: - Установить курсор на начало строки и нажать Ctrl-K B - Установить курсор на конец строки и нажать Ctrl-K К - Перевести курсор на начало новой строки и нажать Ctrl-K C ) ü Выделите второй абзац и переместите его в конец текста. ü Выделите весь текст и скопируйте его 5 раз. ü Выделите первую строку и удалите её. Перемещение по тексту. ü Используя клавиши перемещения курсора, переместитесь на страницу вверх, на страницу вниз, в начало строки, в конец строки, в начало текста, в конец текста. ü Просмотрите, как отличается нажатие клавиши PgUp от нажатия клавиш Ctrl-PgUp. Сохранение программы. ü Сохраните написанный текст (для этого нажимаем в верхнем меню Ф айл - сохранить В. В появившемся окне указываем имя файла и нажимаем Enter). ü Выйдите из Pascal. Загрузите его обратно. Откройте написанный текст (в верхнем меню Ф айл - З агрузить) Попробуйте выполнить данный текст как программу (в верхнем меню В ыполнение - В ыполнить). Компьютер остановится, буквально на первом символе, указав об ошибке. Структура программы Алфавит языка Алфавит языка состоит из: 1 букв латинского алфавита (русский алфавит используется только для пометок и для задания литерных величин), 2 арабских цифр, 3 специальных символов: + - * / = > < [ ] {} ( ) ‘., : ; ^ @ $ # Действительные числа Действительные числа изображаются в естественной и полулогарифмической форме. Число 234000 записано в естественной форме. Мы можем записать его так 2.34 . 105. Запись данного числа в полулогарифмической форме выглядит следующим образом: 2.34Е+5. Знак и число, стоящие после символа E указывают, на сколько знаков вправо или влево необходимо сместить десятичную запятую. Например: - 65470 = 6.547Е+4 - 3.1415 = 3.1415E+0 - 0.0028 = 2.8E-3 Моя первая программа. Арифметические операции. В языке Pascal используется следующие арифметические операции: арифметическая операция (а=14, b=4) результат - сложение (+) S: =a+b S=18 - вычитание (-) S: =a-b S=10 - умножение (*) S: =a*b S=56 - деление (/) S: =a / b S=3.5 - целочисленное деление S: =a div b S=3 - остаток от целочисленного деления S: =a mod b S=2 Нет возведения в степень. Если степень целая, её заменяют умножением: а3 ↔ S: =a*a*a Для возведения числа в произвольную степень используется следующее соотношение: xy=e ln(x ) =eylnx тогда xy=exр(y*ln(x)) Операции отношения. = - равно < > - неравно < - меньше > - больше < = - меньше или равно > = - больше или равно Оператор присваивания. Знак: = называется оператором присваивания. Например Y: = 5; X: =sqr(Y) + 3 Это означает следующее: переменной Y присвоить значение 5, а переменной X присвоить значение 52+3=28. Идентификаторы. Идентификаторы в Pascal - это имена констант, переменных, меток, объектов. Идентификаторы могут иметь произвольную длину, но значащими являются только первые 63 символа. Идентификатор всегда начинается буквой (или знаком подчёркивания), за которой следуют буквы и цифры. Пробелы и специальные символы алфавита не могут входить в идентификатор.
Оператор вывода информации. Для вывода информации на экран компьютера используется оператор: write( ) или writeln( ) В скобках записываются данные, которые необходимо вывести на экран. Вопросы для повторения: 6. Чем отличается операция /от операции div? 7. Существует ли в Pascal операция возведения в степень? 8. Что должно быть записано слева от оператора присваивания? 9. Что может быть записано в правой части оператора присваивания? 10. Может ли слово Apple являться переменной? 11. Что такое переменная? 12. Что такое идентификатор? 13. Почему знак умножения необходимо записывать явно (нужно писать f*w, а не fw)? Задания для самостоятельной работы: 1. Вычислите устно: a) a: = 78 mod 5 б) b: =97 div 9 в) c: = 13 mod 7 г) kl: = (50 div 4) mod 5 д) fl: = 82 mod (30 div 7) 2. Вычислите устно: a) z: = sqr(9) б) w: =sqrt(9) в) x: = abs(-7) г) y1: = int(5.7) д) y2: = trunc(5.7) e) y3: = round(5.7) ж) k: = frac(5.7) з) sl: = 2+pi и)* pr: = sqr(sqrt(8)) 3. Какие из предложенных ниже записей являются идентификаторами, а какие нет? a) uд б) w9 в) 9w г) y(17) д) alpha e) y#kl ж) _kl з) f_h и) my prog к) div л) date_27 м) MyNameSerg 4. Загрузите Pascal. Введите записанную ниже программу в компьютер. Просмотрите, какие разделы присутствуют в программе. Выполните программу. program My_prog1; const s='Моя первая программа'; Begin write(s); End. 5. Введите записанную ниже программу в компьютер. На основании этого примера (дописывая и удаляя ln) попробуйте разобраться в чём отличие между операторами write( ) и writeln( ) program My_prog2; var a: integer; b, c: real; Begin a: =-64; b: =sqrt(abs(a)); c: =int(pi); writeln('b=', b); writeln('c=', c); End. 6. *Составьте программы для вычисления следующих формул: а)z=3+x2-3x3 б) d=x (sin x + cos(x2) + |x|) в) l = 2 π r г) k=1 + |y-x|3 + |y-x|/(x+1) Комментарии в программе. Операции div и mod. Арифметические операции. В языке Pascal используется 6 арифметических операций. арифметическая операция (а=14, b=4) результат - сложение (+) S: =a+b S=18 - вычитание (-) S: =a-b S=10 - умножение (*) S: =a*b S=56 - деление (/) S: =a / b S=3.5 - целочисленное деление S: =a div b S=3 - остаток от целочисленного деления S: =a mod b S=2 Нет возведения в степень. Если степень целая, её заменяют умножением: а3 ↔ S: =a*a*a Для возведения числа в произвольную степень используется следующее соотношение: xy=e ln(x ) =eylnx тогда xy=exр(y*ln(x))
Рассмотрим несколько примеров: Заданы два числа. Найдите их сумму. рrogram zadacha2_4; var a, b, s: byte; Begin writeln('введите целое число a '); read(a); write('введите целое число b '); read(b); s: =a+b; writeln('s =', s); End. Проанализируйте полученный результат при a+b> 255. Поменяйте тип данных byte на integer. Что получается теперь? Просмотрите, до какой предельной суммы a+b вычисления происходят верно? Установите тип данных longint. Просмотрите суммы.
Заданы два целых числа k и d. Используя только арифметические операции, найдите целую и дробную части от деления k на d. program zadacha2_5; var a, drobn: real; k, d, cel: integer; Begin writeln('введите два числа'); readln(k, d); cel: =k div d; {целочисленное деление} a: =k/d; {обычное деление} drobn: =a-cel; writeln('целая часть - ', cel); writeln('дробная часть - ', drobn); Еnd. Можно ли было в данной программе все переменные определить как integer или как real? Попробуйте и проанализируйте.
Дано трёхзначное число. Чему равны его цифры? program zadacha2_6; var a, с1, с2, с3: integer; Begin writeln('введите трёхзначное число '); readln(a); c1: =a div 100; c2: =(a mod 100) div 10; {или c2: =(a div 10) mod 10; } c3: =a mod 10; writeln('первая цифра -', c1); writeln('вторая цифра -', c2); writeln('третья цифра -', c3); Еnd. Дано действительное число a. Используя только пять операций умножения получить a15. program zadacha2_7; var a, b, c, d, s: longint; Begin writeln('введите число a'); readln(a); b: =a*a; {вторая степень} с: =b*b; {4 степень} d: =c*a; {5 степень} s: =d*d*d; {15 степень} writeln('результат = ', s); Еnd. Вопросы для повторения: 21. Чем отличается операция / от операции div? 22. Есть ли в Pascal операция возведения в степень? 23. Выполняется ли равенство: (264 mod 100) div 10 = (368 div 10) mod 10. 24. Придумайте формулу для нахождения предпоследней цифры числа? 25. Можно ли производить операции mod и div над переменными, которые описаны как real? 26. Как должна быть описана переменная fl, если она вычисляется по формуле fl: =a / b? А как можно описать переменные a и b? 27. Как должна быть описана переменная k, если она вычисляется по формуле k: =a div b? А как нужно описать переменные a и b?
Задания для самостоятельной работы: 7. Задано двухзначное число. Чему равна последняя цифра числа? 8. Задано двухзначное число. Чему равна первая цифра числа? 9. В двухзначное число вписать ноль в середину и получить трехзначное число. 10. Найдите сумму цифр заданного трёхзначного числа. 11. Найдите цифры заданного четырёхзначного числа. 12. Задано пятизначное число. Найдите цифры и сумму цифр пятизначного числа. 13. С начала суток прошло k минут. Определите сколько сейчас часов и минут. 14. Идёт k-ая секунда суток. Определить который сейчас час (в часах, минутах и секундах). 15. Робинзон Крузо провёл на острове f дней. Сколько полных недель он пробыл на острове? 16. Поезд перевозит s тонн груза. Сколько автомобилей грузоподъемностью b тонн (b< < s) он способен заменить? 17. Дано действительное число a. Не пользуясь никакими другими операциями кроме умножения, получить: a) a13 за пять операций; b) a21 за шесть операций; c) a3 и a10 за четыре операции; d) a4 и a12 и a28 за шесть операций.
Составление линейных алгоритмов с использованием основных функций.
Решение прикладных задач.
23. Дано действительное число x. Не пользуясь никакими другими арифметическими операциями, кроме умножения, сложения и вычитания, вычислить 2x4 - 3x3 + 4x2 - 5x + 6. Разрешается использовать не более 4 умножений и 4 сложений и вычитаний. 24. Дано действительное число x. Не пользуясь никакими другими арифметическими операциями, кроме умножения, сложения и вычитания, вычислить 1 - 2x + 3x2 - 4x3 и 1 + 2x + 3x2 + 4x3. Разрешается использовать не более восьми операций. 25. Дана сторона a квадрата. Вычислите периметр, длину диагонали и площадь квадрата. 26. Даны стороны a и b прямоугольника. Вычислите периметр, длину диагонали и площадь прямоугольника. 27. Дана сторона a равностороннего треугольника. Вычислите периметр и площадь треугольника. 28. Дана длина ребра куба. Вычислите диагональ куба, объём куба и площадь его боковой поверхности. 29. Три сопротивления R1, R2, R3 соединены параллельно. Найдите сопротивление соединения. 30. Треугольник задан своими сторонами a, b, c. Используя формулу Герона (s = √ p(p-a)(p-b)(p-c), где p - полупериметр p=(a+b+c)/2 ) вычислите площадь треугольника. 31. Вычислите расстояние d между двумя точками с координатами x1, y1, x2, y2 (расстояние d = √ (x1-x2)2+(y1-y2)2). 32. Треугольник задан координатами своих вершин x1, y1, x2, y2, x3, y3. Вычислите площадь треугольника. 33. Сумма первых n членов арифметической прогрессии вычисляется по формуле Sn=(a1+an) ∙ n/2 где an=a1+d ∙ (n-1). Даны первый член прогрессии a1 и разность прогрессии d и количество членов прогрессии n. Вычислить Sn. Установить экспериментальным путём, при каком n значение Sn выходит за пределы integer. (Арифметическая прогрессия - это последовательность чисел, в которой разность между двумя соседними элементами постоянна. Например: 3, 7, 11, 15, 19, ... Здесь 3 - первый член прогрессии (a1), d=4 - разность прогрессии.) Задана температура в градусах по шкале Цельсия. Используя формулу перевода температуры из градусов по шкале Цельсия в градусы по шкале Фаренгейта F = 1.8 C + 32 получите температуру по Фаренгейту. Вопросы для повторения: 34. Найдите и объясните ошибки в описаниях переменных целого типа: Var a, b, c: integer; s{путь} v{скорость} t{время}: integer; d, e, f, : integer; const: integer; d+t: integer; x,, y: integer; q, w, e, r, t: integer k, l; integer; 35. Вычислите устно: a) 17 div 6 b) 34 mod 8 c) 19 div 4 d) 89 div 9 e) 89 mod 9 f) 77 mod 7 36. Какие числа можно получить при вычислении выражения x mod 5 =? 37. Вычислите значения выражений: a) trunc (2.8) e ) round (2.8) b) trunc (2.1) f ) round (2.1) c) trunc (-1.6) g ) round (-1.6) d) trunc (-1.1) h ) round (-1.1)
Чему равен результат работы программ при a = 253:
var a, x, y, z, b: integer; Begin readln(a); x: =a div 100; y: =(a div 10) mod 10; z: =a mod 10; b: =x*100+z; writeln(b); End. Условный оператор. Операторные скобки После служебного слова then, или после служебного else будет выполняться только один оператор. Если необходимо, чтобы выполнялось несколько операторов их нужно взять в операторные скобки: Begin
end; Группу операторов находящуюся внутри операторных скобок будем называть составным оператором. Фактически, весь раздел операторов, внутри операторных скобок, представляет собой один составной оператор. Для того, чтобы при большом количестве операторных скобок, программа была более читаемая, end желательно записывать под begin. Даны действительные числа x, y (x≠ y). Меньшее из этих двух чисел заменить их суммой, а большее - их произведением. program zadacha3_8; var a, b, sa, sb: longint; Begin writeln('Введите два числа'); readln(a, b); sa: =a; sb: =b; if a> b then begin b: =sa+sb; a: =sa*sb; end else begin a: =sa+sb; b: =sa*sb; end; writeln ('первоначальные числа a=', sa, ' b=', sb); writeln ('полученные числа a=', a, ' b=', b); End. Составить программу решающую квадратное уравнение вида ax2+bx+c=0. program zadacha3_9; var a, b, c: integer; x, d, x1, x2: real; Begin writeln('введите коэффициенты а, b, c'); readln(a, b, c); d: =b*b-4*a*c; {вычисление дискриминанта}
if d< 0 then writeln('уравнение не имеет корней');
if d=0 then begin writeln('уравнение имеет 1 корень'); x: =-b/(2*a); writeln('x= ', x); end;
if d> 0 then begin writeln('уравнение имеет 2 корня'); x1: =(-b+sqrt(d))/(2*a); x2: =(-b-sqrt(d))/(2*a); writeln('x1= ', x1); writeln('x2= ', x2); end; End. Вопросы для повторения: 1. В каких случаях после служебных слов then и else нужно писать begin … end, а в каких нет? 2. Что представляет собой составной оператор? 3. Почему end желательно записывать под begin? 4. Для чего в задаче 3_8 введены переменные sa, sb? 45. В какой из следующих структур допущена ошибка? Какая?
Задания для самостоятельной работы: 1. Даны действительные числа x, y (x≠ y). Меньшее из этих двух чисел заменить их полусуммой, а большее - их удвоенным произведением. 2. Даны два целых числа M, N. Если M делится нацело на N, то вывести на экран частное от деления, в противном случае - сообщение " M на N нацело не делится". 3. Даны три числа. Удвоить их, если они упорядочены по возрастанию, иначе отрицательные заменить их модулями. 4. Даны три числа. Удвоить их, если они целые, иначе нецелые заменить их целыми частями. 5. Дано натуральное число n (n £ 9999). Если число четырёхзначное, то получите и выведите перевёртыш этого числа (3528 → 8253), иначе выведите ответ " Число не четырехзначное". 6. Дано натуральное число n. Если оно двухзначное, то впишите в середину ноль (для 56 → 506), иначе выведите ответ " Число не двухзначное". 7. * Даны натуральные числа k, l ( 1£ k, l £ 8). На клетке (k, l) расположена шахматная фигура: a) конь b) ферзь Вывести на экран координаты клеток, на которые может походить данная фигура, при этом учитывайте, что нельзя выходить за пределы доски. Оператор выбора. Оператор выбора. Оператор выбора позволяет выбрать одно из нескольких возможных продолжений программы. Структура оператора выбора такова: case < ключ выбора> of < список выбора> [ else < операторы> ] end; Рассмотрим несколько примеров: Вводиться число от 1 до 4, определяющее пору года. Дать название этой поры года (1 - зима, 2 - весна, 3 - лето, 4 - осень).
program zadacha3_10; var n: byte; Begin writeln('Введите номер поры года'); readln(n); case n of 1: writeln('зима'); 2: writeln('весна'); 3: writeln('лето'); 4: writeln('осень'); else writeln('неправильно ввели номер поры года'); end; End.
Составим программу " КАЛЬКУЛЯТОР", которая после ввода двух чисел и одного из знаков +, -, *, / произведёт вычисления, а результат выдаст на экран.
program zadacha3_11; var a, b, s: real; sim: char; Begin writeln('Введите два числа'); readln(a, b); writeln('Введите знак операции'); readln(sim); case sim of '+': s: =a+b; '-': s: =a-b; '*': s: =a*b; '/': s: =a/b; end; writeln ('результат ', a, sim, b, ' = ', s); End.
В данной программе отсутствует часть else и поэтому, если ввести вместо рассматриваемых арифметических знаков, ввести любой символ, то программа будет работать, но будет работать неверно.
Вопросы для повторения: 46. Сколько строк может быть записано в списке выбора? 47. Может ли в операторе выбора отсутствовать часть else? 48. Сформулируйте, что может являться ключом выбора? 49. Можно ли оператор выбора заменить условным оператором if … then? 50. Сколько операторов if then понадобилось бы для решения задачи 3_10?
Задания для самостоятельной работы: 1. Отредактируйте задачу zadacha3_11 так, чтобы при вводе произвольного символа программа выдавала ответ: " Введена некорректная арифметическая операция"; 2. Вводится число от 1 до 10. Дать название этого числа (1 - один, 2 - два, …, 10 - десять); 3. Вводится число от 1 до 7, определяющее день недели. Дать название этого дня (1 - понедельник, 2 - вторник, …, 7 - воскресенье); 4. В спортивных соревнованиях Шарик, кот Матроскин, дядя Фёдор и почтальон Печкин заняли соответственно 1, 2, 3 и 4 места. Составить программу, которая по номеру места выдаёт имя участника соревнований. 5. Вводится число от 1 до 15. Вывести данное число, записанное римскими цифрами (I, II, III, IV, V, VI, …., XV); 6. Вводится число от 1 до 15. Вывести данное число, записанное в двоичной системе счисления (1, 10, 11, 100, 101, …., 1111); 7. Вводится число от 1 до 12, определяющее месяц года. Дать название этого месяца года (1 -Январь, 2 - Февраль, …, 12 Декабрь); 8. Вводится номер месяца. Вывести пору года для этого месяца (1 - зима, …, 3 - весна, …, 8 - лето, …); 9. Вводиться номер поры года. Вывести названия месяцев для этой поры года (1 – декабрь, январь, февраль, ...); 10. *Вводится число от 1 до 100. Дать название этого числа (1 - один, 2 - два, …, 100 - сто); 11. Дано натуральное число N (N< 20), определяющее сумму денег в рублях. Дать для этого числа наименование: " рубль", " рубля", " рублей"; 12. Дано натуральное число N (N< 100), определяющее возраст человека в годах. Дать для этого числа наименование: " год", " года", " лет"; Вводится число от 1 до 7, определяющее день недели. Вывести расписание уроков в вашем классе в этот день. Вложенные циклы. Для решения задачи достаточно часто требуется использовать несколько вложенных друг в друга циклических конструкций. Такие конструкции называют вложенными циклами. Рассмотрим несколько примеров: Дано натуральное число S. Требуется написать программу для нахождения всех прямоугольников, площадь которых равна S и стороны выражены натуральными числами. program zadacha3_6; var s, a, b: longint; Begin writeln('Введите s'); readln(s); for a: =1 to s do for b: =1 to s do if a*b=s then writeln ('стороны ', a, ' и ', b); End. Данную задачу можно было решить, используя только один цикл. Подумайте, как это сделать.
Даны натуральные числа n, m. Получить все натуральные числа, меньшие n, сумма квадратов цифр которых равна m. program zadacha3_7; var n, m, i, a, sum, cif: longint; Begin writeln('введите n и m'); readln(n, m); for i: =1 to n do begin a: =i; sum: =0; while a> 0 do begin cif: =a mod 10; sum: =sum+sqr(cif); a: =a div 10; end; if sum=m then write(i, ' '); end; End. Найти все решения заданного числового ребуса. Каждой букве соответствует некоторая цифра. Причём одинаковым буквам соответствуют одинаковые цифры, разным буквам - разные цифры. Поскольку здесь всего три буквы, то для решения достаточно написать три вложенных цикла, и перебрать все варианты сложения трёхзначных чисел. program zadacha3_8a; var k, t, o, kto, kot, tok: longint; Begin for k: =0 to 9 do for t: =0 to 9 do for o: =0 to 9 do begin kto: =k*100+t*10+o; kot: =k*100+o*10+t; tok: =t*100+o*10+k; if (k< > t) and (k< > o) and (t< > o) and (kto+kot=tok) then writeln(kto, '+', kot, '=', tok); end; End. В данном алгоритме тело цикла выполнялось 10∙ 10∙ 10=1000 раз. (будем говорить сложность алгоритма =1000) Если же для решения более сложных ребусов потребуется написать 8-10 вложенных циклов, то такой полный перебор будет работать достаточно долго. Можно немного упростить данный алгоритм, если увидеть что 1≤ k≤ 4, t≥ 2. for k: =1 to 4 do for t: =2 to 9 do for o: =0 to 9 do Теперь сложность алгоритма 4∙ 8∙ 10=320. Простое косметическое исправление дало увеличение скорости в 3 раза. Но и данный алгоритм не является оптимальным. Посмотрите, при k =2 и t =2 программа переберёт все 10 вариантов o. В таких случаях когда k = t цикл по o вообще необходимо не выполнять. Назовём такой метод - контролируемый перебор. program zadacha3_8c; var k, t, o, kto, kot, tok: longint; Begin for k: =1 to 4 do for t: =2 to 9 do if k< > t then for o: =0 to 9 do if (k< > o) and (t< > o) then begin kto: =k*100+t*10+o; kot: =k*100+o*10+t; tok: =t*100+o*10+k; if kto+kot=tok then writeln(kto, '+', kot, '=', tok); end; End. Такой алгоритм даже при 8-10 вложенных циклах работает очень быстро. Вопросы для повторения: 51. Может ли во вложенных циклах использоваться одна и та же переменная, например i? 52. Можно ли вкладывать друг в друга различные циклы: FOR в WHILE или REPEAT в FOR? Задания для самостоятельной работы: 1. Старинная задача. Сколько можно купить быков, коров и телят, если бык стоит 10 рублей, корова – 5 рублей, телёнок – полтинник (0, 5 рубля), при условии, что на 100 рублей надо купить 100 голов скота. 2. Задано натуральное n. Для всех чисел от 1 до n найти: a) количество делителей; b) сумму чётных делителей. 3. Найти все решения следующих числовых ребусов: a) БАБКА+ДЕДКА+РЕПКА=СКАЗКА (4 решения) b) КОРОВА+ТРАВА+ДОЯРКА=МОЛОКО (2 решения) c) АЛЁНКА+ИВАН+КОЗЛИК=СКАЗКА (1 решение) d) ВЕТКА+ВЕТКА+СТВОЛ=ДЕРЕВО (3 решения) ВОРОТА+ТРАВА=ФУТБОЛ (3 решения) Понятие массива. Задание массива в разделе констант Массив представляет собой таблицу в памяти компьютера (имеющую название), состоящую из некоторого числа ячеек (7, 13, 50, 100). К значениям, находящимся в ячейках массива, имеется удобный доступ, необходимо лишь указать имя массива и индекс ячейки (a[1], a[3], a[7]).
Например, массив а состоит из 10 ячеек (говорят, что размерность массива равна 10)
Попытаемся понять, как работать с массивом на примере следующей задачи:
Имеется 10 чисел. Необходимо найти их сумму.
program zadacha5_1; const n=10; var s, i: integer; a: array[1..n] of integer; {описание массива} Begin for i: =1 to n do begin writeln('Введите a[', i, ']'); {Ввод элементов массива} read (a[i]); end;
writeln('Введённый массив'); for i: =1 to n do {Вывод эл. массива} write (a[i], ’ ’);
s: =0; for i: =1 to n do {Нахождение суммы} s: =s+a[i];
writeln; writeln('Сумма элементов массива =', s ); End. В данной задаче все элементы массива вводились с клавиатуры. Но ввод элементов массива можно осуществлять и по-другому: задавая весь массив в разделе констант.
Решим задачу вторым способом. program zadacha5_2; const n=10; a: array[1..n] of integer=(1, 0, -2, 7, 8, 9, 9, 4, 0, -4) var s, i: integer; Begin writeln('Введённый массив'); for i: =1 to n do {Вывод эл. массива} write (a[i], ’ ’);
s: =0; for i: =1 to n do {Нахождение суммы} s: =s+a[i];
writeln; writeln('Сумма элементов массива =', s ); End.
Вопросы для повторения: 53. Что такое массив? 54. Что такое элемент массива? 55. Что такое индекс массива? 56. Что такое размерность массива? 57. Зачем нужны массивы? 58. Как можно обратиться к ячейке массива? 59. Какого типа могут быль элементы массива? 60. Какого типа может быть индекс массива? 61. Как можно осуществить ввод элементов массива? Придумайте три способа. Задания для самостоятельной работы:
1. Имеется целочисленный массив, состоящий из 15 элементов: a) Найти сумму a[1] и a[7] элементов; b) Найти разность a[9] и a[3] элементов; c) Найти среднее арифметическое всех элементов массива; d) Найти произведение всех элементов массива.
2. Имеется целочисленный массив, состоящий из N элементов (N - чётное): a) Найти сумму первых N/2 элементов; b) Найти сумму элементов стоящих на чётных позициях; c) Найти произведение элементов стоящих на нечётных позициях; d) Найти сумму чётных элементов стоящих на чётных позициях.
3. Имеется вещественный массив, состоящий из 9 элементов. Найти сумму, среднее арифметическое и произведение всех элементов массива. Двухмерные массивы Примеры решения задач с использованием двухмерных массивов Двухмерные массивы имеют строки и столбцы. Элемент массива задается номером строки и номером столбца, на пересечении которых он находится
Если количество строк = количеству столбцов массив называется квадратной матрицей, в противном случае - прямоугольной.
Задана прямоугольная матрица размера n строк и m столбцов. Заполнить ее целыми числами. Распечатать по строкам. Найти и вывести сумму всех элесментов и их среднее арифметическое значение.
program zadacha5_3_1; var i, j, s, m, n: integer; sr: real; a: array[1..10, 1..20] of integer; {описание массива} Begin Write('Кол. строк, кол. столбцов? '); readln( n, m); for i: =1 to n do for j: =1 to m do begin write('Введите a[', i, ', ', j, ']'); {Ввод элементов readln (a[ i, j ]); массива} end;
writeln('Введённый массив'); for i: =1 to n do {Вывод эл. Массива} begin for j: =1 to m do write (a[ i, j ], ’ ’); {Вывод эл. массива} writeln; end; s: =0; for i: =1 to n do for j: =1 to m do {Нахождение суммы} s: =s + a[ i, j ];
writeln('Сумма =', s);
sr: =s / (n*m); {Нахождение среднего} writeln('Средее =', sr: 8: 3) End.
Задача. Среди нечетных столбцов заданной целочисленной матрицы размерностью n*m найти столбец с максимальной суммой модулей элементов. program zadacha5_3_2; var i, j, m, n, k, s, max: integer; a: array[1..10, 1..20] of integer; {описание массива} Begin Write('Кол. строк, кол. столбцов? '); readln( n, m); {Заполнить таблицу} {Вывести таблицу по строкам} {Первоначально будем считать сумму модулей элементов первого столбца максимальной} s: =0; for i: =1 to n do {Нахождение суммы первого столбца}
max: = s; k: =1; j: =3; while j < = m do begin s: = 0;
for i: =1 to n do s: = s + abs ( a[ i, j ]); if s > max then begin max: = s; k: =j; end; j: = j+2; {Переход к очередному нечетному end; индексу столбца } writeln( 'Номер столбца с максим. суммой модулей элементов =', k, 'знач. макс.=', max); end. Задания для самостоятельной работы: 8. Имеется целочисленный массив n*m элементов. Найти номер строки с минимальной суммой модулей элементов. 9. Имеется целочисленный массив n*m элементов. Найти индексы максимального элемента таблицы и значение максимума. 10. Имеется целочисленный массив n*m элементов. Каких элементов в массиве больше отрицательных или положительных? 11. Имеется целочисленный массив n*m элементов. Сообщить есть ли в таблице отрицательные элементы. 12. Имеется целочисленный массив n*m элементов. Найти среднее арифметическое элементов массива. Определить и вывести количество элементов массива, значение которых превышает это среднее значение.
Литература 1. Карасев П.Н. Информатика (программирование).-Волгоград, 2002. 2. Брудно А.Л. Каплан Л.И. Олимпиады по программированию.- М., 1985. 3. Грогоно П. Программирование на языке Паскаль/Пер. с англ.- М., 1982. 4. Каймин В.А. и др. Основы информатики и вычислительной техники (пробный учебник для 10-11 классов).-М., Просвещение, 1994. 5. Культин Н. Turbo Pascal в задачах и примерах.-Санкт-Петербург, БХВ-Петербург, 2002. 6. Немнюгин С.А. Turbo Pascal(практикум).-Санкт-Петербург, 2001. 7. Златопольский Д.М. Я иду на урок информатики (задачи по программированию 7-11 классы).-М., Первое сентября, 2002.
Популярное:
|
Последнее изменение этой страницы: 2016-05-30; Просмотров: 821; Нарушение авторского права страницы