Шафеева практика С
.pdfФедеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования
«Омский государственный технический университет»
Практикум по программированию на языке С
Методические указания к лабораторным работам
Омск 2008
Составители: Ольга Павловна Шафеева, канд.техн.наук, доцент, Каворина Юлия Геннадьевна, ст. гр. ИВТ325; Шукурова Гульмира Смагуловна, ст. гр. ИВТ325
Рассмотрены основы алгоритмизации решения задач и программирования на языке СИ. Приводятся примеры разработки алгоритмов и программ для задач разного уровня сложности. Содержатся графические схемы проектируемых алгоритмов.
Предназначены для выполнения студентами лабораторных работ по дисциплинам "Основы алгоритмизации и программирования", "Программирование на языке высокого уровня".
В подготовке методических указаний и отладке программ приняли также участие студенты группы ИВТ325 Грязнова Е.С., Каскевич А.В.
Печатается по решению редакционно-издательского совета Омского государственного технического университета.
УДК 004.43 ББК 32.973.26-018.1
© О.П. Шафеева, 2008 © Омский государственный
технический университет, 2008
2
ВВОД-ВЫВОД В ЯЗЫКЕ СИ. СТРУКТУРА ПРОГРАММЫ
Для реализации лабораторных работ необходима среда Borland С/С++3.1 (3.2). Ее запуск производится через файл bс.exe (BС\BIN\bс.exe). При этом откроется окно редактирования с меню (приложение А).
1. Подготовить в окне редактирования программу, состоящую из одной главной функции:
#include <stdio.h> /* подключение библиотеки <stdio.h> */ void main() /* заголовок главной программы */
{
int x, y, z; /* объявление переменных целого типа */ x = 5; y = 6; /* операторы присваивания */
z = x + y;
printf("сумма =%d\n", z); /* стандартная функция вывода из библ.<stdio.h> */
}
Сохранить программу в файле: имя0_1.с или имя0_1.cpp . Откомпилировать (F9), при необходимости исправить ошибки путем
установки маркера на нужное сообщение и нажатия клавиши <Enter>. Для перехода к другой ошибке нажать <F6> или <F8>, к предыдущей ошибке –
<F7>.
Выполнить программу (Ctr+F9 ), посмотреть результаты ( Alt+F5 ). Дополнить вывод значениями z в восьмеричной и шестнадцатеричной
системах счисления. Сохранить (F2).
2. Вычислить Z1 = X + Y++; Z2= ++X + Y; [4] с выводом на печать (сохранить под именем0_2.с):
x = значение, y = значение, z = значение <звонок>.
3. Заменить операции присваивания исходных данных оператором ввода scanf. Предусмотреть задания числа позиций для вывода и выравнивание по левому краю для параметра z [1, 6, 7].
Шаблон для ввода:
%[*][длина][модификатор] символ преобразования.
Символы преобразования:
d (или i) – используется для вывода целого десятичного числа (int), u – десятичное целое без знака,
f – вещественное число в естественной форме (float),
e (Е) – вещественное число в экспоненциальной форме,
g (G) – наиболее короткая запись числа из двух форм e или f, c – для вывода отдельного символа,
s – для вывода строки символов,
3
o – восьмеричное число,
x – шестнадцатеричное число (буквы строчные), X – шестнадцатеричное число (буквы прописные). Сохранить программу в файле имя0_3.с.
Выполнить для трех примеров, записать полученные результаты.
4. Создать программу для ввода, сложения, умножения, деления и вывода вещественных чисел с типами double и float. Использовать для вывода символы преобразования f, e, E, g, G, задание длины и точности, составные операции +=,*=, /=.
Шаблон для вывода:
%[флажок][длина][.точность][модификатор] символ преобразования.
Записать полученные программы в файлы: имя0_4.с и имя0_5.с. Выполнить для трех примеров, записать полученные результаты.
Порядок выполнения лабораторных работ
1.Изучить теоретические сведения по теме.
2.Построить схему алгоритма для решения задач в соответствии с вариантом, выданным преподавателем, для каждого задания.
3.Подготовить текст программы и набрать его в окне редактирования.
4.Откомпилировать программу (F9) и исправить синтаксические ошибки.
5.Выполнить программу для реальных исходных данных (Ctrl+F9).
6.Просмотреть результаты (Alt+F5) и записать в тетрадь.
7.Оформить отчет по текущей лабораторной работе, в который включить:
-номер работы (лабораторная работа № 1),
-тема работы,
-условия задач,
-схемы алгоритмов,
-тексты программ,
-результаты выполнения программ, выводы.
8.Защитить лабораторную работу преподавателю.
Лабораторная работа 1
Основы программирования в среде языка СИ. Оператор присваивания
Оператор присваивания имеет вид <идентификатор> = <выражение>;
В арифметических выражениях могут использоваться операции (приложение Б) и математические функции из библиотек <stdlib.h> и
<math.h> [7].
4
Наиболее часто применяются функции библиотеки <math.h>:
double |
sin(double x) – sin x; |
double exp(double x) |
– ех ; |
|||
double |
cos(double x) – cos x; |
double log(double x) |
– ln х; |
|||
double |
tan(double x) – tg x; |
double log10(double x) – lg х; |
||||
double fabs(double x) |
– |x|; |
long labs(long x) – |x| для целого x; |
||||
double sqrt(double x) – |
|
|
|
double pow(double x, double y) – xy; |
||
|
х ; |
|||||
double |
sinh(double x) – sh x; |
double cosh(double x) – сh x; |
||||
double tanh(double x) – th x; |
double atan(double x) – arctan х; |
|||||
double |
acos(double x) – arccos x; |
double asin(double x) – arcsin x; |
||||
double ceil(double x) |
– ближайшее целое, не меньшее, чем х; |
double floor(double x) – ближайшее целое, не превышающее х; double fmod(double x, double y) – остаток от деления нацело x на y;
double modf(double x, double *ptr) - расчленение числа с плавающей точкой на целую и дробную части. Дробная часть возвращается функцией. Целая часть записывается в область памяти, на которую указывает ptr.
Приоритет операций в выражении
Ранг |
Операции |
Ассоциативность |
1 |
( ) [ ] -> :: . |
→ (слева – направо) |
2 |
! ~ + - ++ -- & * |
← (справа - налево) |
3 |
.* ->* |
→ |
4 |
* / % |
→ |
5 |
+ - |
→ |
6 |
<< >> |
→ |
7 |
< <= >= > |
→ |
8 |
== != |
→ |
9 |
& |
→ |
10 |
^ |
→ |
11 |
| |
→ |
12 |
&& |
→ |
13 |
| | |
→ |
14 |
?: |
← |
15 |
= *= /= %= += -= &= ^ = |= <<= >>= |
← |
16 |
, |
→ |
Таблица типов данных С/С++ приведена в приложении В. |
Пример 1. Вычислить площадь прямоугольника по длинам его сторон А и В. Обозначим площадь переменной S, необходимо найти S=A*B.
Программа набирается в окне редактора С++ и компилируется (F9). Сначала подключаются библиотеки
5
#include <stdio.h> |
|
// для ввода/вывода |
|
#include <conio.h> |
// для функций работы с экраном |
|
|
void main () |
|
// Заголовок главной программы |
|
{ |
|
|
|
int A=2, B=3, S; // объявление переменных целого типа |
|
||
clrscr(); |
// |
вызов функции очистки экрана |
из библиотеки |
<conio.h> |
|
|
|
S=A*B ; |
// оператор «выражение» |
|
|
printf ("\n Площадь прямоугольника = %d\n", S); |
// вывод |
getch(); // вызов функции задержки работы до нажатия любой клавиши
}
В результате выполнения программы (Ctrl+F9) на экран выводится сообщение:
Площадь прямоугольника = 6.
Пример 2. Найти площадь равностороннего треугольника. Если стороны треугольника имеют размер А, то его площадь S = A2 sin(π/3)/2. Схема алгоритма (СА) для этой задачи (рис.1) выполнена по ГОСТ 19.701-90
(прил. Г [2]). |
|
|
|
Текст программы: |
|
|
|
#include <math.h> |
|
Начало |
|
#include <stdio.h> |
|
|
|
|
|
|
|
#include <conio.h> |
|
Ввод |
|
#define PI 3.1413 |
//директива постановки |
А |
|
void main() |
|
|
|
{
float A,S; //объявление переменных плавающего типа clrscr(); //очистка экрана
printf ( " Введите А"); scanf ("%f",&A); S=A*A*sin(PI/3)/2;
printf (" Результат : S=%6.2f для A=%f\n", S, A); getch();
}
После выполнения программы на экран выводится: Результат: S = 10.83 для А = 5.
S |
А 2 |
sin |
|
|
2 |
3 |
|||
|
|
Вывод
S
Конец
Рис.1
Предварительно рассчитанный при подготовке к лабораторной работе на калькуляторе результат для А = 5 составил S = 10.8253, что подтверждает верность программы.
6
Задание 1 (программа 1_1)
№ |
x1 |
x2 |
a |
b |
c |
|
|
|
|
|
|
|
|
|
Вычислить |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
1 |
2 |
3 |
4 |
5 |
6 |
|
|
|
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
w ae |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
1 |
1 |
2 |
1.5 |
2 |
-0.7 |
|
x cos (bx) c5 |
|||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
y |
|
|
|
|
|
|
sin x |
|
c ln ax |
|||||||||||||||||||||||||||||||||
2 |
1 |
2 |
0.7 |
- |
2.1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||
1 a2 sin 2 x |
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
0 |
2 |
2 |
1.2 |
1 |
|
z |
|
a b esin x c |
|||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
4 |
1 |
2 |
4.1 |
-2.3 |
- |
|
w |
|
|
x3 a2 cos 2x |
||||||||||||||||||||||||||||||||||||||
|
x |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
a b sin 3x |
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
5 |
-1 |
1 |
0.5 |
2 |
1.5 |
y bx2 ea x2 a |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
x 1,5 |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ax x 4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
6 |
2 |
4 |
0.5 |
1.3 |
- |
|
|
z e |
|
x a |
||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
x |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x b |
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||
7 |
0 |
2 |
0.5 |
1 |
- |
w e a2 |
|
|
|
|
|
|
|
|
|
|
ebx |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
x 1 |
x 1 |
||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
8 |
-1 |
1 |
2.7 |
1.7 |
- |
y |
|
|
|
|
|
|
|
a2 |
|
|
|
|
|
|
|
|
ln( a bx) |
|||||||||||||||||||||||||
|
(x 2) e bx |
|||||||||||||||||||||||||||||||||||||||||||||||
9 |
0 |
π/2 |
2 |
0.7 |
0.5 |
z a3 cos (bx sin 2 |
x) 3 |
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
|
c |
|||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
10 |
1 |
0 |
0.5 |
2.9 |
1.5 |
w |
|
ax 2 x cos(bx) |
|
|||||||||||||||||||||||||||||||||||||||
bx e x sin( bx) c |
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
y e ax |
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
11 |
1 |
2 |
1.5 |
-1.2 |
- |
|
ax b sin 2x |
|
|
|||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
z e bx sin( cx b) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
12 |
1 |
2 |
0.5 |
1.7 |
2 |
|
bx a |
|
||||||||||||||||||||||||||||||||||||||||
13 |
-1 |
1 |
0.5 |
1.2 |
- |
w 2 x arctg(x a) 3 bx cos bx |
||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
e 2x (x b) |
||||||||||||||||||||||||
14 |
1 |
2 |
0.5 |
3.1 |
- |
y |
|
|
|
|
ax sin 2 x |
|
|
|||||||||||||||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7
1 |
2 |
3 |
4 |
5 |
6 |
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
15 |
1 |
2 |
0.5 |
3.2 |
- |
z e2x ln( a x) b3x lg( b x) |
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
0 |
1 |
1 |
2 |
4 |
|
|
w |
|
|
|
x a |
|
|
|
3 |
|
x |
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
a |
bx3 cx2 |
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
17 |
0 |
1 |
1 |
3 |
- |
|
|
|
y |
|
|
b ex 1 |
|
|
|
||||||||||||||||||
|
|
|
a x |
|
x tgx |
|
|
|
|||||||||||||||||||||||||
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
18 |
-1 |
2 |
1 |
2 |
- |
|
|
|
|
z |
a cos(x b) |
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x4 / 2 sin 2 x |
|
||||||||||||||||||
|
|
|
|
|
|
w |
|
|
|
(b |
|
|
|
|
) (x2 |
|
|
|
c |
|
|||||||||||||
19 |
1 |
2 |
2 |
3 |
1 |
|
ln |
|
|
|
x |
|
|
|
|
) |
|||||||||||||||||
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||
|
|
|
|
|
|
x / 4 |
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
20 |
-1 |
1 |
2 |
π/6 |
0,5 |
|
|
y |
a cos (x b) |
2x |
|
||||||||||||||||||||||
|
|
|
|
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
c sin 2 x |
|
|
|
Задание 2 (программа 1_2)
1.Идет k секунда суток. Определить, сколько целых часов (h) и целых минут (m) и секунд (s) прошло к этому моменту.
2.Определить площадь трапеции с основаниями а, b, высотой h и
объем усеченного конуса, если считать а, b - площадями оснований.
3.Определить координаты центра тяжести трех материальных точек с массами m1,m2,m3 и координатами (x1,y1), (x2,y2), (x3,y3).
4.Вычислить по заданному радиусу R объем шара и площадь круга, найти соотношение между ними.
5.Вычислить медианы треугольника по заданным сторонам a, b, c.
6.Вычислить площадь поверхности и объем конуса по заданным радиусам и высоте h.
7.По заданному радиусу найти объем шара и площадь поверхности.
8.Вычислить, какая идет секунда суток при положении стрелок в h часов, m минут и s секунд, а также угол (в градусах) между положением часовой стрелки в начале суток и ее положением в указанный момент.
9.Ввести двузначное целое число х<15. Написать программу перевода его в восьмеричную систему счисления.
10.Ввести координаты двух точек (х1, y1), (x2,y2). Найти расстояние между ними.
8
Лабораторная работа 2
Программирование разветвленных алгоритмов. Операторы передачи управления
Структура условного оператора передачи управления:
if (<выражение>) <оператор 1> else <оператор 2>;
(Если) (иначе) - ключевые слова, где <условие> - это произвольное выражение логического типа, которое может принимать два значения: истина (TRUE) и ложь (FALSE);
<оператор> - любой оператор языка СИ, заканчивается точкой с запятой. Сокращенная форма условного оператора:
if (<выражение>) <оператор>;
Оператор безусловного перехода: goto <идентификатор-метка>;
Меткой является идентификатор. Метка размещается перед оператором С/С++, к которому выполняется переход и отделяется двоеточием (:).
Пример 1. Составить программу для начисления базовой зарплаты согласно следующему правилу: если стаж работы сотрудника менее трех лет, то зарплата равна 100$, при стаже работы от трех до 5 лет - 150$, свыше 5 лет зарплата повышается с каждым годом на 10$, причем при стаже, превышающем 20 лет, она составляет 300$.
Для программирования решения этой задачи определим математиче-
скую формулировку задачи: |
|
|
|
100, |
если ST < 3; |
ZP= |
150, |
если 3 ≤ST 5; |
|
150+ (ST -5)*10, если 5 < ST≤ 20; |
|
|
300, |
если ST > 20; |
где ZP - зарплата, ST - стаж работы. Далее построим СА (рис.2,а), ей со- |
||
ответствует |
следующая программа: |
|
#include <stdio.h> |
|
|
#include <conio.h> |
|
void main ()
{int ST; // ST - стаж (байтовый (целый) тип беззнаковый)
float ZP; |
// ZP - зарплата (плавающий тип) |
printf ("\n Введите стаж "); |
|
scanf ("%d",&ST); |
|
if (ST<3) ZP = 100;
else if (ST<5) ZP = 150;
else if (ST>=20) ZP=300; else ZP=150+(ST- 5)*10;
printf ("\n Зарплата = %10.2f$\n",ZP);
9
getch();
}
Оператор выбора switch позволяет в зависимости от значения какойлибо переменной или выражения (ключа выбора) выполнить те или иные операторы, помеченные соответствующими константами.
Структура оператора:
switch (<выражение> )
{
case <константа 1>: <группа операторов 1>; case <константа 2>: <группа операторов 2>;
. . .
case <константа N>: <группа операторов N> default: <операторы>;
}
Начало
Ввод
стажа
|
Да |
ZP=100 |
ST<3 |
|
|
|
|
Нет |
|
|
ST<=15 |
Да |
ZP=150 |
|
Нет
Да
ST>=20 ZP=300
Нет
ZP=100+(ST-5)*10
Вывод
ZP
Конец
а)
Рис.2
Начало
Ввод числа углов T
T
1..2 |
Не фигура |
|
3 Треугольник
4Четырехугольник
5
Пятиугольник
иначе Многоугольник
Конец
б)
где <выражение> - выражение (переменная) любого порядкового типа;
<константа> - константа того же типа, что и <выражение>; <оператор> - произвольный оператор C/C++.
10