Загрузил JeOeN

ЛабРаб С Шафеева

реклама
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«Омский государственный технический университет»
Программирование на языке С
Методические указания
к лабораторным работам
Омск 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()
{
А2

float A,S; //объявление переменных плавающего типа S 
sin
2
3
clrscr();
//очистка экрана
printf ( " Введите А");
Вывод
scanf ("%f",&A); // ввод
S
S=A*A*sin(PI/3)/2;
printf (" Результат : S=%6.2f для A=%f\n", S, A);
Конец
getch();
// из библиотеки <conio.h>
}
После выполнения программы на экран выводится:
Результат: S = 10.83
для А = 5.
Рис.1
Предварительно рассчитанный при подготовке к лабораторной работе
на калькуляторе результат для А = 5 составил S = 10.8253, что подтверждает верность программы.
6
№ x1
1
2
x2
3
a
4
Задание 1 (программа 1_1)
b
c
Вычислить
5
6
7
1
2
1.5
2
1
w  ae x cos (bx)  c5
-0.7
sin x
y
2
1
2
0.7
-
2.1
3
0
2
2
1.2
1
z
2
2
1  a sin x
 c ln ax
a  b  esin x  c
4
1
2
4.1 -2.3
-
x3  a 2 cos 2 x
w
x  a  b sin 3x
5
-1
1
0.5
1.5
y  bx 2 e a x  a x  1,5
 ax x 
4xa
x
xb
2
2
6
2
4
0.5
1.3
-
z e
7
0
2
0.5
1
-
w  e a
2
x  1  ebx 3 x  1
a2
8
-1
1
2.7
1.7
-
y
9
0
π/2
2
0.7
0.5
z  a 3 cos (bx sin 2 x)  3 c
( x  2) e
 bx
 ln( a  bx)
ax  2  x cos(bx)
10
1
0
0.5
2.9
1.5
w
11
1
2
1.5 -1.2
-
y  e  ax 3 ax  b sin 2 x
12
1
2
0.5
1.7
2
z  e bx sin(cx  b)  bx  a
13
-1
1
0.5
1.2
-
w  2 x arctg( x  a)  3 bx cos bx
14
1
2
0.5
3.1
-
y
7
bx  e  x sin( bx)  c
ax sin 2 x  e 2 x ( x  b)
1
2
3
4
5
6
7
15
1
2
0.5
3.2
-
z  e2 x ln(a  x)  b3x lg(b  x)
x  a 3 x
w
16
0
1
1
2
4
17
0
1
1
3
-
18
-1
2
1
2
-
z
19
1
2
2
3
1
w  ln (b 
20
-1
1
2
π/6
0,5
y
a  bx3  cx 2
b  e x 1
y
a  x x  tgx
a  cos( x  b)
x 4 / 2  sin 2 x
x ) (x2 
a cos ( x  b)
c  sin 2 x
c
)
a x/4
 2x
Задание 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: <операторы>;
}
Начало
Начало
Ввод
стажа
ST
Ввод числа углов T
Да
ST<3
T
ZP=100
Нет
ST<=15
Да
Не фигура
1..2
ZP=150
3
Треугольник
4
Четырехугольник
ZP=100+(ST-5)*10
5
Пятиугольник
Вывод
ZP
иначе
Нет
Да
ST>=20
ZP=300
Нет
Конец
Многоугольник
Конец
а)
б)
Рис.2
где <выражение> - выражение (переменная) любого порядкового типа;
<константа> - константа того же типа, что и <выражение>;
<оператор> - произвольный оператор C/C++.
10
Пример 2.Напечатать в зависимости от числа углов название фигуры
(треугольник, четырехугольник, пятиугольник, шестиугольник, многоугольник).
Вариант реализации задачи с применением оператора выбора представлен СА (рис.2,б) и следующей программой:
#include <stdio.h>
#include <conio.h>
void main ()
{
int T;
// T – число углов
clrscr();
// очистка экрана
printf ("Введите число углов ");
scanf ("%d",&T);
switch (T)
{
case 1: case 2 : printf ("Это не фигура\n ");
break;
case 3: printf ("С %d углами - треугольник\n ", T);
break;
case 4: printf ("С %d углами - четырехугольник\n ", T);
break;
case 5 : printf ("С %d углами - пятиугольник\n ", T );
break;
case 6: printf ("С %d углами - шестиугольник\n ", T );
break;
default : printf ("С %d углами - многоугольник\n ", T );
}
getch();
}
Задание 1 (программа 2_1)
Вычислить значение функции в зависимости от интервала, в который
попадает вводимый с клавиатуры аргумент:
1. Для t  [0,3],
где a=-0.5,b=2
2. Для x  [0,4],
где а=2.3
3. Для x  [0,7],
где a=-2.7,b=-0.27
z=
a t2 ln t
1
e a t cos b t
х
cos(x-a)
при x2,
при 0.3< x  2,
при x  0.3 ,
(a+b)/(ex+cosx)
(a+b)/(x+1)
ex+sinx
при 0  x2.3,
при 2.3 x5,
при 7  x  5 ,
5
f=
z=
при 1  t  2 ,
при t<1,
при t>2,
xa
11
4. Для i  [7,12],
где a=2.2,b=0.3.
5. Для x  [0.9,5],
где a=1.5
6. Для t  [-1.4],
где a=2.1,b=0.37.
y=
a i4 + b i
tg(i + 0.5)
e2i + a 2  i 2
 x2 - 7/x2
y=
ax3 + 7 x
lg(x + 7 x )
at 2  b sin t  1
z=
at + b
at 2  b cos t  1
7. Для x  [0,6],
где a=1.5.
y=
8. Для x  [1,2],
y=
где a=1.8,b=-0.5, c=3.5
9. Для t  [1,5],
где a=2.5
10. Для x  [0,4],
где a=1,b=3.
11. Для t  [0.5,3],
где a=1.3,b=6.5
12. Для x  [0,2],
где b=-2.9
13. Для x  [0.5,2]
где a=-0.8
14. Для x  [1,2],
где b=1.3.
z=
a esin x +2.5
ecos x + a
при i< 10,
при i = 10,
при i >10,
при x<1.3,
при 1.3  x3,
при x  3 ,
при t<0.1,
при 0.1 t 2,
при t  2 ,
при x<0.3,
при 0.3 x<4,
(sin x)/ (a + ex)
a/x + b x2 - c
(a + bx)/ x  1
при x  4,
при x  1.2 ,
при x>1.2,
t3 t a
t sin a t
e-at cos a t
при t>a,
при t=a,
при t<a,
y=
e-bx sin b x
сos bx
e-ax cos b x
при x<2.3,
при 2.3  x  3 ,
при x  3,
z=
a t2 – b t  1
a-b
2/3 3
a t - t 1
при t<a,
при a  t  b,
при t>b,
y=
|e-2x sin bx|
cos bx
e-x cos bx
при x >1,
при x = 1,
при x < 1,
z=
sin (cos a x)
tg ax
a2 x
при x >1,
при x = 1,
при x < 1,
ln bx - 1/(bx+1)
y=
bx + 1
ln bx +1/(bx+1)
12
при x < 1.3,
при 1.3  x  1.7,
при x > 1.7,
15. Для x  [-1,1],
где a=2.5,b=-0.9.
z=
ax2+bx2/3
a x2
b x2/3
при x<0.1,
при x=0.1,
при x>0.1.
16. Ввести координаты точки (x, y). Напечатать, в каком квадранте
или на какой оси координат находится эта точка.
17. Ввести радиусы R1, R2 и высоту. Вычислить объем усеченного конуса: h(S1  S1S2  S2 ) / 3 , где S- площадь оснований. Если R1 = R2 - объем
и площадь цилиндра, если R1 = 0 или R2 = 0 - объем (hπr2) и площадь
πr(
r
2
 h 2 ) поверхности конуса.
18. Ввести с клавиатуры цифру. Определить, какой системе счисления
она может принадлежать.
19. Ввести число. Определить, делится ли оно нацело на два, три или пять.
20. Ввести a, b, h. Если h=0, вычислить площадь прямоугольника; при
a = b, найти площадь квадрата; в противном случае подсчитать площадь
трапеции.
Задание 2 (программа 2_2)
1. Определить остаток от деления на восемь введенного числа х и
написать восьмиричную цифру прописью.
2. По цифре, введенной с клавиатуры, напечатать название этой цифры.
3. С клавиатуры ввести число k (1..30). Определить, какому дню недели оно соответствует, если первое число - понедельник.
4. Ввести число и номер месяца. Напечатать дату прописью.
5. Идет k секунда суток. Вычислить, сколько прошло часов и полных
минут к этому моменту, при этом согласовать со значением слова (час, часа, часов, минута, минуты, минут).
6. В зависимости от номера (N) типа фигуры, организовать ввод необходимых данных и вычислить при N = 1 - площадь круга, N = 2 - объем
шара (4/3πR3), N=3 -объем цилиндра, N = 4 - площадь поверхности сферы 4πr2.
7. Ввести число N (0 ≤ N ≤ 15). Определить и напечатать шестнадцатеричную цифру, ему соответствующую.
8. Для целого числа К (1…99) напечатать фразу « Мне К лет », при
определенных значениях К слово «лет» заменить словом «год» или «года».
9. В зависимости от номера (N) типа фигуры, организовать ввод необходимых данных и вычислить при N = 1 - площадь прямоугольника, при
N=2 - площадь параллелограмма, при N = 3 - площадь трапеции 1/2(a+b)h.
В последнем случае напечатать: является ли трапеция параллелограммом
или ромбом.
13
10. Перевести число 0 ≤ х ≤ 31 в шестнадцатеричную систему счисления.
11. Напечатать прописью остаток от деления любого целого числа на пять.
12. По введенному номеру напечатать нужный цвет в радуге.
13. Спроектируйте программу, которая показывает, что, если сумма цифр двузначного числа кратна трем, то и само число делится на три без остатка.
14. Разработайте программу, которая доказывает, что квадрат двузначного числа k5 (последняя цифра - 5), равен k * (k + 1) * 100 + 25 (т.е.
может быть получен умножением старшей цифры k на следующую по порядку и припиской «25»). Например, 35 * 11 = 3*4*100 + 25.
Для задания 2 номер варианта определяется остатком от деления
индивидуалного варианта на число 12.
Лабораторная работа 3
Программирование циклических алгоритмов с заданным
числом повторений
Оператор цикла с счетчиком:
for (<выражение1> ; <условие выполнения> ; <выражение2>) <оператор>;
где <выражение1> - это выражение инициализации цикла (может содержать несколько операторов, разделенных запятыми);
<выражение2> - изменение параметра цикла (не обязательно целое).
Пример 1. Вычислить сумму элементов s=1+1/4+1/9+1/16+... .
На основе анализа изменения параметра знаменателя определим алгоритм решения задачи (pис. 3) и напишем программу:
#include <stdio.h>
#include <conio.h>
Начало
void main ()
{
Ввод N
float s = 0, r;
int i,N;
clrscr();
//очистка экрана
S=0
printf ("\n Введите N ");
scanf ("%d",&N);
i=1, N
for ( i=1; i<=N; i++ )
{
Вывод S
r = 1.0/ (i*i);
r =1/i2
s+ = r; // s = s + r
}
S=S + r
Конец
printf ("Сумма = %6.2f\n ",s);
getch();
Рис.3
}
14
Пример 2. Вычислить значения двух функций F1(x) = tg(x) и F2(x) =
sin(x) в n точках, равномерно распределенных на интервале a ≤ x ≤ b, где a
= -π/4, b = π.
Для реализации первого варианта данной задачи разработана СА
(pис. 4) и cледующая программа:
#include <stdio.h>
Начало
#include <conio.h>
#include <math.h>
Ввод
# define b 3.1415
a,b,N
void main ()
{
ax=| b-a | / (n-1),
float F1, F2, x, dx, a = - b/4; // dx - шаг изменения x
х=а
int i, n; // i - переменная цикла
clrscr(); // очистка экрана
i=1, N
printf ("Введите число точек \n");
x=a
scanf ("%d", & n);
dx = fabs(b-a)/(n-1);
F1=tgx, F2=sinx
x = a;
printf (" ___________________ \n");
Вывод
printf ("| I | X | F1 | F2 | \n");
i, x, F1,F2
printf ("|---|--------|--------|--------|\n");
for ( i=1; i<=n; ++i )
// оператор цикла
x= x + dx
{ F2 = sin(x);
F1 = tan(x);
// вычисление tg x
printf (" |%3d| %8.3f |%8.4f| %8.4f|\n", i, x, F1, F2);
x=x+dx;
// x += dx
Конец
}
printf (" ____________________ \n");
Рис. 4
getch();
}
Если точки не нумеровать, можно в цикле применить параметр х и шаг
изменения dx. Тогда во втором варианте программы оператор цикла имеет вид: for ( x = a; x <= b + dx/2; x+ = dx ) { . . . }
Задание 1 (программа 3_1)
Для заданных с клавиатуры значений переменных x и n вычислить
1. X = 1 + 1/2 + 1/3 + ... + 1/10.
2. Z = 2. 4. 6. 8. ... .20.
3. Y = -x + 4x - 9x + ... - 81 x..
4. Y = x + x/3 + x/5 + ... + x/17.
. . . .
5. Y = n! = 1 2 3 ... n.
6. Y = 1 - 3 + 32 - 33 + . . . + 310.
20
7. Y=  x2/(2i-1).
i 5
10
8. Z =  (x+i)/i.
1 2
15
15
9. Y=  x2/i.
i 1
10. Y = 1 + x/2 + x2/4 + x3/6 + ... + xi/2i + ... + x9 /18 .
10
11. Y = 1 + x2/1! + x4/2! + x6/3! + … + x20/10! = 1 +  x2i/i!.
i 1
3
5
n
2n-1
12. Y = 1 - x +x /3! -x /5!+ ...+(-1) x /(2n-1)!+ ... +x11/11!.
13. е = 1 + 1/1! + 1/2! + ... + 1/n! + ... (сравнить результат со значением
функции EXP(1), определенной в Паскале).
14. π = 4(1-1/3+1/5-1/7+…+(-1)n/(2n+1)+…) (результаты сравнить с
определенным в языке Паскаль числом Pi).
15. Y = arctg x = x - x3/3 + x5/5- ... + (-1)n x2n+1/(2n+1)+ ... (|х|<1).
16. Z = LN(1+x) = x - x2/2 + x3/3 - ... + (-1)n-1 xn/n + ... (|x|<1).
17. S = x - x3/3! + x5/5! - ... +(-1)n x2n+1/(2n+1)! + ... .
18. Вычислить суммы положительных и отрицательных значений функции z =
cos(nx + a) sin(nx-a), где n = 1,2,...,5, a и x - вещественные числа.
19. Вычислить сумму четных и сумму нечетных чисел натурального ряда до N.
n
20. Найти сумму факториала M=  i !.
i 1
Задание 2 (программа 3_2, программа 3_3)
Вычислить значения двух функций в n равномерно распределенных в
диапазоне а≤x≤b точках. Результаты оформить в виде таблицы.
№ п/п
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
a
0
1
-1
-2
0
-
-1
-4
1
1
0
-
0
1
2
2
0
1
3
1
b
2
2
5
5


3
4
3
4
2


2
4
4
5
2
4
3
n
20
18
15
14
16
20
20
12
15
20
20
18
16
12
10
16
18
F1(х)
sin x cos x
1+2x+5
4e-|x|-1
| x+10|5
2 sin 2x +1
2-cos x
2-x/100
x3e2x
ex  1
1/(1+ x )
5-3 cos x
|sinx|+|cosx|
e-x+cos2x
e-x lg x  1
x cos x/2
x
2 lg x - 3x lg x
3-x/50
e2x 3 x - sin x
2x arctg x 5
x 1
16
15
18
F2(х)
sin x + cos x -1
(x-1)3
cos x
e-(x+5)
(x+5)3 (1+sin2x)
x4
20/(1+x2)
ex sin x
x ln2 x
2x/(1-4x)
1  sin 2 x
|sin x| - |cos x|
e -2x
x + sin x
3x +
2 e -x
ctg x
x e -x +ln x
10/(2+x2)
e axx
е2x lg x - 33x
Лабораторная работа 4
Программирование циклических алгоритмов с предусловием
Цель работы: научиться разрабатывать и отлаживать программы с
неразветвленными и разветвленными циклами, управляемыми условиями.
Структура оператора цикла с предусловием (с предварительной проверкой условия):
while ( <выражение>) <оператор>;
где <выражение> - это любое логическое выражение, <оператор> - это
произвольный оператор Си, в том числе и составной.
Пример. Для трех значений а = 0.1, 0.2, 0.3 протабулировать функцию y=a.tg(x/4) при изменении аргумента x на интервале [0.5,0.9] с шагом, равным a.
Для СА (рис.5) решения данной задачи программа может быть следующей:
Начало
#include <conio.h>
#include <stdio.h>
#include <math.h>
а=0,1
void main ()
{
float a,x,y;
a<=0,3; x=0,5
clrscr();
printf ("-------------------------------\n");
х≤0,9
printf (" a|
x|
y |\n");
printf ("-------------------------------\n");
y=tg( x/4)
a=0.1;
while (a<=0.31)
{
printf ("%5.2f\n",a);
Вывод
x = 0.5;
a, x, y
while (x<=0.91)
{
y=a*tan(x/4);
х = х+а
printf (" %12.2f| %10.2f\n",x,y);
x=x+a; // x+=a;
а = а+0,1
}
printf("-------------------------------\n");
a=a+0.1; // a+=0.1;
Конец
}
getch();
Рис.5
}
Второй вариант программы можно реализовать через циклы ….
17
Задание 1 (программа 4_1)
Начертите структурную схему алгоритма, напишите и отладьте программу для табуляции следующих функций:
1. S = a e-xsin ax+ ay
при -1 <= x <=1 с шагом 0.2,
a = 0.75,
1<=y <=5 с шагом 1.5.
2. Z = 5 a.x. y 2 + 1,3 sin(x-a) при 2 <=x <=5 с шагом 0.5,
a = 1.9,
-1<=y<=1 с шагом 0.5.
3. S = t  1 e2 t ycos(t-a)
при 1<=t<=2 с шагом 0.2,
a = -2.1,
2<= y<=3 с шагом 0.3.
при 1<= x<=2 с шагом 0.2,
0<= t<=1 с шагом 0.2.
4. Z = bx t  b (tx+2.1)
b = 3.5
2
x 2e x / 2 ,
Z=
ex / a 1
если 0 <= x <= 2,
если 2 < x <= 3.6,
Y=
sin ax - lg( a 2  x 2 ) ,
a cos2(px),
2 - sin ax,
если 0.1 <=x <= 0.4,
если 0.4 < x <= 1.2,
если 1.2 < x <=1.6,
a = 1.0; 1.5,
шаг dx=a/5.
ln(a+x2/ a ) ,
2 e2x ,
если 0 <=x <= 2,
если 2 < x <= 3.6,
a=1.0; 1.3; 1.6,
шаг dx=a/4.
если 0.1 <= x < 0.5,
если
x = 0.5,
если 0.5 < x <= 1.5,
a = 2; 2.1,
шаг dx=a/10.
если 0 < x<= 3,
если 3 < x <= 4,
a = 1; 1.5,
шаг dx=a/2.
если -1 <=x <= 0,
если 0 < x < 1,
если
x = 1,
a = 0.7; 1,
dx=(a+0.2)/2.
если 1 <= x <= 2.5,
если 2.5 < x <= 4,
a = 0.5; 1.0,
шаг dx=a/2.
если 0.5 <= x < 1.5,
если x = 1.5,
если 1.5 < x <= 3,
a=0.1; 0.2; 0.3,
шаг dx=2a.
5.
6.
7. Z=
2
8.
a(ex+2a+e-(x-3a),
Z = sin x,
a + a cos(x+3a),
9.
Z=
-a ex-3a,
-a(1+ln(x-3a)),
10.
- (x+3a)2 - 2a,
Y = a cos(x+3a) - 3a,
a ex,
11.
Z=
a(x-a)3/2,
a/2(ex/a+e-x/a),
a = 0.50; 0.75,
шаг dx=a/2.
.
a x 2 1
12.
x
,
Y = a cos x,
(a x2 + 1)x,
13.
Z=
(sin2x +a)2 ea sinX ,
tg(x/4),
если 0.1<=x<= 0.5,
если 0.5 < x <=0.9,
18
a=0.1;0.2;0.3,
шаг dx=a.
14.
tg(a2 +sin px),
Y = a sin(p- cos px),
lg x,
если 0 <= x <= 1,
если 1 < x <= 2,
если 2 < x < 3,
a=0.5; 0.75; 1;
шаг dx=a/4.
15. Z= ecos x -a sin2(px),
a x2 - cos px,
если 0.5 <= x <= 1.5
если 1.5 < x <= 2
a=0.1;0.7;1.3,
шаг dx= a/4.
16.
1/x,
Y = ln(x2+ ax),
x2,
если 0.1 <= x <= 0.4
если 0.4 < x <= 1.2
если 1.2 < x < 1.6
a = 1.0; 1.5,
шаг dx = a/5.
17. Дана непустая последовательность различных натуральных чисел,
за которой следует нуль (признак конца последовательности). Определить
порядковый номер наименьшего из них и его значение.
18. Найти первый отрицательный член последовательности cos (ctg),
где n = 1,2,3,... . Напечатать его номер и значение. Распечатать всю последовательность
19. Вычислить наибольший общий делитель (k) натуральных чисел d
и f. Оператор FOR не использовать.
20. Дан ряд неотрицательных вещественных чисел. Определить, сколько из них
больше своих «соседей»: предыдущего и последующего чисел. Признаком окончания
ряда чисел считать появление отрицательного числа.
Задание 2 (программа 4_3)
Модифицировать (изменить) программу 3_2 для вычисления функций
F1(x) и F2(x) с применением вместо счетного цикла оператора цикла с
предусловием. Выполнить ее и сравнить результаты с полученными в предыдущей работе.
Лабораторная работа 5
Программирование циклических алгоритмов
с постусловием
Стpуктуpа оператора цикла с постусловием
do {<операторы>} while (<условие выполнения>);
Пример. Вычислить 15 значений функций y1(x) = tg(x); и y2(x) =
ctg(x) при a ≤ x ≤ b, a=0.6*Pi, b=0.7*Pi.
Для вычислений разработана СА (рис.6) и следующая программа:
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
19
{
int n=14;
float a=0.6*M_PI, b=0.7*M_PI;
float x, y1, y2, dx;
clrscr();
dx=fabs((a-b)/n);
x=a;
do
{
y1=tan(x);
y2=1/y1;
printf ("x= %6.4f y1= %7.4f y2= %7.4f\n",x,y1,y2);
x=x+dx;
}
while (x<=b);
getch();
}
Пример 2. Вычислить сумму элементов
s = 1+1/4+1/9+1/16+... c точностью до
E = 0.00001 (рис. 7).
#include <stdio.h>
#include <conio.h>
void main ()
{
float E=0.00001;
float s, r;
// s- сумма, r-слагаемое
int i;
// счетчик слагаемых
s = 0;
i = 1;
do
{
r = 1.0/(i*i);
// вычисление слагаемых
s = s + r;
// s+ = r;
i++ ; // i = I +1;
}
while (r>E);
// сравнение слагаемых с Е
printf ("Сумма=%9.5f\n",s); // вывод суммы
getch();
}
Начало
n = 14, a = 0.6π
b = 0.7π
dx = | (a-b)\n |,
x=a
x
y1 = tg x ,
y2 = ctg x
Вывод
x, y1, y2
x = x+dx,
x>b
Конец
Рис.6
Начало
E =10-5,s=0, i=1
R = 1/i2
r≤E
s = s+r, i = i+1
Вывод s
Конец
Рис.7
20
Задание 1 (программа 5_1)
Модифицировать программу 3_2 для вычисления функций F1(x) и F2
(x) с применением оператора цикла с постусловием. Выполнить ее и сравнить результаты с полученными ранее.
Задание 2 (программа 5_2)
Начертить структурную схему алгоритма, написать и отладить программу для одной из следующих задач.
1. Вычислить приближенное значение z = arctg x и сравнить с
x - x3/3 + x5/5 - ... + (-1)nx2n+1/(2n+1) + ... (|х|<1), прекращая вычисления,
когда очередной член по абсолютной величине будет меньше eps=0.00001.
2. Вычислить y = x - x2/2 + x3/3 - ... + (-1)n-1xn/n + ...
с точностью
eps=0.00001, где |x|<1. Сравнить результат с вычисленным через стандартную функцию значением y = LN(1+x).
3. Вычислить y = 1 + x/1! + x2/2! + ... + xn/n! + ... с точностью
eps=0.00001 и срав-нить результат с вычисленным через стандартную
функцию значением y = ЕXP(x).
4. Вычислить y = sin x = x - x3/3! +x5/5! -...+ (-1)nx2n+1/(2n+1)!+... с
точностью eps=0.00001.
5. Вычислить y = 1 - x2/2! + x4/4! - ... + (-1)n x2n /(2n)! + ... с точностью
eps = 0.0001 и сравнить результат с вычисленным через стандартную
функцию значением y = cos (x).
6. Найти произведение цифр заданного натурального числа.
7. Определить число, получаемое выписыванием в обратном порядке
цифр заданного натурального числа.
8. Определить номер первого из чисел sin x, sin(sin x), sin(sin(sin x)), .. ,
меньшего по модулю 10-3.
9. Дана непустая последовательность различных целых чисел, за которой следует нуль. Определить порядковый номер и величину наибольшего
среди отрицательных чисел этой последовательности.
10. Вычислять периметры и площади прямоугольных треугольников
по длинам катетов, пока один из заданных катетов не окажется нулевым.
11. Дана непустая последовательность положительных целых чисел, за
которой следует отрицательное число (это признак конца последовательности). Вычислить среднее геометрическое этих чисел.
12. Дана непустая последовательность ненулевых целых чисел, за
которой следует нуль. Определить, сколько раз в этой последовательности
меняется знак.
13. Числа Фибоначчи (fn) определяются формулами
f0 = f1 = 1; f n = f n-1 + f n-2 при n = 2,3,... .
Вычислить сумму всех чисел Фибоначчи, которые не превосходят 1000.
21
14. Дана непустая последовательность положительных вещественных
чисел х1, х2, х3,..., за которыми следует отрицательное число. Вычислить
величину
х1 + 2х2 + ... + (N-1)xN-1 + N хN, где N заранее не известно.
15. Вычислить длины окружностей, площади кругов и объемы шаров
для ряда заданных радиусов. Признаком окончания счета является нулевое
значение радиуса.
16. Определить, есть ли среди цифр заданного числа одинаковые.
17. Определить, является ли заданное натуральное число палиндромом, т. е. таким, десятичная запись которого читается одинаково слева
направо и справа налево.
18. Вычислить наименьшее общее кратное натуральных чисел a и b.
19. Дано число L. Определить первый отрицательный член последовательности х1, х2, х3,..., где х1= L, xi = tg(xi-1).
20. Определить, является ли заданное натуральное число совершенным, т.е. равным сумме всех своих (положительных) делителей, кроме
самого этого числа (например, совершенное число 6=1+2+3).
Задание 3 (программа 5_3)
Модифицировать программу 4_1 с использованием оператора цикла с постусловием do … while и сравнить с полученными результатами в работе 4.
Лабораторная работа 6
Программирование алгоритмов обработки одномерных массивов
Цель работы: научиться разрабатывать и отлаживать программы с
использованием регулярных типов (векторов).
Массив – набор элементов, способных хранить данные одинакового
типа. Объявляя массив, необходимо сначала указать тип хранимых данных, имя массива и его размер в квадратных скобках. Размером массива
называется количество его элементов.
<класс><тип><идетификатор>[конст. выраж1][конст. выраж2]…;
Квадратные скобки здесь обязательны, константное выражение в
квадратных скобках задает количество элементов в массиве (размерность)
по каждому измерению. Число измерений определяется числом квадратных скобок. Индексирование элементов в языке Си начинается с нуля.
Пример. Найти значение и номер наименьшего элемента в одномерном массиве. При задании элементов исходного массива типизированной
константой СА решения задачи имеет вид (рис.8, а) и используется следующая программа:
22
Начало
Начало
Задание
массива А
Ввод
а1
min = a1 ,
n=1
min=a1 ,
n=1
i=2,10
i = 2,10
ai<min
Ввод
аi
Нет
Да
Вывод
min, n
Нет
min=ai ,
n=i
Конец
min >ai
Да
min=ai ,
n=i
Вывод
min, n
Конец
b)
a)
Рис.8
#include <conio.h>
#include <stdio.h>
void main ()
{
int a[10] = {5,2,7,1,8,3,4,5,6,6};
int i, min, n;
min = a[0];
n = 0;
for (i=0; i<10; i++)
{
if (a[i]<min)
{
min = a[i];
n=i+1;
}
}
23
printf ("минимальный элемент %d-й равен %d\n ", n, min);
getch();
}
Если элементы массива вводятся с клавиатуры, то СА имеет вид
(рис.8,б) и текст программы изменится:
#include <stdio.h>
#include <conio.h>
void main ()
{ int a[10];
int i, min, n;
printf(“Введите элементы массива: ”);
scanf ("%d",&a[0]);
min = a[0];
n = 1;
for (i=1; i<10; i++)
{
scanf ("%d", &a[i]);
if (a[i]<min)
{
min = a[i];
n = i+1;
}
}
printf ("минимальный элемент %d равен n= %d\n ", n, min);
getch();
}
Задание 1
Начертить структурную схему алгоритма, написать и отладить программу для одной из следующих задач. В программе 6_1 исходные массивы задать типизированными константами. В программе 6_2 элементы исходных массивов ввести через оператор ввода.
1. Дан массив из N чисел (N<12). Вычислить среднее геометрическое значение.
2. Дан массив из N чисел (10<N<15). Найти максимальное значение.
3. Дано 20 чисел. Найти их среднее арифметические значение.
4. Дано 12 вещественных чисел. Найти порядковый номер того из них, которое
наиболее близко к какому-нибудь заданному целому числу Х.
5. Дана последовательность из 15 целых чисел. Определить количество отрицательных чисел в ней и максимальное число подряд следующих отрицательных чисел.
6. Дано 15 целых чисел. Найти наибольшее из них. Определить,
сколько из чисел принимает наибольшее значение.
7. Дано целое n>1 и вещественные числа x1,x2,..,xn. Вычислить математическое ожидание и дисперсию по формулам
24
n
M=  xi / n ,
i 1
n
D=  ( xi  M ) 2 /( N  1) .
i 1
8. Дан массив из N чисел (8<N<12). Вычислить сумму элементов с
нечетными индексами и их среднее арифметические значение.
9. Даны два одномерных массива А и В. Вычислить элементы массива
С по правилу: если аi и bi различны, то сi присвоить их сумму, при одинаковых аi, bi в сi переписать соответствующий элемент массива А.
10. Дано 10 вещественных чисел. Вычислить разность между максимальным и минимальным из них.
11. Дано 10 вещественных чисел. Определить, образуют ли они возрастающую последовательность.
12. Дан массив X из n чисел (6<n<10). Вычислить:
y = x1 - x2 + x3 - ...- xn-1 + xn .
13. Дано 18 чисел. Определить, количество элементов, отличных от последнего
числа.
14. Дано 12 чисел. Напечатать сначала все отрицательные , а затем все остальные.
15. Сформировать одномерный массив из 15 простых чисел.
16. Дано восемь натуральных чисел. Найти их наибольший общий делитель.
17. Дана последовательность натуральных чисел. Вычислить сумму
тех из них, порядковые номера (индексы) которых - простые числа.
18. Дан массив из 20 натуральных чисел. Вычислить сумму тех из них,
порядковые номера которых - числа Фибоначчи, определяемые формулами
f0 = f1 = 1; fn = fn-1 + fn-2 при n = 1, 2 ,3 ,... .
19. Дан массив X из n чисел. Вычислить:
y = xn(xn+xn-1)(xn + xn-1 + xn-2)...(xn + ... + x1) .
20. Дано 24 целых числа. Распечатать их в обратном порядке по
шесть чисел в строке.
Задание 2 (программа 6_3)
Модифицировать программу 3_2 для функций F1(x) и F2 (x) таким
образом, чтобы результаты были сформированы в виде трех одномерных
массивов. Выполнить ее и сравнить результаты с полученными в лабораторных работах 3 и 4.
Лабораторная работа 7
Обработка двумерных массивов
Цель работы: научиться разрабатывать и отлаживать программы с
использованием матриц.
Массив можно представить как ряд или последовательность данных, а
можно как таблицу, данные которой распределены по строкам и столбцам.
В двумерном массиве, одна размерность соответствует строкам, а вторая
25
столбцам. При объявлении массива каждая размерность представляет собой дополнительный индекс.
Описание двумерного массива (матрицы):
<класс><тип><идетификатор>[конст. выраж1][конст. выраж2]…,
<идетификатор>[конст. выраж1][конст. выраж2]…;
Пример. Вычислить суммы элементов
в столбцах двумерного числового массива
А размером [1..3,1..4].
Текст программы для СА (рис. 9):
#include <stdio.h>
#include <conio.h>
void main ()
{
int a [3][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4}};
int s[4];
// массив сумм
int i, j; clrscr();
for ( j=0; j<4; ++j)
{
s[j] = 0;
for ( i=0; i<3; ++i )
s[j] = s[j] + a[i][j];
printf (" s[%d] = %d ", j, s[j]);
}
getch();
}
Задание 1 (программа 7_1)
Начало
Задание
А(3х4)
j=1, 4
sj =0
i=1,3
sj=sj +aim
Вывод
sj
Конец
Рис.9
1. Даны матрицы A,B [1..4,1..4] вещественных чисел. Вычислить матрицу С поэлементным сложением соответствующих элементов матриц А и В.
2. Дана матрица B[1..5,1..5] вещественных чисел. Найти для нее
транспонированную матрицу.
3. Даны матрица A[1..4,1..4] вещественных чисел и константа К. Вычислить матрицу С=А*К.
4. Сформировать массив по правилу
1 0 0 ... 0
2 1 0 ... 0
3 2 1 ... 0
...
10 9 8 ... 1 .
5. Даны натуральное N и элементы квадратной вещественной матрицы А пятого порядка. Вычислить N-ю степень каждого элемента этой
матрицы
26
(аij1 = аij, аij2 = аij * аij, аij3 = аij2 * аij и т.д., где i, j = 1,2,...,5).
6. Сформировать массив по правилу 0 0 0 ...0
0 1 0 ...0
0 0 2 ...0
…
0 0 0 ...9 .
7. Сформировать массив последовательностью натуральных чисел:
1 2 ... 10
11 12 ... 20
21 22 ... 30
...
91 92 ... 100 .
8. Сформировать двумерный массив:
12345
51234
45123
34512
23451 .
9. Дана матрица A[1..N,1..N] целых чисел. Сформировать вектор В из
максимальных элементов каждой строки.
10. Дана матрица A[1..6,1..6] челых чисел и переменная Х. Элементы
нечетных строк матрицы А заменить на Х.
11. Дана матрица B[1..5,1..5]. Получить массив С удалением (либо обнулением) n-й строки и k-го столбца из матрицы В.
12. Определить, является ли заданная квадратная матрица девятого
порядка магическим квадратом, т. е. такой, в которой суммы элементов во
всех строках и столбцах одинаковы.
13. Определить, является ли заданная целая квадратная матрица шестого порядка симметричной (относительно главной диагонали).
14. Дана вещественная матрица A[1..7,1..4]. Переставляя ее строки и
столбцы, добиться того, чтобы наибольший элемент оказался в верхнем
левом углу.
15. Дана вещественная матрица размером 4х8. Упорядочить ее строки
по неубыванию сумм их элементов.
16. Для заданной целой матрицы размером 6х8 элементов напечатать
индексы всех ее седловых точек. Элемент матрицы называется седловой
точкой, если он является наименьшим в своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей
строке и наименьшим в своем столбце.
17. Дана матрица A[1..6,1..2] вещественных чисел. Рассматривая A
[i,1] и A [i,2] как координаты точек на плоскости, определить радиус
27
наименьшего круга (с центром в начале координат), внутрь которого попадают все эти точки.
18. Дан массив F[1..N,1..M] из целых малых величин, определить количество «особых» элементов в нем. Элемент считается «особым», если
он больше суммы остальных элементов своего столбца.
19. Дана матрица D[1..5,1..6] из целых чисел. Упорядочить элементы
строк в нем по убыванию.
20. Дан массив М координат точек на плоскости. Найти наибольшее
расстоя-ние между этими точками.
Задание 2 (программа 7_2)
Сформировать таблицу Пифагора.
Задание 3 (программа 7_3)
Модифицировать программу 6_3 таким образом, чтобы значения X, F1
и F2 были представлены двумерным массивом, состоящим из трех строк.
Лабораторная работа 8
Программирование с применением функций
Цель работы: научиться разрабатывать и отлаживать программы с
использованием подпрограмм (функций).
Объявление функции (прототип, заголовок) задает ее имя, тип возвращаемого значения и список передаваемых параметров. Определение
функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках:
[класс] тип имя ([список параметров])[throw (исключения)] {тело функции}
С помощью необязательного модификатора класс можно явно задать
область видимости функции, используя ключевые слова extern, static:
extern – глобальная видимость во всех модулях программы (по умолчанию);
static – видимость только в пределах модуля, в котором определена
функция.
Тип возвращаемого функцией значения может быть любым, кроме
массива и функции (но может быть указателем на массив или функцию).
Если функция не должна возвращать значение, указывается тип void.
Список параметров определяет величины, которые требуется передать
в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его
тип и имя (в объявлении имена можно опускать).
Механизм возврата из функции в вызвавшую ее функцию реализуется
оператором
return [выражение];
28
Пример. Даны три массива A (5), B (5), C (5). Найти среднее арифметическое значение наименьших элементов массивов.
До написания программы разрабатывается СА главной программы
(рис.10, а) и СА для подпрограммы нахождения наименьшего элемента в
любом массиве (рис.10, б). Отлаженная программа решения задачи имеет
следующий вид:
Начало
minim (d)
Задание
массивов
A,B,C
i=2,5
Вывод
min
sr=(minim(A)+
minim(B)+
+minim(C))/3
di <min
minim=min
Вывод
sr
min=di
Нет
Да
Конец
а)
Конец n/n
б)
Рис.10
#include <stdio.h>
#include <conio.h>
typedef int* mass; // переопределение типа: mass – указатель на целые
// функция вычисления минимального элемента в массиве
int minim (mass d)
{
int i, min;
min = d[0];
for (i=1; i<5; ++i)
if ( d[i]<min )
min = d[i];
printf ("минимальный элемент равен %d\n", min);
return min;
}
void main ()
{
int a[] = {5,2,7,1,8};
int b[] = {3,4,5,6,6};
29
int c[] = {3,8,5,2,6};
int n;
float sr;
sr = (minim(a) + minim(b) + minim(c)) / 3;
printf(" sr= %5.2f ", sr);
getch();
}
Задание 1 (программа 8_1)
Написать и отладить программы для задач из лабораторных работ 1 и
6 с применением подпрограммы - функции с параметрами. Вычисление
функции (или обработку массива) выполнить в подпрограмме, а ввод исходных данных и вывод результатов - в основной программе. Предусмотреть, по крайней мере, два обращения к функции с различными фактическими параметрами (двумя массивами).
Для отладки программ использовать средства среды Си (см. прил. А):
пошаговое исполнение программы (трассировку) с контролем значений
переменных в окне отладчика Watch.
Задание 2 (программа 8_2)
1. По заданным вещественным массивам A [1..6], B [1..6] и C [1..6]
вычислить
(max B)/max A + (max C)/max(B+C) при min A < max B,
 
max(B+C) + max C в противном случае.
2. Даны две квадратные вещественные матрицы шестого порядка.
Напечатать квадрат той из них, в которой наименьший след (сумма диагональных элементов), считая, что такая матрица одна.
3. Определить координаты центра тяжести трех материальных точек с
массами m1,m2,m3 и координатами (x1,y1), (x2,y2), (x3,y3) по формулам
xc = (m1x1+m2x2+m3x3)/(m1+m2+m3),
yc = (m1y1+m2y2+m3y3)/(m1+m2+m3).
Вычисление координаты оформить функцией с параметрами.
4. Вычислить все медианы для каждого из трех треугольников по заданным в массивах A, B, C сторонам: ma=0.5 2b 2  2c 2  a 2 , mb=
0.5 2a 2  2c 2  b 2 , mc=0.5 2a 2  2b 2  c 2 . Вычисление медианы оформить
функцией.
5. Даны три одномерных массива вещественных чисел A [1..6], B
[1..8] и С[1..7]. Найти общую сумму положительных элементов в массивах. Нахождение суммы элементов в массиве оформить функцией.
6. Даны два двумерных массива целых чисел с размерами (4х5) элементов. Подсчитать количество отрицательных элементов в каждом из них.
30
7. Даны два одномерных массива целых чисел A [1..8] и B[1..8]. Найти
сумму их максимальных элементов. Для нахождения максимального элемента в массиве использовать функцию.
8. Даны два двумерных массива целых чисел с размерами (5х5) элементов каждый. Подсчитать произведение элементов главных диагоналей
в каждом из них.
9. Даны три одномерных массива вещественных чисел A[1..6], B[1..8]
и С[1..7]. Найти среднее геометрическое значение положительных элементов для каждого.
10. Даны две матрицы целых чисел M[1..3,0..1], К[1..3,0..2]. Найти
среднее арифметическое значение для каждой из них.
11. Даны три одномерных массива целых чисел A[1..6], B[1..8] и
С[1..7]. Подсчитать количество неотрицательных элементов в каждом.
12. Даны две матрицы целых чисел S[1..3,0..2], К[1..3,0..2], в каждой
из которых имеется по два одинаковых числа. Распечатать их значения.
13. Даны два одномерных массива целых чисел A[1..6] и B[1..8]. Вычислить значение Z=(min A[i] + min B[j]) / min (A[i]+B[j]).
i
j
i, j
14. По заданным целым массивам X[0..7] и Y[8..15] вычислить
7
Z
7
 x i2
при  xi yi+8>0,
 yi2
в противном случае.
i 0
15
i 0
i 8
15. Дана матрица целых чисел D[1..6,1..5]. Найти наименьшую из
сумм неотрицательных элементов строк матрицы. Для вычисления суммы
использовать подпрограмму (функцию).
16. Дана матрица целых чисел E [1..3,1..5]. Используя функцию, найти
среднее геометрическое значение для каждого столбца матрицы.
17. Дана матрица целых чисел F [1..4,1..5]. Найти наименьшие значения элементов в каждой из строк матрицы с помощью функции.
18. Даны две квадратные вещественные матрицы шестого порядка.
Напечатать квадрат той из них, в которой наименьший след (сумма диагональных элементов), считая, что такая матрица одна.
19. Сформировать двумерный массив 1 2 3 4 5
1 4 9 16 25
1 8 27 64 125
...
.
Найти правило и оформить функцией вычисление любой строки.
20. Даны две матрицы целых чисел V [1..2,1..3], W [1..3,1..2]. Найти
суммы элементов строк и столбцов в этих матрицах.
31
Лабораторная работа 9
Программирование с возвратом из функций нескольких значений
Цель работы: научиться разрабатывать и отлаживать программы с
использованием функций, вычисляющих несколько значений.
Для возврата значений из функции можно использовать два способа.
Первый способ заключается в использовании глобальных переменных.
Второй способ позволяет возвратить одно значение с помощью оператора
return, а другие записать в ячейки памяти с указанными адресами. В
последнем случае в функцию необходимо передать адреса ячеек, куда надо
поместить значения. Это выполняется с помощью указателей.
Пример 1. Написать программу, функция в которой будет вычислять
квадрат и куб аргумента. (Одно значение будем возвращать из функции
оператором return, другое будет записываться по указателю int*.)
# include <stdio.h>
# include <iostream.h> // для потоковых функций ввода/вывода
int fun(int, int*);
// прототип функции
void main()
{
int a, kub, qv;
cin>>a;
// ввод из потока
qv=fun(a,&kub); //исходное число, адрес ячейки,
куда поместить второе значение
cout<<"для числа " << a<< "\t квадрат=" <<qv<<"\t куб=" <<kub; // вывод
}
int fun(int k, int* p)
{
*p=k*k*k; // значение куба помещаем по адресу *p
return k*k;
}
Пример2. Ввести три массива A[1..3], B[1..4], C[1..5] (подпрограммой).
Вычислить средние арифметические и геометрические значения в каждом
из них.
Для решения задачи pазpаботана СА (pис.11), состоящая из основной
программы (а) и двух подпрограмм: одной - для ввода элементов массива
(б), другой - для определения среднего арифметического и среднего геометрического значений в массиве (в), а также следующая пpогpамма для
реализации алгоритма:
#include <stdio.h>
#include <math.h>
#include <conio.h>
32
Начало
ka =
vvod(a)
Вывод
sr(ka,a,&ga)
kb =
vvod(b)
VVOD (d[])
sr (k, f[ ],*g)
Ввод
k
s=0, p=1
i=1,k
i=1,k
Вывод
sr(kb,b,&gb
)
Ввод di
s = s + fi, ;
p = p* fi
kc =
vvod(c)
return k
*g = k g
Вывод
sr(kc,c,&gc)
Конец п\п
return s/k
Конец п\п
Конец
а)
б)
в)
Рис.11
int vvod(int d[])
{
int i, k;
printf("Vvedite chislo elementov ");
scanf("%d",&k);
printf("Vvedite massiv is %d elementov \n", k);
for ( i=0; i<k; ++i )
scanf("%d", &d[i]);
return k;
}
float sr(int k, int f[], double *g)
{
int i;
33
long int s, p ;
s = 0; p = 1;
for ( i = 0; i<k; ++i )
{
s += f[i];
// s = s + f[i];
p *= f[i];
// p = p * f[i];
}
*g = pow((double)p, 1.0/k);
return ((float)s)/k;
}
void main ()
{
int ka, kb, kc; double ga, gb, gc;
int a[5], b[5], c[5];
clrscr();
ka=vvod(a);
printf("srA = %5.2f \t ", sr(ka,a,&ga));
printf(" srGA = %5.2f \n", ga);
kb=vvod(b);
printf("srA = %5.2f \t ",sr(kb,b, &gb));
printf("srGB = %5.2f \n", gb);
kc=vvod(c);
printf("srA = %5.2f \t ",sr(kc,c, &gc));
printf("srGC = %5.2f \n", gc);
getch();
}
Задание 1 (программа 9_1)
Написать и отладить программу для задачи из лабораторной работы 7
с выделением алгоритма обработки или формирования массива. Организовать вызов процедуры с параметрами-массивами для двух наборов исходных данных. (Для ускорения отладки массив можно задать константой).
Задание 2 (программа 9_2)
1. Даны массивы A [1..6], B [1..6], C [1..6], вычислить суммы положительных и отрицательных элементов. Получить А*B, B*С, А*C. Вычисление произведения массивов оформить подпрограммой.
2. Даны массивы A [1..5], B [1..6]. Получить новые массивы путем
сдвига элементов в массивах на два разряда вправо, освободившиеся слева элементы обнулить. Сдвиг элементов в массиве оформить подпрограммой, из подпрограммы вернуть выпавшие справа разряды.
3. Даны два одномерных массива А [1..6] и C [1..6]. Получить A2, С2,
А*С. Подсчитать число четных и число нечетных чисел в полученных
массивах. Перемножение массивов и подсчет выполнить в подпрограмме.
34
4. Даны матрицы целых чисел S[1..3,0..2], K[1..3,0..2], в которых имеется по два одинаковых числа. Найти и напечатать их значения и индексы.
5. Вычислить значение функции Z = x1+ex2, где x1, x2 - корни уравнения Aix2+Bix+Ci = 0, где i = 1,2,..,N. Коэффициенты уравнения заданы в
массивах A [1..N], B [1..n], C [1..N]. Для вычисления корней использовать
подпрограмму.
6. Составить подпрограмму для переменных двух квадратных матриц,
с помощью которой вычислить вторую, третью и четвертую степени матрицы M [1..5,1..5]. Для каждой матрицы вычислить сумму и среднее арифметическое значение элементов.
7. Даны массивы A [1..6], B [1..6], C [1..6]. Преобразовать их, каждому
элемен-ту массива, присваивая значение, соседнего с ним справа. Последнему элементу присвоить значение первого. Напечатать исходные, результирующие массивы и отдельно последние два элемента результирующего.
8. По заданным вещественным массивам A[1..6], B[1..6] и С[1..6] вычислить (minAi)/maxAi + (maxCi)/min(Ci) + max(B+C)I / min(B+C)i.
9. Даны массивы A [1..6], B[1..8]. Выбрать из них положительные элементы и записать соответственно в массивы A [1..k] и B [1..k], где k<6,
n<8; из отрицательных элементов сформировать массивы A2 [1..6-k],B2
[1..8-n]. Напечатать суммы и произведения элементов для каждого.
10. Даны массивы A [1..6], B [1..6], C [1..6]. Переставить элементы в
них таким образом, чтобы слева подряд были записаны отрицательные, а
справа положительные, подсчитать количество положительных и число
отрицательных в каждом массиве.
11. Даны две целые квадратные матрицы четного порядка. Элементы
массивов с четными номерами строки и столбца заменить нулем (стереть).
Напечатать исходные и полученные массивы, количество четных и число
нечетных чисел в каждом.
12. Даны одномерные массивы A[1..6], B[1..8], C[1..10]. Записать их в
виде матриц AA [1..3,1..2], BB [1..2,2..4], CC [1..5,1..2], найти наименьшие
элементы в каждой и напечатать их номера.
13. Даны две целые квадратные матрицы шестого порядка. Распечатать элементы главных диагоналей каждой из них и вычислить суммы
элементов отдельно главной и побочной диагоналей.
14. По заданным 10 элементам вещественных массивам A, B и С вычислить
(max (b i ))/max(a i )  (max(c i ))/min(b  c) i при minA i  minB i
z
max(b  c) i  min(c i ) при min A i  min B i
15. Даны матрицы целых чисел V (-1..2,0..3), W [1..3,0..2]. Сформировать из них одномерные массивы VV и WW, записывая элементы построчно. Напечатать индексы исходных мартиц для максимальных значений.
35
16. Дана матрица чисел H [1..5,1..6]. Переставить элементы в строкам
матрицы таким образом, чтобы они были расположены в порядке возрастания их модулей. Подсчитать сколько в исходных матрицах положительных и отрицательных чисел.
17. Дана матрица чисел G [1..2,1..6]. Переставить элементы в матрице
так, чтобы элементы каждого столбца матрицы были смещены циклически
вправо. Перестановку элементов в столбце реализовать подпрограммой,
напечатать два «выпавших» элемента.
18. Даны массивы A [1..6], B [1..6], C [1..6]. Упорядочить элементы в
них в порядке убывания их модулей, напечатать наименьшее и наибольшее значения.
19. Даны две матрицы целых чисел V [1..2,1..3], W [1..2,1..3]. Найти
общие суммы элементов строк, из функции вернуть две суммы.
20. Даны две целые квадратные матрицы шестого порядка. Вычислить
суммы элементов выше главной диагонали и ниже нее. Определить, можно
ли отражением относительно главной диагонали преобразовать одну в
другую.
Лабораторная работа 10
Обработка символьных и строковых данных
Символьный тип (char) – это тип данных, используемый для описания
отдельных символов (знаков, букв, кодов) [1,6,7] .
Основные функции преобразования символов <ctype.h>, ввода/вывода символов, строк (stdio.h) приведены в приложении Е.
Строка – это массив символов. В языке С строка представляет собой
массив элементов типа char, завершающийся признаком конца строки ‘\0’.
Основные функции для работы со строками (<string.h>):
unsigned strlen(const char *str);
(Определяет длину строки str.)
char *strcpy(char *sp, const char *si); (Копирует строку si в строку sp.)
char * strncpy(char *sp, const char *si, int kol); (Копирует первые kol символов строки si в строку sp).
int strcmp (const char *str1, const char *str2); (Сравнивает строки str1иstr2.)
int strncmp(const char *str1, const char *str2, int kol); (Сравнивает строку
str1 с kol символами str2.)
char *strcat (char *const char *si);(Объединяет строки (конкатенация).)
char * strncat(char *sp, const char *si, int kol); (Приписывает kol символов
строки si к строке sp )
char * strstr (const char *str1, const char *str2); (Ищет в строке str1 подстроку str2. )
char *strchr (const char *str, int c); (Ищет в строке str первое вхождение
символа с.)
36
char * strrchr (const char *str, int c); (Ищет в str последнее вхождение ‘с’)
int strpbrk (const char *str1, const char *str2); (Ищет в строке str1 первое
появление любого из строки str2.)
В приложении Е сведены функции для работы со строками [7] из
библиотек <string.h> и <stdlib.h>.
Пример: Ввести строку st1.Сформировать строку st2 перестановкой символов исходной строки в обратном порядке и заменой всех строчных латинских букв прописными.
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void main()
{
int i, j;
char st1[255], st2[255];
clrscr();
printf("Введите строки \n");
gets (st1);
// ввод строки
printf ("исходная строка : %s\n",st1);
j = strlen(st1)-1;
//максимальный индекс элемента в строке
for ( i=0; i<strlen(st1); ++i)
{
st2[i] = toupper(st1[j]);
// изменить регистр
j -= j;
// j = j-1
}
st2[i] = '\0';
// символ конца строки
printf("новая строка %s ",st2) ;
printf ("\n");
// перевод строки
getch();
}
Задание 1 (программа 10_1)
1. Дана строка из 20 символов. Вывести из нее на печать только
строчные буквы латинского алфавита.
2. Вывести на печать все строчные, а затем все прописные буквы русского и латинского алфавитов.
3. В заданной строке подсчитать частоту появления букв «a», «b».
4. Дан текст из 60 литер. Напечатать только строчные русские буквы,
входящие в этот текст.
5. Дана последовательность символов, содержащая символ «я». Определить порядковый номер символа «я» в последовательности.
37
6. Дана последовательность символов. Определить в ней символ, который по алфавиту предшествует другим.
7. Напечатать в алфавитном порядке все различные строчные буквы,
входящие в заданный текст из 100 литер.
8. Определить, является ли заданная последовательность символов в
строке симметричной: читается одинаково слева направо и справа налево.
9. Напечатать текст, образованный символами с порядковыми номерами 56, 89, 84 и 69 и текст с изменением регистра.
10. Даны две строки с1 и с2, содержащие до 5 цифр каждая. Преобразовать их к данным целого типа, используя процедуру VAL, вычислить
арифметическое выражение с3 = (с1-с2)/(с1+с2).
11. Вычислить суммы кодов всех букв, входящих в слова SUM и
ALFA. Сравнить слова и определить, какое из них больше.
12. Напечатать заданный текст с удалением из него всех букв b, непосредственно перед которыми находится буква с.
13. Имеется символьная переменная d, присвоить логической переменной T значение true, если значение d-цифра, и значение false в противном случае.
14. Если в заданный тексте входит каждая из букв слова key, тогда
напечатать «yes» , иначе – «no».
15. Написать программу, которая предварительно запрашивает ваше
имя, а затем приветствует вас по имени.
16. Ввести вещественное число, преобразовать его в строку. Подсчитать количество разрядов в целой и дробной частях. Найти представление
числа в виде мантиссы (по модулю меньшее единицы) и порядка.
17. Ввести строку, состоящую из нулей, единиц и десятичной точки.
Преобразовать ее в десятичное число.
Задание 2 (программа 10_2)
1. Дана строка, содержащая не более двадцати латинских букв. Все
вхождение «max» в ней заменить на «min» и «макс» на «мин». Подсчитать число таких замен.
2. Дана строка, содержащая сорок латинских букв. Подсчитать все
вхождение «abc» в строку и их удалить. Вывести на экран два варианта
полученных строк, заполняя образовавшую «дыру» последующими буквами с добавлением в конце пробелов, и, оставляя на месте удаленных символов пробелы.
3. Определить сколько различных символов входит в заданный текст,
содержащий не более 100 литер и оканчивающийся точкой.
4. Определить номера позиций гласных букв в заданном тексте.
5. Напечатать заданный текст из 60 символов, удалив из него повторные вхождения каждой литеры.
38
6. Дана строка, состоящая из слов, разделенных пробелами, в конце строки – точка. Определить, сколько в строке слов, содержащих четное число символов.
7. Дан набор слов на английском языке, разделенных пробелами, в
конце точка. Выделить в последовательности нечетные слова прописными
буквами.
8. Дан непустой текст из строчных букв, за которыми следует точка.
Определить упорядочены ли эти буквы по алфавиты. Напечатать результат
проверки и исходный текст прописными буквами.
9. Дана последовательность от двух до восьми слов, в каждом из которых от одной до десяти строчных букв; между соседними словами – не
менее одного пробела, за последним словом – точка. Напечатать слово с
максимальной длиной.
10. Дано несколько слов, в каждом из которых от одной до семи
строчных букв, между соседними словами – не менее одного пробела, за
последним словом – точка. Напечатать эти слова в алфавитном порядке.
11. Дана последовательность, содержащая от одного до восьми слов, в
каждом из которых от одной до пяти строчных букв; между соседними
словами – запятая, за последним словом – точка. Напечатать эту же последовательность, удалив из нее повторные вхождения слов.
12. В заданном тексте (слова разделены пробелами) поменять местами
первое и последнее слово.
13. Даны числа K и текст из слов, разделенных пробелами, в конце –
точка. Определить количество слов в тексте, состоящих из K букв.
14. Дана последовательность, содержащая от двух до десяти слов, в
каждом из которых от одной до восьми строчных букв; между соседними
словами – не менее одного пробела, за последним словом – точка. Напечатать те слова, в которых буквы слова упорядочены по алфавиту.
15. Дана последовательность, содержащая от двух до десяти слов, в
каждом из которых от одной до пяти строчных букв; между соседними
словами – запятая, за последним словом – точка. Напечатать эту же последовательность слов, но в обратном порядке.
16. В заданный текст входят только цифры и буквы. Определить, является ли текст десятичной, шестнадцатеричной или двоичной записью
целого либо вещественного числа (указать при выводе какого).
17. В заданном тексте найти и, если есть, напечатать все слова-палиндромы (слова, которые одинаково читаются слева направо и справа налево).
18. Дан текст из слов, разделенных пробелами, в конце - точка. Найти
слово наименьшей длины (содержащее наименьшей количество букв).
19. Разработать программу шифровки – дешифровки текста путем замены каждой буквы текста другой, с кодом на N больше (меньше) исходной.
20. Дана непустая последовательность слов, в каждом на которых от
одной до шести букв; между соседними словами – запятая, за последним –
39
точка. Напечатать те слова, у которых одинаковые «соседи». (Определить
процедуру, которая вводит очередное слово и присваивает его шестилитерной строке, а запятую или точку присваивает некоторой глобальной переменной).
Лабораторная работа 11
Файлы
Цель работы: создание, чтение и обработка файлов из программы.
Под файлом обычно подразумевается именованная область памяти на
внешнем носителе. Стандартная библиотека содержит три класса для работы с файлами:
Прежде чем читать информацию из файла или записывать в него,
нужно его открыть. В библиотеке <stdio.h> для этого имеется специальная
функция
FILE *fopen(char *fname, char *mode);
где *fname – имя файла, *mode – режим [1, 5, 6, 10].
Функция
возвращает указатель (ссылку) на файл, который должен быть предварительно описан.
Пример. Объявим указатели на переменные файлового типа
FILE *uin, *uout;
// (указатели на переменные файлового типа)
uin = fopen(“name1”, “r”); // открыть файл “name1” для чтения и далее
идентифицировать как uin
uout = fopen(”name2”, “w”); // открывается для записи и связывается с
идентификатором uout.
Если производиться открытие несуществующего файла, то он создается. Для открытия файла с именем test рекомендуется метод, который
позволяет определить ошибку при открытии файла [8,10].
# include <stdio.h>
// работа с файлами и константа NULL
(FILEOPEN.C)
# include <stdlib.h>
//для функции exit()
void main()
{
FILE *fp;
// fp – файловая переменная
if (( fp = fopen("test", "w"))==NULL)
{
puts("Не могу открыть файл\n");
// печать строки
exit(1);
}
puts("Файл открыт\n");
}
40
После окончания работы с файлом необходимо его закрыть функцией int fclose(FILE *fp) , которая возвращает нуль, если операция выполнена успешно, и иное значение в противном случае. Функция является рекомендуемой, поскольку файлы при нормальном завершении закрываются
автоматически.
Пример. Вычислить суммы элементов в столбцах двумерного числового массива А[1..2,1..4], заданного в файле FILE1.dat. Полученные значения
поместить в файл FILE2.dat. Для решения задачи разработана СА (рис.12)
Начало
Объявление
ф.п. f1,f2
Закрыть f1,
Открыть f2
j=1,4
Открыть
f1
Закрыть f2
Sj=0
i=1,2
Конец
i=1,2
j=1,4
Sj=Sj+aij
Ввод aij из
файла
f1
Вывод Sj
в файл f2
Рис.12
Программа:
#include <conio.h>
#include <stdio.h>
void main()
{
int a[2][4];
// объявление переменных
int s[4];
int i, j;
FILE * f1,* f2; // объявление файловых переменных
clrscr(); // очистка экрана
f1 = fopen("FILE1.dat", "r"); // открыть файл file1.dat для чтения
for(i=0; i<2; ++i)
for ( j=0; j<4; ++j )
41
fscanf(f1, "%d", &a[i][j]);
// чтение из файла, связанного с f1
fclose(f1); // закрыть файл, связанный с f1
// открыть файл для записи
f2 = fopen("FILE2.dat","w");
fprintf(f2, "1 2 3 4 – столбцы \n");
fprintf(f2, "суммы по столбцам \n");
for ( j=0; j<4; ++j )
{
s[j] = 0;
for (i=0; i<2; ++i)
s[j] = s[j] + a[i][j];
fprintf(f2, "%d", s[j]);
}
// на экран ничего не выводится
// результат действий программы в file2.dat
}
Задание 1 (программа 11_1)
Выполнить задачу из лабораторной работы 9, считывая исходные
данные из одного файла и записывая полученные результаты в другой
текстовый файл. Файл с исходными данными должен быть подготовлен
предварительно.
Задание 2 (программа 11_2)
1. В текстовом файле Т1 записана последовательность целых чисел,
разделенных пробелами. Написать программу, записывающую в текстовый файл Т2 все положительные числа из Т1.
2. В текстовом файле f1 записана последовательность чисел. Сформировать текстовый файл f 2, содержащий все числа в обратном порядке.
3. В текстовом файле Т1 записана последовательность чисел. Разработать программу, переписывающую в текстовый файл Т2 сначала все положительные числа из Т1, нуль, затем – все отрицательные числа.
4. В текстовом файле f 1 дана последовательность целых чисел, разделенных пробелами. Записать в тестовый файл F2 все положительные числа, а в файл F3 - отрицательные числа и нулевые элементы.
5. Сформировать файл из девяти строк, в первой из которых – одна
единица, во второй – две двойки,…, в девятой – девять девяток.
6. Даны два файла F1, F2. Сформировать третий файл F, в который
сначала записать все элементы файла F1, а затем – элементы файла F2.
7. Элементы каждого из заданных в двух файлах массивов X и Y упорядочены по возрастанию. Объединить элементы этих двух массивов в
один файл F с упорядочением их по возрастанию.
42
8. В заранее подготовленном файле K задан массив из 15 целых чисел.
Выделить в другой файл те элементы массива K, индексы которых являются степенями двойки.
9. В текстовом файле S1 записана последовательность из N*K чисел.
Написать программу, формирующую в файле S2 матрицу из N строк по K
чисел в каждой строке.
10. В файле W задан массив из девяти элементов. В новом файле WW
сформировать массив, в котором каждому элементу будет присвоено значение справа соседнего с ним. Последнему элементу присвоить значение
первого.
11. В файле D1 задана квадратная матрица вещественных чисел.
Сформировать файл D2, в котором поменять местами первую и последнюю строки матрицы.
12. В текстовом файле F подготовить последовательность целых чисел, разделенных пробелами. Написать программу, записывающую в текстовый файл FF все различные значения, встречающиеся в файле F.
13. В файле X задан массив из 20 чисел. Упорядочить его по возрастанию и занести в файл Y.
14. В файле X1 задана матрица целых чисел. Сформировать файл Х2,
в котором все элементы с четными номерами строки и столбца матрицы
заменить нулем (стереть).
15. Задана в файле строка текста. Выполнить все циклические сдвиги
слов в заданном тексте влево. Каждый полученный при этом текст вывести
в другой файл.
16. В файле Y1 задана матрица вещественных чисел. Сформировать
файл Y2, в котором строки матрицы упорядочены по убыванию элементов
первого столбца.
17. В файле дан текст из 20 символов. Напечатать сначала все цифры,
входящие в него, затем латинские буквы, далее русские буквы и все
остальные литеры, сохраняя при этом взаимное расположение символов в
каждой из четырех групп. Создать четыре новых файла, каждый из которых содержит свою группу символов.
18. Имеется текстовый файл BOOK. Написать программу, которая игнорирует исходное деление этого файла на строки, переформирует его,
разбивая на строки так, чтобы каждая строка оканчивалась точкой либо
содержала ровно 40 литер, если среди них нет точки.
19. Имеется текстовый файл T. Вывести в новый файл и напечатать
первую из самых коротких его строк.
20. Имеется текстовый файл, содержащий фразу. Написать программу,
которая считывает из файла литеры до первой точки и записывает их (без
точки) в другой текстовый файл, формируя в нем строки по 20 символов (в
последней строке литер может быть меньше).
43
Лабораторная работа 12
Структуры
Цель работы: научиться разрабатывать и отлаживать программы
с использованием комбинированного типа - «структура».
Структура может содержать элементы разных типов.
struct [имя_типа]
{
тип_1 элемент_1;
тип_2 элемент_2;
…
тип_n элемент_n;
} [список_переменных];
Элементы структуры называются полями структуры и могут
иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание
структуры служит определением элементов этого списка. Частными видами полей структуры являются побитовые поля и объединения (union).
Пример: Разработать программу формирования списка студентов с
указание М дат рождения и выборки студентов по году рождения.
#include <stdio.h>
#include <conio.h>
struct student
//определение нового типа
{
char name [15];
struct
// вложенная структура (запись)
{
unsigned den,mes;
unsigned int god ;
} denRogd;
};
void main ()
{
struct student z [20];
unsigned short g, i, n; // g- год
clrscr();
// очистка экрана
printf("Введите количество студентов");
scanf ("%u", &n);
for (i=0; i<n; ++i)
{
44
printf("Введите имя %u студента",i+1);
scanf ("%s", z[i].name);
printf ("Введите день рождения ");
scanf ("%u", &z[i].denRogd.den);
printf ("Введите месяц рождения");
scanf ("%u", &z[i].denRogd.mes);
printf ("Введите год рождения");
scanf ("%d", &z[i].denRogd.god);
}
printf ("Введите год для поиска ");
scanf ("%u",&g);
printf (" Список\n");
for ( i=0; i<n; ++i )
{
if (z[i].denRogd.god==g)
{
printf ("Имя студента ");
printf ("%s\n",z[i].name);
printf ("Дата рождения - ");
printf ("%u ",z[i].denRogd.den);
printf ("%u ",z[i].denRogd.mes);
printf ("%d",z[i].denRogd.god);
printf ("\n");
}
}
getch();
}
Задание 1 (программа 12_1)
1. Ввести оценки студента по 5 экзаменам. Определить средний балл
и подсчитать количество удовлетворительных, хороших и отличных оценок. Напечатать название предмета, если есть «неуд».
2. Дан список студентов и оценка каждого на экзамене (оценки на N
экзаменах). Подсчитать количество удовлетворительных оценок, хороших, отличных и средний балл в группе. Напечатать фамилии неуспевающих студентов.
3. Дан список студентов группы. Заполнить его следующими сведениями: фамилия, имя, отчество; имеет ли компьютер (если имеет, то какой
и с какого года). Подсчитать сколько студентов имеют ПК.
4. Сформировать список студентов группы со следующими сведениями: Фамилия, имя, отчество, знает ли языки программирования Turbo Pascal, Cи (если да, где обучался и сколько лет). Подсчитать, сколько студентов знают язык Си, сколько – Turbo Pascal, сколько - оба языка.
45
5. Сформировать список студентов группы, в котором указать фамилию (имя, отчество); город, в котором получил среднее образование (номер школы, если обучался в Омске). Подсчитать, сколько в группе иногородних студентов.
6. Сформировать запись «ключевые слова ТР»: слово и перевод. Подсчитать их количество. Организовать поиск: по ключевому слову - перевод и наоборот.
7. Сформировать телефонный справочник. По номеру организовать
поиск владельца и наоборот.
8. Сформировать запись «Даты - праздники». Организовать в программе ввод дат, подсчитать число праздничных дней и рабочих.
9. Сформировать запись «английское слово-перевод». Вводя слово
(английское или русское), найти перевод или выдать сообщение «нет в
словаре». По возможности предусмотреть пополнение словаря.
10. Сформировать запись «операторы ТР»: оператор, действие. Подсчитать их количество и количество операторов имеющих повторяющиеся
ключевые слова.
11. Сформировать запись «типы ТР»: имя, тип, операции, разрешенные в данном типе. Подсчитать количество разных операций и вывести
списки типов для каждой операции.
12. Сформировать пополняемую базу данных «Континент - страны»,
в которой указать столицы, численность населения, крупные города. Организовать поиск страны по городу, стран или городов на континенте.
13. В файле задан список книг (автор, название, год издания). Разработать программу выбора книг, выпущенных ранее заданного года.
14. Сформировать список граждан, в котором указать фамилию, имя,
отчество; адрес; профессию. Организовать в программе выборку и подсчет граждан с одинаковой профессией.
15. Сформировать список студентов группы, в котором указать фамилию, имя, отчество; день, число и месяц рождения. Организовать выборки
по месяцу и году рождения.
16. Дан список студентов группы. Заполнить его следующими сведениями: фамилия, имя, отчество; день, число и месяц рождения. Распечатать список в порядке возрастания дат рождения.
17. Сформировать базу данных «Единицы измерения», в которой указать название единицы, обозначение, назначение, соотношение. Организовать поиск по любому полю.
18. Разработать базу данных « География. Реки», в которой указать
название реки, местоположение, длину, глубину.
19. Разработать базу данных «Астрономия», в которой указать название звезды, величину, созвездие.
46
20. Разработать базу данных «Планеты солнечной системы», в которой указать название планеты, величину, удаленность, спутники.
21. Сформировать базу данных «Химические элементы», в которой
указать название элемента, формулу, группу, организовать выборки.
22. Ввести сведения о человеке: фамилия, имя, отчество, пол, национальность, рост, вес, дата рождения.
23. Ввести сведения о гражданине: Ф.И.О., дата рождения, ИНН, №
страхового свидетельства, № мед. полиса. Запрограммировать поиск.
24. Сформировать справочник о спортивных командах: название, город, число сыгранных игр, число очков, количество игроков.
Задание 2 (программа 12_2)
Дополнить программу 12_1 заполнением и обработкой файлов. Имя
файла вводить с клавиатуры в процессе работы программы.
Лабораторная работа 13
Модульное программирование
Пример. Найти соотношение между максимальными элементами
для массивов А и В.
Выделим вычисление наибольшего элемента в подпрограмму, которую вынесем в отдельный модуль.
#include <stdio.h>
#include <conio.h>
#include "r_pos.h" // подключение модуля из текущего каталога
int i;
void main()
{
int a[8], b[8];
int s;
clrscr();
printf("Введите массив A из 8 чисел типа int \n");
for ( i=0; i<8; ++i )
scanf("%d", &a[i]);
printf("Введите массивB из 8 чисел типа int\n");
for (i=0; i<8; ++i)
scanf("%d",&b[i]);
printf("Сообщение=");
printf(" max(A)/max(B) = %6.3f \n", (float)max(a)/max(b));
getch();
}
47
// Интерфейсная часть модуля r_pos
typedef int * mass;
int max(mass d);
extern int i;
// Исполняемая часть модуля
int max(mass d)
{
int mx;
mx = d[0];
for (i=1; i<8; ++i)
if (mx<d[i]) mx = d[i];
printf("%d:", mx);
return mx;
}
Задание (программы 13_1 и 13_2)
Для задач 8_3 и 9_2 разработать программы, скрыв подпрограммы в
отдельном файле (модуле), использовать ссылки на переменные, объявленные в другом модуле.
Лабораторная работа 14
Динамические структуры данных. Списки
Список - это набор связанных между собой динамических элементов.
Элемент односвязной динамической структуры данных состоит из
двух полей: информационного и указательного и описывается типом
«структура».
Очередь – частный случай линейного односвязного списка, для
которого разрешены два действия: добавление элемента строго в конец
списка, а извлечение (удаление) - строго из начала (головы) очереди.
Стек - частный случай линейного односвязного списка, для которого разрешено добавлять или удалять элемент только с одного конца
списка, который называется вершиной стека.
Пример. Задать списком строку, заканчивающуюся точкой. Подсчитать
число цифр в ней.
#include <conio.h>
#include <stdio.h>
48
typedef struct zv
{
char info;
struct zv * next;
} Zv;
void main()
{
Zv * P;
Zv * t;
char sym;
int k;
clrscr();
printf("Vvedite stroku i tochku ");
P=NULL;
do
/* заполнение стека
{
sym=getche();
t=malloc(sizeof(Zv));
t->next=P; P=t;
t->info=sym;
}
while(sym!='.');
*/
k = 0;
t = P;
while ( t!=0 )
{
if ( t->info >= '0' && t-> info <= '9' ) k = k+1;
t = t->next;
}
printf("\n");
printf("Цифр в строке - %d",k);
getch();
}
Задание 1 (программа 14_1)
1. Используя динамическую структуру список, подсчитать количество
русских строчных букв в строке.
2. Используя динамическую структуру список, проверить, является ли
он упорядоченным набором чисел.
3. Используя динамическую структуру список, подсчитать количество
цифр в заданном наборе символов.
49
4. В деке задать слово. Определить, является ли оно словомперевертышем.
5. Сформировать динамический список из элементов целого типа.
Удалить из него отрицательные элементы. Распечатать исходный и результирующий списки.
6. Найти сумму четных элементов списка, состоящего не менее чем из
двух элементов.
7. Используя динамическую структуру список, подсчитать сумму чисел в нем.
8. В динамическом списке из каждой группы подряд идущих одинаковых элементов оставить один.
9. Используя динамическую структуру список, подсчитать количество
четных чисел в заданном наборе символов.
10. Используя динамическую структуру список, подсчитать сумму отрицательных чисел в списке.
11. Сформировать очередь из элементов целого типа. Четные элементы
возвести в квадрат. Распечатать исходную и результирующую очереди.
12. Используя динамическую структуру список, подсчитать количество положительных и отрицательных чисел в списке.
13. Задать два динамических списка. Проверить их на равенство.
14. Используя динамическую структуру список для хранения символов, напечатать только русские буквы из текста.
15. Используя динамическую структуру, список для хранения символов, определить, является ли заданная фраза палиндромом.
16. Сформировать динамический список из элементов целого типа.
Определить, есть ли в списке хотя бы два совпадающих по ключевому полю элемента.
17. Используя динамическую структуру очередь, перевести введенную
последовательность чисел в слово, состоящее из кодов ASCII.
18. Удалить из списка все отрицательные элементы.
19. Используя динамическую структуру список, сохранить ряд чисел.
Удалить повторяющиеся элементы.
20. Построить динамический список из элементов целого типа с помощью датчика случайных чисел. Найти значение среднего элемента списка.
21. Используя динамическую структуру список, сохранить ряд чисел.
Удалить элемент с заданным номером.
22. Сформировать динамическую структуру «очередь», элементами
которой являются цифры. Извлекая элементы из очереди, напечатать их
двоичные эквиваленты.
23. Сформировать список динамических элементов, упорядоченный
по возрастанию. Включить в список новый элемент, сохранив свойство
упорядоченности.
50
24. Используя динамическую структуру стек, распечатать элементы в
обратном порядке.
25. Используя динамическую структуру "очередь", зашифровать содержимое текста: каждый символ заменить его кодом+1.
26. Используя динамическую структуру "стек", зашифровать содержимое текстового файла.
27. Используя динамическую структуру список, сохранить ряд чисел.
Удалить элементы с заданным ключевым полем.
Задание 2 (программа 14_2)
Реализовать задачу с использованием другой динамической структуры или придумать свою задачу, написать и отладить для нее программу.
Лабораторная работа 15
Графика
Цель работы: знакомство с графическими процедурами и функциями.
Пример: Пусть необходимо построить график циклоиды. Зададим ее
математическое описание:
x = a t - b sin t, y = a - b cos t,
при b<a циклоида получается укороченной, при b>a - удлиненной, b = a
дает обычную циклоиду.
При разработке программы необходимо перед выводом графической
информации на экран дисплея инициализировать графический режим с
указанием пути к графическому драйверу, а в конце программы его следует закрыть.
Поскольку в графическом режиме работы дисплея верхняя левая точка экрана имеет координаты (0,0), сместим ось 0Х на середину экрана, а
ось 0У - на 10 пикселей вправо. Для наглядности увеличим график путем
использования масштабных коэффициентов по каждой оси координат.
Кроме того, нужно помнить, что координаты точки в графическом режиме
могут быть только целого типа.
С учетом вышесказанного программа построения циклоиды имеет
вид
#include <graphics.h>
#include <conio.h>
#include <math.h>
void main()
{
int a = DETECT, b, k;
float x, y, t;
51
initgraph(&a,&b,"C:\\TC\\BGI\0");
setgraphmode(2);
setbkcolor(0);
setcolor(4);
moveto(0, 240);
linerel(625, 0);
getch();
setcolor(2);
line(10, 0, 10, 478);
setcolor(5);
getch();
moveto(10, 240);
t=0.0;
// текущее значение параметра t из задания
for ( k =0; k<200; ++k )
{
x = 0.4 * t - 0.5*sin(t);
y = 0.4 - 0.5*cos(t);
lineto(100*x + 10, 100*y + 240);
t = t + M_PI/32;
}
getch();
settextstyle(0, 0, 3);
outtextxy(50, 440, "График циклоиды");
getch();
closegraph();
}
Поскольку вычисляемые в программе координаты являются вещественными, то для их преобразования к целым значениям использована
функция TRUNC().
При разработке графических программ необходимо следить, чтобы
значения координат не выходили за пределы экрана. Для этого рекомендуется рассчитывать коэффициенты увеличения или уменьшения, а также параметры смещения изображения.
Задание 1 (программа 15_1)
Начертить графики функций F1(x) и F2(x) для результатов, полученных в программе 3_2.pas. На экран должен выводиться график с надписью
выводимой функции.
Задание 2 (программа 15_2)
Напишите и отладьте программу для одной следующих задач.
52
1. Подготовить и отладить программу вычерчивания квадрата, вписанного в окружность. Запрограммировать изменение цветов окружности.
2. Организовать вывод на экран разноцветных цифр поочередно горизонтально и вертикально.
3. Отладить программу вычерчивания нескольких окружностей заданного радиуса в произвольном месте экрана разными цветами. Предусмотреть их мерцание.
4. Разработать программу изображения точки, движущейся по косинусоиде (y = cos(x)).
5. Отладить программу рисования квадрата с диагоналями, пресекающимися в центре экрана. Создать иллюзию его уменьшения.
6. Начертить на экране картинку «круги на воде».
7. Изобразить движущийся на зрителя экран (прямоугольник).
8. Подготовить и отладить программу изображения правильного треугольника, вращающегося вокруг своей (любой) медианы.
9. Разработать программу вывода на экран компьютера пяти квадратов
по углам и в середине экрана. Запрограммировать поочередный вывод их
разными цветами.
10. Разными цветами в различных точках экрана выводить надпись
«TurboPascal» с изменением размера шрифта.
11. Изобразить трубу, образованную разноцветными окружностями.
12. Организовать вывод на экран названия континентов разными цветами в различных точках экрана готическим и обычным шрифтами.
13. Изобразить спутник (точку), вращающийся вокруг планеты.
14. Изобразить НЛО, приземляющийся в различных точках экрана.
15. Организовать вывод на экран разноцветных русских букв разных
размеров поочередно высвечивая или заполняя экран в хаотическом порядке.
16. Отладить программу вычерчивания графиков функций y = sin(x) и
y = sin(2x) разными цветами с разными осями координат.
17. Организовать вывод на экран формул химических элементов разными цветами в различных точках экрана.
18. Начертить на экране ряд геометрических фигур: квадрат, круг,
треугольник, прямоугольник, используя разные цвета.
19. Изобразить схематично на экране движущегося человечка.
20. Изобразить движение объекта по прямоугольной спирали.
ЗАДАНИЕ К РАСЧЕТНО-ГРАФИЧЕСКОЙ РАБОТЕ
Разработать схему алгоритма, написать и отладить программу для
расчета и построения графиков двух функций (результаты расчетов
должны храниться в виде массивов и распечатываться в виде таблицы)
53
[5]
необходимо выделить наибольшее и наименьшее значения для
каждой из функций. Добавить в нее решение нелинейного уравнения и
вычисления приближенного значения определенного интеграла по
заданию преподавателя.
Разработать программу нахождения корней уравнения f(x)=0 на интервале [a,b] с точностью e=0.001 (интервал подобрать или рассчитать самостоятельно). При реализации можно использовать метод половинного деления (бисекции) или метод хорд [9]:
1. x - 2e-x - x = 0.
3. 5x - ex -2x x = 0.
5. 2x - 3x - 2 = 0.
7. sin x + x - 3 = 0.
2. x2 - ln(x+1) + sin x -2 = 0.
4. 2x lg x - 3 = 0.
6. 0,5 + cos x - 2x sin x = 0.
8. x ex – 2 x2 - 1 = 0.
ln(x2  3) + 2x - 3 = 0.
9.
10. 2 ln(x+1) - x + 1 = 0.
11. tg x - ex+1 = 0.
13. x3 - 2x2 - 4 = 0.
15. 2
3 x2  1
12. 2 ln(x+1) + arctg x -3 = 0.
14. 5x2 - 2x ln x-7 = 0.
16. 2x3 - 3x2 - 4 = 0.
- 3 sin x = 5.
18. 2x sin2 x-3 x  cosx = 0.
20. x3 + 3x + 2 = 0.
17. 4x - sin2x -3 = 0.
19. 2 ln(x+1)-3 sin2x = 4.
Разработать программу для вычисления значения определенного интеграла на интервале [a,b] (a, b подобрать самостоятельно) численными
методами прямоугольников и трапеций [9] для следующих вариантов:
b
1.

3 x  1dx
b
 x  3dx
2
2.
a
 x e dx
 cosxe dx
x
a
e
10. 
a
 x tgdx
b
b
b
8.  x ln xdx
2
9.
e sin 2 xdx
11. 
 (1  x 2 ) dx
b
2x
a
12.
 ( x 3  1) dx
a
54
lg( x  1)
a
b
ln( x  1)dx
cos
a
a
x
dx
2  x3 )
 ( x 2  1) dx
6.
a
b
b
5.
2
1
a (
b
2 x
a
7.
3. 
a
b
4.
b
sin x
b
 (e  e
x
13.
16.
x
b
)dx
14.

a
a
b
b
 x sin( x)dx
17.
a
a
b

19.  (1  ln( x) )
1
a
x 2 arctg( x)dx
15.  (sin x  cos x) dx
cos x
b
arctg 2 ( x)
dx
x
b
18.
ln(1  x)
 (1  x2 ) dx
a
b
20. 
dx
a
a
1
( x  cos x )
dx.
Интервал интегрирования разбить равномерно на N>50 частей.
Библиографический список
1. Березин, Б.И. Начальный курс Си и С++ / Б.И. Березин, С.И. Березин. – М.: Диалог-МИФИ, 1996. – 288 с.
2. ГОСТ 19.701-90. ЕСПД. Схемы алгоритмов, пpогpамм, данных и
систем. – М.: Изд-во стандартов, 1991. – 26 с.
3. Кpячков, А.В. и дp. Пpогpаммиpование на С и С++. Практикум. /
А.В. Кpячков и дp. – М.: Радио и связь, 1997. – 344 с.
4. Макогон, В.С. Язык программирования Си для начинающих / В.С.
Макогон. – Одесса: НПФ "АСТРОПРИНТ", 1993. – 96 с.
5. Методы проектирования программ: Метод. указания / Сост. О. П.
Шафеева. –Омск: Изд-во ОмГТУ, 2004. – 32 с.
6. Павловская, Т.А. С/С++. Программирование на языке высокого
уровня / Т.А. Павловская. – СП-б: Питер, 2002. – 462 с.
7. Подбельский, В.В. Программирование на языке Си / В.В. Подбельский, С.С. Фомин. – М.: 2000 – 600 с.
8. Флоренсов, А.Н. Введение в программирование. Семантический подход: учеб.
пособие / А.Н. Флоренсов. – Омск: Изд-во ОмГТУ, 1998. – 220 с.
9. Численные методы: Метод. указания. / Сост.: О. Б. Малков, Е. Т.
Гегечкори. – Омск: Изд-во ОмГТУ, 1995. – 28 с.
10. Шафеева, О.П. Технологии программирования. С++: учеб. пособие / О.П. Шафеева. – Омск: Изд-во ОмГТУ, 2007. – 80 с.
11. Шилд, Г. Справочник программиста по С/С++. Учеб. Пособие / Г.
Шилд – М.: Издательский дом «Вильямс», 2000. – 448 с.
55
Приложение А
Главное меню
File
(Alt+F)
Файл
Edit
(Alt+E)
Редактор
Search
(Alt+S)
Поиск
Run
(Alt+R)
Выполнение
Compile
(Alt+C)
Компиляция
NEW
UNDO
FIND
RUN Ctrl-F9 COMPILE
Создать
Найти
Alt+BkSp
Alt-F9
Запуск на
новый Удалить
фрагмент выполнение Компиляция
файл
изменения REPLACE
файла из
PROGRAM
Заменить
окна
OPEN F3
REDO
RESET
Открыть
фрагмент
MAKE F9
Ctrl-F2
файл Восстановить
Условная
SEARCH
Перезапуск рекомпиляция
SAVE F2
AGAIN
изменения
программы
Сохранить _____________ Повторить
LINK Компофайл CUT Shift-Del
поиск
новать
GO TO
SAVE as... Убрать
Ctrl+F2
____________
Сохранить
фрагмент __________ CURSOR F4
под имев буфер GO TO LINE Выполнение BUILD ALL
до курсора Безусловная
нем … COPY Ctrl-Ins NUMBER
Перейти к
SAVE ALL Копировать
рекомпиляция
TRACE
INTO
Сохранить
строке
с
в буфер
всей програмF7
все
номером
мы
PASTE
Трассировка
__________
Shift-Ins
PREVIOUS с заходом в INFORВставить из
п/п
CHANGE
ERROR
буфера
MATION
Предыдущая
DIR
Информация
CLEAR
Смена
ошибка
Ctrl-Del
STEP OVER
каталога
Удалить
REMOVE
F8
PRINT
NEXT
фрагмент
Выполнение MESSAGE
Распечатать
ERROR
COPY
по строкам Убрать отчет
Следующая
DOS
EXAMPLE
без захода в об ошибках
ошибка
SHELL
Копировать
п/п
Выход
пример
в DOS
LOCATE
ARGUDOS QUIT
FUNCTION
MENTS
SHAW
Разместить
ALT+X CLIPBOARD
функцию
Открыть окно
Аргументы
буфера
56
с р е д ы Турбо Cu
Debug
Alt+D
Отладка
Project
проектирова
ние
(ALT+P)
Options
Window
Help
Alt+W
Alt+H
Alt+O
Параметры
Окна
Помощь
APPLICASIZE/MOVE
INSPECT
CONTION
Ctrl +F5
наблюдать OPEN
Приложение
Перемещение, TENTS
ALT+F4
PROJECT
изменение СодержаCOMPILER
Открыть
Параметры
размеров ние
проект
EVALUTRANSFER
ZOOM
F5
ATE/
INDEX
Переместиться Раскрыть
CLOSE
MODIFY
в выбранное
на экран Ключевые
PROJECT
слова
Ctrl-F4
MAKE
CASCADE
Закрыть
Вычислить/
Выполнить
Окна каскадом Shift+F1
проект
изменить
выбранные TILE
TOPIC
действия НепересекаCALL
SEARCN
ADD ITEM LINKER
ющиеся
STACK
Поиск
Добавить
Параметры
NEXT
F6
Ctrl-F3
темы
компоновщи- Следующее
Oкнo под- пункт
Ctrl+F1
ка
CLOSE
программы
DELETE
Alt-F3 ЗаLIBRARIAN
ITEM
Библиотечные крыть текущее PREVIOUS
TOPIC
WATCHES Удалить
параметры
CLOSE ALL
ПредыдуПараметры
пункт
DEBUGGER Закрыть все
щая тема
Отладчик
окна
TOGGLE
Alt+F1
LOCAL
DIRECTOMESSAGE
BREAKHelp
on
OPTOIN
Окно
RIES
POINT
Отдельные Каталоги ENсообщений Help
Обозначить опции
Справка о
VIRONMENT OUTPUT
точку преУсловия
Окно результата пользователе
рывания
INCLUDE
работы
WATCH
Ctrl+F8
FILES
Окно отладки ACTIVE
SAVE
FILE
Включить в Сохранение
USER
BREAKДействуюпрограмму параметров
SCREEN
POINTS
файлы
Пользов. экран щий файл
Точки
помощи
PROJECT
прерывания
Окно проекта ABOUT
Версия
LIST ALL
языка
Список всех
окон
57
Приложение Б
Операции языка С/С++
Вес
Знак
1
вызов функции
выделение элемента массива
выделение элемента структуры
или объединения
->
выделение элемента структуры
или объединения (объединения),
адресуемой (го) указателем
!
логическое отрицание
~
побитовое отрицание
изменение знака (унарный минус)
++
увеличение на 1 (инкремент)
-уменьшение на 1 (декремент)
&
определение адреса
*
обращение по адресу
(тип) преобразование типа
sizeof определение размера в байтах
*
умножение
/
деление
%
остаток от деления
+
сложение
вычитание
2
3
4
5
6
7
8
9
10
11
12
13
Наименование операции
( )
[]
.
<<
>>
<
<=
>
>=
==
!=
&
^
|
&&
||
?:
сдвиг влево
сдвиг вправо
меньше чем
меньше или равно
больше чем
больше или равно
равно
неравно
поразрядная операция "И"
«исключающее "ИЛИ"»
поразрядная "ИЛИ"
логическая операция "И"
логическая операция "ИЛИ"
условная операция
58
Тип
Порядок
операции
Выражение Слева
направо
унарные
Справа
налево

бинарные
арифметические
бинарные
арифметические
сдвига
Слева
направо
отношения
отношения
побитовая
побитовая
побитовая
логическая
логическая
тернарная
Слева
направо

Слева
направо
Слева
направо
Слева
направо






14
=
+=
-=
*=
/=
%=
<<=
>>=
&=
|=
15
^=
,
простое присваивание
присваиСправа
составные присваивания:
вания
налево
сложение с присваиванием
бинарные
вычитание с присваиванием
умножение с присваиванием
деление с присваиванием
остаток от деления с присваиванием
сдвиг двоичного числа влево с
(для двоприсваиванием
ичных
сдвиг двоичного кода вправо с пр. операндов)
побитовая операция "И" с присв.
поразрядная операция "ИЛИ" c
присваиванием
исключающее "ИЛИ" с присваив.
операция "запятая" (соединения)
тернарная

Приложение В
№Обозначение
1
2
3
4
5
6
7
8
9
Размер
(байт)
1
char,
signed char
unsigned char
1
short, short int,
2
signed short ,
signed short int
unsigned short,
2
unsigned short int
int, signed,
1, 2, 4
signed int
unsigned,
1, 2, 4
unsigned int
long, signed
4
long, long int
unsigned long
4
float
8
10 double
8
11 long double
10
Типы данных
Диапазон
-128...127
0...255
-32768...
32767
0...65535
Тип данных
Символьный
со знаком
Символный без знака
Короткое целое со знаком
Короткое целое без знака
Целое
Зависит от
реализации
Зависит от ре- Целое без знака
ализации
-2147483648 Длинное целое со знаком
…2147483647
0...4294967295 Длинное целое без знака
-3.4e-38...
Вещественное число с
3.14e+38
плавающей точкой
-1.7еВещественное число
308..1.7е308
удвоенной точности
-3.4e-4932...
Длинное вещественное
.4e4932 число удвоенной точности
59
Приложение Г
Обозначения графические в схемах алгоритмов (ГОСТ 19.701-90)
Символ
Наименование
Назначение
Данные
Определяет ввод или вывод на внешнее
устройство или любой носитель данных
Процесс
Отражает обработку данных: выполнение отдельной операции или группы операций
Предопределенный процесс
Отображает предопределённый процесс, состоящий из одной или нескольких операций программы, которые определены в другом месте
(подпрограмме, модуле)
Подготовка
Отражает инициализацию и модификацию параметра для управления циклом со счётчиком
Решение
Описывает проверку условия и выполняет переключение по одному из условий. Имеет один
вход и два или более альтернативных выходов,
один из которых активизируется после вычисления условия внутри символа
Состоит из двух частей: начала и конца цикла.
Границы цикла Обе части имеют один и тот же идентификатор.
Изменение значения идентификатора, условия
для выполнения или завершения помещаются
внутри символов в начале или в конце цикла
Соединитель
Используется для обрыва линии и продолжения
её в другом месте. Должен содержать уникальное обозначение
Терминатор
Определяет начало и конец структурной схемы
алгоритма программы или подпрограммы
Основная
линия
Отображает последовательность выполнения
действий в алгоритме
Комментарий
Используется для добавления пояснительных
записей. Связывается с символом или группой
символов, обведённых пунктиром
60
Приложение Д
Сообщения об ошибках
Сообщения об ошибках периода компиляции
"," expected (Нужно указать ",").
Array bounds missing "]" (Массив ограничивает отсутствие "]").
Array must have at least one element (Массив должен иметь по крайней
мере один элемент).
Call of nonfunction (Нефункциональное обращение).
Call to function 'function' with no prototype (Обращение к функции "функция" без прототипа).
Code has no effect (Код не имеет эффекта).
Compound statement missing "}" (Утверждение, пропускающее "}").
Declaration is not allowed here (Здесь не допускается объявление).
Declaration missing ";" (Отсутствие объявления ";").
Declaration syntax error (Синтаксическая ошибка, объявление переменной).
Declaration terminated incorrectly (Объявления, завершенные неправильно).
Delete array size missing "]" (Отсутствие скобки "]").
do-while statement missing ;OR For statement missing ; (Отсутствие
утверждения do-while, или отсутствие утверждения For).
Expression syntax (Ошибка синтаксиса в выражении).
Extra parameter in call to function (Недопустимый параметр в обращении к функции).
Function call missing ")" (В обращении к функции отсутствует ")").
Illegal initialization (Неверная инициализация).
Illegal character 'character' (Неверный символ " символ ").
Illegal structure operation (Неверная операция структуры).
Illegal use of pointer (Неверное использование указателя).
'identifier' cannot start a parameter declaration (Идентификатор не может начать объявление параметра).
'identifier' is assigned a value which is never used (Идентификатор определяет значение, которое ранее не использовалось).
Invalid indirection (Недопустимый ссылка).
Lvalue required (Требуется наименование выражения (адрес переменной)).
Member identifier expected (Ожидается значение идентификатора).
Multiple declaration for 'identifier' (Многократные объявления для идентификатора).
Must take address of a memory location (Необходимо взять адрес расположения памяти).
Non-portable pointer conversion (Преобразования указателя не переносятся).
Not an allowed type (Недопустимый тип).
Operator "[]" missing "]" (Оператор "[]" не имеет "]").
Overlays only supported in medium, large, and huge memory models
(Оверлейные программы, поддерживаемые только в среде, большие и огромные
модели памяти).
61
Parameter 'parameter' is never used (Параметр "параметр" ранее никогда
не использовался).
Size of 'identifier' is unknown or zero (Размер идентификатора неизвестен
или нуль).
Structure required on left side of . or .* (Ошибка структуры на левой стороне, или отсутствие "*").
Two consecutive dots (Наличие двух последовательных точек).
Too few parameters in call to 'function' (Несколько параметров в обращении к "функции").
Too many initializers (Слишком много инициализаторов).
Too many error or warning messages (Слишком много ошибок или предупреждений).
Type mismatch in parameter 'parameter' in call to 'function' (Несоответствие типов в параметре "параметр" при обращении к "функции").
Type mismatch in redeclaration of 'identifier' (Несоответствия типов в повторном определении идентификатора).
Value of type void is not allowed (Недопустимые значения типа).
Variable 'identifier' is initialized more than once (Идентификатор переменной инициализирована более одного раза).
Unable to open include file 'filename' (Невозможно открыть файл).
Undefined structure 'structure' (Неопределенная структура "структура").
Undefined symbol 'identifier' (Неопределенный символ идентификатора).
Undefined symbol 'symbol' in module 'module' (Неопределенный символ
"символ" в модуле "модуль").
Unexpected "}" (Непредвиденная "}").
Unknown preprocessor directive: 'identifier' (Неизвестны директивы препроцессора: идентификатора).
Wrong number of arguments in call of macro 'macro' (Неправильное число
параметров в обращении макрокоманды " макрокоманда ").
Ошибки стадии выполнения
Division by zero (Деление на нуль).
Possibly incorrect assignment (Возможность неправильного значения).
Suspicious pointer conversion (Подозрительное преобразование указателя).
Function should return a value (Функция не возвращает значение).
Математические ошибки
DOMAIN – Аргумент функции вне сферы этой функции.
OVERFLOW – Результат слишком большой, чтобы быть представленным
в возвращаемом значении функции.
PLOSS – Произошла частичная потеря значимости.
SING – Специфический аргумент: аргумент функции имеет незаконную
величину. Например, передается нуль в функцию, которая запрашивает ненулевую величину.
TLOSS – Полная потеря значимости.
UNDERFLOW – Результат слишком мал.
62
Приложение Е
Функции преобразования символов (файл ctype.h)
Функция
isalnum
isalpha
isascii
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit
Прототип и краткое описание действий
int isalnum (int c);
Дает значение не нуль, если с – код буквы или цифры (А 
Z, а  z, 0  9), и нуль – в противном случае.
int isalpha (int c);
Дает значение не нуль, если с – код буквы (А  Z, а  z), и
нуль – в противном случае.
int isascii (int c);
Дает значение не нуль, если с есть код ASCII, т.е. принимает значение от 0 до 127, в противном случае – нуль.
int iscntrl (int c);
Дает значение не нуль, если с – управляющий символ с кодами 0  00  0  01F или 0  0F, нуль
– в противном случае.
int isdigit (int c);
Дает значение не нуль, если с – цифра (0  9) в коде ASCII,
и нуль – в противном случае.
int isgraph (int c); Дает значение не нуль, если с – видимый (изображаемый) символ с кодом (021  0  7E), и
нуль – в противном случае.
int islower (int c);
Дает значение не нуль, если с – код буквы на нижнем регистре (а  z), и нуль – в противном случае.
int isprint (int c);
Дает значение не нуль, если с – печатный символ с кодом
(020  0  7E), и нуль – в противном случае.
int ispunct (int c); Дает значение не нуль, если с – символ
разделитель (т.е. соответствует iscntrl или isspace) и нуль –
в противном случае.
int isspace (int c); Даетзначение не нуль, если с – обобщенный пробел: пробел, символ табуляции, символ новой
строки или новой страницы, символ возврата каретки (0 
09  0  0D, 020), и нуль – в противном случае.
int isupper (int c);
Дает значение не нуль, если с – код буквы на верхнем регистре (А  Z), и нуль – в противном случае.
int isxdigit (int c);
Дает значение не нуль, если с – код шестнадцатеричной
цифры (0  9, А  F, а  f), и нуль – в противном случае.
63
Функция
toascii
Прототип и краткое описание действий
int toascii (int c);
Преобразует целое число с в символ кода ASCII, обнуляя
все биты, кроме младших семи. Результат от 0 до 127.
tolower
int tolower (int c);
Преобразует код буквы с к нижнему регистру, не буквенные коды не изменяются.
toupper
int toupper (int c);
Преобразует код буквы с к верхнему регистру, не буквенные коды не изменяются.
Функции ввода-вывода для стандартных потоков
(файл stdio.h)
Функция
getch
getchar
gets
printf
putchar
puts
scanf
sprintf
sscanf
ungetch
Прототип и краткое описание действий
int getch (void); Считывает один символ с клавиатуры без отображения на экране.
int getchar (void); Считывает очередной символ из
стандартного входного потока (stdin).
char * gets (char *s);
Считывает строку s из стандартного входного потока (stdin).
int printf (const char *format [, argument, …]);
Функция форматированного вывода в стандартный поток stdout.
int putchar (int c);
Записывает символ с в стандартный поток вывода
(stdout).
int puts (const char *s);
Записывает строку s в стандартный поток вывода
(stdout).
int scanf (const char *format [, address, …]);
Функция форматированного ввода из стандартного потока stdin.
int sprintf (char *s, const char *format [, argument, …]);
Функция форматированной записи в строку s.
int sscanf (const char * s, const char *format [, address, …]);
Функция форматированного чтения из строки s.
int ungetch (int c);
Возвращает символ с в стандартный поток ввода stdin,
заставляя его быть следующим считываемым символом.
64
Функции для работы со строками
(файлы string.h, stdlib.h)
Функция
atof
atoi
atol
itoa
ltoa
strcat
strchr
strcmp
strcpy
strcspn
strdup
strlen
strlwr
strncat
strncmp
Прототип и краткое описание действий
double atof (const char *str);
(stdlib.h)
Преобразует строку str в вещественное число типа double.
int atoi (const char *str);
(stdlib.h)
Преобразует строку str в целое число типа int.
long atol (const char * str);
(stdlib.h)
Преобразует строку str в целое число типа long.
char * itoa(int v, char *str, int baz);
Преобразует целое v в строку str. При изображении числа используется основание baz ( 2  baz  36 ). Для отрицательного
числа и baz = 10 первый символ «минус» (-)
char * ltoa(long v, char *str, int baz);
Преобразует длинное целое v в строку str. При изображении
числа используется основание (2 baz 36).
char *strcat (char *const char *si);
Приписывает строку si к строке sp (конкатенация строк).
char *strchr (const char *str, int c);
Ищет в строке str первое вхождение символа с.
int strcmp (const char *str1, const char *str2);
Сравнивает строки str1и str2. Результат отрицателен, если
str1 str2; равен нулю, если str1= = str2, и положителен, если
str1 str2 (сравнение беззнаковое).
char *strcpy(char *sp, const char *si);
Копирует байты строки si в строку sp.
int strcspn (const char *str1, const char *str2);
Определяет длину первого сегмента строки str1, содержащего символы, не входящие во множество символов строки str2.
Ищет один из символов одной строки в другой
char * strdup(const char *str);
Выделяет память и переносит в нее копию строки str.
unsigned strlen (const char *str);
Вычисляет длину строки str.
char * strlwr(char *str);
Преобразует буквы верхнего регистра в строке в соответствующие буквы нижнего регистра.
char * strncat(char *sp, const char *si, int kol); Приписывает kol символов строки si к строке sp (конкатенация).
int strncmp(const char *str1, const char *str2, int kol);
Сравнивает части строк str1 и str2, причем рассматриваются
65
Функция
Прототип и краткое описание действий
первые kol символов. Результат отрицателен, если str1 str2;
равен нулю, если str1= = str2, и положителен, если str1 str2.
strncpy
char * strncpy(char *sp, const char *si, int kol);
Копирует kol символов строки si в строку sp («хвост» отбрасывает или дополняется пробелами).
strnicmp
int strnicmp (char *str1, const char *str2, int kol);
Сравнивает не более kol символов строки str1 и строки str2,
не делая различия регистров (см. функцию strncmp()).
strnset
char * strnset (char *str, int c, int kol);
Заполняет строку str заданным символом с.
strpbrk
int strpbrk (const char *str1, const char *str2);
Ищет в строке str1 первое появление любого из множества
символов, входящих в строку str2.
strrchr
char * strrchr (const char *str, int c);
Ищет в строке str последнее вхождение символа с.
strset
char * strset (char *str, int c);
Заполняет строку str заданным символом с.
strspn
int strspn (const char *str1, const char *str2);
Определяет длину первого сегмента строки str1, содержащего только символы, из множества символов строки str2.
Ищет символ одной строки, отсутствующий в другой
strstr
char * strstr (const char *str1, const char *str2); Ищет в строке
str1 подстроку str2. Возвращает указатель на тот элемент в
строке str1, с которого начинается подстрока str2.
strtod
double strtod (const char *str, char **endptr );
(stdlib.h)
Преобразует символьную строку str в число двойной точности. Если endptr не равен NULL, то *endptr возвращает как
указатель на символ, при достижении которого прекращено
чтение строки str.
strtok
char * strtok (char *str1, const char *str2); Ищет в строке
str1 лексемы, выделенные символами из второй строки.
strtol
long strtol (const char *str, char **endptr, int baz); (stdlib.h)
Преобразует символьную строку str к значению «длинное
число» с основанием baz (2 baz 36). Если endptr не равен
NULL, то *endptr возвращает как указатель на символ, при
достижении которого прекращено чтение строки str.
strupr
char * strupr(char *str); Преобразует буквы нижнего регистра в строке str в буквы верхнего регистра.
ultoa
char * ultoa (unsigned long v, char *str, int baz);
Преобразует беззнаковое длинное целое v в строку str.
66
Приложение Ж
Библиотека заголовочных файлов
Стандартные функции [6]
<ctype.h> - преобразования и проверки символов;
<complex> - комплексных чисел;
<ctime> - системные часы;
<locale.h> - установки локальной среды;
<math.h> (<cmath>) - математические функции;
<new> - работы с динамической памятью;
<numeric> - числовых операций;
<signal.h> - обработки сигналов;
<stdio.h> - ввода/вывода (чтение/запись символов), работы с файлами;
<stdlib.h> - работы с памятью, преобразования, некоторые математические функции;
<string.h> - работы со строками в стиле С;
<time.h> - для работы с датой и временем;
<valarray> - классы для численных расчетов.
Константы, макросы и типы данных определены в файлах:
<assert> - для диагностики;
<errno.h> - для проверки ошибок;
<float.h> - для работы с числами с плавающей точкой;
<fstream> - файловые потоки;
<ios> - базовые классы потоков ввода/вывода;
<istream> - входные потоки;
<ostream> - выходные потоки;
<sstream> - строковые потоки;
<sstreambuf> - буферизация потоков;
<iostream> - для потокового ввода/вывода;
<limits.h> - определение размеров целочисленных данных;
<setjmp.h> - возможности нелокальных переходов;
<signal.h> - функции и макросы для обработки сигналов (прерываний).
<stdarg.h> - поддержка функций с неопределенным числом параметров.
Контейнерные классы
<bitset> - битовое множество;
<deque> - двусторонняя очередь;
<list> - двусвязный список;
<queque>- очередь;
<set> - множество;
<stack> - стек;
<vektor> - одномерный массив.
Как правило, каждый компилятор содержит больше заголовочных
файлов.
67
СОДЕРЖАНИЕ
Ввод – вывод в языке СИ. Структура программы.
3
4
Порядок выполнения лабораторных работ
Лабораторная работа 1. Основы программирования в среде языка
Си. Оператор присваивания
4
Лабораторная работа 2. Программирование разветвленных алгоритмов. Операторы передачи управления
9
Лабораторная работа 3. Программирование циклических алгоритмов с заданным числом повторений
14
Лабораторная работа 4. Программирование циклических алгоритмов с предусловием
17
Лабораторная работа 5. Программирование циклических алгоритмов с постусловием
19
Лабораторная работа 6. Программирование алгоритмов обработки
одномерных массивов
22
Лабораторная работа 7. Обработка двумерных массивов
25
Лабораторная работа 8. Программирование c применением функций 28
Лабораторная работа 9. Программирование с возвратом из функций нескольких значений
32
Лабораторная работа 10. Обработка символьных и строковых даных 36
Лабораторная работа 11. Файлы
40
Лабораторная работа 12. Структуры
44
Лабораторная работа 13. Модульное программирование
47
Лабораторная работа 14. Динамические структуры. Списки
48
Лабораторная работа 15. Графика
51
Задание к расчетно-графической работе
53
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
55
ПРИЛОЖЕНИЕ А. Главное меню среды ТП
56
ПРИЛОЖЕНИЕ Б. Операции языка С/С++
58
ПРИЛОЖЕНИЕ В.Типы данных
59
ПРИЛОЖЕНИЕ Г. Обозначения графические в схемах алгоритмов 60
ПРИЛОЖЕНИЕ Д. Сообщения об ошибках
61
ПРИЛОЖЕНИЕ Е. Функции для работы с сисмволами и строками
63
ПРИЛОЖЕНИЕ Ж. Библиотека заголовочных файлов
67
Редактор ___________
Свод. темплан 200__ г.
ИД№
от . .
Подписано в печать _________. Бумага офсетная. Формат 64 84 1/16.
Отпечатано на дупликаторе. Усл. печ. л. 2. Уч. - изд.л. 2.
Тираж
. Заказ .
Издательство ОмГТУ. 644050, Омск, пр. Мира 11
Типография ОмГТУ
68
Скачать