ФГБОУВПО «Воронежский государственный
технический университет»
Кафедра систем информационной безопасности
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
по выполнению лабораторных работ
по дисциплине
"Средства и методы программирования" для студентов специальностей 090105 "Комплексное обеспечение информационной безопасности информационных систем" и 090106 "Информационная безопасность телекоммуникационных систем" очной формы обучения
Воронеж 2011
Составитель канд. техн. наук Г.А. Кащенко
УДК 681.3
Методические указания по выполнению лабораторных работ по дисциплине "Средства и методы программирования" для студентов специальностей 090105 "Комплексное обеспечение информационной безопасности информационных систем" и 090106 "Информационная безопасность телекоммуникационных систем" очной формы обучения Ч.2 / ФГБОУВПО «Воронежский государственный технический университет», сост. Г.А. Кащенко. Воронеж, 2011. 48 с.
Рассматриваются методические указания по выполнению лабораторных работ по дисциплинам "Методы программирования" и "Средства и методы программирования". Содержащаяся информация является базовой для углубленного изучения языка высокого уровня С++.
Методическое руководство подготовлено в электронном виде в текстовом редакторе MS Word XP и содержится в файле Кащенко2лаб.doc.
Рис. 16. Табл. 4. Библиогр.: 7 назв.
Рецензент канд. техн. наук, доц. Г.А. Остапенко
Ответственный за выпуск зав. кафедрой д-р техн. наук, проф. А.Г. Остапенко
Издается по решению редакционно-издательского совета Воронежского государственного технического университета
© ФГБОУВПО «Воронежский государственный
Технический университет», 2011
Целью проведения лабораторных работ является:
– формирование практических навыков программирования и работы в современных вычислительных системах;
– овладение одним из алгоритмических языков высокого уровня (в данном лабораторном практикуме – языком Си).
Основная концепция, заложенная в лабораторных работах, – это движение от простейших алгоритмов, управляющих структур, типов данных к более сложным алгоритмам, управляющим структурам, типам данных.
Методические указания к лабораторным работам являются ориентиром в самостоятельной подготовке студентов по теме работы и содержат требования, рекомендации, контрольные вопросы, задания по теме работы.
Выполнение лабораторной работы включает следующие этапы:
1. Допуск к работе.
На этом этапе преподаватель проверяет подготовленность студента по теме работы, задавая контрольные вопросы или контрольные упражнения.
2. Проектирование и реализация программы решения задачи (вариант выдает преподаватель после успешного выполнения п. 1).
Этот этап включает:
– разработку и описание алгоритма поставленной задачи,
– написание программы в соответствии с требованиями к лабораторной работе,
– трансляцию и отладку программы на тестовых примерах (набор тестов подбирает студент).
3. Защита лабораторной работы.
К защите студент должен подготовить отчет по работе, продемонстрировать работу программы на тестовых примерах. Защита состоит в обсуждении алгоритма и программы, ответе на контрольные вопросы, решении контрольных примеров.
Отчет по лабораторной работе включает следующие разделы:
1. Условие задачи.
2. Анализ задачи.
3. Алгоритм решения задачи.
4. Текст программы.
5. Набор тестов.
6. Результаты работы программы.
Анализ задачи необходим для достижения следующих целей:
– установить, что является исходными данными и результатами решения задачи;
– выделить основные отношения между входными и выходными данными (если возможно описать их на языке математики);
– выделить основные подзадачи, которые надо решить, чтобы достичь результата.
На основании этого определяется подход к разработке алгоритма решения задачи (т.е. метод ее решения), который позволяет в самом общем виде сформулировать, что должен делать алгоритм, чтобы преобразовать исходные данные в результат.
Как правило, в условии задачи нет каких-либо ограничений на размер и тип исходных данных, поэтому необходимо определить класс входных данных, которые должны обрабатываться алгоритмом. Например, входными данными является матрица. В этом случае необходимо задать максимально допустимое число строк и максимально допустимое число столбцов. При этом студент должен не сужать, а максимально расширять класс входных данных, чтобы разработать наиболее универсальную программу.
Алгоритм решения задачи – это не программа ее решения, а способ дать человеку (а не машине) представление о структуре алгоритма, о смысле его шагов и их логической взаимосвязи. Поэтому шаги алгоритма должны описываться в терминах тех объектов и отношений между ними, о которых идет речь в условии задачи (это, конечно, не исключает использования математической и другой условной символики).
Структура алгоритма станет более ясной, если ее описывать в наглядной и достаточно формализованной (напоминающей конструкции языка программирования) форме. Поэтому требуемой формой описания алгоритма в данном лабораторном практикуме является либо графическое представление алгоритма на языке блок-схем, либо на специальном языке описания алгоритмов, например школьном алгоритмическом языке.
Тема. Обработка текстовой информации.
Цель. Закрепить правила конструирования строк, основные действия над строками, получить практические навыки решения задач обработки текстов.
Содержание работы
1. Изучить правила конструирования строк.
2. Изучить стандартные функции работы со строками.
3. Спроектировать и отладить программу решения задачи, выбрав и обосновав, наиболее удобную для отображения и обработки текста структуру данных.
Методические указания
Обработка текста – это пример задачи из нечисловой предметной области. Обработка текста сводится к решению двух основных подзадач:
а) поиск в некоторой заданной последовательности слов или символов другой заданной последовательности слов или символов. При этом результатом поиска является не только вхождение одной последовательности в другую, но и позиция вхождения.
б) редактирование последовательности слов или символов, т.е. замена одной подпоследовательности на другую, включение в текст новой подпоследовательности, удаление из текста некоторой подпоследовательности.
Важной особенностью обработки текста является то, что объем текстовой информации достаточно велик, а сама обработка, как правило, состоит в просмотре всего текста. Поэтому, решая такие задачи, необходимо стремиться к тому, чтобы каждый символ текста просматривался один и только один раз.
Значением «строкового» типа является последовательность символов (слово строковый заключено в кавычки, так как в Си явно такой тип не определен и, говоря о строковом типе, мы имеем в виду тип данных, обладающий свойствами строкового типа). «Строковый» тип (или просто строка) в Си рассматривается как подмножество типа массив. Строка задается одномерным массивом, элементы которого символы, последний символ массива – ‘\0’. Эта «нуль-литера», кодируемая нулевым байтом, является признаком конца строки. Литера ‘\0’ также как другие символы входит в строку. Размер строки (количество символов) определяется решаемой задачей и ограничивается доступным объемом памяти. Таким образом, строку можно задать:
char str[10];
char word[ ] = {‘a’,’b’,’c’,’d’,’\0’};
char stroka[ ] = “ABCDEF”;
В первом примере определен массив из 10 элементов типа char. Чтобы использовать такой массив как строку надо позаботиться о том, чтобы при задании значений элементам этого массива один из элементов получил значение символа ‘\0’.
Например:
scanf (“%c”, ch); I=0;
while (ch != ‘,’) {str[I++] = ch; scanf (“%c”, ch);}
str[I] = ‘\0’;
или
for (i = 0; ((ch = getchar( )) != ‘,’); ++i ) str[ i ] = ch ;
str[ i ] = ‘\0’;
Стандартная функция getchar из библиотеки stdio.h читает очередную литеру из входного текстового потока и возвращает ее в качестве результата.
Читая последовательность символов, помещаем очередной символ в массив str, пока не введем символ ‘,’. После ввода символа ‘,’ и выхода из цикла добавляем к символам в массиве str символ ‘\0’- признак конца строки. Максимальная длина последовательности символов в строке str – 9 символов (10-й символ это ‘\0’).
Во втором примере определен и инициирован массив word из пяти символов, последним из которых является признак конца строки.
В третьем примере определен и инициирован массив stroka из 7 символов, последним из которых также является символ ‘\0’, так как массив инициирован строковой константой “ABCDEF” (символ ‘\0’ всегда завершает строковую константу). Количество элементов в массиве (во втором и третьем примерах) определяет компилятор по числу начальных значений в списке инициализации.
Так как строковый тип – это особый массив, то для строки сохраняются все свойства регулярного типа (т.е. над отдельными элементами можно выполнять операции, допустимые для базового типа). С «нуль-литерой» можно работать как и с остальными символами (не забывая о ее основном назначении).
Кроме этого, для строк определен набор стандартных функций, приведенный в табл. 1. Функции работы со строками находятся в библиотеке string.h.
Исходный текст это, как правило, последовательность символов, состоящая из слов, разделенных символами-разделителями и оканчивающаяся символом-признаком конца текста. При выборе структуры данных для отображения текста надо стремиться к тому, чтобы текст занимал минимально необходимый объем памяти, и выбранная структура предоставляла средства для быстрого (непосредственного) обращения к элементам текста, которыми, как правило, являются его слова. Таким требованиям отвечает структура данных – массив. Текст можно представить:
двумерным массивом - матрицей, строка которой это слово текста, оканчивающееся символом конца
строки-‘\0’. Количество столбцов равно максимальной длине слова плюс один (символ ‘\0’). Количество строк равно максимальному числу слов в тексте. Обращение к строке матрицы это обращение к слову. Чтобы создать такую структуру, надо читать текст посимвольно, помещая каждое очередное слово в новую строку матрицы и добавляя к слову символ ‘\0’.
одномерным массивом – строкой. Такая структура полностью соответствует внешнему представлению
текста. Размер массива равен максимальной длине исходного текста с учетом разделителей. Чтобы обратиться к слову, необходимо последовательно просматривать символы массива, обнаруживая очередной символ-разделитель, который завершает текущее слово, за ним начинается новое слово. Так продолжаем, пока очередное слово не завершится признаком конца строки. Для создания массива-строки можно использовать функцию gets из библиотеки stdio.h – cчитывание строки из стандартного входного файла. Исходный текст должен завершаться символом новой строки ’\n’, который не включается в результирующую строку, символ ‘\0’ добавляется к строке автоматически. Также можно использовать функцию scanf со спецификацией преобразования %s, «нуль-литера» добавляется к строке автоматически.
Для выделения слова из строки можно использовать функцию работы со строками strtok.
Например:
{
char stroka[55], *razd = “, .;:?!”, *sl;
gets(stroka);
sl = strtok (stroka, razd);
while ( sl )
{
обработка выделенного слова sl;
sl = strtok (NULL, razd);
}
}
Контрольные вопросы
1. Конструирование строкового типа.
2. Стандартные функции работы со строками.
3. Способы представления текста в памяти.
7. Ввод-вывод текстовой информации.
Таблица4.1
Основные стандартные функции для работы со строками
Функция |
Прототип и краткое описание функции |
strcat |
char *strcat(char *st1, char *st2); Добавляет строку st2 в конец строки st1. |
strcmp |
int strcmp(char *st1, char *st2); Лексикографески сравнивает строки st1 и st2. Результат отрицателен, если st1< st2; равен нулю, если st1 ==st2; положителен, если st1 > st2 |
strcpy |
char *strcpy(char *st1, char *st2); Копирует строку st2 в строку st1. |