Часть 2. составление и отладка программы. вычисление и обработка результатов
Порядок выполнения лабораторных работ
1 Изучите теоретический материал к лабораторной работе.
2 Ознакомьтесь с примерами программ на языке С.
3 Составьте алгоритм и программу по указанному варианту задания.
4 Отладьте программу и выполните расчеты на ЭВМ.
5 Оформите отчет о выполненной работе.
Содержаниеотчета
Отчет должен содержать:
1) цель работы;
2) условие задачи;
3) блок-схему алгоритма решения задачи;
4) Программу;
5) решение задачи (листинг) на ЭВМ;
6) краткие выводы по работе.
Лабораторная работа № 4
Изучение интегрированной среды С
Цель работы: научиться использовать интегрированную среду С.
Теоретические сведения
Вид интегрированной среды и ее возможности зависят от типа и версии компилятора.
Пример 15
/* ЗАНЯТИЕ N 1
Разработал Петров Ю.В. */
/* <-Это начало многострочного комментария
Это окончание многострочного комментария -> */
// <-Это однострочный комментарий
#include <stdio.h> //Директива препроцессора (#include) включает
#include <conio.h> //заголовочные файлы с расширением (.h)
void main(void) //Главная функция
{ //Начало составного оператора (блока, тела функции)
clrscr(); //Функция очистки экрана
printf("\n\t Здравствуй,\n"); //Функция вывода на экран
printf("\n мир!"); // '\n' '\t' -управляющие
// последовательности
} //Конец составного оператора (блока, тела функции)
/* Результат выполнения программы
Здравствуй,
мир! */
Ход работы
1 Выполнить загрузку интегрированной среды разработки С (IDE) для Turbo C, расположенной в каталоге N:\APL\TC\BIN\TC.EXE, из активной директории.
2 Изучить особенности IDE (структуру меню и подменю), а также повторить возможности текстового редактора (типа Brief), изучить «горячие» клавиши.
3 Выполнить загрузку программ-примеров (N:\APL\TC\LAB\*.CPP), их корректировку, сохранение и компиляцию.
4 Изучить непонятные синтаксические конструкции с использованием встроенной помощи. Скопировать пример из помощи в активное окно и изучить его работу.
5 Повторить выполнение пунктов 1-4 для интегрированной среды разработки Borland C (N:\APL\BC\BIN\BC.EXE).
6 Сравнить возможности IDE Turbo C и Borland C.
7 Написать отчет и сделать выводы по работе, изучив контрольные вопросы по теме.
Вопросы для контроля и самостоятельной работы
1 Как осуществляется запуск и выход из IDE?
2 Как осуществляется настройка путей для подключения внешних файлов?
3 Перечислите режимы компиляции. Что они обозначают?
4 Как производится подключение библиотеки графических функций?
5 Как осуществляется открытие и закрытие окон, переход между окнами, копирование текста из окна в окно?
6 Как осуществляется модификация имени файла?
7 Что такое проект? Как проиизводится создание, дополнение и выполнение проекта?
8 Почему загрузка IDE осуществляется из активной директории?
9 Назовите «горячие » клавиши и их назначение.
10 Как выделить комментарии вС?
11 Как подключиться заголовочные файлы, что они содержат?
12 Что обозначается словом main()?
Лабораторная работа 5
Операторы присваивания, ввода, вывода.
Программирование линейного
Вычислительного процесса
Цель работы - выработать практические навыки в написании и отладке простых С-программ на линейный вычислительный процесс.
Теоретические сведения
Присваивание (выражение и оператор). Символ "=" в языке Си обозначает бинарную операцию, у которой в выражении должно быть два операнда - левый (обычно переменная) и правый (обычно выражение). Если z - имя переменной, то
z = 2.3 + 5.1
есть выражение со значением 7.4. Одновременно это значение присваивается и переменной z. Только в том случае, когда в конце выражения с операцией присваивания помещен символ ";", это выражение становится оператором присваивания. Таким образом,
z = 2.3 + 5.1;
есть оператор простого присваивания переменной z значения, равного 7.4.
Тип и значение выражения с операцией присваивания определяются значением выражения, помещенного справа от знака '='. Однако этот тип может не совпадать с типом переменной из левой части выражения. В этом случае при определении значения переменной выполняется преобразование (приведение).
Так как выражение справа от знака '=' может содержать, в свою очередь, операцию присваивания, то в одном операторе присваивания можно присвоить значения нескольким переменным, т.е. организовать "множественное" присваивание, например:
c=x=d=4.0+2.4;
Здесь значение 6.4 присваивается переменной d, затем 6.4 как значение выражения с операцией присваивания "d=4.0+2.4" присваивается х и, наконец, 6.4 как значение выражения "x=d" присваивается с. Естественное ограничение - слева от знака '=' в каждой из операций присваивания может быть только леводопустимое выражение (имя переменной).
В языке Си существует целый набор "составных операций присваивания" {ранг 14). Каждая из составных операций присваивания объединяет некоторую бинарную логическую или арифметическую операцию и собственно присваивание. Операция составного присваивания является основой оператора составного присваивания:
имя переменной ор=выражение;
где ор - одна из операций *, /, %, +, -, &, Ù, |, «, ». Если рассматривать конструкцию "ор=" как две операции, то вначале выполняется ор, а затем '='. Например, х*=2; z+=4; i/=x+4*z;
При выполнении каждого из этих операторов операндами для операции ор служат переменная из левой части и выражение из правой. Результат присваивается переменной из левой части.
Таким образом, первый пример можно рассматривать как обозначение требования "удвоить значение переменной х"; второй пример - "увеличить на 4 значение переменной z"; третий пример - "уменьшить значение переменной i в (x+4*z) раз". Этим операторам эквивалентны такие операторы простого присваивания:
х=х*2; z=z+4; i=i/(x+4*z) ;
В последнем из них пришлось ввести скобки для получения правильного результата. Перейти от простого оператора присваивания к составному можно только в тех случаях, когда одна переменная используется в обеих частях. Более того, для некоторых операций эта переменная должна быть обязательно первым (левым) операндом. Например, не удастся заменить составными следующие простые операторы присваивания:
a=b/a; x=z%x.
В качестве левого операнда в операциях присваивания может использоваться только модифицируемое именующее выражение (l-значение), т.е. ссылка на некоторую именованную область памяти, значение которой доступно изменениям.
Перечислим операции присваивания, отметив, что существуют одна простая операция присваивания и ряд составных операций:
= - простое присваивание: присвоить значение выражения-операнда из правой части операнду левой части. Пример: Р = 10.3 - 2*х;
*= - присваивание после умножения: присвоить операнду левой части произведение значений обоих операндов. Р *= 2 эквивалентно Р = Р * 2;
/= - присваивание после деления: присвоить операнду левой части частное от деления значения левого операнда на значение правого. Р /= 2.2 - d эквивалентно Р=- Р / (2.2 - d);
%= - присваивание после деления по модулю: присвоить операнду левой части остаток от целочисленного деления значения левого операнда на значение правого операнда. N %= 3 эквивалентно N = N % 3;
= - присваивание после суммирования: присвоить операнду левой части сумму значений обоих операндов А += В эквивалентно А = А + В;
-= - присваивание после вычитания: присвоить операнду левой части разность значений левого и правого операндов. X -= 4.3 - Z эквивалентно X = X - (4.3 - Z);
Обратите внимание, что для всех составных операций присваивания форма присваивания Е1 ор= Е2 эквивалентна Е1 = El op (E2), где ор - обозначение операции.
Запятая в качестве операции (ранг 15)
Несколько выражений, разделенных запятыми ",", вычисляются последовательно слева направо. В качестве результата сохраняются тип и значение самого правого выражения. Например, если переменная х имеет тип int, то значением выражения (х=3, 3*х) будет 9, а переменная х примет значение 3.
Стандартные математические функции (файл math.h):
Функция | Краткое описание |
abs | нахождение абсолютного значения выражения типа int |
acos | вычисление арккосинуса. Аргументы этой и других тригонометрических функций задаются в радианах |
asin | вычисление арксинуса |
atan | вычисление арктангенса х |
atan2 | вычисление арктангенса от у/х |
cabs | нахождение абсолютного значения комплексного числа |
ceil | нахождение наименьшего целого, большего или равного х |
_clear87 | получение значения и инициализация слова состояния сопроцессора и библиотеки арифметики с плавающей точкой |
_control87 | получение старого значения слова состояния для функций арифметики с плавающей точкой и установка нового состояния |
cos | вычисление косинуса |
cosh | вычисление гиперболического косинуса |
exp | вычисление экспоненты |
fabs | нахождение абсолютного значения типа double |
floor | нахождение наибольшего целого, меньшего или равного х |
fmod | нахождение остатка от деления х/у |
_fpreset | повторная инициализация пакета плавающей арифметики |
frexp | вычисляет для х вещественную мантиссу m и целое n так, что x=m*2n |
hypot | вычисление гипотенузы |
labs | нахождение абсолютного значения типа long |
ldexp | вычисление х*2e |
log | вычисление натурального логарифма |
log10 | вычисление логарифма по основанию 10 |
matherr | управление реакцией на ошибки при выполнении функций математической библиотеки |
modf | разложение х на дробную и целую часть |
pow | вычисление х в степени у |
sin | вычисление синуса |
sinh | вычисление гиперболического синуса |
sqrt | нахождение квадратного корня |
_status87 | получение значения слова состояния с плавающей точкой |
tan | вычисление тангенса |
tanh | вычисление гиперболического тангенса |
В библиотеке определен также ряд констант, таких как M_PI (число π), M_E (основание натурального логарифма e) и др.
Функция форматированного вывода.Достаточно часто для вывода информации из ЭВМ в программах используется функция printf(). Она переводит данные из внутреннего кода в символьное представление и выводит полученные изображения символов результатов на экран дисплея. При этом у программиста имеется возможность форматировать данные, т.е. влиять на их представление на экране дисплея.
Возможность форматирования условно отмечена в самом имени функции с помощью литеры fв конце ее названия (print formatted).
Оператор вызова функции printf() можно представить так:
printf(форматная строка, список _аргументов);
Форматная строка ограничена двойными кавычками и может включать произвольный текст, управляющие символы и спецификации преобразования данных. Список аргументов (с предшествующей запятой) может отсутствовать. Например:
#include <stdio.h> void main( )
{ printf ("\n Здравствуй, Мир!\n");
}
Директива #include <stdio.h>включает в текст программы описание (прототип) библиотечной функции printf(). (Если удалить из текста программы эту препроцессорную директиву, то появятся сообщения об ошибках и исполнимый код программы не будет создан. Среди параметров функции printf() есть в этом примере только форматная строка (список аргументов отсутствует). В форматной строке два управляющих символа '\n' - "перевод строки". Между ними текст, который выводится на экран дисплея:
Здравствуй, Мир!
Первый символ '\n' обеспечивает вывод этой фразы с начала новой строки. Второй управляющий символ '\n' переведет курсор к началу следующей строки, где и начнется вывод других сообщений (не связанных с программой) на экран дисплея.
Для изображения в программе соответствующих символьных констант используются комбинации из нескольких символов, имеющих графическое представление. Каждая такая комбинация начинается с символа ‘\’ (обратная косая черта - backslash). Такие наборы литер, начинающиеся с символа ‘\’, в литературе по языку Си называют управляющими последовательностями. Ниже приводится их список:
'\n'- перевод строки;
'\t' - горизонтальная табуляция;
'\r' - возврат каретки (курсора) к началу строки;
'\\' - обратная косая черта \;
'\n''- апостроф (одиночная кавычка);
'\'" - кавычка (символ двойной кавычки);
'\0'-нулевой символ;
'\а' - сигнал-звонок;
'\b'- возврат на одну позицию (на один символ);
'\f' - перевод (прогон) страницы;
'\v'- вертикальная табуляция;
'\?' - знак вопроса.
Итак, произвольный текст (не спецификации преобразования и не управляющие символы) непосредственно без изменений выводится на экран. Управляющие символы (перевод строки, табуляция и т.д.) позволяют влиять на размещение выводимой информации на экране дисплея.
Спецификации преобразования данных предназначены для управления формой внешнего представления значений аргументов функции printf(). Обобщенный формат спецификации преобразования имеет вид:
%фпажки ширина _поля.точность модификатор спецификатор
Среди элементов спецификации преобразования обязательными являются только два — символ '% ' и спецификатор.
В задачах вычислительного характера будем использовать спецификаторы:
d - для целых десятичных чисел (тип int);
u -для целых десятичных чисел без знака (тип unsigned);
f- для вещественных чисел в форме с фиксированной точкой (типы float и double);
е - для вещественных чисел в форме с плавающей точкой (с мантиссой и порядком) - для типов double и float.
В список аргументов функции printf() включают объекты, значения которых должны быть выведены из программы. Это выражения и их частные случаи - переменные и константы. Количество аргументов и их типы должны соответствовать последовательности спецификаций преобразования в форматной строке. Например, если вещественная переменная summa имеет значение 2102.3, то при таком вызове функции
printf("\n summa=%f", summa);
на экран с новой строки будет выведено: summa=2102.3
После выполнения операторов
float с, е ;
int к;
с=48.3; к=-83; e=16.33;
printf ("\nc=%f\tk=%d\te=%e", с, к, e);
на экране получится такая строка:
с=48.299999 к=-83 e=1.63300e+01
Здесь обратите внимание на управляющий символ \t (табуляция). С его помощью выводимые значения в строке результата отделены друг от друга.
Для вывода числовых значений в спецификации преобразования весьма полезны "ширина поля" и "точность".
Ширина_поля - целое положительное число, определяющее длину (в позициях на экране) представления выводимого значения.
Точность - целое положительное число, определяющее количество цифр в дробной части внешнего представления вещественного числа (с фиксированной точкой) или его мантиссы (при использовании формы с плавающей точкой).
Пример с теми же переменными:
printf ("\nc=%5.2\tk=%5d\te=%8.2f\te=%11.4e", c, k , e, e) ;
Результат на экране:
с=48.30 к= -83 e= 16.33 e= 1.6330e+01
В качестве модификаторов в спецификации преобразования используются символы:
h - для вывода значений типа short int;
I - для вывода значений типа long;
L - для вывода значений типа long double.
Ввод данных.Для ввода данных с клавиатуры ЭВМ в программе будем использовать функцию (описана в заголовочном файле stdio.h):
scanf {форматная_строка, список_аргументов);
Функция scanf() выполняет "чтение" кодов, вводимых с клавиатуры. Это могут быть как коды видимых символов, так и управляющие коды, поступающие от вспомогательных клавиш и от их сочетаний. Функция scanf() воспринимает коды, преобразует их во внутренний формат и передает программе. При этом программист может влиять на правила интерпретации входных кодов с помощью спецификаций форматной строки. (Возможность форматирования условно отмечена в названии функции с помощью литеры fв конце имени.)
И форматная строка, и список аргументов для функции scanf()обязательны. Форматную строку для функции scanf() будем формировать из спецификаций преобразования вида: