Основы программирования
С.М. Окулов, г. Киров
Занятие 1. Первая программа
План занятия:
• загрузка Турбо Паскаля;
• краткое знакомство с интегрированной средой;
• первая программа — нахождение произведения двух целых чисел;
• компиляция программы;
• сохранение программы;
• запуск программы;
• разбор программы.
Опишем основные этапы занятия.
Краткое знакомство с
интегрированной средой
После загрузки системы экран разделен на три части:
Переход из основного окна в
главное меню и обратно осуществляется посредством клавиши <F10>.
В рабочем окне редактора интегрированной среды наберем текст
первой программы.
Program Myl_l ;
Var a, b, rez :
Integer;
Begin
WriteLn ('Введите
два числа через пробел');
ReadLn (a, b);
rez :=a*b;
WriteLn ('Их
произведение равно ', rez);
WriteLn ('Нажмите <Enter>');
ReadLn
End.
Краткий разбор примера.
Структура программы
Программа начинается с заголовка, который имеет следующий вид:
Program <имя программы>;
За
заголовком идет раздел описаний, в котором должны быть описаны все
идентификаторы (константы, переменные, типы, процедуры, функции, метки),
которые используются в программе. После раздела описаний идет раздел
операторов, который начинается со служебного слова Begin и заканчивается
служебным словом End. В этом разделе задаются действия над объектами программы,
введенными в разделе описаний. Операторы, посредством которых эти действия
производятся, разделяются точкой с запятой. После последнего слова End ставится
точка.
Имя нашей
программы Му1_1 (заметим, что в имени программы не должно быть пробелов, оно
должно начинаться не с цифры, состоять только из латинских букв, цифр и символа
"_"). Из разделов описаний в нашей программе имеется лишь один —
раздел описания переменных. Он начинается со служебного слова Var, после
которого идет последовательность объявлений переменных, разделенных точкой с
запятой. В каждом объявлении перечисляются через запятую имена переменных
(идентификаторы) одного типа, после каждого списка имен переменных ставится
двоеточие и указывается тип переменных списка. В нашем примере описаны три
переменные: все они (a, b и rez) имеют целый тип (integer), то есть значениями
переменных этого типа являются целые числа.
Понятие
переменной — центральное в любом языке программирования. Переменная (величина,
которая изменяется в процессе работы программы) характеризуется именем, типом и
значением. Использование в выражениях неинициализированных переменных (т.е.
переменных, значения которым не были присвоены явно) часто является причиной
ошибок.
После раздела описаний расположен раздел операторов, начинающийся
со служебного слова Begin, после которого записываются операторы языка. Первый
оператор в нашей программе — это WriteLn ('Введите два числа через пробел') —
записать (вывести) на экран текст, заключенный между апострофами, Ln за словом
Write означает, что после вывода следует перевести курсор на следующую
строку.
Следующий
оператор — ReadLn (а, b) —
читать данные с клавиатуры. В данном случае необходимо ввести два целых числа
через пробел. Переменной а присваивается значение, равное первому
введенному числу, а переменной b — значение, равное второму введенному числу.
Например, при вводе чисел 12 и 45 а = 12, а b = 45. В конце этого
оператора Ln имеет тот же смысл.
После
этих двух операторов стоит оператор присваивания: rez :=a*b; (:= — это знак
оператора присваивания в языке Паскаль).
Значение выражения из правой части оператора
присваивания заменяет текущее значение переменной из левой части. Тип значения
выражения должен совпадать с типом переменной.
При выполнении оператора присваивания
переменная rez получит значение, равное произведению значения переменной a
на значение переменной b (см. рисунок). Так как в результате умножения
двух целых чисел получается целое число, то переменная rez имеет тип Integer
(значениями которого могут быть лишь целые числа).
Следующий оператор — это снова оператор
вывода WriteLn ('Их произведение равно1, rez}, он выведет на экран
текст, заключенный между апострофами, а за ним — значение переменной rez. Затем
следующий оператор WriteLn выведет на экран сообщение: "Нажмите
<Enter>", — а оператор ReadLn будет ожидать этого нажатия в окне
выполнения. Раздел операторов завершается служебным словом End, после которого
ставится точка. Операторы отделяются друг от друга точкой с запятой.
Для того чтобы запустить программу, выходим в главное меню (нажатием
<F10>), выбираем
пункт Run и дважды нажимаем <Enter>. На экране появляется сообщение:
Введите Два целых числа через пробел
Курсор находится в следующей строке. Вводим два целых числа через пробел
и нажимаем < Enter>, после этого появляется сообщение:
произведение равно …
нажмите
<Enter>
Вместо точек будет выведено значение
переменной rez, то есть число, равное произведению первого введенного числа на
второе. Это сообщение останется на экране до тех пор, пока не будет нажата
клавиша <Enter>.
Для того чтобы сохранить программу, необходимо:
• выйти в главное меню и выбрать режим File;
• нажать <Enter>, в вертикальном меню выбрать пункт
Save as… и нажать клавишу <Enter>;
• в появившемся
окне ввести имя файла (например, a:\prim1_1.pas) и нажать клавишу
<Enter>. В нашем примере файл с именем PRIM1_1.PAS сохраняется в корневом
каталоге диска A; PAS — расширение, сообщающее о том, что файл содержит
программу, написанную на языке Паскаль.
Поскольку
мы работаем в режиме DOS, имя файла не может содержать более 8 символов.
Примечания.
1. В именах файлов нельзя употреблять
следующие символы: *, =, +, [, ], \, |, :, ., <, >, /, ?, символ пробела
и буквы русского алфавита.
2. Для быстрого сохранения файла можно
воспользоваться командами Save <F2>
или Save all меню File.
Для того чтобы закончить работу,
необходимо:
• выйти в главное меню и выбрать пункт File;
• нажать <Enter> и в вертикальном меню
выбрать пункт Quit, после чего нажать либо <Enter>, либо
просто
нажать комбинацию клавиш <Alt> + <Х>.
Эксперименты с программой
1. Введите в качестве исходных данных достаточно большие числа,
например, 4567 и 789. Убедитесь, что у вас получается неправдоподобный
результат — отрицательное число (—1117). Найдите экспериментальным путем тот
интервал значений переменных а и b, когда результат умножения правильный.
2. Вместо числа введите какой-нибудь символ. Убедитесь, что компьютер
выдает сообщение об ошибке "Error 106: Invalid numeric format".
3. Добавьте лишний знак апострофа в операторе WriteLn. Убедитесь, что
программа не проходит компиляцию, а система сообщает об ошибке "Error 8:
String constant exceeds line".
4. Измените оператор
rez
:=a*b на rez:=a-(a Div
b)*b
Выясните результат операции Div над
переменными целого типа. Измените текстовую часть следующего за оператором
присваивания оператора WriteLn, отразив в ней результат вашего исследования.
5. Добавьте в программу переменную с именем ost, оператор присваивания
ost:=a Mod b; и оператор вывода WriteLn ( ' ???????? ', ost). Выясните, какая
операция обозначается словом Mod. Замените знаки вопроса вашими пояснениями.
6. Наберите следующую программу:
Program My1_2;
Var a :
Integer;
Begin
WriteLn ('Введите целое число');
ReadLn (а) ;
WriteLn ( ' ???????? ', Abs
(a) );
WriteLn ( ' Нажмите <Enter>
' );
ReadLn
End.
Выясните, что
вычисляет Abs. Выполните аналогичное исследование для выражений sqr (a), Ord
(a) , Succ (a) , pred (a).
Примечание. Рекомендуется следующий
порядок работы: текст программы Му1_1 сохраняется под новым именем, например,
PRlM1_2.PAS, а затем изменяется и вновь сохраняется. Это позволяет сократить
время на набор программы.
1. Измените программу таким образом,
чтобы в ней находилась сумма двух чисел.
2. Измените программу таким образом,
чтобы в ней находилась сумма четырех чисел.
3. Напишите
программу для вычисления выражения: (а + (d - 12) *3) * (с - 5*k), значения
переменных а, d, с и k вводятся с клавиатуры.
4. Нарисуйте схему (взяв за образец рисунок, приведенный в
тексте занятия), иллюстрирующую выполнение следующею фрагмента программы:
х:=13;
у:=25;
t:=x;
х:=у;
y:=t;
5. Измените рисунок из предыдущего примера, заменив три последних оператора на:
х:=х-у;
у:=х+у;
х:=у-х;
6. Напишите программу вывода
на экран нескольких чисел в виде
13
14
15
16
или
101
102
103
Язык программирования Паскаль был разработан Н. Виртом в
1968—1970 годах и получил широкое распространение благодаря наглядности
программ и легкости при изучении. Он послужил основой для разработки других
языков программирования (например, Ада, Модула - 2).
Турбо Паскаль появился на рынке программных продуктов в 1983 году и совершил настоящую революцию в программировании и обучении этой дисциплине. До этих пор предпочтение отдавалось Бейсику — простому, дешевому и массовому. Паскаль же был аппаратно - зависимым, дорогим и сложным в обращении. С появлением Турбо Паскаля положение изменилось. Удобство Турбо Паскаля в том, что он предоставляет интегрированную среду — редактор, компилятор и среду выполнения программы.
Первая версия Турбо Паскаля использовалась не очень долго — она
появилась в 1983 году, а уже в 1984 году ее заменила вторая версия, которая
получила широкое распространение. К осени 1985 года появляется третья версия,
более удобная в работе.
Четвертая версия (1988 год) представила Турбо Паскаль в новом
виде (в частности, компилятор стал встроенным). Осенью этого же года
разработана пятая версия, в которой появился встроенный отладчик. А в 1989 году
появилась версия 5.5, позволившая перейти к объектно - ориентированному
программированию.
Шестая версия уже обеспечивала многооконный и многофайловый
режимы работы, использование мыши, применение объектно-ориентированного
программирования, обладала встроенным ассемблером и имела другие возможности.
В 1992 году фирма Borland International выпустила два пакета
программирования на языке Паскаль — Borland Pascal 7.0 и Turbo Pascal 7.0.
Пакет Turbo Pascal 7.0 использует новейшие достижения в
программировании. Язык этой версии обладает широкими возможностями, имеет
большую библиотеку модулей. Среда программирования позволяет создавать тексты
программ, компилировать их, находить и исправлять ошибки, компоновать программы
из отдельных частей, использовать модули, отлаживать и выполнять отлаженную
программу.
2. Некоторые команды редактора
—
перемещение курсора на символ вправо;
— перемещение курсора на
символ влево;
— перемещение курсора на строку вверх;
— перемещение курсора на строку вниз;
<Home> —
перемещение курсора в начало текущей строки;
<End> —
перемещение курсора в конец текущей строки;
<Page Up> — перемещение курсора на страницу вверх;
<Page Up> — перемещение курсора на страницу вниз;
<Ctrl> + <Home> — перемещение курсора в левый верхний угол.
Команды
вставки и удаления текста
<Insert> —
включение и выключение режима вставки;
<Delete> —
удаление символа, стоящего в позиции курсора;
<Backspace> — удаление символа, стоящего перед курсором;
<Ctrl>
+ <N> — вставка пустой строки над строкой, в которой находится курсор;
<Ctrl> + <Y> — удаление строки, в которой находится курсор.
Примечание. Страница в данном случае — это один экран.
Если режим вставки включен, то на экране
курсор имеет вид мигающей черты. В режиме вставки набираемый символ вводится в
позицию, в которой стоит курсор, а все символы (начиная с символа, стоящего в
позиции курсора), расположенные правее, сдвигаются вправо. Если режим вставки
выключен, то набираемый символ заменит тот символ, который находится в позиции
курсора, таким образом можно старый текст заменить на новый. Иногда на этой
клавише написано BS, а иногда это стрелка, указывающая влево, расположенная над
клавишей ввода ( <Enter>
).
3. Данные
Данные — общее понятие всего того, с чем
работает компьютер. В аппаратуре все данные представляются как
последовательности двоичных цифр. В языках высокого уровня, а к ним относится
Турбо Паскаль, абстрагируются от деталей представления данных в памяти
компьютера. Любой тип данных определяет множество значений, которые может
принимать величина этого типа, и те операции, которые можно применять к
величинам этого типа.
В Турбо Паскале используются пять типов
данных: простые, строковые, составные, ссылочные и процедурные. К простым типам
данных относятся: целый, вещественный, логический, символьный, перечислимый и
ограниченный (два последних определяются пользователем). На простых типах
данных, кроме вещественного, определено отношение порядка. Что это такое? Все
множество значений типа рассматривается как упорядоченное множество, и каждое
значение связано с некоторым целым числом, которое есть его порядковый номер. В
любом порядковом типе для каждого значения, кроме первого, существует
предшествующее значение, и для каждого значения, за исключением последнего,
существует последующее значение. Определены следующие стандартные функции для
работы с порядковыми типами:
• Ord — возвращает порядковый номер значения любого порядкового типа;
• Pred
— возвращает предшествующее значение для заданного значения порядкового типа
(выясните: что возвращает Pred, если заданное значение первое?);
• Succ — возвращает следующее значение для заданного значения
порядкового типа (выясните: что возвращает Succ, если заданное значение
последнее?).
В Турбо Паскале есть возможность конструировать
(создавать) свои типы данных из имеющихся типов, причем весьма сложные.
Итак, абстрагирование и конструирование суть концепции типа данных.
4. Операторы ввода и
вывода
Любая программа взаимодействует с окружающей
средой с помощью операторов ввода-вывода. Если трактовать термин
"программа" очень вольно, то можно считать, что программа что-то
откуда-то берет, что-то делает с введенными данными и затем выводит куда-то
полученные результаты. В Турбо Паскале связь программы с внешними устройствами
осуществляется через файлы. В простейшем случае эти файлы связаны с клавиатурой
(для ввода данных) и с экраном дисплея
(для вывода).
Для ввода с клавиатуры используется оператор
Read (или ReadLn).
Вызов: Read (r1, r2, …, rn).
Параметры r1,
r2, …, rn имеют тип Integer, Real, Char или String.
Действие: если ri имеет
тип
• Integer или Real,
то считывается одно число и значение его присваивается переменной ri. При этом знаки пробела и
перевода строки перед числом игнорируются;
• Char, то
считывается один символ и присваивается переменной ri;
• String, то
считывается максимум q символов при длине строковой переменной ri, равной
q.
Оператор
ReadLn действует так же, как и Read. Отличие в том, что после ввода
осуществляется переход на начало следующей строки.
Вывод на экран осуществляется с помощью операторов Write (или WriteLn).
Вызов: Write (r1,
r2, …, rn ).
Параметры: r1,
r2, …, rn имеют тип Integer, Real, Boolean, Char или String.
Действие: на экран выводится значение ri, в
стандартном формате.
Работа WriteLn отличается тем, что после
вывода осуществляется переход на начало следующей строки.
Занятие 2.
Целочисленные
типы данных
План занятия:
1. Типы данных для представления целых величин и операции над ними.
2. Разбор программы выделения цифр целого числа.
3. Эксперименты с программой: перевод числа из десятичной системы счисления в двоичную, выяснение сути арифметических операций над данными целого типа, преобразование данных целого типа.
4. Выполнение самостоятельной работы.
Представление целых величин
Имеются пять типов данных для представления целых чисел: ShortInt, Integer, Longlnt, Byte, Word. Они отличаются диапазоном значений, а значит, и размером памяти, отводимой для их представления.
Тип |
Диапазон значений |
Объем памяти |
ShortInt |
-128 ... 127 |
1 байт со знаковым битом |
Integer |
-32 768 ... 32 767 |
2 байта со знаковым битом |
Longlnt |
-2 147 483 648 ... 2 147 483 647 |
4 байта со знаковым битом |
Byte |
0... 255 |
1 байт без знакового бита |
Word |
0 ... 65 535 |
2 байта без знакового бита |
Над величинами целого типа определены следующие операции: сложение (+), вычитание (—), умножение (* ), деление нацело (Div), получение остатка от деления (Mod). Так как на данных целого типа определено отношение порядка, то можно использовать стандартные функции Ord, Succ и Pred.
Примечание: Переменной целого типа присваивать значение результата обычной операции деления "/" нельзя. Убедитесь в этом с помощью модификации программы, которую вы написали на первом занятии. Попробуйте найти объяснение этому факту.
Разбор программы
Перед разбором программы рекомендуется рассмотреть примеры выполнения операций Div и Mod над различными (положительными и отрицательными) числами.
19 |
Div |
4 |
= 4 |
19 |
Mod |
4 |
= 3 |
-19 |
Div |
4 |
= - 4 |
-19 |
Mod |
4 |
= - 3 |
19 |
Div |
-4 |
= - 4 |
19 |
Mod |
-4 |
= 3 |
-19 |
Div |
-4 |
= 4 |
-19 |
Mod |
-4 |
= -3 |
В данной программе определяются цифры трехзначного числа. Можно ее использовать и для определения цифр двузначного числа, просто цифра сотен в этом случае равна нулю.
Program My2_1;
Var а, one, dec, hun, rez: Integer;
Begin
WriteLn ( ' Введите число ' ) ; ReadLn (a) ;
one :=a Mod 10;
WriteLn ( 'Цифра единиц числа — ' , one) ;
dec := (a Div 10) Mod 10;
WriteLn ( ' Цифра десятков числа — ', dec) ;
hun := a Div 100;
WriteLn ( 'Цифра сотен числа — ',hun );
rez := hun*100+dec*10+one;
WriteLn( ' ? это тоже число — ' ,rez) ;
Write ( ' Enter ' );
ReadLn
End.
Например, если вы введете число 137, то значение переменной one будет равно 7, dec — 3 и hun — 1. Вспомните деление чисел столбиком.
137 10
130 13 10
7 10 1
3
Примечание. Не забудьте сохранить программу под именем PRIM2_1. PAS.
Экспериментальный раздел работы
1. Измените программу Му2_1 для нахождения цифр двузначного числа. Сохраните ее под именем PRIM2_2.PAS.
2. Измените программу My2_1
для нахождения цифр четырехзначного
числа. Сохраните ее под именем PRIM2_2.PAS.
3. Деление на 10 и нахождение остатков от деления мы рассмотрели выше.
Рассмотрите пример деления столбиком на 2.
137 | 2
1 68 | 2
0 34 | 2
0 17 | 2
1 8 | 2
0 4 | 2
0 2 | 2
0 1
Наберите
следующую программу, отладьте ее и
попробуйте дать объяснение полученному
результату. Измените программу так, чтобы
она правильно работала, например, с числом
115.
Program My2_2;
Var rez : Integer;
Begin
WriteLn ( ' 137 ' ) ;
WriteLn ( '
10001001 ' )
Rez := l*128+0*64+0*32+0*l6+1*8+0*4+0*2+1*1;
WriteLn (rez)
;
ReadLn
End.
4. Наберите следующую программу:
Program My2_3;
Uses Crt;
Var a : Integer;
b : Word;
r1 : Integer;
r2 : LongInt;
Begin
ClrScr;{Очистка
экрана, процедура модуля Crt}
a := 32000; b := 64000;
r1 := a+b; WriteLn (r1);
r2 := a+b; WriteLn (r2);
ReadLn
End.
После запуска вы увидите, что значение переменной r1 равно 30 464, а значение переменной г2 — 96 000. Если изменить тип переменной r1 на Word, то результат не изменится. Используя информацию из таблицы, приведенной в начале занятия, измените программу так, чтобы проделать аналогичные эксперименты с данными других целых типов. Попробуйте понять, как получаются эти результаты.
5. Добавьте в программу Му2_3 перед ReadLn следующие два оператора:
WriteLn (LongInt
(100*a) );
WriteLn (100*LongInt (a) );
Функция LongInt преобразует переменную типа
Integer в тип LongInt. В первом случае
преобразование осуществляется после
умножения, а во втором — перед умножением. В
первом случае получается результат,
далекий от истины, — отрицательное число —
11 264, во втором — правильный, 3 200 000.
Приведем основные правила, по которым в
Турбо Паскале осуществляются операции над
переменными целых типов.
Перед выполнением бинарных операций
над двумя операндами оба операнда
преобразуются к общему для них типу. Им
является тип с наименьшим диапазоном,
включающим все возможные значения обоих
типов. Например, общим типом для Integer и Byte
будет Integer, для Integer и Word — LongInt. Результат
будет общего типа.
Выражение в правой части
оператора присваивания вычисляется
независимо от размера или типа переменной в
левой части!
Перед выполнением любой арифметической
операции любой операнд длиной в 1 байт
преобразуется в промежуточный операнд
длиной в 2 байта, который является
совместимым как с Integer, так и с Word.
Задания для самостоятельной работы
1. Чему равны
значения переменных a и b после
выполнения последовательности действий:
а := 15 Div (16 Mod 7) ;
b:= 34 Mod a * 5 - 29 Mod 5*2;
a:= 4 * 5 Div 3 Mod 2;
b:= 4 * 5 Div ( 3 Mod 2 ) ;
2. Дано
двузначное число. Определить:
— сумму и
произведение цифр числа;
— число,
образованное перестановкой цифр
исходного числа.
4. Решить
задачу 3 (кроме последнего пункта) для
четырехзначных чисел.
Примечание. Предложить
максимальное количество разумных
модификаций рассматриваемой задачи.
5.
Арифметическая прогрессия — это
последовательность чисел, в которой
разность между двумя соседними
элементами постоянна.
Последовательность 12, 15, 18, 21, 24,... является
арифметической прогрессией, 12 — первый
член прогрессии (a1), разность
прогрессии равна 3. Любой член прогрессии
вычисляется по формуле ап= а1
+ d — (п — 1), где d — разность
прогрессии, п — номер взятого члена.
Даны а1 и d. Найти (экспериментальным
путем) п, при котором значение ап
выходит за диапазон типа Integer.
6.
Сумма первых n членов арифметической
прогрессии вычисляется по формуле Sn=
(a1 + an) • n / 2.
Даны а1 и d. Найти (экспериментальным
путем) n, при котором значение Sn выходит
за диапазон типа Integer.
Материал для чтения
1. Выражения состоят из операций и операндов. Различают бинарные операции — они выполняются над двумя операндами, и унарные (одноместные) — над одним операндом. Бинарные операций записываются в инфиксной форме (знак операции ставится между операндами), унарные — в префиксной (знак унарной операции предшествует операнду), Порядок выполнения операций в выражении определяется их приоритетами, которые приведены в следующей таблице.
Примечание. Мы включили в
таблицу и те операции, которые будут
рассмотрены позднее.
Операции |
Приоритет |
Тип операции |
@, Not, +, -, ^ | 1-й (высший) | унарный |
*, /, Div, Mod , And, Shl, Shr | 2-й | мультипликативный |
+, -, Or, Xor | 3-й | аддитивный |
=, <>, <, >, <=, >=, In | 4-й (низший) | операции отношения |
2. Система счисления — способ записи чисел. Системы счисления, в которых вклад каждой цифры в величину числа зависит от ее позиции в последовательности цифр, изображающей число, называются позиционными. Например, в десятичной записи числа
3377 = 3 • 1000 + 3 • 100 + 7 • 10 + 7 = 3 •103 + 3 • 102 + 7• 101 + 7 • 100
вклад как цифр 3, так и цифр 7 различен. Это же число в пятеричной системе счисления записывается как 1020023377= 1• 55 + 0 • 54 + 2 • 53 + 0 • 52 + 0 • 52 + 2 • 50.
Подскажем, что 55= 3125, а 53 = 125. Это же число в двоичной системе счисления записывается как 110100110001
3377 = 1 • 211 + 1 • 210 + 0 • 29 + 1 • 28 + 0 • 27 + 0 • 26 + 1 • 25 + 1 • 24 + 0 • 23 + 0 • 22+ 0 • 21 + 1 • 20.
Приведем значения степеней двойки: 211 = 2048, 210= 1024, 29= 512, 28 = 256, - и т.д. Сформулируем алгоритм перевода целого числа из десятичной системы счисления в двоичную: делим исходное число на 2 нацело в десятичной системе счисления и считаем новым значением числа целую часть частного, остаток от деления, а это 0 или 1 , запоминаем; продолжаем процесс деления до тех пор, пока не будет получен 0. Результат получаем, выписывая остатки в порядке, обратном их нахождению.Пример:
3377 : 2 = 1688 (1)
В скобках указано значение
остатка от деления. Итак,
337710= 1101001100012.
Методические рекомендации. Ученикам следует предложить выполнить порядка 15 — 20 упражнений по переводу целых чисел из десятичной системы счисления в двоичную и обратно.
3. Компьютер
работает только с данными, представленными
в двоичной системе счисления. Не имеет
значения, какие это данные: текст, звук,
рисунок, целые числа, они должны быть
переведены в двоичное представление. Для
хранения одной двоичной цифры, а это 0 или 1 ,
используется один бит (разряд) памяти
компьютера. Запомните, что 8 бит называют 1
байтом, 1024 байт — 1 килобайтом (1 Кб), 1024 Кб — 1
мегабайтом (1 Мб), 1024 Мб — 1 гигабайтом (1 Гб). В
2 битах можно хранить 4 различные
последовательности из 0 и 1: 00, 01, 10, 11 (22).
В 3 битах — 8: 000, 001, 010, 011, 100, 101, 11О, 111 (23).
Если перевести эти 8 последовательностей из
двоичной системы счисления в десятичную, то
получим десятичные цифры от 0 до 7. Если у нас
есть 4 бита, а это 16 различных двоичных
последовательностей, то мы можем хранить
числа из интервала от 0 до 15. Проверьте. А что
делать, если необходимо хранить и
отрицательные числа? У нас по-прежнему 4
бита памяти компьютера. Естественным шагом
является выделение одного бита для
хранения знака числа. Получаем, что,
например, — 5 хранится как 1101, а 5 — 0101. И
диапазон представления чисел в этом случае
от — 7 до 7, т.е. 15 различных значений, а у нас
есть возможность хранить в 4 битах 16
различных последовательностей.
Последовательность 1000 не задействована,
или, что еще более неприятно, она может
трактоваться как — 0. Давайте научимся
выполнять следующие действия: инверсию и
прибавление 1 к двоичному числу. Рассмотрим
пример.
Число | Двоичное представление |
Инверсия |
Прибавление
1 |
Отрицательное число |
1 | 0001 | 1110 | 1111 | -1 |
2 | 0010 | 1101 | 1110 | -2 |
3 | 0011 | 1100 | 1101 | -3 |
4 | 0100 | 1011 | 1100 | -4 |
5 | 0101 | 1010 | 1011 | -5 |
6 | 0110 | 1001 | 1010 | -6 |
7 | 0111 | 1000 | 1001 | -7 |
8 | 1000 | 0111 | 1000 | -8 |
0 | 0000 | 1111 | 10000 (пятый, старший, разряд "отбрасываем") |
0 |
В предпоследнем столбце мы получаем двоичное представление отрицательных чисел. Все 16 двоичных последовательностей задействованы, диапазон представления от — 8 до 7 и представление 0 однозначно. Представление отрицательных чисел в том виде, который приведен в таблице, называется дополнительным кодом. Естественно, что представление положительных чисел в дополнительном коде совпадает с их обычным представлением. Сравните полученный результат с диапазоном значений величин целого типа из таблицы, приведенной в начале занятия.
Методические
рекомендации. Предложите
ученикам вручную выполнить аналогичные
действия при 5 и 6 разрядах, отводимых для
представления целых чисел.
Занятие 3. Команды редактора для работы с блоками, работа с окнами
План
занятия:
• знакомство с
командами редактора для работы с блоками;
• работа с
окнами в интегрированной среде;
• программа вычисления
степеней двойки;
• программа перевода
чисел из десятичной системы счисления в двоичную;
• выполнение
самостоятельной работы.
Знакомство с командами редактора для работы с блоками
Блок — выделенный
фрагмент текста программы. В каждый момент времени в тексте может быть отмечен
только один блок. Отмеченный блок выделяется на экране цветом символов и фона.
Для того чтобы что-то сделать с блоком, его необходимо выделить, т.е. отметить
начало и конец блока. После этого выполняются действия с блоком.
Приведем основные
команды редактора (пункт Edit главного меню) для работы с блоками:
<Ctrl>
+ <K><B> — отметить начало блока;
<Ctrl> + <K><K> — отметить конец блока;
<Ctrl> + <K><T> — отметить одно слово как
блок;
<Ctrl> + <K><C> — скопировать блок;
<Ctrl> + <K><Y> — удалить блок;
<Ctrl> +
<K><H> — убрать выделение блока;
<Ctrl> +
<K><V> — переместить блок;
<Ctrl> +
<K><R> — загрузить с диска ранее записанный блок, начиная с позиции курсора;
<Ctrl> + <K><W>— записать отмеченный блок
на диск.
Примечания.
1. Последовательность
выполнения команд:
•
устанавливаем курсор в требуемое место текста;
• нажимаем клавишу
<Ctrl>;
•
не отпуская клавишу <Ctrl>, нажимаем клавишу с буквой <K>;
•
отпустив клавишу с буквой <K>, не отпуская клавишу <Ctrl>, нажимаем
клавишу со второй буквой.
2. Знание команд работы
с блоками значительно ускоряет набор программ. Используйте их при работе.
Задания
1. Набор любого содержательного
текста. Например: "На счетах десятичное число кодируется положением
костяшек на спицах, а в арифмометре (механическом вычислителе) — положением
диска с 10 зубцами. С помощью связанных между собой дисков можно
построить суммирующее устройство.
Идея такого устройства
принадлежит Леонардо да Винчи (1452—1519). А впервые сделал его в 1642 году
французский философ и математик Блез Паскаль (1623—1662).
Выдающийся американский
математик Джон фон Нейман (1905—1957) при работе в составе группы
исследователей над машиной "ЭНИАК" сформулировал принципы, лежащие в
основе функционирования современных вычислительных машин. Суть этих принципов:
в памяти ЭВМ хранятся не только данные, но и обрабатывающая их программа;
представление в памяти данных и программы совпадает; программа должна
выполняться последовательно, команда за командой".
2. Выделение фрагментов текста как
блоков.
3. Копирование фрагментов текста
(выделяется блок, курсор устанавливается в требуемое место, выполняется команда
копирования).
4. Перемещение фрагментов текста
(выделяется блок, курсор устанавливается в требуемое место, выполняется команда
перемещения).
5. Запись фрагментов текста на диск и
чтение их с диска (выделяется блок, задается команда записи на диск, при этом
необходимо определить имя блока, курсор устанавливается в требуемое место,
выполняется команда чтения блока с диска).
Работа с окнами
В Турбо Паскале есть
возможность работы с несколькими окнами (пункт Window главного меню). Окно —
прямоугольная область экрана. Его размеры и положение на экране можно изменять.
В каждый момент времени активным является только одно окно, в нём находится
курсор.
Рассмотрим команды для
работы с окнами.
Tile — последовательное размещение окон;
Cascade — каскадное размещение окон;
Close All — закрытие всех окон.
Size / Move (<Ctrl> + <F5>) —
изменение размера, перемещение окна. При выполнении команды изменяется цвет
рамки окна.
Для изменения размера окна
используются комбинации клавиш <Shift> + <
>, < ¯ >, < ¬
>, < ® >. Для перемещения — <
>, < ¯ >, <
¬
>, < ® >. Для завершения изменения
параметров окна следует нажать клавишу
<Enter>. При этом цвет рамки окна изменяется на первоначальный.
Zoom
(<F5>) — распахнуть
активное окно на полный экран
;
Next
(<F6>) — переход к следующему окну
;
Previos
(<Shift> + <F6>) —
переход к предыдущему окну;
Close (<Alt>
+ <F3>) — закрытие активного окна;
List
— просмотр списка
открытых окон.
Задания
1. Загрузить все программы предыдущих занятий.
2. Выполнить перечисленные выше команды работы с окнами.
Экспериментальный раздел работы
1. Выполните обычные действия с программой МуЗ_1 (набор, компиляцию, запись на диск, запуск).
Program
МуЗ_1;
Uses
Crt;
Var
rО, r1, r2, rЗ, r4, r5, r6 : Integer;
Begin
ClrScr;
WriteLn
( ' Вычисляем
степени числа 2 ' );
r0:=1;
r1:=2; r2:=r1*r1; r3:=r2*r1;
r4:=r2*r2;
r5:=r3*r2; r6:=rЗ*rЗ;
WriteLn
( ' Нулевая
степень, 20 ', r0 ) ;
WriteLn
( ' Первая
степень, 21 '
, r1
);
WriteLn
( ' Вторая
степень, 22 ', r2 );
WriteLn
( ' Третья степень, 23 ', rЗ);
WriteLn
( ' Четвертая
степень, 24 ' , r4);
WriteLn
( ' Пятая
степень, 25 ' , r5);
WriteLn
( ' Шестая
степень, 26 ' , rб);
ReadLn
End.
Примечание. При наборе программы рекомендуется использовать изученные команды работы с блоками. Например, можно набрать оператор r2:=r1*r1, затем выделить его как блок, скопировать четыре раза и модифицировать. Аналогичные действия выполняются с операторами WriteLn.
Давайте
подсчитаем, какое количество операций
требуется для вычисления 5-й
степени двойки в нашей программе:
для вычисления rЗ требуются 2 операции, r2 —
одна операция
плюс заключительное умножение, итого — 4 операции. А можно ли
вычислить 25 за меньшее количество
операций? Оказывается, да, за 3 операции — r5:=r2*r2*r1.
Вычисление r2
требует одну операцию умножения и две
операции для вычисления результата.
Модифицируйте
программу так, чтобы она вычисляла степени двойки до 10-й включительно
за минимальное количество
операций.
2. Выполните обычные действия с программой МуЗ_2 (набор, компиляцию, запись на диск, запуск).
Примечание. При наборе программы рекомендуется использовать изученные команды работы с блоками и окнами.
Program МуЗ_2;
Uses Crt;
Var r0,r1,r2,rЗ,r4,r5,r6 :
Integer;
s0,s1,s2,s3,s4,s5,s6 : Integer;
a,b,rez :
Integer;
one,dec,hun : Integer;
Begin
ClrScr;{Очистка
экрана}
{Вычисление
степеней'двойки}
r0:=1;
r1:=2; r2:=r1*r1; r3:=r2*r1; r4:=r2*r2;
r5:=rЗ*r2;
r6:=rЗ*rЗ;
WriteLn
( ' Введите число, меньшее 128 и большее 64');
ReadLn
(а);
b:=a;
{Перевод числа в двоичную систему
счисления}
s0:=b Mod 2;
b:=b Div
2;
s1:=b
Mod 2;
b:=b
Div 2;
s3:=b
Mod 2;
b:=b
Div 2;
s4:=b
Mod 2;
b:=b
Div 2;
s5:=b
Mod 2;
b:=b
Div 2;
s6:=b
Mod 2;
b:=a;
{Выделение десятичных цифр в записи
числа}
one:=b Mod 10;
b:=b
Div 10;
dec:=b Mod 10;
b:=b Div 10;
hun:=b
Mod 10;
WriteLn ( ' Мы
правильно выделили десятичные цифры ' );
WriteLn ( ' Вывод числа
в десятичной системе счисления '
,hun*100+dec*10+one);
WriteLn (hun,dec,one);
WriteLn
( '
Это же число
в двоичной системе счисления
' );
WriteLn (s6,s5,s4,s3,s2,s1,s0);
WriteLn
( '
Переводим число из двоичной системы
счисления в
десятичную' );
rez:=s6*r6+s5*r5+s4*r4+s3*r3+s2*r2+s1*r1+s0*r0;
{Перевод}
WriteLn { ' Все сделано
правильно, числа совпадают ' ) ;
Writeln
(a,'
',
rez);
Readln
End.
Попробуйте задать в качестве исходных данных число, большее 128. Что у вас получилось? Модифицируйте программу так, чтобы и в этом случае она была работоспособна.
Задания для самостоятельной работы
1. Вычислять не очень большие степени двойки мы научились. Предположим, что у вас есть некая последовательная (элементы следуют один за другим, и они одинаковые по своим свойствам) структура для работы с данными. Она имеет имя, например А, и элементы из этой структуры выбираются по номеру (она последовательная). Так, запись А [10] говорит о том, что мы работаем с 10-м элементом нашей структуры. Предложить идею (нет-нет, не программу!), как, используя эту структуру, можно вычислять большие степени двойки за минимальное количество операций.
А
1 | |
2 | |
3 | |
... |
... |
"Структура
— взаиморасположение и связь составных
частей чего-либо". (Из словаря
иностранных слов.) Когда мы говорим о структуре,
то обязаны сказать о том, из каких элементов
она состоит и как они (элементы)
связаны между собой.
Следует также понимать, что структура обладает
новыми свойствами по отношению к свойствам элементов, ее составляющих.
Если структуре дать какое-то
имя, то мы получаем нечто новое. В Паскале структура
из однородных элементов, расположенных последовательно, называется
массивом
2.
Модифицируйте программу МуЗ_1 так, чтобы она
вычисляла степени тройки.
3.
Модифицируйте программу МуЗ_2 так, чтобы она
осуществляла перевод чисел из
определенного интервала в троичную систему
счисления и обратно.
4.
На предыдущем занятии в материале для
чтения мы рассмотрели представление
отрицательных чисел в дополнительном коде.
Пусть по-прежнему у нас имеется только 4
разряда для представления чисел.
Необходимо найти 7—3, или 7 + (—3). Складываем
в двоичной системе счисления 0111 + 1101 = 10100.
Первое двоичное число — это 7, второе
двоичное число — это —3 в дополнительном
коде. Результат пятиразрядный, у нас 4
разряда, отбрасываем старший разряд,
получаем 0100, а это двоичная запись числа 4.
Еще пример. Требуется найти 2—5, или 2 + (— 5). В
двоичной системе счисления 0010 + 1011 = 1101, а это
запись — 3 в дополнительном коде. Пусть вам
дано 6 разрядов для представления целых
чисел. Измените предыдущие операции так,
чтобы они выполнялись и для этого случая.
Разберите еще несколько аналогичных
примеров.
Таким образом, нет необходимости реализовывать операцию вычитания целых чисел! Достаточно уметь складывать числа, инвертировать двоичное представление числа и прибавлять единицу к младшему разряду. Но сложение можно реализовать путем последовательного прибавления единицы к младшему разряду. Что остается ? Инверсия и прибавление единицы к младшему разряду!
5.
Подсчитайте сумму пятеричных чисел в
интервале от 205 до 405, включая
границы интервала.
6.
Восстановите цифры двоичного числа, на
месте которых записан символ "*". 1**1 + 0011
= 1100. Придумайте и выполните еще несколько
примеров такого типа.
7.
Определите, является ли число 43015
четным? Найдите все четные числа в
интервале от 43005 до 43405.
8.
Составьте таблицы сложения и умножения в
четверичной и восьмеричной системах
счисления.
9.
Сравните числа в различных системах
счисления 3124 и 728. Изменится ли
результат, если вычесть из чисел
соответственно 124, и 128?
10.
Существует ли система
счисления с основанием х, в которой
выполняются следующие равенства: 3х +
4х = 7х , Зх • 4х=
=13x и 39x + 29х= 70х? Ответ
обоснуйте.
11.
Может ли в какой-нибудь системе счисления
с основанием х выполняться следующее
равенство: 600x= 211x + 252x + +53х?
Ответ обоснуйте.
Материал для чтения
Попытаемся ответить на вопрос: что такое
программа? Существуют различные научные
трактовки этого термина. Мы определим это
понятие иначе. Программа — это "откуда
взять, что сделать, куда положить, а если это
не так?". ( Венц А.Н. Профессия программист,
1999.) Правда, в книге Венца таким образом
определено понятие алгоритма, но, на наш
взгляд, оно более соответствует тому, что
понимается под словом "программа".
Оставим пока в стороне нюансы терминологии.
Вспомним разобранные программы и ответим
на вопросы. "Откуда взять?" — мы пока
вводим данные с клавиатуры компьютера. "Что
сделать?" — например, в нашей первой
программе один оператор присваивания. "Куда
положить?" — наши программы выводят
результаты на монитор.
И,
наконец, четвертый и, наверное, самый
главный вопрос — "а если это не так?".
Мы видим, что даже в первой программе
ответ не очевиден. Она работает не при всех
исходных данных. Если вы откомпилировали и
один или два раза запустили программу и
получили правильные результаты, то это еще
не значит, что у вас есть работающая
программа. Итак, сформулируем один из
основных принципов нашей с вами работы: "Все
подвергай сомнению, все проверяй сам, ни
одного факта не принимай на веру". Это
относится не только к программам, но и к
тому, о чем говорит учитель, к тому, что
пишут в книгах по информатике!
Сформулируем еще один принцип. Работа
по схеме воспроизведения, пусть даже
творческого, того, что написано в учебнике,
или того, что говорит учитель, не приводит к
успеху в информатике. Успех в освоении
предмета приходит лишь через
самостоятельную, кропотливую работу. А.Н.
Венц в своей книге приводит формулу
великого программиста (ВП), выведенную
экспериментальным путем:
ВП = 50%К + 30%Т +
10%О + 5%З + 5%ТЛ,
где
К — знать, как это делать, Т —
трудолюбие,
О — опыт, 3 — знание, ТЛ — талант.
На то, что относится к вундеркиндам,
приходится только 5%, остальное — труд,
ежедневный труд. А сейчас подвергните
сомнению эту формулу. Автор, например, не
очень понимает разницу между терминами "знать,
как..." и просто "знание".
Продолжим
уточнение термина "программа". Языков
программирования существует великое
множество, но на каком бы из них вы ни
работали, при создании программы
необходимо выполнить следующее:
•
ввести данные в программу (ввод);
•
определить представление этих данных в
памяти компьютера (данные, точнее,
структуры данных);
•
определить операции по обработке данных (операторы);
• выполнить вывод результатов
работы программы (вывод).
Организация операций в программе
может быть различна:
• некоторые из них выполняются только
при определенных условиях (условия);
•
часть из них выполняется несколько раз (циклы);
•
часть из них допускает разбивку на блоки
и выполняется в различных частях программы (подпрограммы).
Итак,
эти семь элементов — ввод, данные,
операторы, вывод, условия, циклы,
подпрограммы — являются основными при
создании небольших программ на любом языке
программирования. Однако следует заметить,
что рассмотренное уточнение понимания того,
что есть программа, относится примерно к 1975
году, да и то с некоторыми оговорками. Нет,
например, того, что понимается под термином
"технология программирования". Мы не
говорим (пока) о том, как из этих элементов
"склеивается", собирается программа (об
этом позднее). Абсолютно не затронут вопрос
о том, как программа должна реагировать на
события во внешней среде, и многое другое.
Таким образом, наша трактовка работы
программы сводится к некоему
последовательному процессу, а это не всегда
соответствует действительности. Однако
нельзя объять необъятное, программирование
— сложнейший раздел информатики,
сложнейшая отрасль производства, а учебник
посвящен "основам программирования". В
материалах для чтения мы сделаем обзор
технологий программирования, для того
чтобы составить общее представление о том,
какой "виток" спирали развития
технологий программирования изучается.
Продолжение следует