Реферат: Методические указания для выполнения лабораторных работ и курсовой работы содержание
МЕТОДИЧЕСКИЕ УКАЗАНИЯ ДЛЯ ВЫПОЛНЕНИЯ ЛАБОРАТОРНЫХ РАБОТ И КУРСОВОЙ РАБОТЫ
СОДЕРЖАНИЕ
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.
Вывес
еще рефераты
Еще работы по разное
Реферат по разное
Методические указания к выполнению курсовых работ по дисциплине «Теория финансов» студентами специальности 1 25 01 04 «Финансы»
17 Сентября 2013
Реферат по разное
Методические указания и задания к лабораторным работам для учащихся ссуз специальности Т1002 «Программное обеспечение информационных технологий»
17 Сентября 2013
Реферат по разное
Заочной формы обучения
17 Сентября 2013
Реферат по разное
Методические указания по работе с глоссарием
17 Сентября 2013