Методические указания для выполнения лабораторных работ и курсовой работы содержание

Вид материалаМетодические указания

Содержание


2Лабораторная работа № 1. Ввод и вывод данных
3. Семь основных элементов программирования
4. Операторы ввода
Другие функции вывода: puts и putchar
5. Операторы ввода
Распространенный пробел
Использование для ввода функций gets и getch
6. Варианты заданий
3Лабораторная работа № 2. Условные операторы
Составные операторы
Адресные операторы
Условные операторы
Операторы отношения
Дополнительные сведения о выражениях
Оператор "запятая"
3.Варианты заданий
4Лабораторная работа № 3. Циклические процессы
Первая программа
Вторая программа
Третья программа
...
Полное содержание
Подобный материал:
  1   2   3   4   5   6   7   8   9   ...   12


МЕТОДИЧЕСКИЕ УКАЗАНИЯ ДЛЯ ВЫПОЛНЕНИЯ ЛАБОРАТОРНЫХ РАБОТ И КУРСОВОЙ РАБОТЫ


СОДЕРЖАНИЕ


1 Введение 3

2 Лабораторная работа № 1. Ввод и вывод данных 4

3 Лабораторная работа № 2. Условные операторы 13

4 Лабораторная работа № 3. Циклические процессы 23

5 Лабораторная работа № 4. Подпрограммы 27

6 Лабораторная работа № 5. Работа с указателями 31

7 Лабораторная работа № 6. Алгоритмы обработки в вычислительных процессах 35

8 Лабораторная работа № 7. Файловые структуры 38

9 Лабораторная работа № 8. Стек 51

10 Лабораторная работа № 9. Односвязные списки 59

11 Лабораторная работа № 10. Древовидные структуры 69

12 Лабораторная работа № 11. Динамическое распределение памяти 79

13 Методические указания для выполнения курсовой работы 98

13.1 Сроки выполнения курсовой работы 99

13.2 Список тем и вариантов 99



1Введение


Каждый даже универсальный язык программирования имеет преимущественную область применения. Язык «С» в силу своих особенностей одинаково хорошо поддерживает системное программирование и программирование прикладных (пользовательских) задач. Поэтому его удобно использовать для создания автоматизированных систем различного назначения и, следовательно, изучение языка «С» целесообразно для всех технических специальностей. В настоящее время существует множество платформ этого языка от усеченных платформ для микропроцессоров до больших универсальных языков для мощных ЭВМ. Последние (как правило) имеют три составные части:
  1. Turbo C;
  2. Объетно-ориентированное программирование;
  3. Обобщенное программирование.

Первая часть (базовая) имеется во всех платформах «С» и его стандарты поддерживаются практически всеми операционными системами, включая и UNIX. Это делает необходимым начать изучение «С» с Turbo C.

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

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

Пятая и шестая работы посвящены программам средней сложности. Поэтому в них делается основной упор на описание соответствующих подходов и алгоритмов. Приводятся примеры их реализации.

Последние пять работ ориентированы на профессиональное программирование, для которого характерно применение специальных структур данных, используемых при решении задач в качестве неделимых логических единиц. Фактически – это шаг к объектно-ориентированному программированию, при котором объекты (указанные логические единицы) реализованы средствами Turbo C). В приложениях к этим работам приводятся примеры решения задач на основе соответствующих структур данных. Варианты заданий в этих работах существенно различаются по сложности, что дает возможность повысить полезность этого лабораторного практикума для студентов с различной степенью подготовки в области программирования. Еще одной особенностью этой группы работ является то, что решение задач приводится в приложения как на языке «С», так на языке программирования Паскаль. Это позволяет:
  1. использовать данные методическик указания и при изучении языка Паскаль;
  2. провести сравнительный анализ между двумя языками.



2Лабораторная работа № 1. Ввод и вывод данных



1.Цель работы


Целью работы является
  1. Знакомство с интегральной средой программирования и создание первых программ на языке «С»;
  2. Изучение и отработка приемов и навыков ввода и вывода данных на языке «С».

2. Общие сведения о программах

Создание первой программы в Турбо-Си

По традиции, первой для программиста программой на Си должна быть программа Hello, World, описанная в классическом труде Кернигана и Ричи "Язык программирования Си" (или аналогичная программа). Текст этой программы и некоторые к ней пояснения приведены ниже.


#include

#include

#include

#include

void main()

{

printf("Желаем Вам успеха в изучении языка С\n");

}

В начале программы директивой #include подключаются библиотеки, поддерживающие работу тех или иных операторов "С". Откладывая подробное обсуждение этого вопроса на лекционные занятия, отметим только, что для данной программы достаточно было подключение одной библиотеки ,содержащей описание стандартных функций ввода/вывода. Подключение указанных четырех библиотек является достаточным для широкого класса простых программ и поэтому на первоначальном этапе обучения, не особенно вникая в суть вопроса, достаточно копировать эти четыре строчки в начало каждой программы. По правильно обработанной данной программе компьютер выведет строку, заключенную в кавычки.

Пусть мы хотим занести эту программу в файл с именем hello.c. Тогда можно начать с ввода следующей командной строки /из DOS/:


tc hello.c

В результате выполнения этой команды вызывается версия Турбо-Си с интегрированным окружением, создается файл с именем HELLO.C /если он уже не существует/, и вы попадаете в редактор Турбо-Си, в котором вам необходимо указанную программу:

Закончив ввод программы, ее необходимо записать на диск перед тем, как двигаться дальше, если после зависания компьютера весь ваш труд пропал даром. Для записи программы нажмите F2 или выберите пункт Save из меню работы с файлами File, нажав F10 F S.


Компиляция

Теперь, когда программа записана на диск, до ее запуска необ­ходимо сделать две вещи: оттранслировать и скомпоновать ее.

Для трансляции исходного файла нажмите Alt-F9 /нажмите одновременно клавиши Alt и F9/.

После завершения трансляции, которая займет не более одной или двух секунд, на экране появится мигающее сообщение об успешном завершении работы: "Succerss: Press any key" /успех, нажмите любую клавишу/. После нажатия любой клавиши окно исчезнет и вы окажетесь в главном меню.

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

Запуск

После успешной трансляции программа готова к запуску. Т.к. ме­ню в данный момент активно, можно нажать R /Run/. Если вы вернулись в редактор, нажмите Alt-R или выйдите в главное меню нажатием F10 и нажмите R для выполнения команды Run. На экране появится окно ком­поновщика, показывающее, что Турбо-Си ищет необходимые библиотечные процедуры.

Если в это время появились ошибки, скорее всего это произошло потому, что вы не указали, где находятся библиотечные файлы. Если окно компоновщика до сих пор находится на экране, уберите его нажа­тием любой клавиши, затем нажмите последовательно F10 и О для выхо­да в меню установки параметров Options /или используйте сокращение Alt-O/.

Нажав Е, выберите пункт Environment /окружение/, а затем нажмите L для выбора пункта определения библиотечной директории Library directory. После появления на экране окна библиотечной директории напечатайте полное имя пути поддиректории, в которой находятся библиотечные файлы /это, возможно, будет имя A:\TURBOC\LIB или C:\TURBO\LIB/ и нажмите Enter.

Для выхода из меню Environment нажмите Esc, затем нажмите S для сохранения установленных параметров /Store Options/. На экране появится прямоугольник, в который надо впечатать имя файла конфигурации, в нем уже будет указано имя TCCONFIG.TC. Просто нажмите Enter, когда Турбо-Си спросит вас, стирать ли старый файл конфигурации, нажмите Y.

Наконец, нажмите Esc для выхода из меню Options и нажмите R для запуска программы. Теперь компоновка программы должна завер­шиться успешно. Это значит, что для запуска вашей программы Турбо-Си копирует в нее необходимые для ее работы процедуры из библио­теки исполняющей системы. По умолчанию используется малая /Small/ модель памяти /более подробно о моделях памяти говорится в главе 9/, поэтому Турбо-Си берет процедуры из библиотеки с именем CS.LIB.

После компоновки программы Турбо-Си запускает ее на выполнение. Экран очищается, в верхней его части появляется сообщение «Желаем Вам успеха в изучении языка», а в нижней части - сообщение Press any key to Turbo C ... Нажмите любую клавишу - на экране появится знакомый экран Турбо-Си. Примите наши поздравления - вы только что запустили свою первую программу!


3. Семь основных элементов программирования

Целью большинства программ является решить какую-либо задачу. Задачи решаются программами путем различных манипуляций с информа­цией и данными. Необходимо:
  1. ввести информацию в программу;
  2. иметь место для хранения информации;
  3. давать инструкции по обработке информации;
  4. выводить информацию из программы пользователю.

Вы можете организовать инструкции таким образом, что:
  1. некоторые из них выполняются только тогда, когда какое-либо условие или набор условий истинны;
  2. другие повторяются некоторое число раз;
  3. третьи разделяются на группы, которые могут выполняться в различных местах программы.

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

Во многих языках программирования все это есть, многие, вклю­чая Си, имеют дополнительные возможности. При изучении любого ново­го языка, если вам нужно изучить его быстро, определите, как в нем реализованы семь основных элементов, дальше все будет просто. Ниже приведено их краткое описание.

Вывод - означает запись информации на экран, диск или в порт ввода-вывода.

Типы данных - это константы, переменные и структуры, которые содержат числа /целые и с плавающей точкой/, текст /символы и стро­ки/, или адреса /переменных и структур/.

Операторы - присваивают одно значение другому, комбинируют значения /сложение, деление и т.д./, и сравнивают значения /равно, не равно и т.д./.

Ввод - означает чтение данных с клавиатуры, диска или их порта ввода-вывода.

Условное выполнение - выполнение определенного набора инструк­ций, если указанное условие истинно, или пропуск данного набора, если условие ложно.

Циклы - выполнение набора инструкций определенное число раз или пока некоторое условие истинно.

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

4. Операторы ввода

Функция printf

Вам уже приходилось использовать наиболее часто встречающуюся в Си функцию вывода print. Она предназначена для вывода информации на экран. Формат ее прост и гибок:

printf(<форматная строка>,<аргумент>,<аргумент>,...);

Форматная строка

Форматная строка - это строка, которая начинается и заканчива­ется двойными кавычками /"вот так"/. Целью функции printf является вывод этой строки на экран. До вывода аргументы, указанные в стро­ке, преобразуются в соответствии со спецификаторами формата, указанными в самой строке. Рассмотрим следующий оператор:

printf("The sum is %d/n",sum);

Последовательность %d в форматной строке является спецификато­ром формата. Все спецификаторы формата начинаются со знака процента /%/, за которым обычно следует одна буква, указывающая тип данных и способ форматирования этих данных.

Для каждого спецификатора формата должен быть указан один и только один аргумент. Если аргумент принадлежит типу данных, кото­рый не соответствует указанному в спецификаторе формата, то Тур­бо-Си попытается проделать соответствующее преобразование. Аргумен­тами могут быть переменные, константы, выражения, вызовы функций,

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

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

%u беззнаковое целое %i целое

%p значение указателя %f с плавающей точкой

%e с плавающей точкой в экспоненциальном формате

%c символ

%s строка

%x или %X целое в шестнадцатеричном формате

Ширина поля может быть указана цифрой, помещенной между знаком % и буквой. Например, десятичное поле шириной 4 символа будет указано так: %4d. Значение будет напечатано выравненным вправо /с ведущими нулями/, так что общая длина поля будет равна 4 символам.

Если вам нужно напечатать знак процента, вставьте %%. Последовательность \n не является спецификатором формата. По

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

Другие функции вывода: puts и putchar

Для вывода на экран есть еще две функции: puts и putchar. Фун­кция puts выводит на экран строку, оканчивающуюся символом перехода на новую строку.

Обратите внимание, что символ \n в конце строки отсутствует, т.к. он добавляется самой функцией puts.

Вторая функция, putchar, выводит на экран один символ и не до­бавляет \n. Оператор putchar(ch) эквивалентен printf("%c",ch).

В чем смысл использования puts и/или putchar взамен функции printf? Одной из причин является достаточно большой размер процедуры printf. Если только она вам действительно не нужна для цифрового вывода или специального форматирования, лучше воспользоваться функциями puts и putchar, что сделает вашу программу меньше и быстрее. Например, файл .ЕХЕ, созданный на основе файла HELLO.C, использующего функцию puts намного меньше того же файла, но использующего функцию printf.


5. Операторы ввода

Функция scanf

Основное назначение этой функции - интерактивный ввод информа­ции. Вид функции scanf эквивалентен виду функции printf:

scanf (<форматная строка>,<адрес>,<адрес>,...)

Функция scanf использует многие из тех спецификаторов формата со знаком %, что и функция printf: %d для целых чисел, %f для чисел с плавающей точкой, %s для строк и т.д.

Однако у этой функции есть важная отличительная черта: за форматной строкой следуют не значения, а адреса. В программе SUM.C имеется следующая строка:

scanf("%d%d",&a,&b);

Эта строка означает, что программа ожидает ввода двух десятич­ных целых значений, разделенных пробелом; первое значение будет присвоено переменной а, второе - переменной b. Обратите внимание на то, что для передачи значений применяется адресный оператор &, при помощи которого функции scanf передаются адреса переменных а и b.

Распространенный пробел

Пробел между двумя спецификаторами формата %d представляет на самом деле больше, чем просто пробел. На его месте может быть любое количество свободного пространства, а именно: любое количество про­белов, табуляций и символов новой строки в любых комбинациях. Обыч­но, в большинстве случаев такой распространенный пробел игнорирует­ся программами и компиляторами языка Си.

Но что делать, например, если вместо пробела вы хотите разде­лять свои переменные запятой? Для этого отредактируйте эту строку так:

scanf("%d,%d",&a,&b);

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

Передача адреса в функцию scanf

Что делать, если вы хотите ввести в программу строку? Напечатайте и запустите следующую программу:

#include

#include

#include

#include

void main()

{char name[30];

scanf("%s",name);//ввод строки

printf("%s Введенная строка: ",name); вывод введенной строки

}


Т.к. name - это массив символов, значение переменной name есть адрес самого массива. По этой причине перед именем name не используется адресный оператор &, и строка ввода выглядит следующим образом: scanf("%s",name).

Обратите внимание, что мы использовали массив символов /char name [30];/, а не указатель на символ /char *name;/. Объяснением этому служит тот факт, что объявление массива на самом деле резервирует память для хранения его элементов, а при объявлении ссылки этого не происходит. Если бы мы использовали объявление char *name, тогда нам бы пришлось явным образом резервировать память для хране­ния переменной *name.


Использование для ввода функций gets и getch

Использование для ввода информации функции scanf приводит к появлению следующей проблемы. Запустите еще раз эту же программу, но введите в нее имя и фамилию. В своем ответе программа покажет вам снова одно только имя. Почему? Потому что функция scanf воспри­няла пробел, введенный вами после имени, как конец вводимой строки. Для решения этой проблемы можно воспользоваться двумя способами. Функция gets воспринимает любую информацию до тех пор, пока вы не нажмете клавишу Enter. Код, соответствующий этой клавише, в строку не вводится, но в конце строки добавляется нулевой символ \0.

И последняя функция - это getch. Эта функция считывает с клавиатуры один символ, не отображая его на экране /в отличие от функ­ции scanf и gets/. Эта функция не передает символ в качестве параметра; она сама имеет тип char, и ее значение может быть непосредс­твенно присвоено переменной типа char. В заключении перепишем предыдущую программу, используя операторы puts и gets.

#include

#include

#include

#include

void main()

{char name[30];

gets(name);//ввод строки

puts(name);// вывод введенной строки

}


6. Варианты заданий

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

2.Ввести две знаковые переменные. Сначала сложить их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива форматным оператором.

- Присвоить по указателю значение строки и вывести бесформатным опе­ратором.

4.Ввести беззнаковые переменные. Сначала

сложить их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой. Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

7.Ввести две знаковые переменные. Сначала сложить их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива форматным оператором .

- Присвоить по указателю значение строки и вывести бесформатным оператором.

9.Ввести переменные в форме с плавающей запятой. Сначала

сложить их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

`11.Ввести две знаковые переменные. Сначала сложить их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

12.Ввести две знаковые переменные. Сначала выполнить операцию деления их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива форматным оператором.

- Присвоить по указателю значение строки и вывести бесформатным опе­ратором.

14.Ввести переменные в форме с плавающей запятой. Сначала

сложить их, а затем поделить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой. Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

16.Ввести две знаковые переменные. Сначала сложить их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

17.Ввести две знаковые переменные. Сначала сложить их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива форматным оператором.

- Присвоить по указателю значение строки и вывести бесформатным оператором.

19.Ввести беззнаковые переменные в форме с плавающей запятой. Сначала

сложить их, а затем перемножить их и вывести результаты в формате

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

- Присвоить по указателю значение строки и вывести ее.

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

а) беззнаковых;

б) знаковых;

в) с плавающей запятой.

Прокомментировать полученный результат

- Ввести строковую переменную в виде массива.

`