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



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


СОДЕРЖАНИЕ


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Введение
Каждый даже универсальный язык программирования имеет преимущественную область применения. Язык «С» в силу своих особенностей одинаково хорошо поддерживает системное программирование и программирование прикладных (пользовательских) задач. Поэтому его удобно использовать для создания автоматизированных систем различного назначения и, следовательно, изучение языка «С» целесообразно для всех технических специальностей. В настоящее время существует множество платформ этого языка от усеченных платформ для микропроцессоров до больших универсальных языков для мощных ЭВМ. Последние (как правило) имеют три составные части:

Turbo C;

Объетно-ориентированное программирование;

Обобщенное программирование.

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

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

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

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

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

использовать данные методическик указания и при изучении языка Паскаль;

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



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

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


Целью работы является

Знакомство с интегральной средой программирования и создание первых программ на языке «С»;

Изучение и отработка приемов и навыков ввода и вывода данных на языке «С».

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. Семь основных элементов программирования

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

ввести информацию в программу;

иметь место для хранения информации;

давать инструкции по обработке информации;

выводить информацию из программы пользователю.

Вы можете организовать инструкции таким образом, что:

некоторые из них выполняются только тогда, когда какое-либо условие или набор условий истинны;

другие повторяются некоторое число раз;

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

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

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

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

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

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

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

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

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

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

^ 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.Ввести две беззнаковые переменные. Сначала поделить их, а затем перемножить их и вывести результаты в формате

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

б) знаковых;

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

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

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

`


^ 3Лабораторная работа № 2. Условные операторы
1. Цель работы


Целью работы является изучение форматов условных операторов и отработка приемов и навыков их использования в программах на языке «С».

2. Операции

Присваивание, как, например, в выражении ratio=a/b или ch=getch(), является одной из основных операций. В языке Си присва­ивание обозначается одним знаком равенства /=/; значение с правой стороны присваивается переменой с левой стороны.

Присвоения можно связывать таким образом: sum=a=b. В таком случае вычисление производится справа налево, т.е. значение b будет присвоено переменной, а затем будет присвоено переменной sum, при этом все три переменные получат одно и то же значение (первоначальное значение переменой b). Следует отметить, что оператор присваивания существенно отличается от знака "=", применяемого в математике. Например, в математике выражение а=а+5: не имеет смысла, тогда как в программе это означает, что прежнее значение "а" увеличивается на 5.

Унарные и бинарные операции

Язык Си поддерживает стандартный набор бинарных арифметических операций:

- умножение /*/

- деление (/)

- взятие остатка (%)

- сложение (+)

- вычитание (-)

Турбо-Си поддерживает операцию унарного минуса (a+(-b)), кото­рая выполняет дополнение до двух, а также, в качестве расширения по стандарту ANSI, операцию унарного плюса: (a+(+b)).

Операторы инкремента /++/ и декремента /--/

В языке Си имеются также некоторые специфические унарные и бинарные операторы. Наиболее широко известны из них операторы инкремента /++/ и декремента /--/. При помощи одного такого оператора можно добавить единицу к любому значению или вычесть из любого значения единицу. Сложение или вычитание могут производиться в середине выражения, кроме того, можно определить, будут ли они выполняться до или после вычисления всего выражения. Рассмотрим две сле­дующие строки программы:

sum = a + b ++;

sum = a + ++b;

Первая строка производит следующие действия: складываются зна­чения переменных а и b, результат вычисления присваивается перемен­ной sum, затем переменная b увеличивается на единицу.

Вторая строка делает следующее: значение b увеличивается на единицу, а складывается с b, результат сложения присваивается пере­менной sum.

Эти операторы значительно расширяют возможности языка, но перед их использованием необходимо убедиться, что вы полностью пони­маете их действие. Отредактируйте программу SUM.C так, как показано в нижеследующем примере, а затем попытайтесь угадать результат ее работы дотого, как вы ее запустите.


Побитовые операторы

В языке Си имеются следующие операторы для работы на битовом уровне:

- сдвиг влево (<<)

- сдвиг вправо (>>)

- И (&)

- ИЛИ (I)

- исключающее ИЛИ (^)

- НЕ (~)

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

#include

#include

#include

#include

void main()

{char n1=31,n2=15,n3=63;

n1=n1&4;

n2=(n2|128)>>4;

n3=(n3^31)<<1;

printf("n1= %04x n2= %04x n3= %04x ",n1,n2,n3);

}


Постарайтесь определить результаты, которые должна вывести эта программа, прежде чем вы ее запустите. Обратите внимание на использование спецификаторов размера поля для выравнивания выводимой информации: спецификатор %04X говорит о том, что мы хотим распеча­тать ведущие нули, что поле печати имеет ширину 4 разряда и выводи­мый результат распечатывается в шестнадцатеричном виде /основание 16/.

^ Составные операторы

Язык Си позволяет использовать сокращенную запись выражений со многими операторами. Все описанные выше операторы /унарные, бинар­ные, инкремента и декремента/ могут быть скомбинированы с операто­ром присваивания. Практически любое выражение вида:

<переменная>=<переменная><оператор><выражение>;

может быть заменено на следующее: <переменная><оператор>=<выражение>;

^ Адресные операторы

Язык Си поддерживает два адресных оператора: оператор взятия адреса & и косвенный оператор *.

Оператор & возвращает адрес переменной: если sum есть перемен­ная типа int, тогда ∑ есть адрес /ячейка памяти/ этой переменной. Таким образом, если msg есть ссылка на переменную типа char, тогда *msg есть символ, на который указывает msg. Напечатайте сле­дующую программу и изучите полученные результаты:

Первая строка выводит два значения: значение переменой sum /8/ и адрес этой переменной, присвоенный ей компилятором. Вторая строка также выводит два значения: символ, на который указывает msg/H/ и значение переменной, которое является адресом этого символа /этот адрес также присвоен компилятором/.

^ Условные операторы

До сих пор мы ничего не говорили об операторах отношения и о логических операторах. Кроме того, имеются некоторые непростые моменты, обсуждение которых мы отложили до описания условных выражений, которые могут принимать значение true или false, т.е. истина или ложь.

^ Операторы отношения

Операторы отношения позволяют сравнивать два значения, резуль­тат операции зависит от того, истинно или ложно сравнение. Если сравнение ложно, значение результата равно нулю, если истинно, зна­чение равно единице. Список операторов отношения языка Си:

> больше чем

>= больше или равно

< меньше чем

<= меньше или равно

== равно

!= не равно

Зачем необходимо знать, истинна какая-либо величина или ложна? Запустите программу, которая приведена ниже, и посмотрите, что получится, если в качестве второго значения вы введете ноль.

#include

#include

#include

#include

void main()

{int n1,n2,n3 ;

scanf("%d,%d",&n1,&n2);//ввод двух переменных целого типа

n3=n2/n1;

printf("%d результат = ",n3); //вывод результата деления

}


Программа напечатает сообщение об ошибке Divide by zero /Деление на ноль/ и остановится. Те­перь проделайте в ней нижеследующие изменения и запустите ее снова:

#include

#include

#include

#include

void main()

{int n1,n2,n3 ;

scanf("%d,%d",&n1,&n2);//ввод двух переменных целого типа

if(n2==0){

printf("отношение неопределено ");

getch(); // программа ждет ввода любого символа

}

else {

n3=n1/n2;

printf("%d результат = ",n3); //вывод результата деления

getch(); // программа ждет ввода любого символа

}

}


Оператор, находящийся на двух следующих за вызовом функции scanf строках называется условным оператором if. Он читается следу­ющим образом: "Если значение выражения n2==0 истинно, немедленно вызвать функцию printf. Если значение этого выражения ложно, прис­воить переменой n3 значение выражения n1/n2, за тем вызвать функ­цию printf."

Если вы напечатаете ноль в качестве второго значения, вводимого в программу, она напечатает сообщение: "отношение неопределенно", дождется, пока вы не нажмете какую-либо клавишу и вернется в Турбо-Си. Если же второе значение не равно ну­лю, программа печатает частное от деления двух чисел, ждет нажатия клавиши и возвращается в Турбо-Си - и все при помощи условного оператора if.

Логические операторы

Имеется три логических оператора: И /&&/, ИЛИ /\\/ и НЕ /!/. Их необходимо отличать от описанных выше побитовых операторов /&,I,~/. Логические операторы работают с логическими значениями /true и false/, позволяя составлять выражения отношения.

Чем они отличаются от соответствующих побитовых операторов?

- Логические операторы дают результат или равный 1 /истина/ или 0 /ложь/, тогда как побитовые операторы производят соответствующие действия над каждым битом;

- Логические операторы && и || являются "короткозамкнутыми". Предположим, имеется выражение: expI&& exp2. Если exp1 ложно, тогда ехр2 вычисляться не будет. Точно также имея выражение ехр1 || exp2, мы не вычислим exp2, если exp1 истинно.

^ Дополнительные сведения о выражениях

Прежде чем мы перейдем к циклам, скажем еще несколько слов о выражениях. Выражения типа (а == 0.0) и (а <= c*p) достаточно проз­рачны. Однако язык Си позволяет писать куда более загадочные вещи. Мы не будем изощряться в загадочности, но приведем, все же, некоторые примеры.

Оператор присваивания

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

Например, выражение (sum=5+3) имеет значение 8, поэтому выра­жение ((sum=5+3) <=10) всегда будет давать значение true, т.к. 8<=10. Следующий пример более экзотичен:

#include

#include

#include

#include

void main()

{char ch;

_begin:

if(((ch=getch()) == 'g`){

printf(""Quitting, huh?");

getch(); // программа ждет ввода любого символа

}

else {

printf Good move ");

getch(); // программа ждет ввода любого символа

goto _begin; // отправляемся на метку _begin;

}

}


Вы догадались, что здесь происходит? Когда программа встречает выражение ((ch=getch()) == 'g`), она останавливается, ждет пока вы не нажмете любую клавишу, присваивает символ, соответствующий этой клавише, переменной ch и затем сравнивает этот символ с буквой g.

Если они совпадают, тогда на экране появляется сообщение "Quitting, huh?" /Выходим, а?/, в противном случае распечатывается сообщение "Good move ..." /Попробуем еще .../.

^ Оператор "запятая"

Оператор "запятая" может использоваться для помещения сложного выражения в круглые скобки. Выражения будут вычисляться слева нап­раво, все выражение примет значение последнего вычисленного выраже­ния. Например, если имеются две переменные oldch и ch, обе типа char, тогда выражение

(oldch=ch, ch=getch())

производит следующие действия: значение переменной ch присваивается переменной oldch, затем принимается символ с клавиатуры, и он прис­ваивается переменной ch, затем все выражение принимает значение пе­ременной ch. Например:

Оператор if

Обратите внимание на оператор if в предыдущем примере. Оператор If имеет следующий формат:

if(значение)

выражение1;

else

выражение2;

где значением может быть любое выражение, которое принимает целое значение или может быть преобразовано к целому значению. Если это значение не равно нулю /т.е. истинно/, тогда выполняется выражение1, в противном случае выполняется выражение2.


Два замечания по поводу оператора if-else.

Во-первых, вторая часть оператора /else выражение2/ является необязательной; ниже приведен пример такого оператора if:

if (значение)

выражение1;

В данном случае выражение1 выполняется тогда и только тогда, когда значение не равно нулю. Если значение равно нулю, тогда выражение1 пропускается и программа продолжает свое выполнение.

Во-вторых, иногда, если конкретное выражение истинно или лож­но, бывает нужно выполнить не одно действие, а несколько. Для этого используется составной оператор. Составной оператор состоит из левой фигурной скобки /{/, нескольких выражений, каждое из которых заканчивается точкой с запятой /;/ и правой фигурной скобки /}/. (см. предыдущие программы)

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

^ 3.Варианты заданий

_______________________________________________________________________________

1.

--Ввести переменные х, у, z (x - целое, у - вещественное, z-вещественное).

Если х<0, то z=(x+5)*y; y=(z-3)*x; z=y/z;

если 0=
если x>10, то z=x*x+y*y.

Вывес
еще рефераты
Еще работы по разное