Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Понятия динамических переменных
Все переменные, действующие в программе, должны быть перечислены в разделе описаний, причём каждая переменная должна иметь имя (идентификатор). При запуске программы транслятор, анализируя блок var раздела описаний, формирует специальные таблицы, в которые заносит данные о том, сколько памяти должно быть выделено каждой переменной, и реально выделяет соответствующее место в памяти, которое называют сегментом (областью) данных. При наличии в программе процедур и функций транслятор для входящих в них переменных заранее выделяет некоторый другой объём памяти, называемый стеком. Память, выделенная переменным при активизации раздела описаний программы, сохраняется за ними на всё время работы программы. Поэтому такие переменные называют статическими. Все объявленные переменные размещаются в одной непрерывной области оперативной памяти (сегменте данных). Динамической памятью называют оперативную память ЭВМ, предоставляемую программе при её работе, за вычетом сегмента данных (обычно 64 кбайт), стека (обычно 19 кбайт) и объёма, занимаемого самой программой. Динамически распределяемую область оперативной памяти называют кучей (heap). Соответственно переменные, созданием и уничтожением которых может явно управлять программист, называют динамическими. Динамические переменные, количество и место расположения которых в памяти заранее неизвестно, невозможно обозначить идентификаторами. Поэтому единственным средством доступа к динамическим переменным являются указатели и ссылки на место их текущего расположения в памяти. Разница между статическими и динамическими переменными в первую очередь заключается в обращении к ним. К статическим переменным обращаются по имени (идентификатору), к динамическим – по адресу. Ссылочный тип данных и адресация Динамические переменные в разделе описаний программы в явном виде не указывают, т.к. у них нет имени. Доступ к динамическим переменным осуществляется с помощью переменных специального типа данных, называемых ссылочными, а сами ссылочные переменные называют ссылками или указателями. Указатели могут быть типизированными и нетипизированными. Типизированные указатели задают адреса области памяти, в которой хранятся или будут храниться данные базового, то есть заранее описанного стандартного или определённого программистом типа. Нетипизированные указатели задают адреса области памяти, в которой хранятся или будут храниться данные любого, заранее неизвестного типа. Минимальной единицей памяти, которая может быть выделена под переменную или инструкцию программы, является байт. Каждый байт оперативной памяти имеет свой порядковый номер, называемый адресом. Различные данные могут занимать в памяти один или несколько байт. Участок памяти, в котором хранится одно значение данных (один элемент данных), называют ячейкой памяти. Адресом ячейки является адрес её самого первого байта. Нумерация адресов начинается с нуля. Структура объявления ссылочного типа данных выглядит следующим образом: type < имя типа ссылочной переменной> = ^< базовый тип д.п.>; var < имя д.п.> [, < имя д.п.>, ...]: < имя типа ссылочной переменной>; < имя д.п.> [, < имя д.п.>, ...]: ^ < базовый тип д.п.> ; Здесь д.п. – динамическая переменная. Базовым называют стандартный или заранее описанный тип данных. Например, в разделе описаний программы (фрагмент приведен ниже)её строки описывают ссылочные типы и ссылочные переменные – указатели. const max = 150; type R = ^integer; T = ^real; A_mas = ^massiv; massiv = array [1..max] of word; var a, b: R; c: ^real; d, f, g: T; h, k: pointer; m, n: A_mas; Здесь R, T и A_mas – имена типов ссылочных (динамических) переменных целого (R) и вещественного (T) типов и типа массива (A_mas); a и b – типизированные указатели (ссылочные переменные) на динамические переменные типа R, т.е. целого типа; c, d, f и g – типизированные указатели на динамические переменные вещественного типа. Указатель " c" задан только в разделе переменных, а указатели d, f и g – через имя типа T; m и n – типизированные указатели на динамические данные типа массива. При этом следует обратить внимание на то, что тип указателя massiv определён до определения базового типа array. Перечисленные указатели называют типизированными, так как они связаны с адресами значений конкретных базовых типов. Указатели h и k являются нетипизированными, так как описаны словом pointer, и могут ссылаться на данные любого типа. В объявлениях ссылочных типов после символа " ^" может стоять только простое имя типа, например, real, integer, string, но не string [15] или array [1..7] ofinteger. В случае сложных имён типов используют переопределение типов, то есть сначала определяют одним словом тип, являющийся сложным, например, массивом, а затем этот тип используют с символом " ^". Создание и удаление динамических переменных Для работы с динамическими переменными в модуле System языка Турбо Паскаль предусмотрено несколько процедур и функций. В случае типизированных указателей динамические переменные создают с помощью процедуры new (p), которая выделяет в динамической памяти столько байтов, сколько требуется для хранения переменной заданного указателем р типа, а указателю р присваивается адрес первого байта выделенной в памяти ячейки. В случае нетипизированных указателей динамические переменные создают с помощью процедуры getmem (p, size), которая выделяет в динамической памяти столько байтов, сколько указано переменной size, а указателю р присваивается адрес первого байта выделенной в памяти ячейки. Для освобождения динамически выделенной для типизированных указателей памяти можно использовать процедуру dispose (p), которая очищает память, указанную ссылкой р. В случае нетипизированных указателей для очистки динамической памяти предусмотрена процедура freemem (p, size), которая освобождает size байтов, начиная с адреса р. После очищения (освобождения) указатели сохраняют свои значения, однако при этом указывают уже на несуществующие динамические переменные. Поэтому рекомендуется всем высвободившимся указателям присвоить значение nil. При выделении динамической памяти полезными являются функции memavail и maxavail, первая из которых возвращает общий размер свободной динамической памяти в байтах, а вторая – размер наибольшего непрерывного участка свободной памяти. Например, var p: ^real; ..... if maxavail > sizeof ( real ) then new (p); .....
Динамические массивы Рассмотрим работу с динамическими массивами на примере программы перемножения прямоугольных матриц, размер которых заранее не известен, но может быть определён динамически. Размеры перемножаемых матриц должны быть согласованы, а именно количество столбцов первого сомножителя должно равняться количеству строк второго. Так как размер переменных заранее не известен, то процедуры new и dispose применить нельзя. Для данной задачи подходят стандартные процедуры getmem и freemem. Процедура getmem ( var d: pointer; m: word ) создаёт динамическую переменную указанного размера и присваивает значение адреса ссылочной переменной d. Если в памяти ЭВМ не хватает места для размещения переменной, то появляется сообщение об ошибке. Процедура freemem ( var d: pointer; m: word ) как и процедура dispose освобождает память, отведённую под динамическую переменную, и делает эту память доступной для другого использования. Точно также после этого указателю d обязательно нужно присвоить значение nil. Пример 1. program Mult_Matr; uses Crt; type Index_Of_Row = array [1..100] of ^ VectColumn; VectColumn = array [1..100] of integer; {здесь Index_Of_Row – имятипассылочныхпеременных, имеющихбазовыйтипдинамическогомассива, VectColumn – имятипассылочнойпеременнойтипа " массивцелыхчисел" } matrix = record {matrix – переменная типа " запись" } N_rows, N_column: word; {Номер строки (ряда), номер столбца} index: ^ Index_Of_Row; {index – ссылка (указатель) на вектор-столбец VectColumn, длина которого равна числу строк матрицы Index_Of_Row. Каждый элемент столбца VectColumn сам является указателем на вектор-строку} end; var A, B, C: matrix; {А и В – исходные матрицы, С – матрица – результат перемножения матриц А и В} IndexSize, ElemSize, I, K: word; (* Размеры индекса и элемента матрицы, I, K – счётчики. Ссылка на элемент матрицы А имеет вид: A.index^[I]^[K] *) M, N: longint; (* Размеры матрицы *) procedureCreateMatrix( var A: matrix; r c: word ); {Процедурасозданияматрицы} var j, k: word; begin with A do Begin N_rows: = r; N_column: = c; j: = N_rows * SizeOf (Pointer); inc ( IndexSize, j ); GetMem (index^[j], k); for k: = 1 to N_column do index^[j]^[k]: = -5 + random (11); end; end; Begin ……………….. End.
Порядок выполнения работы 1. Разработайте алгоритм решения задачи в соответствии со своим вариантом. 2. Откройте текстовый редактор TurboPascal. 3. Напишите программу решения задачи по разработанному ранее алгоритму. В программе предусмотреть вывод справочной информации (информация об авторе, наименование и назначение программы), возможность многократных вычислений. 4. Отладьте программу. 5. Сохраните результаты работы программы. Содержание отчета Отчет оформляется индивидуально и содержит: - титульный лист; - наименование, цель и содержание работы; - алгоритм и текст программы - изображения экранов монитора с результатами работы программы; - выводы по результатам работы. Варианты заданий I. Разработайте алгоритм и программувыполняющую действия над одномерными массивами в соответствии с заданным вариантом. В программе предусмотреть вывод справочной информации (назначение программы, вид выполняемого действия, автор), возможность повторного выполнения программы. Размер массива – произвольный.
1. Массив А вводится с клавиатуры. Найти сумму его элементов. 2. Найти произведение элементов, кратных 3 в массиве, заданном датчиком случайных чисел на интервале [-28, 27]. 3. Массив А вводится с клавиатуры. Найти среднее арифметическое его элементов с нечетными номерами. 4. Массив А вводится с клавиатуры. Найти сумму его элементов с четными номерами, произведение отрицательных элементов, количество нечетных элементов. 5. Найти наибольший элемент и его номер в последовательности, элементы которой вводятся с клавиатуры. 6. Найти средне арифметическое элементов последовательности, превосходящих некоторое число С. Массив задан датчиком случайных чисел на интервале [-44, 35]. Значение С вводится с экрана. 7. Массив А вводится с клавиатуры. Вывести только нечетные элементы. 8. Упорядочить данную последовательность по убыванию. Элементы вводятся с клавиатуры. 9. Упорядочить данную последовательность по убыванию. Массив задан датчиком случайных чисел на интервале [-54, 33]. 10. Массив А вводится с клавиатуры. Сформировать новый массив В, состоящий из положительных элементов массива А. 11. Массив задан датчиком случайных чисел на интервале [-31, 45]. Сформировать новый массив В, состоящий из нечетных элементов массива А. 12. Массив А вводится с клавиатуры. Сформировать новый массив В, состоящий из положительных элементов массива А и найти в нем наибольший элемент. 13. Массив задан датчиком случайных чисел на интервале [-37, 66]. Найти наименьший нечетный элемент. 14. Сформировать и вывести на экран последовательность из n элементов, заданных датчиком случайных чисел на интервале [-23, 34]. 15. Найти произведение элементов одномерного массива, состоящего из n элементов. Элементывводятсясклавиатуры. 16. Найти сумму элементов одномерного массива. Элементы вводятся с клавиатуры. 17. Задан массив А, состоящий из n чисел. Найти среднее арифметическое его элементов. Элементывводятсясклавиатуры. 18. Найти сумму элементов массива с четными номерами, содержащего N элементов. Элементывводятсясклавиатуры. 19. Сформировать и вывести на экран массив, элементы которого заданы датчиком случайных чисел на интервале [-19, 26]. Найти произведение элементов с нечетными номерами. 20. Сформировать и вывести на экран массив, элементы которого заданы датчиком случайных чисел на интервале [-56, 47]. Найти произведение элементов с четными номерами, которые превосходят некоторое число t. 21. Найти наименьший элемент одномерного массива, состоящего из n элементов. Элементывводятсясклавиатуры. 22. Найти номер наименьшего элемента в массиве, заданного датчиком случайных чисел на интервале [-20, 25]. 23. В заданном одномерном массиве, состоящем из n целых чисел, подсчитать количество нулей. 24. В заданном одномерном массиве, состоящем из n целых чисел, подсчитать количество четных элементов. 25. Найдите среднее арифметическое элементов массива, состоящего из 10 чисел, которые превышают по величине число С. Элементы вводятся с клавиатуры. 26. Найти произведение элементов целочисленного одномерного массива с четными номерами, состоящего из n элементов. Элементывводятсясклавиатуры. 27. В заданном одномерном массиве поменять местами соседние элементы. 28. Массив А вводится с клавиатуры. Сформировать новый массив В, состоящий из четных элементов массива А. Элементы вводятся с клавиатуры.
Разработайте алгоритм и программу, выполняющую действия над двумерными массивами в соответствии с заданным вариантом. В программе предусмотреть вывод справочной информации (назначение программы, вид выполняемого действия, автор), возможность повторного выполнения программы. Вывод-вывод матриц организовать с использованием процедур или функций. Размерность матриц заранее не известна, определяется пользователем во время работы программы. 1. Поэлементное умножение двух произвольных столбцов матрицы с записью результатов умножения в столбец указанный пользователем. 2. Вычисление суммы, произведения и среднего арифметического всех элементов матрицы. 3. Упорядочить диагонали 2-мерного массива. 4. Найти и поменять местами максимальный и минимальный элементы матрицы. 5. Найти и поменять местами максимальный и минимальный элементы произвольной строки матрицы. 6. Найти и поменять местами максимальный и минимальный элементы матрицы. 7. Найти и поменять местами максимальный и минимальный элементы произвольной строки матрицы. 8. Найти и поменять местами максимальный и минимальный элементы произвольного столбца матрицы. 9. Изменить все элементы матрицы на заданную пользователем величину. 10. Суммирование двумерных матриц. 11. Умножение двумерных матриц. 12. Транспонирование матрицы. 13. Нахождение максимального и минимального элемента матрицы. 14. Нахождение максимального и минимального элемента произвольной строки матрицы. 15. Нахождение максимального и минимального элемента произвольного столбца матрицы. 16. Нахождение максимального и минимального элемента матрицы находящегося на главной диагонали матрица. Размерность матрицы 6х6. 17. Поэлементное умножение двух произвольных срок матрицы с записью результатов умножения в строку указанную пользователем. 18. Поэлементное умножение двух произвольных столбцов матрицы с записью результатов умножения в столбец указанный пользователем. 19. Вычисление суммы, произведения и среднего арифметического всех элементов матрицы. 20. Сортировка произвольной строки матрицы по возрастанию. 21. Сортировка произвольной строки матрицы по убыванию. 22. Сортировка произвольного столбца матрицы по возрастанию. 23. Сортировка произвольного столбца матрицы по убыванию. 24. Замена двух произвольных строк матрицы. 25. Замена двух произвольных столбцов матрицы. 26. Возвести в квадрат все элементы 2-мерного массива. 27. Подсчёт кол-во строк в 2-мерном массиве, содержащих элемент не превышающий заданное значение. 28. Перемешать 2-мерный массив. 29. Нахождение максимального и минимального элемента матрицы находящегося на главной диагонали матрица. Размерность матрицы 6х6. 30. Перемешать строки 2-мерного массива. 31. Поэлементное умножение двух произвольных срок матрицы с записью результатов умножения в строку указанную пользователем. 32. Перемешать столбцы 2-мерного массива.
6 Контрольные вопросы 1. Укажите особенности статических переменных. 2. Укажите особенности динамических переменных. 3. Укажите различия между статическими и динамическими переменными. 4. Дайте определение динамической памяти. Каков объем динамической памяти ЭВМ? 5. Скажите, что такое ячейка памяти и как к ней выполняется адресация. 6. Укажите правила объявления ссылочного типа данных. 7. Поясните механизм создания и удаления динамических переменных. 8. Поясните, что такое динамический массив и в чем его отличие от обычных массивов. 9. Напишите фрагмент программы для инициализации одномерного динамического массива. 10. Укажите особенности создания многомерных динамических массивов. Рекомендуемая литература 1. Степанов А.Н. Информатика. Базовый курс. Учебник для ВУЗов. - Издательство " Питер", 2007. – 768с. 2. Острейковский, В.А. Информатика: учебник для вузов / В.А.Острейковский.— 3-е изд., стер. — М.: Высш.шк., 2005.— 511с.: ил. — Библиогр.в конце кн. — ISBN 5-06-003533-6 /в пер./: 128.74.
ЛАБОРАТОРНАЯ РАБОТА 15 Строковый тип данных. Работа со строками в TurboPascal (4 часа)
Цель работы
Ознакомление с понятиями динамическая память, динамическая переменная, указатель. Получение практических навыков написания и отладки программ в среде TurboPascal для работы с динамическими массивами.
2 Краткая теоретическая справка Строковый тип данных Для обработки текста в Турбо Паскале был введён строковый тип данных string (строка). Строковый тип обобщает понятие символьных массивов, позволяя динамически изменять длину строки. Различают строковые переменные и строковые константы. Строковый тип данных подобен одномерному массиву символов, задаваемому в виде array [0.. N] ofchar. Строковый тип данных может быть объявлен в разделах констант, типов и переменных: const Strcon = ' Strcon – это строковая константа'; type S1 = string [N]; S2 = string; var S3, S4: string [M]; S5: string; S6, S7: S1; S8: S2; Строковую константу объявляют в разделе констант. Строковая константа – последовательность любых символов, кроме символа возврата каретки, заключённая в апострофы. Если в строковой константе встречается апостроф, то он удваивается. Строковую константу можно записать как последовательность ASCII- кодов символов, перед каждым из которых должен стоять символ сеточки #. Например, строки #139#165#170#230#168#239 и 'Лекция' эквиваленты. Допускается в одной строковой константе совмещать оба вида записи, чередуя их любым образом. Это позволяет использовать в строке все виды символов, включая управляющие. Например, допустима запись #7'Допущена ошибка! '#13'Нажмите клавишу ввода " Enter" ', что означает подачу звукового сигнала (#7) для привлечения внимания оператора, вывод текста " допущена ошибка! ", переход на новую строку (#13) и вывод текста на ней " Нажмите клавишу ввода " Enter". Выражения в квадратных скобках после слова string указывают максимальную длину строки и могут быть любыми константами порядкового типа, принимающими заданные значения в интервале от 1 до 255 включительно, т.е. N ≤ 255 и M ≤ 255. Если значение константы не указано, то длина строки принимается максимально возможной и равной 255 байтам (элементам). Операции над строками Значение строковой переменной может быть присвоено оператором присваивания либо прочитано из некоторого файла, например, текстового, соответствующей процедурой присваивания или чтения: S3: = 'Тульский государственный университет' S5: = S3; readln (F, S5); {Чтение из файла F} При вводе строковых переменных вводимые символы размещаются с начала строкового массива. Если количество введённых символов меньше заданной длины строки, то оставшиеся байты заполняются пробелами. Если заданная длина строки меньше, чем длина присваиваемого значения, то лишние символы отбрасываются. Строка в Паскале трактуется одновременно как простое (скалярное) значение, так и как массив символов. Поэтому некоторые операции могут выполняться над строкой целиком (например, ввод и вывод), а некоторые над каждым символом по отдельности. К конкретному символу строки можно обратиться как к элементу массива, указав в квадратных скобках после имени строки порядковый номер элемента строки. В отличие от массивов переменные строкового типа могут участвовать как операнды в инструкциях ввода-вывода, например, в виде readln (S3) или в виде write (S3). Самый первый байт в строке имеет индекс " 0" и содержит текущую длину строки. Поэтому по оператору write (S3 [0]) на экран монитора будет выведен символ, описывающий длину строки S3.Количество символов в строке при её вводе определяется автоматически, при этом также автоматически заполняется нулевой байт. К строкам можно применять операцию объединения (сцепления) строк, называемую конкатенацией и обозначаемую знаком " +". Например, после выполнения оператора S6: = 'a' + 'b' + 'c'; строка S6 будет содержать текст " abc", а после выполнения оператора S6: = S6 + 'd' + 'e' + 'f'; – текст " abcdef". Все остальные действия над строками реализуются с помощью четырёх стандартных строковых функций Concat, Length, Copy, Pos и четырёх строковых процедур Delete, Insert, Str и Val, находящихся в модуле System. Строковая функция Concat (St1, St2 [, St3, .., StN]) – конкатенация – имеет тип string и возвращает строку, полученную в результате слияния (" сцепления" ) строк-параметров St1, St2, .., StN. Например, функция Concat ('abc', 'def'); эквивалентна действию оператора S6: = S6 + 'd' + 'e' + 'f'; Строковая функция Length (St) – " длина" – имеет тип byte и возвращает текущую длину строки St. Функцию Length удобнее использовать вместо выражения St [0], т.к. оно не даёт никаких преимуществ, а только затрудняет чтение текста программы. Строковая функция Copy (St, m, n) – " копирование" – имеет тип string и возвращает подстроку длиной n символов из строки St, начиная с символа номера m. Параметры m и n должны имеет тип integer, параметр St – тип string. Строковая функция Pos (SubSt, St) – " позиция" – имеет тип byte и предназначена для поиска в строке St первого участка текста, совпадающего с текстом строки (" подстроки" ) SubSt. Если такой участок найден, то функция получит номер позиции, с которой начинается совпадение текстов. Если совпадения нет, то функция получит значение " ноль". Строковая процедура Delete (St, m, n) – " удаление" – удаляет n символов из строки St, начиная с позиции m. Параметры m и n должны имеет тип integer или byte, параметр St – тип string. Строковая процедура Insert (SubS, S, n) – " вставка" – вставляет подстроку SubS в строку S, начиная с позиции n. Параметр n должен иметь тип integer или byte. Строковая процедура Str (X [: width [: decimals]], St) преобразует число Х любого вещественного или целого типов в строку символов St. Такое же преобразование делает процедура Writeln перед выводом. Если количество полей width под строковое представление значения Х не задано, то целое число будет занимать фактическое количество позиций, а вещественное будет записано в показательной форме в виде мантиссы и порядка числа и займёт 22 позиции (16 – мантисса, 8 – порядок). Если количество полей width под строковое представление значения Х задано, то целое число будет занимать width позиций. Если Х – вещественное число, то оно будет представлено в десятичной форме и также заниматьwidth позиций, включая decimals позиций после десятичной точки. Строковая процедура Val (St, x, y) преобразует строковое изображение числа St в число x целого или вещественного типа. Параметр y содержит признак ошибки преобразования. Если преобразование прошло успешно, то в x помещается результат преобразования, а переменная y будет равна 0. В противном случае параметр y будет содержать номер позиции строки St, где обнаружен ошибочный символ, а содержимое x не изменится. В Паскале различают ведущие и ведомые пробелы. Пробел в начале строки перед символом называют ведущим, а в конце строки после конечного символа – ведомым. При обращении к процедуре Val ведомые пробелы недопустимы. Поэтому, например, обращение Val (' 125', x, y); будет успешным, x станет равным 125, y – 0, а обращение Val ('125 ', x, y); будет ошибочным: значение x станет равным 125, т.е. не изменится, а y станет равным 4, т.е. укажет на ошибку в четвёртой позиции. Если имеет место обращение Val ('3, 1416', x, y); то x станет равным3, 1416, т.е. не изменится, а y станет равным 2, т.к. имеет место ошибка: вместо десятичной точки поставлена запятая. Если же написано Val ('3.1416', x, y); то х будет равен 3.1416, а y станет равным нулю. Кроме того, к строкам можно применять функцию Upcase (Ch) типа char, которая преобразует латинскую букву Chв заглавную. Если значение символа Ch не является латинской буквой, то функция Upcase его не изменит. К строкам также применимы операции отношения =, < >, <, < =, >, > =. Сравнение строк происходит посимвольно слева направо. При этом один символ считается больше другого, если его код в таблице ASCII больше. Как только в одной из строк впервые обнаружится больший символ, то эту строку считают большей и на этом их сравнение заканчивают. Строки считаются равными, если имеют одинаковую длину и у них совпадают соответствующие символы. Если длина одной строки больше, чем у другой, то строка большей длины считается большей. Например, приведённые далее соотношения являются правильными: 'A' > '1', 'abcd' < 'acbd', 'abcd' > 'abc', 'abc ' = 'abc', 'c' < 'bbb'. Любая заглавная буква всегда меньше соответствующей ей строчной, т.к. в кодовой таблице ASCII сначала располагаются все заглавные буквы, а затем строчные, т.е. заглавные буквы имеют меньшие номера. Порядок выполнения работы 1. Разработайте алгоритм решения задачи в соответствии со своим вариантом. 2. Откройте текстовый редактор TurboPascal. 3. Напишите программу решения задачи по разработанному ранее алгоритму. В программе предусмотреть вывод справочной информации (информация об авторе, наименование и назначение программы), возможность многократных вычислений. 4. Отладьте программу. 5. Сохраните результаты работы программы. Содержание отчета Отчет оформляется индивидуально и содержит: - титульный лист; - наименование, цель и содержание работы; - алгоритм и текст программы - изображения экранов монитора с результатами работы программы; - выводы по результатам работы.
Варианты заданий Разработайте алгоритм и программу, выполняющую действия над строковыми переменными в соответствии с заданным вариантом. В программе предусмотреть вывод справочной информации (назначение программы, вид выполняемого действия, автор), возможность повторного выполнения программы. Содержимое строки определяется пользователем при работе программы. 1. Проверка корректности вводимых с клавиатуры целых чисел. 2. Поиск в текстовой строке заданного пользователем фрагмента. 3. Разворот строки. 4. Автозамена в текстовой строке. Искомый и замещающий текст определяется пользователем. 5. Определение количества задаваемых пользователем символов в текстовой строке. 6. Сортировка символов по возрастанию. 7. Замена строчных букв прописными в начале предложения в текстовой строке. 8. Проверка корректности вводимых с клавиатуры вещественных чисел. 9. Формирование текста из вводимых пользователем слов (предложений). 10. Сортировка символов в строке по убыванию. 11. Замена слов в тексте. Номера перставляемых слов определяет пользователь в процессе работы программы. 12. Сформировать строку, содержащую последовательность из символов. Задаётся символ и их количество. 13. Сформировать строку, содержащую последовательность из символов. Задаётся символ и их количество. 14. Преобразовать число в римское число. 15. Замена первого и последнего слов в предложениях местами. 16. Во введённой строке вставить по одному пробелу между печатными символами а пробелы между словами сделать состоящими из 2-х пробелов (пример “Привет мир” -> “П р и в е т м и р”) 17. Преобразовать строку в морзянку (азбука морзе берётся из интернета). 18. Замена латинских букв кириллицей при вводе текста в соответствии с их расположением на клавиатуре ЭВМ. 19. Нахождение самого длинного и самого короткого слов в предложении, вывод их на экран. 20. Нахождение длинного и короткого слов в предложении, вывод на экран порядковых номеров данных слов. 21. Сформировать строку, содержащую сначала все символы на нечётных позициях, а затем на чётных. 22. Определение количества слов в предложениях, вводимых пользователем с клавиатуры. 23. Определение количества символов в произвольно слове текстовой строки. 24. Определение количества слов и количества символов в словах произвольной текстовой строки. 25. Перемешать символы в строке. 26. Вывод всех слов текстовой строки номера, которых являются четными. 27. Вывод всех слов текстовой строки номера, которых являются нечетными. 28. Определение является ли слово перевертышем, например «казак». 29. Сравнение двух строковых переменных, определяемых пользователем. 30. Копирование фрагмента строки с записью в другую строку.
6 Контрольные вопросы 1. Поясните, что такое строковая переменная. 2. Возможно ли представить строковую переменную в виде массива? 3. Укажите как нумеруются элементы строковой переменной. 4. Какое максимальное число элементов может входить в строковую переменную? 5. Укажите правила инициализации строковых переменных с использованием раздела определения типов. 6. Укажите правила инициализации строковых переменных с использованием раздела описания переменных. 7. Перечислите возможные варианты инициализации строковых переменных. 8. Укажите варианты определения длины строковой переменной (кол-ва символов в переменной). 9. Перечислите основные операции над строками. 10. Укажите назначение и синтаксис функции Copy. 11. Укажите назначение и синтаксис процедуры Insert. 12. Укажите назначение и синтаксис функции Pos. 13. Укажите назначение и синтаксис процедуры Val. 14. Скажите результат выполнения операторов S: =’компь’+’ютер’; write(S). Рекомендуемая литература 1. Степанов А.Н. Информатика. Базовый курс. Учебник для ВУЗов. - Издательство " Питер", 2007. – 768с. 2. Острейковский, В.А. Информатика: учебник для вузов / В.А.Острейковский.— 3-е изд., стер. — М.: Высш.шк., 2005.— 511с.: ил. — Библиогр.в конце кн. — ISBN 5-06-003533-6 /в пер./: 128.74. ЛАБОРАТОРНАЯ РАБОТА 16 Работа с внешними файлами в Turbo Pascal: чтение и запись (4 часа) Цель работы Получение практических навыков написания и отладки программ в среде TurboPascal для работы с файлами. 2 Краткая теоретическая справка Понятие файла Файл или файловый тип данных представляет собой именованную последовательность однотипных компонентов, расположенных на внешнем носителе или HDD (SSD) компьютера. В Турбо Паскале различают три категории файлов, работа с которыми отличается друг от друга: 1) текстовые файлы, 2) типизированные файлы и 3) файлы без типа. Текстовые файлы в Турбо Паскале представляют собой совокупность строк разной длины. В конце каждой строки ставится специальный признак EOLN (endofline), а в конце файла – EOF (endoffile). К элементам файла (символам) возможен только последовательный доступ. Типизированные файлы отличаются от текстовых тем, что длина любого компонента файла строго постоянна. Поэтому имеется возможность организации прямого доступа к каждому компоненту, указав его порядковый номер. Первый компонент файла имеет номер 0. Нетипизированные файлы характеризуются тем, что для них не указан тип компонентов. Это позволяет совмещать такие файлы с любыми другими файлами и организовать высокоскоростной обмен данными между внешним носителем файла и оперативной памятью. Описание категории файлов можно выполнить как с использованием разделов объявления типов и переменных, так и только раздела объявления переменных. Например, 1-й вариант: type < имя типа файла> = fileof < базовый тип>; {типизированные файлы} < имя типа файла> = text; {текстовый файл (типизированный файл текстового типа)} < имя типа файла> = file; − нетипизированный файл. var < имя файла> [, < имя файла>, …, < имя файла> ]: < имя типа файла>; или 2-й вариант: var < имя файла> : text; {текстовый файл или файл текстового типа} < имя файла> : fileof < тип>; {типизированные файлы} < имя файла> : file; {нетипизированный файл, или char} Здесь < тип> – любой тип данных Турбо Паскаля, кроме файловых. Популярное:
|
Последнее изменение этой страницы: 2016-06-04; Просмотров: 1067; Нарушение авторского права страницы