Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TurboPascal[1].doc
Скачиваний:
8
Добавлен:
02.05.2019
Размер:
1.38 Mб
Скачать

Задачи повышенной сложности

  1. Напечатать строку, образованную символами, расположенными в четырех углах символьного массива (в любом порядке).

  2. Составить программу, которая печатает слово, образованное несколькими идущими подряд символами с заданными номерами, расположенными в некоторой строке символьного массива.

  3. Д

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    *

    ан двумерный массив размером 5х5, заполненный буквами. Напечатать слово, образованное элементами массива, отмеченными звездочкой (*), при прочтении их:

а) слева направо в каждой строке, начиная с первой;

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

  1. Напечатать слова, образованные четными элементами каждой строки массива.

  2. В каждой строке двумерного символьного массива найти количество букв «Е», расположенных справа от буквы «Н»

  3. Проверить, одинаковые ли строки целочисленного массива с номерами N и М.

  4. Найти :

а) номер первой по порядку строки целочисленного массива, содержащей наибольшее число цифр;

б) номер первого по порядку столбца символьного массива, содержащего наибольшее число пробелов;

в) номер последней по порядку строки символьного массива, содержащей наибольшее количество букв «Ш» и «Щ».

  1. Шахматную доску представить в виде квадратного символьного массива размером 8 х 8. Заполнить массив таким образом, чтобы элементы массива, соответствующие черным полям, имели значение Х. Левое нижнее поле на шахматной доске всегда черное.

Символы и строки.

Помимо числовой информации компьютер может обрабатывать символьную информацию. Turbo Pascal оперирует информацией, которая может быть представлена отдельными символами или строками символов.

Символы.

Для хранения и обработки отдельных символов используются переменные типа. Значением переменной типа char может быть любой символ. Переменная символьного типа должна быть объявлена в разделе описания переменных так:

Имя:;

где имя – имя переменной символьного типа, char – ключевое слово обозначения символьного типа.

Примеры: otv: char;

ch: char;

Как и любая переменная программы, переменная типа char может получить свое значение в результате выполнения команды присвоения или ввода (read, readln). Если переменная типа char получает значение в результате выполнения операции присвоения, то справа от знака := должно стоять выражение типа char или символьная константа – символ, заключенный в двойные кавычки.

В результате выполнения программы:

var

c1, c2, otvet: char;

begin

c1:=’*‘;

c2:=c1;

write (‘Вы хотите научиться программировать?’);

readln (otvet);

writeln (c1, ‘Ваш ответ: ’, otvet, c2);

readln;

end.

переменная с1 получает значение присваиванием значения константы, с2 – присваиванием значения переменной с1, а значение переменной otvet вводится с клавиатуры.

Обратите внимание: переменная otvet объявлена как char, т.е. один символ. Поэтому если в ответ на вопрос программы будет введено, например слово «Да», то переменная otvet получит значение «Д».

Переменную типа char можно сравнивать с другой переменной типа char или с символьной константой. Сравнение основано на том, что каждому символу поставлено в соответствии число, причем символу ‘0’ соответствует число меньшее чем символу ‘9’, а символу ‘A’ – меньшее, чем ‘B’, символу ‘Z’ – меньшее чем ‘a’. Таким образом можно записать: ‘0’<’1’<…<’9’<…<’A’<’B’<…<’Z’<’a’<’b’<…<’z’.

Символам русского алфавита соответствуют числа большие, чем символы латинского алфавита.

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

Строки.

Последовательность символов называют строкой. Для хранения и обработки последовательностей символов (строк) можно использовать массив символов. Например, если программа должна вводить с клавиатуры фамилии людей. Эту задачу можно решить вводя строки в символьный массив, длина которого выбирается равной количеству букв самой длиной фамилии. Однако в этом случае на клавиатуре каждый раз приходится набирать строку длиной равной ровно столько символов сколько в самой длиной фамилии (дополняя короткие фамилии пробелами), что не очень удобно. Поэтому помимо массивов из символов есть такое понятие как строки, это переменные типа string, Значением переменной типа string может быть любая последовательность символов длиной не более 255.

Переменная типа string должна быть объявлена в разделе описания переменных так:

Имя: string;

или

Имя: string[длина];

где Имя – имя переменной; string – ключевое слово обозначения строкового типа; длина – константа типа integer, определяющая максимальную длину последовательности символов, которая может быть присвоена переменной.

Примеры: name: string [30]:

s: string;

Если при объявлении переменной длина не указывается, то предполагается что длина строки равняется 255 символам, т.е. объявления s: string; и s:string[255]; эквивалентны.

В тексте программы последовательность символов, являющаяся строкой, заключается в одинартные кавычки. Например, чтобы присвоить строковой переменной parol значение, нужно записать:

parol:=’большой секрет’;

или parol:=’2004’;

Утверждение parol:=2004; приведет к ошибке при компиляции, так как тип переменной не соответствует типу константы.

Переменную типа string можно сравнивать с другой переменной или константой типа string, используя операторы =, <, >, <=, >=, <>. Строки сравниваются посимвольно от первого символа. Если все символы сравниваемых строк одинаковые, то такие строки считаются равными. Если в одинаковых позициях строк находятся разные символы, большей считается та строка, у которой в этой позиции находится символ с большим кодом. Например: Иванов – 1 строка, Иванов – 2 строка, тогда они равны; васильев – 1 строка, Васильев – 2 строка, тогда 1 строка больше 2; Алексеев – 1 строка, петров – 2 строка, тогда 1 строка меньше 2; Иванова – 1 строка, Иванов – 2 строка , тогда 1 строка больше 2.

Кроме операций сравнения к строковым переменным и константам можно применить оператор сложения, в результате выполнения которого получается новая строка, полученная склеиванием двух или более строк. Например: name:=’Иван’;

fam:=’Иванов’;

fn:= fam +’ ‘+name;

переменная fn получит значение ’Иванов Иван’.

Задачи:

  1. Составить программу:

а) которая запрашивает имя человека и повторяет его на экране;

б) которая запрашивает имя человека и повторяет его на экране с приветствием;

в) которая запрашивает название футбольной команды и повторяет его на экране со словами: "Это чемпион!".

  1. Дано слово. Получить и вывести на экран буквосочетание, состоящее из его второго и четвертого символов.

  2. Дано слово. Получить и вывести на экран буквосочетание, состоящее из его третьего и последнего символов.

  3. Составить программу, которая запрашивает отдельно имя и отдельно фамилию, а затем выводит их как одну символьную строку.

  4. Дано слово. Вывести на экран его третий символ.

  5. Дано слово. Вывести на экран его последний символ.

  6. Дано слово. Вывести на экран его k-й символ.

  7. Дано слово. Определить, одинаковы ли второй и четвертый символы в нем.

  8. Дано слово. Верно ли, что оно начинается и оканчивается на одну и ту же букву?

  9. Даны два слова. Верно ли, что первое слово начинается на ту же букву, которой оканчивается второе слово?

Turbo Pascal предоставляет несколько полезных при работе со строками функций и процедур.

Функция length.

Функция length возвращает длину строки. У функции один параметр – переменная строкового типа. Возвращаемое значение функции (целое число) – количество символов, из которых состоит строка, без учета начальных и завершающих пробелов. Например length(’Иванов’) равно 6, а значение length(’ Невский проспект ’) равно 16, так как при вычислении длины строки функция не учитывает начальные и завершающие пробелы.

Примеры определения длины строки

  • k:=length(‘мир’); k=3

  • s:=‘Кот и пес’;

n:= length(s); n=9

  • s1=‘’;

i:= length(s1); i=0

‘’ - пустая строка!

Задачи:

  1. Дано название футбольного клуба. Определить количество символов в нем.

  2. Дано название города. Определить четно или нет количество символов в нем.

  3. Даны две фамилии. Определить какая из них длиннее.

Функция copy.

Функция copy позволяет выделить фрагмент строки. В общем виде обращение к функции copy  выглядит так: (строка, p, n);

где строка – переменная строкового типа, содержащая строку, фрагмент которой надо получить; p – номер первого символа в строке строка, с которого начинается выделяемая подстрока; n – длина выделяемой подстроки. Например, в результате выполнения команд:

s:= ‘Инженер Иванов’;

fam:= copy (s, 9, 6);

значением переменной fam будет строка ‘Иванов’.

Примеры выделения символов

  • s:=‘информатика’;

s1:=copy (s, 3, 5); s1=‘форма’

s2:=copy (s, 8, 2)+ copy (s, 3, 1); s2=‘тиф’

Задачи:

  1. Дано слово. Получить его часть, образованную второй, третьей и четвертыми буквами.

  2. Дано слово, состоящее из четного числа букв. Вывести на экран его первую половину, не используя оператор цикла.

  3. Дано слово. Получить его часть, образованную идущими подряд буквами, начиная с m-й и кончая n-й.

  4. Из слова "яблоко" путем вырезок его букв получить слова "блок" и "око".

  5. Из слова "информатика" путем вырезок его букв получить слова "форма" и "тик".

Процедура insert.

Процедура insert позволяет добавить часть строки в исходную строку. В общем виде обращение к процедуре выглядит так: Insert ( подстрока, строка, p);

где подстрока – строковая константа или переменная, которую необходимо добавить в строковую переменную строка; p – номер первого символа в строке строка, с которого начинается добавление подстроки.

Примеры вставки символов

  • s:=‘мама’;

insert (‘очк’, s, 4); s=‘мамочка’

  • s1:=‘рог’;

s2:=‘по’;

insert (s1, s2, 3); s2=‘порог’

Задачи:

  1. Дано слово. Вставить букву "т" после k-й буквы.

  2. Дано слово. Вставить заданную букву после первой буквы "и".

  3. Дано слово. Переставить его первую букву на место последней. При этом вторую, третью, ..., последнюю буквы сдвинуть влево на одну позицию.

Процедура delete.

Процедура delete позволяет удалить часть строки. В общем виде обращение к процедуре выглядит так: delete (Строка, p, n);

где строка – переменная строкового типа; p – номер символа, с которого начинается удаляемая подстрока; n – длина удаляемой подстроки.

Например, в результате выполнения команд:

s:= ‘Город Санкт-Петербург’;

delete (s, 7, 6);

значение переменной s будет строка ‘Город Петербург’.

Примеры удаления символов

  • s:=‘котик’;

delete (s, 4, 2); s=‘кот’

  • s:=‘информатика’;

delete (s, 1, 2);

delete (s, 6, 4); s=‘форма’

Задачи:

  1. Дано слово:

а) удалить из него третью букву; б) удалить из него k-ю букву.

  1. Дано слово:

а) Удалить из него первую из букв "о", если такая буква есть.

б) Удалить из него последнюю из букв "т", если такая буква есть.

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

  2. Дано предложение. Удалить из него все символы с n1-го по n2-й (n1n2).

  3. Дано предложение. Удалить из него все буквы "с".

  4. Дано слово. Удалить из него все повторяющиеся буквы, оставив их первые вхождения, то есть в слове должны остаться только различные буквы.

  5. Дано предложение. Удалить из него все буквы "о", стоящие на нечетных местах.

Функция pos.

Функция pos позволяет определить положение подстроки в строке. В общем виде обращение к функции выглядит так: pos (Подстрока, строка);

где Подстрока – строковая константа или переменная, которую надо найти в строковой константе или переменной строка.

Например, в результате выполнения команды: p:= pos (‘Пе’, ‘Санкт-Петербург’); значение переменной p будет равно 7. Если в строке нет искомой подстроки, то функция возвращает ноль.

Примеры определения позиции

  • k:=pos(‘р’, ’мир’); k=3

  • s:=‘колокол’;

n:=pos(‘кол’, s); n=1

  • s1:=‘ок’; s2:=‘кок’;

i:=pos(s1, s2); i=2

  • k:=pos(‘п’, ’мама’); k=0

Например

var

st: string;

begin

write (‘Введите строку: ’);

readln (st);

while (pos (‘ ‘, st)=1) and (length (st)>0) do

delete (st, 1, 1);

write (‘Строка без начальных пробелов: ’, st);

end.

Данная программа использует функцию pos и процедуру delete для удаления пробелов в начале введенной с клавиатуры строки. пробелы удаляются в цикле while до тех пор, пока функция pos обнаруживает пробел в начале строки (значение pos при этом равно единице). Проверка условия length (st)>0 нужна, так как возможно, что введенная с клавиатуры строка состоит вся из пробелов.

Задачи:

  1. Дано предложение, в котором имеется несколько букв "е". Найти:

а) порядковый номер первой из них;

б) порядковый номер последней из них.

  1. Дано предложение. Определить, есть ли в нем буква "а". В случае положительного ответа найти также порядковый номер первой из них.

  2. Дано предложение. Определить количество букв "н", предшествующих первой запятой предложения.

  3. Дано предложение. Напечатать все символы, расположенные между первой и второй запятой. Если второй запятой нет, то должны быть напечатаны все символы, расположенные после единственной имеющейся запятой.

  4. Дано предложение, в котором имеются одна буква "с" и одна буква "т". Определить, какая из них встречается раньше (при просмотре слова слева направо).

Процедура val.

процедура val позволяет преобразовать изображение числа в число. В общем виде обращение к процедуре выглядит так: val (Строка, число, код).

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

Процедура val полезна при организации ввода с клавиатуры. Например, если в программе описана переменная month типа integer и ее значение вводится с клавиатуры, то в результате возможной ошибки оператора, задавшего месяц строкой символов, например 'июнь', а не цифрой, программа завершается ошибкой времени выполнения. Однако если числовые данные вводить как строку, а затем преобразовывать в число с помощью процедуры val, то можно избежать подобного неприятного завершения программы. Ниже приведен пример такой программы.

var

month: integer;

st: string[10];

code: integer;

begin

repeat

write (‘Месяц->’);

readln (st);

val (st, month, code);

if code<>0 then

writeln (‘Ошибка! Месяц следует задать цифрой.’);

until code=0;

end.

Задачи:

  1. Дан текст. Напечатать все имеющиеся в нем цифры.

  2. Дан текст. Определить количество цифр в нем.

  3. Дан текст, в котором имеются цифры.

а) Найти их сумму.

б) Найти максимальную цифру.

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

Процедура str.

Процедура str позволяет преобразовать число в его изображение, т.е. в строку. В общем виде обращение к процедуре выглядит так: str (выражение, строка).

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

Задачи общие:

  1. Дано предложение. Определить число букв "о" в нем.

  2. Дано предложение. Определить число пробелов в нем.

  3. Дано предложение. Определить число вхождений в него некоторого символа.

  4. Дано предложение. Определить долю (в %) букв "а" в нем.

  5. Дан текст. Сколько раз в нем встречается символ "+" и сколько раз символ "*".

  6. Дано предложение. Определить сколько в нем одинаковых соседних букв.

  7. Дано предложение. Определить число вхождений в него буквосочетания "ро".

  8. Дано предложение. В нем слова разделены одним пробелом (начальные и конечные пробелы в предложении отсутствуют). Определить количество слов в предложении.

  9. Дано предложение. В нем слова разделены одним или несколькими пробелами. Определить количество слов в предложении.

  10. Дан текст. Подсчитать общее число вхождений в него символов "+" и "-".

  11. Дано предложение. Определить, сколько в нем гласных букв.

  12. Дано предложение. Все буквы "е" в нем заменить на букву "и".

  13. Дано предложение. Все его символы, стоящие на четных местах заменить на букву "ы".

  14. Дано предложение. Заменить в нем все вхождения буквосочетания "ах" на "ух".

  15. Дано предложение. Заменить в нем все вхождения буквосочетания "бит" на "рог".

  16. Дана последовательность слов. Проверить, правильно ли в ней записаны сочетания "жи" и "ши".

  17. Дана последовательность слов. Проверить, правильно ли в ней записаны сочетания "ча" и "ща". Исправить ошибки.

  18. Дано слово. Определить, сколько различных букв в нем.

  19. Даны два слова. Определить, можно ли из букв первого из них получить второе. Рассмотреть два варианта:

1) повторяющиеся буквы второго слова могут в первом слове не повторяться;

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

  1. Даны три слова. Напечатать только те буквы слов, которые есть только в одном из слов. Рассмотреть два варианта:

1) повторяющиеся буквы каждого слова рассматриваются;

2) повторяющиеся буквы каждого слова не рассматриваются.

  1. Даны три слова. Напечатать их общие буквы. Повторяющиеся буквы каждого слова не рассматривать.

  2. Даны три слова. Напечатать неповторяющиеся в них буквы.

Массивы из строк.

Работа с массивом из строк аналогична работе с целочисленными массивами. При объявлении массива тип элементов в нем должен быть типа string.

Задачи:

  1. В массиве из строк определить количество строк начинающихся на букву «А» и ввести их на экран.

  2. В массиве найти строки, длина которых равна заданному числу, либо сообщить о их отсутствии.

  3. В массиве найти строки, начинающиеся гласной русской буквой.

  4. Отсортировать массив из строк по убыванию их длин.

  5. Отсортировать массив из строк по алфавиту.

  6. Дано предложение из 10 слов. Заполнить ими массив из 10 элементов.

  7. Дано предложение. Напечатать его в обратном порядке слов, например, предложение "мама мыла раму" должно быть напечатано в виде "раму мыла мама".

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

  9. Даны несколько строк текста, в которых нет начальных и конечных пробелов. Необходимо изменить эти строки так, чтобы их длины были одинаковыми. Это следует сделать путем вставки между словами дополнительных пробелов. Количество пробелов между отдельными словами внутри отдельной строки должно отличаться не более чем на 1.

Зачет по строкам.

Системы счисления.

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

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

Примером непозиционной системы счисления может служить римская. В ней были определены следующие обозначения чисел: I – 1, V – 5, X – 10, L – 50, C – 100, D – 500, M – 1000.

Тогда число 378 в римской нумерологии будет выглядеть так: CCCLXXVII.

Славянская система счисления тоже являлась непозиционной, в ней использовались буквы алфавита, над которыми ставился специальный значок ~ - называемый титло.

Запись чисел в этих системах очень громоздко и не удобно, так как требует использования большого числа знаков, требуемых для записи какого - либо числа. Чтобы несколько уменьшить количество используемых знаков для записи чисел, в римской системе было введено следующее правило: Если поместить букву обозначающую меньшее число, слева от буквы обозначающей большее, то меньшее следует из большего вычитать. IV – 4, IX – 9, XL – 40, XC – 90.

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

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

CCCLIX+CLXXIV=DXXXIII. Еще труднее производить умножение. Поэтому должно быть понятно, почему были вытеснены такие системы счисления из обихода позиционными. Хотя надо отметить, что именно римская система используется до сих пор, только в тех случаях, где нет необходимости производить с числами какие – либо действия. Например, при обозначении столетий, глав в книгах, часов на циферблатах.

Общепринятой позиционной системой счисления является десятичная, берущая свое начало от счета на пальцах. Она была изобретена в Индии, затем заимствована там арабами и уже через арабские страны пришла в Европу. Значение каждой цифры в позиционной системе счисления определяется не только ею самой, но так же и местом (позицией), которое она занимает в записи числа. Для позиционной системы счисления так же характерно то, что число разбивается на разряды, которые считаются справа налево и каждая цифра в записи числа означает определенное количество единиц именно того разряда в котором эта цифра стоит (568 – 5 сотен, 6 десятков, 8 единиц). Единица каждого следующего разряда всегда в определенное количество раз превосходить единицу предыдущего. Это отношение называют основанием системы счисления.

Числа, которыми мы привыкли пользоваться называются десятичными и арифметика, которой мы пользуемся, также называется десятичной. Это потому, что каждое число можно составить из набора цифр содержащего 10 символов - цифр - "0123456789". Но десятичная арифметика не единственная. Если мы возьмём только пять цифр, то на их основе можно построить пятеричную арифметику, из семи цифр - семеричную. В областях знаний связанных с компьютерной техникой часто используют арифметику, в которой числа составляются из шестнадцати цифр, соответственно эта арифметика называется шестнадцатеричной. Чтобы понять, что такое число в не десятичной арифметике сначала выясним, что такое число в десятичной арифметике.

Возьмём, к примеру, число 246. Эта запись означает, что в числе две сотни, четыре десятка и шесть единиц. Следовательно, можно записать следующее равенство:

246 = 200 + 40 + 6 = 2 * 102 + 4 * 101 + 6 * 100

Здесь знаками равенства отделены три способа записи одного и того же числа. Наиболее интересна нам сейчас третья форма записи: 2 * 102 + 4 * 101 + 6 * 100 . Она устроена следующим образом:

В нашем числе три цифры. Старшая цифра "2" имеет номер 3. Так вот она умножается на 10 во второй степени. Следующая цифра "4" имеет порядковый номер 2 и умножается на 10 в первой. Уже видно, что цифры умножаются на десять в степени на единицу меньше порядкового номера цифры. Уяснив сказанное, мы можем записать общую формулу представления десятичного числа. Пусть дано число, в котором N цифр. Будем обозначать i-ю цифру через ai. Тогда число можно записать в следующем виде: anan-1….a2a1. Это первая форма, а третья форма записи будет выглядеть так:

anan-1….a2a1 = an * 10n-1 + an-1 * 10n-2 + …. + a2 * 101 + a1 * 100

где ai это символ из набора "0123456789"

В этой записи очень хорошо видна роль десятки. Десятка является основой образования числа. И кстати она так и называется "основание системы счисления", а сама система счисления, поэтому так и называется "десятичной". Конечно, никакими особыми свойствами число десять не обладает. Мы вполне можем заменить десять на любое другое число. Например, число в пятеричной системе счисления можно записать так:

anan-1….a2a1 = an * 5n-1 + an-1 * 5n-2 + …. + a2 * 51 + a1 * 50

где ai это символ из набора "012345"

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

anan-1….a2a1 = an * 2n-1 + an-1 * 2n-2 + …. + a2 * 21 + a1 * 20

где ai это символ из набора "01"

Эта система самая простая из всех возможных, так как в ней любое число образуется только из двух цифр 0 и 1. Понятно, что проще уже некуда. Примеры двоичных чисел: 10, 111, 101.

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

Двоичное в десятичное. Это очень просто. Метод такого перевода даёт наш способ записи чисел. Возьмём, к примеру, следующее двоичное число 1011. Разложим его по степеням двойки. Получим следующее:

1001 = 1 * 23 + 0 * 22 + 0 * 21 + 1 * 20

Выполним все записанные действия и получим:

1 * 23 + 0 * 22 + 0 * 21 + 1 * 20 = 8 + 0+ 0 + 1 = 9. Таким образом, получаем, что 1011(двоичное) = 9 (десятичное). Сразу видно и небольшое неудобство двоичной системы. То же самое число, которое, в десятичной системе записано одним знаком в двоичной системе, для своей записи требует четыре знака. Но это плата за простоту (бесплатно ничего не бывает). Но выигрыш двоичная система даёт огромный в арифметических действиях. И далее мы это увидим.

В свое время в Древнем Вавилоне использовалась шестидесятеричная система счисления, ее отголоски находят у нас применение в переводе часов в минуты, минут в градусы и т.д.

При использовании системы счисления выше десятичной в обиход идут буквы, то есть, например, для шестнадцатеричной системы счисления будут использованы следующие цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f.

Представьте в виде десятичного числа следующие числа.

а) 1101000112 (419); б) 34106(798); с) d7e816(55272); в) 522456(7013); г) 17688(1012); д) 10100039270); е) 2a01b12(58775).

Самостоятельная работа на перевод чисел в десятичную систему счисления.

Для того, чтобы преобразовать десятичное число в двоичное, его нужно разложить по степеням двойки. Но если разложение по степеням десятки получается сразу, то, как разложить по степеням двойки надо немного подумать. Для начала рассмотрим, как это сделать методом подбора. Возьмём десятичное число 12.

Шаг первый. 22 = 4, этого мало. Также мало и 23 = 8, а 24=16 это уже много. Поэтому оставим 23 =8. 12 - 8 = 4. Теперь нужно представить в виде степени двойки 4.

Шаг второй. 4 = 22.

Тогда наше число 12 = 23 + 22. Старшая цифра имеет номер 4, старшая степень = 3, следовательно, должны быть слагаемые со степенями двойки 1 и 0. Но они нам не нужны, поэтому чтобы избавится от ненужных степеней, и оставить нужные запишем число так: 1*23 + 1*22 +0*21 + 0*20 = 1100 - это и есть двоичное представление числа 12. Нетрудно заметить, что каждая очередная степень - это наибольшая степень двойки, которая меньше разлагаемого числа.

Для перевода целого десятичного числа  N  в систему счисления с основанием  q  необходимо  N  разделить с остатком ("нацело") на  q , записанное в той же десятичной системе. Затем неполное частное, полученное от такого деления, нужно снова разделить с остатком на  q , и т.д., пока последнее полученное неполное частное не станет равным нулю. Представлением числа N  в новой системе счисления будет последовательность остатков деления, изображенных одной q-ичной цифрой и записанных в порядке, обратном порядку их получения.

Пример: Переведем число 75 из десятичной системы в двоичную, восьмеричную и шестнадцатеричную:

Ответ: 7510 = 1 001 0112   =  1138  =  4B16.

Преобразуйте десятичные числа в двоичные:

а) 14 б) 29 в) 134 г) 158 е) 1190 ж) 2019

Самостоятельная работа на перевод чисел из десятичной системы счисления.

Арифметические действия в системах счисления.

Рассмотрим основные арифметические операции: сложение, вычитание, умножение и деление. Правила выполнения этих операций в десятичной системе хорошо известны — это сложение, вычитание, умножение столбиком   и  деление углом. Эти правила применимы и ко всем другим позиционным системам счисления. Только таблицами сложения и умножения надо пользоваться особыми для каждой системы.

Сложение

Таблицы сложения легко составить, используя Правило Счета.  

Сложение в двоичной системе

Сложение в восьмеричной системе

                 Сложение в шестнадцатиричной системе

При сложении цифры суммируются по разрядам, и если при этом возникает избыток, то он переносится влево.   Пример. Сложим числа 15 и 6 в различных системах счисления.

Шестнадцатеричная: F16+616

Ответ: 15+6 = 2110 = 101012 = 258 = 1516Проверка. Преобразуем полученные суммы к десятичному виду: 101012 = 24 + 22 + 20 = 16+4+1=21,  258 = 2 . 81 + 5 . 80 = 16 + 5 = 21,  1516 = 1 . 161 + 5 . 160 = 16+5 = 21. 

Умножение

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

Умножение в двоичной системе

Умножение в восьмеричной системе

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

Ответ: 5 . 6 = 3010 = 111102 = 368. Проверка. Преобразуем полученные произведения к десятичному виду: 111102 = 24 + 23 + 22 + 21 = 30; 368 = 3

81 + 6

80 = 30.     Пример. Перемножим числа 115 и 51.

Ответ: 115 . 51 = 586510 = 10110111010012 = 133518. Проверка. Преобразуем полученные произведения к десятичному виду: 10110111010012 = 212 + 210 + 29 + 27 + 26 + 25 + 23 + 20 = 5865; 133518 = 1 . 84 + 3 . 83 + 3 . 82 + 5 . 81 + 1 . 80 = 5865.

Самостоятельная работа на сложение и умножение чисел в различных системах счисления.

Вычитание

Пример. Вычтем единицу из чисел 102, 108 и 1016                 Пример. Вычтем единицу из чисел 1002, 1008 и 10016.            

Деление

Деление в любой позиционной системе счисления производится по тем же правилам, как и деление углом в десятичной системе. В двоичной системе деление выполняется особенно просто, ведь очередная цифра частного может быть только нулем или единицей.     Пример. Разделим число 30 на число 6.

Ответ: 30 : 6 = 510 = 1012 = 58.     Пример. Разделим число 5865 на число 115.

Восьмеричная: 133518 :1638

Ответ: 5865 : 115 = 5110 = 1100112 = 638. Проверка. Преобразуем полученные частные к десятичному виду: 1100112 = 25 + 24 + 21 + 20 = 51; 638 = 6 . 81 + 3 . 80 = 51.     Пример. Разделим число 35 на число 14.

Восьмеричная: 438 : 168

Ответ: 35 : 14 = 2,510 = 10,12 = 2,48. Проверка. Преобразуем полученные частные к десятичному виду: 10,12 = 21 + 2 -1 = 2,5; 2,48 = 2 . 80 + 4 . 8-1 = 2,5.

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

Двоичная система, удобная для компьютеров (потому, что она имеет ряд преимуществ перед другими системами: для ее реализации нужны технические устройства с двумя устойчивыми состояниями (есть ток — нет тока, намагничен — не намагничен и т.п.), а не, например, с десятью, — как в десятичной; представление информации посредством только двух состояний надежно и помехоустойчиво; возможно применение аппарата булевой алгебры для выполнения логических преобразований информации; двоичная арифметика намного проще десятичной. Недостаток двоичной системы — быстрый рост числа разрядов, необходимых для записи чисел), для человека неудобна из-за ее громоздкости и непривычной записи.

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

Числа в этих системах читаются почти так же легко, как десятичные, требуют соответственно в три (восьмеричная) и в четыре (шестнадцатеричная) раза меньше разрядов, чем в двоичной системе (ведь числа 8 и 16 — соответственно, третья и четвертая степени числа 2).

Перевод восьмеричных и шестнадцатеричных чисел в двоичную систему очень прост: достаточно каждую цифру заменить эквивалентной ей двоичной триадой (тройкой цифр) или тетрадой (четверкой цифр).

Например:

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

С

Сводная таблица переводов целых чисел из одной системы счисления в другую.

Рассмотрим только те системы счисления, которые применяются в компьютерах — десятичную, двоичную, восьмеричную и шестнадцатеричную. Для определенности возьмем произвольное десятичное число, например 46, и для него выполним все возможные последовательные переводы из одной системы счисления в другую. Порядок переводов определим в соответствии с рисунком:

На этом рисунке использованы следующие обозначения:

  • в кружках записаны основания систем счисления;

  • стрелки указывают направление перевода;

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

Например:  означает перевод из двоичной системы в шестнадцатеричную, имеющий в таблице порядковый номер 6.

Контрольная работа по системам счисления.

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

Графический режим работы.

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

В графическом режиме экран разделяется прямоугольной сеткой, каждый элемент которой имеет свои координаты. Левый верхний угол экрана имеет координаты (0;0). Значение левой координаты (Х) увеличивается в горизонтальном направлении слева направо. Значение правой координаты (У) увеличивается в вертикальном направлении сверху вниз.

Графическому режиму как и текстовому, присуще понятие текущего указателя. Текущий указатель в любой момент времени может находится в любой точке экрана с координатами (х;у). Его местонахождение отображается курсором, но в графическом режиме курсор не виден.

Инициализация (включение) графического режима

InitGraph (gd, gm, p);

где gd – переменная типа integer, которая указывает на используемый тип графического драйвера; gm – переменная типа integer устанавливающая разрешение экрана; p – строковая константа, указывающая путь к драйверу.

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

В нашем случае gd=9 всегда.

Что касается разрешения то возможны такие варианты значений которые принимает переменная gm:

gm=0 - низкое (640x200)

gm=1 - среднее (640x350)

gm=2 - высокое (640x480)

Ну а путь к драйверу на наших машинах выглядит следующим образом: ‘c:\trans\bp\bgi’

Выключение графического режима

CIoseGraph;

Изображение точек

PutPixel (x, y, c);

где х и у – координаты точки, а с – это цвет которым будет изображена точка (номера цветов аналогичны номерам цветам в модуле crt).

Пример: Нарисовать точку зеленого цвета в центре экрана

Program Primer;

Uses Graph;

Var Gd, Gm : Integer;

Begin

Gd:=9; Gm:=2;

InitGraph(Gd,Gm,’c:\trans\bp\bgi’);

PutPixel(320,240,2);

Readln;

CloseGraph;

End.

Задание:

  1. Изобразить точку в центре экрана при низком разрешении экрана.

  2. Изобразить на экране звездное небо.

  3. Изобразить на экране разноцветное звездное небо.

  4. Изобразить звездное небо на четверти экрана.

  5. Изобразить звездное небо в центре экрана.

Изображение линий.

Цвет линии

SetColor (c);

где с – цвет которым будет изображена линия или текст.

Стиль линии

SetLineStyle (s, p, t);

где s – стиль лини; p – шаблон линии; t – толщина линии.

П еременная s может принимать следующие значения:

0

1

2

3

4 Определяется шаблоном

Переменная t принимает следующие значения:

1 - Тонкая

3 - Толстая

Переменная p может иметь любое значение если стиль линии не шаблон (т.е. если s<>4).

Отрезок прямой линии

Line (x1,y1, x2,y2);

где x1,y1- начальные координаты прямой линии; x2,y2 – координаты конца линии.

Отрезок до точки

LineTo (x,y);

где линия рисуется от точки в который находится указатель в данный момент; х, у – координаты указателя после выполнения команды, т.е. линия рисуется до точки с координатами х, у.

Данную команду удобно использовать при рисовании ломанных линий.

Перемещение текущего указателя в точку с координатами (x,y)

MoveTo (x,y);

Отрезок (вектор)

LineRel (dx, dy);

где линия рисуется от точки в который находится указатель в данный момент; а конечные координаты отрезка формируются следующим образом: к текущим координатам х и у прибавляются соответственно dx и dy.

Задания:

  1. Построить желтый треугольник, вершинами которого являются следующие точки (200;100), (300;100), (250; 10).

  2. Нарисовать домик.

  3. Нарисовать лесенку, если с клавиатуры задаются следующие параметры: а – ширина ступеньки, b – высота ступеньки, с – количество ступенек.

  4. Нарисовать лесенку если помимо вышеуказанных параметров задается еще начало и направление лесенки.

Самостоятельная работа: Нарисовать куб. (Оценивается на «5» - если нижняя левая вершина куба, а также длина его ребра задается с клавиатуры, на «4» - если изобразили отталкиваясь от исходных данных: вершина имеет координаты (100; 400), длина ребра 200).

Контур прямоугольника

Rectangle(x1,y1,x2,y2);

x1,y1,x2,y2 – координаты противоположных не смежных вершин прямоугольника.

Окружность

Circle (x, y, r);

где x, y – координата центра окружности, а r – радиус окружности.

Дуга окружности

Arc (x,y,nu,ku,r);

где x,y – координаты центра окружности, r – радиус окружности, nu – начальный угол с которого начинается рисование дуги, ku – конечный угол, переменные nu,ku – измеряются в градусах.

Дуга эллипса

Ellipse(x,y,nu,ku,rx,ry);

где x,y – координаты центра эллипса, rx,ry – радиусы эллипса соответственно по оси х и по оси у, nu – начальный угол с которого начинается рисование дуги, ku – конечный угол, переменные nu,ku – измеряются в градусах.

Например для того чтобы нарисовать полный эллипс необходимо выполнить такую команду: Ellipse(x,y,0,360,rx,ry);

Задание: Изобразить на экране какую–нибудь смешную рожицу.

Закрашенные фигуры

Стиль заполнения фигуры

SetFillStyle (s, c);

где s – стиль заполнения фигуры, c – номер активного цвета.

Виды стилей заполнения:

0 - сплошная закраска фоновым цветом

1 - сплошная закраска активным цветом

9 - закраска пикселей в шахматном порядке

12 - пользовательский стиль

2 3 4 5 6 7 8 10 11

Закрашенный прямоугольник

Bar (x1,y1, x2,y2);

x1,y1,x2,y2 – координаты противоположных не смежных вершин прямоугольника.

Параллелепипед

Bar3d(x1,y1,x2,y2,d,t);

x1,y1,x2,y2 – координаты противоположных не смежных вершин передней грани параллелепипеда, d – ширина боковой грани, t - Верхняя грань(True (TopOn) – есть, False (TopOff) – нет).

Закрашенный эллипс

FillEllipse (x,y,Rx,Ry);

где x,y – координаты центра эллипса, Rx,Ry – радиусы эллипса соответственно по оси х и по оси у.

Закрашенный сектор круга

PieSlice (x,y,nu,ku,r);

где x,y – координаты центра круга, r – радиус круга, nu – начальный угол с которого начинается рисование сектора круга, ku – конечный угол, переменные nu,ku – измеряются в градусах.

Закрашенный сектор эллипса

Sector(x,y,nu,ku,rx,ry);

где x,y – координаты центра эллипса, rx,ry – радиусы эллипса соответственно по оси х и по оси у, nu – начальный угол с которого начинается рисование сектора эллипса, ku – конечный угол, переменные nu,ku – измеряются в градусах.

Закраска произвольной фигуры

FloodFill (x,y, b);

где x,y - координаты внутренней точки; b – номер цвета границы.

Задание на оценку: Разукрасить нарисованную ранее рожицу.

Вывод текста в графике

Стиль текста

SetTextStyle(s, d, r)

где s – стиль текста, d – направление, r – размер.

стиль: 0 – побитовый направление: 0 - горизонтально (®) размер: 1..10

1 – тройной 1 - вертикально (­)

2 – малый

3 – гротесковый

4 – готический

Вывод текста

OutTextXY(x, y,s)

где, x, y – координаты, s – текст (тип - string).

Выравнивание текста

SetTextJustify(h, v)

где h - выравнивание по горизонтали, v - выравнивание по вертикали.

Выравнивание текста относительно точки привязки

Преобразование чисел в текст

Str ( x, s )

где x – исходное число, s - строка (текст) - тип - string

Ширина строки - Функция

TextWidth (S)

где S – строка (ширина в пикселях)

Высота строки - Функция

TextHeight(S)

где S – строка (высота в пикселях)

Задание:

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

  2. Нарисовать шахматную доску, если координаты верхнего левого угла и сторона квадрата задаются с клавиатуры.

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

Задачи:

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

  2. Нарисовать наклонную шахматную доску.

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

Зачет по текстовому режиму.

Задачи:

  • Написать программу, которая сообщает пользователю: «Я умею рисовать отрезок». Запрашивает: «Введите координаты начала и конца отрезка» и рисует отрезок с соответствующими координатами.

  • Построить рисунок лодочки.

  • Написать программу, которая рисует концентрические окружности.

  • Нарисуйте радугу, т.е. разноцветные дуги концентрических окружностей опирающихся на нижнюю границу экрана.

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

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

  • В верхнем левом углу экрана нарисовать солнышко.

  • Написать программу, которая рисует произвольную ломанную линию.

  • Написать программу, рисующую произвольный бегущий отрезок.

  • Написать программу, которая рисует эллипсы.

  • Составить программу построения квадрата. На одном из его оснований построить равносторонний треугольник со сторонами произвольной длины.

  • Построить ромб со стороной А и острым углом х.

  • Изобразите на экране движение точки по окружности.

  • «Нарисуйте» часы и «заставьте их «ходить».

  • Составить программу построения отрезка штриховой прямой линии, ограниченного точками с координатами А(X,Y) B(X,Y). Размеры штриха и интервала между штрихами возьмите равными. Исходные данные: значения координат точек и размер штриха введите с клавиатуры.

  • Изобразите на экране таяние горящей свечи.

  • Составить программу рисования спирали.

  • Составить программу вычерчивания графиков следующих функций:

а) y=sinx б) y=tgx в) y=cosx г) y=ax+b д) y=ex е) y=logx

  • Нарисуйте горизонтальные(вертикальные) линии длиной L располагая их по всей плоскости экрана на расстоянии d.

  • Расчертите на клеточки со стороной a весь экран.

  • в )

    б)

    Нарисуйте :

а )

д )

г )

е )

ж )

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