Методические указания к выполнению лабораторных работ для студентов


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

общие положения

Дисциплина «Алгоритмизация и программирование» ( «Основы программирования и алгоритмические языки») является базовой профессионально-ориентированной дисциплиной подготовки бакалавров по направлению 6.050101 «Компьютерные науки». Изучение этой дисциплины предусмотрено на первом курсе в первом и втором семестрах.

Методические указания к выполнению лабораторных работ составлены в соответствии с рабочей программой учебной дисциплины «Алгоритмизация и программирование» и является неотъемлемой частью методического комплекса, включающего конспекты лекции [9; 10], методические указания к изучению дисциплины [12], к практическим работам [13], выполнение индивидуальных заданий и курсовой работы [14].

Данное издание методических указаний является обновленным и дополненным изданием [11], которое разрабатывалось в течение многих лет на кафедре информационных технологий при преподавании дисциплины «Алгоритмизация и программирование» и «Основы программирования и алгоритмические языки» для студентов направления подготовки КН.

При разработке вариантов задач, приводятся к каждой лабораторной работы, использовались пособия [1, 2; 3, 5]. Задачи сформулированы таким образом, что могут выполняться с применением различных языков программирования и сред разработки программ, но примеры выполнения отдельных задач приведены в сравнении языках Паскаль и Си.

 

Требования к оформлению отчетов по лабораторным работам

Отчет по лабораторной работе должен иметь в своем составе

1. Задания к лабораторной работе и вариант задания;

2. Математическую постановку задачи, которая содержит

    • описание входных и выходных данных (переменных), их типов и в случае необходимости описание ограничений на данные;
    • математическую модель задачи и описание промежуточных переменных
    • схему алгоритма с комментариями к нее;

3. Тестовый пример для проверки правильности и полноты полученного решения (необходимо привести вариант решения задачи вручную и программные расчеты)

4. Анализ результатов работы программы;

5. Описание программного интерфейса с пользователем

6. Текст (ы) программ (ы).

Лабораторная работа № 1.

Программирование линейного вычислительного процесса

 

задача 1.1

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

Рекомендации к выполнению работы

1. Для программированного вычисления выражений основном случаев необходимо использовать математические функции из стандартных библиотек языков программирования. Если в библиотеке нет необходимой математической функции, надо ее выразить через те, что определены. Например, стандартом языка Паскаль не предусмотрена функция arccos (x), но существует arctg (x).По тригонометрической формуле

arccos x arctg 1,

(1)

 

где x 1.

стандартом языка Паскаль НЕ предусмотрена операция подъема               к

степени х а, где а> 2.Для вычисления степени можно использовать формулу:

x a e a ln x .(2)

Вычисления логарифмов:

log a x ln x ln a .(3)

2. Если выражение сложный, или в нем есть части повторяющихся для упрощения записи этого выражения необходимо ввести промежуточные переменные. Например:

.

y

arctg               x

x 2 4 y 2 3

В заданном выражении часть x 2

ввести дополнительную промежуточную переменную:

4 y 2 повторяется дважды, поэтому целесообразно

t x 2 4 y 2.

Входной выражение приобретает вид:

 

y

arctg x

t 3

1 вариант задания выбирается студентом из приведенного ниже списка «Варианты заданий 1.1″ по номеру в списке академической группы.

Пример выполнения работы

Задача: составить программу для вычисления

a               .

1. математическая постановка задачи.

входные данные действия Выходные дни

данные

x, z действительного типа.

Ограничение: z 1; x 0.

a               x arctan 1

1 z 2

a — действительное.

 

 

 

ввода данных

Учитывая то, что на языке Паскаль не предусмотрено вычисления функция arccos, осуществлено преобразование данного выражения по формуле 1:

 

a

вывода данных

2. тестовый пример.

В качестве примера рассмотрим 3 случая:

 

x = 0.5, z = -0.7;

a

0.5 2.34619

1.08395

x = 2.5, z = 0.5; a

2.5 arccos 0.5

2.5 1.0472

1.618022

x = 7, z = 0 a

7 arccos 0

7 1.5708

3.315958 .

3. Анализ результатов работы программы.

 

входные данные

Исходные данные
расчет вручную Паскаль Си
x = 0.5, z = -0.7 1.08395 1.0839 1.0840
x = 2.5, z = 0.5 1.618022 1.6180 1.6180
x = 7, z = 0 3.315958 3.3160 3.3160

Погрешность, полученная во время программного расчета не превышает

0.001, поэтому можно считать программные расчеты правильными.

4. Описание программного интерфейса с пользователем.

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

После расчета на экран выводится значение а.

Для завершения работы программы необходимо нажать любую клавишу на клавиатуре.

5. Тексты программ на языках Паскаль и Си.

 

Варианты заданий 1.1

 

1. z

x 2

1

2

y 4 февраля

13. a ln y

 

x

 

y

x 2

2 .a x (arcsin     r

d x 3 )



14. a x x 2 x 5

 

z               

4

r 2 1

3 e y 1

3. a

1 x y tg z

15. a

3!5!

tg     cx 3   dx 2 x

16. b 1 cos (y 2)

4. b

x 4

2

sin 2 z

 

5. a

2 cos (x )

17. a

6

1 sin 2 x

2

6. b

1 sin

2 (x    y)

18. a 1

x               y

sin x cos y 2

 

x 2 1

 

arctg z

7. a (1 y)

e x 2

1

 

x 2 1

19. a

tgx y 2

 

8 .. b 1

y x (Y x) 2 y x 3

 

20. a 2 cos x 3 sin 4 a 1

 

 

9. a

3 февраля

y x

2

y

2 sin a 2 cos 42 e 3 x x 2 3 3 x y 4

21. a sin

tg (x y) x

 

 

10. a e x 2

tg 2 log z

2 x

22. a 4 x 3 cox 2 x sin x 3

z 2

11. a 1

3 z 2/5

12. a cos 2 (arctg log a b)

23. a

24. a

cos x 2 sin 2 x

 

 

2 x 3 7 12 b 2 x

 

z x cos x

b   x log 3

4 x 4

25. a

(X

y ) 2 (

3 d e 4 x)

задача 1.2

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

Пример выполнения работы

Задача: составить программу для определения площади и периметра прямоугольника.

 

1. математическая постановка задачи.

Для определения площади и периметра прямоугольника необходимо знать длины двух его сторон. Введем обозначения:

а — длина прямоугольника, задается в

метрах (м);

b — ширина прямоугольника (м); b

P — периметр прямоугольника (м);

S — площадь прямоугольника (м 2). a

входные данные действия Исходные данные
a, b действительного типа. Ограничения: a, b> 0. P 2 a b ;

S a b.

P, S

дийснi.

 

2. тестовый пример.

В качестве примера рассмотрим 3 случая:

1. a = 5 м, b = 10 м. P = 30.0 м, S = 50.0 м2.

2. a = 0.5 м, b = 0.7 м. P = 2.4 м, S = 0.35м 2.

3. a = 3 м, b = 1.5 м. P = 9.0 м, S = 4.5 м2.

 

3. Анализ результатов работы программы.

входные данные Исходные данные
вручную Паскаль Си
P S P S P S
a = 5, b = 10 30.0 50.0 30.0 50.0 30.0 50.0
a = 0.5, b = 0.7 2.4 0.35 2.4 0.35 2.4 0.35
a = 3, b = 1.5 9.0 4.5 9.0 4.5 9.0 4.5

Результаты расчетов совпадают, погрешности не возникло, поэтому можно считать программные расчеты правильными.

4. Описание программного интерфейса с пользователем.

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

После расчета на экран выводятся значения P, S.

Для завершения работы программы необходимо нажать любую клавишу на клавиатуре.

 

5. Текст программ на языках Паскаль и Си.

Варианты заданий 1.2

Составить программу для вычисления:

1. Координат точки пересечения двух прямых;

2. Площади пола и площади стен комнаты;

3. Пересчете координат точки с полярной системы в декартовой;

4. Площади поверхности и объема шара;

5. Площади поверхности и объема конуса;

6. Площади поверхности и объема цилиндра;

7. Площади поверхности и объема прямоугольного параллелепипеда;

8. Площади и периметру треугольника по заданным длинам сторон;

9. Площади и длины окружности заданного радиуса;

10. Площади и периметра прямоугольного треугольника по заданным катетами;

11. Плащи и периметра равносторонней трапеции;

12. Площади и периметра прямоугольной трапеции;

13.Площади и периметра параллелограмма по заданным двум сторонам и углу между ними;

 

14. Определение по заданным x и a значений

x a, x a ,;

15. Скорости V1 и V2 двух поездов, которые начали двигаться навстречу друг другу с расстояния S, если известно, что скорость первого поезда больше на VКМ / час, а встретились они через t часов;

16. Катетов прямоугольного треугольника по заданным длиной гипотенузы и углом;

17. Длин гипотенузы и катета по заданным длиной другого катета и прилегающим к нему углом;

18. Длины гипотенузы и двух углов по заданным длинам катетов;

19. Площади и длины дуги сектора по заданному радиусу и углу;

20. Площадь и длины хорды сегмента по заданным радиусом круга и углом;

21. Координат центра отрезка по заданным координатам концов;

22. Координат центра вписанного в квадрат круга, если известны координаты левой верхней и правой нижней вершины квадрата;

23. Длины сторон прямоугольника, если известны координаты его левой верхней и правой нижней вершины;

24. Длины основы и площади равностороннего треугольника по заданным длиной боковой стороны и угла между ней и основанием;

25. Площади и длины стороны ромба по заданным длинам его диагоналей.

Лабораторная работа № 2.

Программирование разветвленного вычислительного процесса

 

задача 2.1

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

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

установить точку останова на операторе if;

открыть окно для просмотра значения переменных программы (watches)

повторно запустить программу на выполнения.

 

Пример выполнения работы

Задача: составить программу для вычисления:

x 2 , для 0 x 5

c os x в п рот и л е ж н о м у случ д к у

1. математическая постановка задачи (МПЗ).

входные данные действия Исходные данные
 

x действительного типа.

Если запущено 0 x 5,

тогда y = x 2,

иначе y = cos x

 

y — действительное.

 

2. тестовый пример.

Для проверки правильности МПЗ и составленной программы рассмотрим таки случаи:

1. Условие a x b выполняется.

x = 3 -> y = 9;

x = 0 -> y = 0;

x = 5 -> y = 25;

2. Условие a x b НЕ выполняется.

x = -4 -> y = -0,653644;

x = 9 -> y = -0,911130;

 

3. Анализ результатов работы программы.

a, b, x введения данных

 

0 x 5 —

+

 

 

 

y вывода данных

 

входные данные Расчет исходных данных
вручную Паскаль Си
x = 3 9 9.0 9.0
x = 0 0.0 0.0
x = 5 25 25.0 25.0
x = -4 -0,653644 -0,653644 -0,653644
x = 9 -0,911130 -0,911130 -0,911130

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

 

4. Описание программного интерфейса с пользователем.

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

После расчета на экран выводится значение у.

Для завершения работы программы необходимо нажать любую клавишу на клавиатуре.

 

5. Текст программ на языках Паскаль и Си.

Примечание! Для вычисления в программах на языке Паскаль степенных функций необходимо преобразовывать выражение (см. Л.р.№1, з.1.1.). Возникает ограничение на значение основы степени (более 0), что требует дополнительных проверок и преобразований входного выражения.  Дополнительные проверки также необходимы при вычислении значения функции tg и ctg. Учитывая это алгоритм работы программы будет отличаться от алгоритма расчета в математической постановке задачи.Необходимо привести этот алгоритм в отчеты.

Uses Crt;

 

Var

x, y: real;

 

begin

ClrScr;

Write ( ‘Введите значение x:’); ReadLn (x)

 

if (x> = 0) and (x <= 5) then y = sqr (x) else y = cos (x)

 

WriteLn ( ‘y =’, y: 9: 6); readkey;

End.

#include <stdio.h>

#include <conio.h>

#include <math.h> main ()

{

float x, y; clrscr (); printf ( «Input x: ‘);

scanf ( «% f», & x);

 

if (x> = 0 && x <= 5) y = pow (x, 2); else y = cos (x)

 

printf ( «\ ny =% 9.6f», y) getch ();

}

Варианты заданий 2.1

1. x 4 cos c , если 10 х 1 0;

x 2 a a 12, если a 0, x 0;

y 2

11. y               x

cos x

иначе.

e

иначе.

e a x 2 , если х 0, a 0;

cos 2 x 2 b, если 0 х 2;

2. y

log a x

иначе.

12. y

b tg x 2

иначе.

a r cc o s

x, если

0 х 1,

a ctg 2 x, если 0 a 1,

3. y

x 2

— tg x 2

— 1 иначе.

13. y

a a co s 2 x

иначе.

log x k, если x k, k 0;

 

14. y max (a, b), если х 0, a 0;

4. y x 2 k

min (a, b) иначе.

xk иначе.

x b , если 5 х 2;

5. y

log x 10 , если

— 9 х 9;

x 6

 cos b

иначе.

15. y

3

e x

 

иначе.

tg a

d 2 , если d a, a 2

x 2

lg

a, если 2 х 2;

6. y

3

16. y

cos a 5

cos a d

иначе.

x

иначе.

 

lo g n

x, если n 0, x 0;

ctg x x 3 , если 3 х 3,

7. y               n 2

 

иначе.

17. y

cos x 2

3 x

иначе.

8. y sin px, если 0 х ;

e ax , если 7 х 0;

18. y

ctg px иначе.

si n 3 x 2 Иначе е.

x 2 z

z x , если 5 х 5,

2 x

, Если a х b;

9. y

 

e z — 2x

иначе.

19. y

 

10

x 1

7 sin 5 ax

 

иначе.

a si n 2 x , если 5 x 0;

sin x

, Если 0 х z;

10. y

a x cos a 2 Иначе е.

20. y 7 z 2 16

2

bx

— zx

иначе.

задача 2.2

Составить программу с использованием оператора case (switch)

установить точку останова на операторе case (switch)

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

Рекомендации к выполнению работы

Как уже было указано в задании, при выполнении этой работы необходимо использовать оператор множественного ветвления (в языке Паскаль — оператор case — of — else, в языке Си — оператор switch — case — default ).

При надписи программы на одной ветке оператора множественного ветвления можно объединить несколько констант. При этом в Паскаль можно задать диапазон целочисленных или символьных значений [1, 2; 4-8; 9; 10, 13].

Желательно при надписи программы использовать также ветвь else (default) для проверки и выдачи сообщение о «невозможные» значения входных данных, даже если это не предусмотрено в условии варианта задания.

Пример выполнения работы

1. Составить программу для вывода на экран сообщение «младшая школа», «школа», «старшая школа» в зависимости от заданного номера класса.

1. математическая постановка задачи (МПЗ).

 

 

входные данные действия Исходные данные
2. К — целое 5. Если К совпадает с: 7.
3. ограничения: 6. 1..4, тогда вывести 8. младшая школа
4. К> 0. 9. 5..9, тогда вывести 10. средняя школа
11. 10, 11, вывести 12. старшая школа
13. иначе вывести 14. столько               НЕ
учатся !!!

 

2. Тестовый пример и анализ результатов работы программы.

 

 

входные данные Расчет исходных данных
Паскаль Си
К = 2 15. младшая школа 16. младшая школа
К = 7 17. средняя школа 18. средняя школа
К = 10 19. старшая школа 20. старшая школа
К = 22 21. столько не учатся !!! 22. столько учатся !!! НЕ

По всем тестовых примерах полученные корректные исходящие сообщения.

2. Описание программного интерфейса с пользователем.

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

Для завершения работы программы необходимо нажать любую клавишу на клавиатуре.

3. Текст программ на языках Паскаль и Си.

Uses Crt;

 

Var

K: byte;

 

begin

ClrScr;

Write ( ‘Введите класс:’); ReadLn (К);

 

case K of

23.1..4: WriteLn ( ‘младшая школа’);

25.

 

26.5..9: WriteLn ( ‘школа’);

 

28.10, 11: WriteLn ( ‘старшая школа «)

 

 

else WriteLn ( ‘столько не учатся !!! «); end;

#include <stdio.h>

#include <conio.h>

 

main ()

{

short k; clrscr ();

printf ( «Введите класс: ‘); scanf ( «% hd», & k)

 

switch (k) {

24. case 1: case 2: case 3: case 4:

printf ( «младшая школа») break;

 

27. case 5: case 6: case 7: case 8: case 9:

printf ( «средняя школа») break;

29. case 10: case 11:

 

printf ( «старшая школа») break;

30. default: printf ( «столько не учатся !!!»)

}

readkey; End. getch ();

}

Варианты заданий 2.2

1. По заданным номером месяца вывести количество дней в нем.

2. По заданным номером месяца вывести номер квартала.

3. По заданным номером месяца вывести время года.

4. По заданным номером месяца вывести перечень государственных праздников в нем.

5. По заданным номером день недели вывести его название.

6. По заданным номером день недели вывести сообщение «Рабочий,

выходной «.

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

8. По заданным номером день недели вывести количество пар по расписанию вашей группы.

9. Ввести пергу букву из имени человека, вывести перечень из трех возможных имен. Например, введено ‘a’, выводится — «Андрей, Анна, Архип «.

10. В одном элитном доме 20 квартир четырех типов: однокомнатная, двухкомнатная, трехкомнатная, четырехкомнатная. Был составлен перечень:

№ квартиры Тип квартиры
1,2,3,4, 16,17 однокомнатная
5,7,9,12,13 двухкомнатная
6,8,10,14,15 трехкомнатная
11,18,19,20 четырехкомнатная

 

Итак, по номеру квартиры вывести ее тип.

11. По первой букве из названия дисциплины вывести ее направление подготовки

(Технические, естественные, гуманитарные).

12. По первой букве из названия оператора мобильной связи вывести его полное название.

13. По коду пакета мобильной связи вывести название оператора. Например, (0) 50, (0) 66 — UMC.

14. По первой букве из названия оператора языка Паскаль, вывести его полный синтаксис. Например, заданная буква «i», вывести — «if условие then дия1 else дия2;».

15. по               первой буквой с оператора языка Си вывести, к которого типа вычислительного процесса он относится (разветвленный и циклический).

16. По первой букве из названия города вывести страну. Перечень городов: Киев, Москва, Тула, Харьков, Париж, Лион, Генуя, Ровно, Норильск, Венеция, Одесса.

17. По первой букве из названия области Украины вывести в какой стороне света относительно Киева она находится. Перечень областей Львовская, Житомирская, Крым, Луганская, Донецкая, Киевская, Харьковская, Одесская.

18. По введенным знаком арифметической операции вывести ее приоритет.

19. По первой букве с названия функции из библиотеки math.h вывести его класс

(Степенная, логарифмическая, тригонометрическая, определение модуля).

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

21. По номеру цвета в радуге вывести сообщение, относится ли он к теплым или холодных цветов (тапли — красный, желтый и т.п., холодные — синий, голубой и т.п.).

задача 2.3

Составить программу для проверки, принадлежит ли точка с координатами (x, y) в заданной области согласно варианта задания.

Рекомендации к выполнению работы.

В математической постановке задачи необходимо определить:

1. Уравнения прямых и окружности, ограничивающие заданную область. Для прямой уравнения определяется формуле:

x x 1    y y 1,

 

x 2 x 1 y 2 y 1

где x 1, y 1, x 2, y 2 — координаты двух точек, принадлежащих прямой.

Для круга:

x x c 2

y y c c

R 2,

где x с, y с — координаты центра, R — радиус.

2. Составить логическое выражение истинно, когда точка с координатами (x, y) принадлежит заданной области.

Пример выполнения работы

В качестве примера будет рассмотрен математическую постановку задачи (МПЗ) для двух вариантов областей, заданные на рис 1. и рис.2. Другие пункты примера выполнения работы будут продолжать МПЗ для рис. 1.

1. математическая постановка задачи.

Пример 1 (рис.1)

Заданная на рис. 1 область ограничена кругом, центр которого находится в точке (3, 2) и радиусом 2 и прямой, проходит

через пару точек (3, 4), (5, 2).

1. уравнение окружности будет:

x 2 2 y 3 2 2 февраля

2. уравнение прямой будет:

x 3

5 3

y 4

2 4

Рис. 1

 

 

После преобразований получаем:

x 3 2 y 4 2

y 7 x.

3. Итак, для того чтобы точка с координатами (x, y) попала в заданную область, она должна, во-первых быть внутри круга, то есть ее координаты должны удовлетворять условию:

x 2 2 y 3 2 4 /.

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

y 7 x.

4. Учитывая то, что приведенные условия должны выполняться одновременно, для построения общего логического выражения их необходимо объединить логическим «И» (математическая операция — конъюнкция

 

Пример 2 (рис.2)

 

 

 

 

 

 

 

 

 

 

Рис. 2

Заданная на рис. 2 область ограничена тремя прямыми, которые описываются уравнениями:

y = 2, y = 0, x = 4,

и полукругом с координатами центра (2,2) и радиусом 2.

Уравнение окружности будет:

x 2 2 y 2 2 2 февраля.

Точка с координатами (x, y) будет принадлежать заданной области, если она попадает в круг, то есть выполняется условие:

x 2 2 y 2 2 2 2,

или к прямоугольнику, для которого выполняются условия:

x 2 x 4 y 0 y 4.

Эти четыре условия объединены конъюнкцией (логическое «и») потому, что каждая из них должна выполняться для того, чтобы точка по координатам (x, y) попадала внутрь прямоугольника.

Итак, точка принадлежит области заданной на рис. 2, если она попадает ИЛИ в круг, ИЛИ к прямоугольнику. Эти два условия можно объединить в один логический выражение операцией дизъюнкции (логическое «ИЛИ»):

x 2 2 y 2 2 2 2 (x 2 x 4 y 0 y 4).

 

входные данные действия Исходные данные
x, y — координаты если выполняется
точки               действительного типа. x 2 2 y 3 2 4   y 7 x ,

тогда вывести на экран

 

 

принадлежит

иначе вывести на экран Не принадлежит

 

 

x, y

 

+

x 2 2 y 3 2 4

y 7 x

 

 

принадлежит

НЕ

 

 

 

 

Тестовый пример.

Для проверки правильности

 

МПЗ

 

и

 

составленной программы рассмотрим такие

случаи:
Условие выполняется. Условие не выполняется.
x = 3, y = 1;

x = 3, y = 4;

x = 4, y = 2.

x = 4.5; y = 3;

x = 1, y = 1;

x = 6, y = 5.

2. Анализ результатов работы программы.

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

входные данные Расчет исходных данных
вручную Паскаль Си
x = 3, y = 1 принадлежит принадлежит принадлежит
x = 3, y = 4 принадлежит принадлежит принадлежит
x = 4, y = 2 принадлежит принадлежит принадлежит
x = 4.5; y = 3 Не принадлежит Не принадлежит Не принадлежит
x = 1, y = 1 Не принадлежит Не принадлежит Не принадлежит
x = 6, y = 5 Не принадлежит Не принадлежит Не принадлежит

3. Описание программного интерфейса с пользователем.

После запуска программы на экран выводится сообщение-приглашение о введении значения координат точки (x, y).Необходимо ввести действительное значение. Ограничений на значения их не устанавливается.

На экран выводится сообщение «принадлежит» или «не принадлежит» в зависимости от результатов проверки.

После вывода результатов на экране появляется сообщение: «Для выхода из программы нажмите ESC».

Для продолжения работы программы необходимо нажать любую клавишу на клавиатуре, для выхода из программы — <ESC>.

6. Текст программ на языках Паскаль и Си.

 

Варианты заданий 2.3

задача 2.4

Составить программу для обработки нажатия клавиш на клавиатуре:

вывести на экран сообщение «ESC», «Enter», «Пробел», «TAB» в зависимости от нажатой клавиши.Желательно, в программе ввести константы для кодов соответствующих клавиш: ESC = # 27 ENTER = # 13 SPACE = # 32, TAB = # 9.

вывести на экран коды алфавитно-цифровых клавиш и проверить, совпадают ли они с кодами символов в таблице ASCII — кодов.

вывести на экран сообщение «Простой код» или «Расширенный код» и непосредственно код в зависимости от нажатой клавиши.

Рекомендации к выполнению работы

В зависимости от типа клавиатуры на ней могут быть расположены 83/84, 101/102, 122 клавиши. Но принцип расположения и назначение основных клавиш на всех типах клавиатуры одинаковы.

При нажатии или отпускании клавиши на клавиатуре генерируется электрический сигнал, который распознается контроллером клавиатуры. Контроллер клавиатуры передает код соответствующей клавиши (скэн-код) для дальнейшей обработки. В зависимости от типа клавиши генерируются прямые или расширенные коды.

Прямой скэн-код клавиши размером один байт и его значение совпадает с кодом соответствующего символа в таблице ASCII-кодов.

Расширенный скэн-код занимает два байта: старший — нулевой, младший

— код клавиши.

 

 

старший байт младший байт
00 код клавиши

 

Алфавитно-цифровая группа клавиш и клавиши Esc, Tab, BackSpace, Enter, пробел (Space), клавиши правой цифровой группы (кроме Del) возвращают прямые скен- коды (рис. 3).

Функциональные клавиши и клавиши управления курсором возвращают расширенные скэн-коды.

Сдвижные клавиши Shift, Ctrl, Alt, клавиши CapsLock (фиксация режима прописных букв) и NumLock (фиксация режима ввода цифр), PrintScrn (печать экрана), ScrollLock (блокировка прокрутки экрана), Pause / Break (прерывание команды) не возвращают кодов.

Но если сдвижные клавиши используются в комбинациях с клавишами алфавитно-цифровой клавиатуры, они возвращают расширенный скэн-код. Например, если нажать на клавиатуре кнопку с латинской буквой ‘a’, будет возвращен код 97, при нажатии Shift + a будет возвращен код 65 — это символ «А».

Esc

27

 

12 функциональных клавиш (расширенный код)

панель индикаторов
Back spase 8 NL
Tab

9

Алфавитно-цифровые клавиши  

Клавиши управления (расширенный код)

 

 

Права цифровая группа клавиш

Caps

Lock Ø

Enter

13

Shift

Ø

Shift
Ctrl

Ø

Alt

Ø

SPACE ( «Any key»)

32

Alt

Ø

Ctrl

Ø

Del

 

Рис.3. Общая схема расположения клавиш

 

клавиши управления курсором

(Расширенный код)

Права цифровая группа клавиш

(Прямой код)

 

 

 

Рис. 4. Расположение и коды клавиш управления курсором и правых цифровых.

 

Для обработки в программе сигналов от клавиатуры для выполнения следующих функций:

 

Язык прогр. функция назначение библио- тека
Паскаль KeyPressed:

boolean;

Приостанавливает выполнение программы до нажатия пользователем клавиши на клавиатуре. Возвращает true, если была нажата любая клавиша CRT
Паскаль ReadKey: char; Приостанавливает выполнение программы до нажатия пользователем клавиши на клавиатуре. Возвращает символ *, который соответствует коду нажатой клавиши CRT
Си char getch (); — «» — conio.h

* — не для всех клавиш на клавиатуре есть соответствующие символы, например ESC (простой скэн-код 27 в ASCII- таблицы не обозначен), поэтому для преобразования числового кода в его символьный эквивалент в Паскаль- программе используется следующая запись:

 

# код

Итак, символьное представление ESC = # 27 ENTER = # 13 TAB = # 9, SPACE = # 32 и т.п.

Си-программа рассматривает символьные данные, как числовые, так, например, символ ‘a’

и его код 97 с точки зрения Си-программы не различаются.

Для получения информации о нажатых клавиш в программе необходимо объявить символьную переменную и присваивать ей значение, возвращает функция ReadKey (или getch ()).

 

var c: char; #include <conio.h>
begin main ()
c = ReadKey; {Char c;
… {дальнейшая обработка кода} c = getch ();
end; }

 

Но это срабатывает, если клавиша возвращает простой скэн-код. Если клавиша возвращает расширенный скэн-код, необходимо дважды обращаться к функции ReadKey (или getch ()): первый раз для считывания старшего байта # 0 (или просто 0 в Си), второй раз для считывания младшего байта — кода. Обобщенный фрагмент программы для считывания и простых, и расширенных кодов будет:

 

Обычно тестирование любой программы требует многократного запуска, полностью истощает разработчика :-). Можно добавить в текст программы оператор цикла с пост-условием, в котором в конце выводить примерно такое сообщение: «Для выхода нажмите ESC, для Продолжение любую клавишу», а в строке-завершении цикла обращаться к ReadKey (или getch ()) и проверять код на ESC.

примеры программ

Задания:

вывести на экран сообщение «ESC», «Enter», «Пробел», «TAB» в зависимости от нажатой клавиши.Желательно, в программе ввести константы для кодов соответствующих клавиш: ESC = # 27 ENTER = # 13 SPACE = # 32, TAB = # 9.

вывести на экран коды алфавитно-цифровых клавиш и проверить, совпадают ли они с кодами символов в таблице ASCII — кодов.

Задания:

вывести на экран сообщение «Простой код» или «Расширенный код» и непосредственно код в зависимости от нажатой клавиши.

Uses Crt; Const

TAB = # 9; ENTER = # 13;

ESC = # 27; SPACE = # 32;

Var c: char; begin

repeat clrscr;

WriteLn ( ‘Нажмите’); c = ReadKey;

case c of

TAB: Writeln ( ‘Табуляция’); ENTER: Writeln ( ‘Введение’); SPASE: Writeln ( ‘Пробел’);

 

ESC: Writeln ( ‘Эскейп «) else Writeln (‘ Символ ‘, с,’ с

кодом «, ord (c));

end;

Writeln ( ‘Для               выхода               нажмите               ESC, для Продолжение любую клавишу ‘)

 

Until readkey = ESC; End.

#include <stdio.h>

#include <conio.h> main ()

{

int c; clrscr ();

do

{

printf ( «Нажмите клавишу \ n»); c = getch ();

if (c == 0)

{

c = getch ();

printf ( «Расширенный код >>>% d»,

c)

}

else

printf ( «Код клавиши >>>% d \ n», c);

 

printf ( «\ n <ESC> для выхода или любую клавишу для продолжения \ n»);

}

while (getch ()!= 27)

}

Лабораторная работа № 3.

Программирование циклического вычислительного процесса

 

задача 3.1

Составить программу для поразрядная обработки целочисленных (действительных) значений согласно варианту задания.Рассмотреть два варианта алгоритма решения: с циклом с пред-условием и циклом с пост-условием. В отчете привести две схемы алгоритма и проанализировать преимущества и недостатки каждого из них для решения этой задания;

установить точку останова на заголовке оператора цикла;

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

повторно запустить программу на выполнение и выполнить трассировку тела цикла, контролируя значение параметра цикла и выполнение (невыполнение) условия цикла.

 

Рекомендации к выполнению работы

В программировании используются несколько систем счисления: десятичная, двоичная, восьмеричная, шестнадцатеричная. Каждая из этих систем является позиционной (порядковой), то есть значимость цифры в записи числа зависит от ее расположения в том числе. Например, в числе 12 единица значимее (имеет большую «удельный вес»), поскольку расположена в разряде десятков, а двойка в разряде единиц [2, 7, 9].

Любое целое число в позиционной системе исчисления можно представить в виде суммы:

k 1

N                               m i i 0

W i,

где N — представлено целое число; k — количество цифр в числе (количество разрядов) m — количественный эквивалент цифры; W — основание системы счисления; i — номер разряда цифры [2, 7].

Разряды нумеруются с конца числа, например, для числа 25735:

 

 

разряды 4 3 2 1
число 2 5 7 3 5

 

Как сумму в десятичной системе счисления это число можно записать так:

2 10 апрель 5 10 3 7 10 2 3 10 января 5 10 0.

Итак, для того, чтобы в программе разбить число на цифры, необходимо последовательно делить его на W — основание системы счисления, брать остаток от деления:

m N

 

и оставлять целую часть от доли:

W

N N .

W

Этот процесс повторяется пока целая часть от доли больше 0.

Пример выполнения работы

Задача: составить программу, после выполнения которой на экране будут напечатаны цифры целого числа N и номера разрядов, в которых они расположены.

1.Математическая постановка задачи (МПЗ). 2.

входные данные действия Исходные данные
 

N

 

целого

1.

2.

 

3.

 

4.

 

5.

 

6.

k = 0; N = | N |;

Пока N 0, выполнять 3-5, иначе — пункт 6.

m N

 

W

Вывести m, k.

N

k = k + 1; N W    .Переход к пункту 2.

Останов.

 

m — цифра числа

типа. N, целое;
k — номер
разряда, целое;

 

Схема алгоритма решения задачи приведена на рис.1 (в отчете необходимо построить также алгоритм для цикла с пост-условием и провести тестирование).

 

3. Тестовый пример (рассмотрено только цикл с пред-условием, в отчете добавить еще анализ цикла с пост-условием).

Например, для ввода подано число 379.

N = 379; k = 0; .

В начале цикла происходит проверка: N <> 0? (379 <> 0?) Результат — TRUE.

1 я итерация.

m = 379 mod 10 = 9, k = 1, N = 379 div 10 = 37

2 га итерация. 37 <> 0 TRUE

m = 37 mod 10 = 7, k = 2, N = 3.

3 я итерация. 3 <> 0 TRUE

m = 3 mod 10 = 3, k = 3, N = 3 div 10 = 0.

4 и итерация. 0 <> 0 FALSE. Цикл закончен.

Управление передается к следующему оператора после цикла, завершает программу.

 

 

ввода данных

 

 

 

 

 

 

 

 

вывода данных

 

 

 

 

 

 

 

 

 

Рис. 1. Схема алгоритма решения задачи (цикл с пред-условием)

 

3. Анализ результатов работы программы (для цикла с пост-условия тестирования провести самостоятельно).

 

входные данные Расчет исходных данных
вручную Паскаль Си
N = 379 m = 3, k = 0 m = 7, k = 1 m = 3, k = 2 пред- условие после- условие пред- условие после- условие
3 0

1 июля

9 2

? 3 0

7 1

9 2

?
N = 0 m = 0, k = 0 0 0 ? ?
N = -12 m = 2, k = 0 m = 1, k = 1 2 0

1 1

? 2 0

1 1

?

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

 

4. Описание программного интерфейса с пользователем.

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

После расчета на экран выводится значение у.

Для завершения работы программы необходимо нажать любую клавишу на клавиатуре.

5. Текст программ на языках Паскаль и Си.

 

 

Uses CRT; #include <stdio.h>
#include <conio.h>
#include <stdlib.h> / * для abs * /
Const W = 10; {Основание системы счисления} const int w = 10;
Var main ()
N: longint; m, k: byte; {
Begin long n; short m, k = 0;
ClrScr; clrscr ();
WriteLn ( ‘Введите число N:’); printf ( «\ nВведить n: ‘);
ReadLn (N) scanf ( «% ld», & n);
k = 0; N = abs (N) n = abs (n)
While N <> 0 Do while (n!= 0)
begin {
m = N mod W; m = n% w;
WriteLn ( ‘Цифра’, m 2, ‘расположена в printf ( «\ n Цифра% hd расположена в
разряде № ‘, k: 2) разряде №% hd «, m, k)
k = k + 1; k ++;
N = N div W; n = n / 10;
end; }
readkey; getch ();
End. }

 

Варианты заданий 3.1

1. Определение суммы парных цифр целого числа.

2. Определение произведения нечетных цифр целого числа.

3. Определение суммы первых 5 цифр из дробной части действительного числа.

4. Определение или равна сумма первых двух цифр целого числа сумме последних двух цифр.

5. Определение или равна сумма цифр с целой части действительного числа сумме такого же количества цифр с дробной части.

6. Определение сколько нулей в записи целого числа.

7. Определения, равна сумма цифр целой части действительного числа сумме такого же количества цифр в дробной части.

8. Изъятие из записи целого числа нулей.

9. Проверить, выполняется для заданного целого признак деления на 3.

10. Вывод на экран первых (слева) К цифр целого числа (К задает пользователь).

11. Вывод на экран Р цифр с дробной части действительного числа (Р задает пользователь).

12. Проверить, равен квадрат числа кубу суммы его цифр.

13. Определения, среди С цифр дробной части действительного числа цифра 0.

14. Определение количества цифр Т в записи целого числа (Т задает пользователь).

15. Поменять местами целую и дробную части действительного числа.

16. Определение симметричны цифры действительного числа относительно точки.

17. Определение количества цифр, в записи целого числа, большие по 3 и меньше 7.

18. Определение разницы между суммой цифр целой и такого же количества цифр дробной части действительного числа.

19. Проверить, выполняется для заданного числа признак деления на 9.

20. Определения, равна целое число квадрату суммы его цифр.

21. Определение произведения цифр целого числа.

22. Определения, равно квадрат суммы цифр числа сумме квадратов его цифр.

23. Проверить, является ли число степенью числа 3.

24. Заменить первую и последнюю цифры целого числа на цифру Р (Р задает пользователь).

25. Поменять местами первую и последнюю цифры целого числа.

26.* Проверить, является ли число палиндромом, то есть таким, что слева направо и справа налево читается одинаково.

27.Определить наибольший общий делитель чисел А и В.

28.* Вывести на экран все «совершенные» числа в диапазоне от 0 до 100000. число

«Совершенное», если оно равно произведению своих цифр.

 

задача 3.2

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

установить точку останова на заголовке оператора цикла;

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

повторно запустить программу на выполнение и выполнить трассировку тела цикла, контролируя значение параметра цикла и выполнение (невыполнение) условия цикла.

Рекомендации к выполнению работы

Рассмотрим пример. Вычислить сумму N членов ряда:

S 1 1 x 1 2 x 1 3 x 2  3 4 

n элементов

Элементы этого ряда имеют рекуррентное соотношение, так как каждый последующий член ряда можно определить через предыдущий.

 

a

Каждый член ряда можно представить как дробь вида

b

значениями a = 1, b = 1.

с начальными

Для получения следующего значения a необходимо к предыдущему добавить х, а для получения следующего значения b к предыдущему необходимо добавить 1. Итак,

a 1 1, a 2 a 1 x, , a i a i 1 x,

b 1 1, b 2 b 1 1, , b i b i 1 1,

Исходя из этого, общим членом ряда будет

 

будет вычисляться по формуле:

1 i 1 x , где

i

i 1, Ν, а S

N

S

i 1

i 1 x .

i

Исходя из математической постановки задачи, члены ряда вычисляются в цикле, количество итераций цикла заранее известна, шаг изменения параметра цикла 1. Поэтому при разработке схемы алгоритма и программы целесообразным будет использовать цикл с параметром (рис. 2, а).

Если трудно определить общий член ряда, можно воспользоваться промежуточными переменными для определения члену ряда и подать вычисления S по следующей схеме:

1.  S 0, a 1, b 1;

2.S S a,

b

a a x,

b b 1,

для i 1, Ν.

Учитывая, что значение b совпадает со значением и, то можно выражение упростить:

а               б

Рис.2. Схема алгоритма вычисления суммы ряда.

S S a ,

i

a a x;

для i 1, Ν.

Схема алгоритма для такого способа вычисления приведена на рис.2, д.

Примечание. Во время выполнения лабораторной работы можно выбрать любой способ вычисления суммы ряда. Отчет по лабораторной оформляется согласно общих требований к оформлению отчетов.

Варианты задания 3.2

1. y 1     3   3 5 5

2 2 4 4 6 

2. y

1

n элементов

 

 

n корней

1 января

3. y

sin 1 sin 1 sin 2 sin 1 sin N

4. y

5. y 1 x x

2 апреля

x 3

8

т элементов

6. y 1 1 1   1 1

3

7. y cos x

x 2

6 1 0 1 5

n

cos x 2 cos x n

x 3

8. y x

3 февраля

h

9. y 1 a 3 a 5 a

2  4 8 

n

2 апреля 2 n

3 !5 ! 2 n 1 !

3 3 3 n 3

 

11. y 1 2

2 ! n 1 !

12. y   x

x 3

x 5

3 5

n

13. y cos 1 cos 2 cos 39 cos 40

14.

y   x

x 3

3!

x 5

5 !

 

v

15. y x x

2

x 3

3

n

16. p x 1

 

2

1 февраля

 2  3

n

y sin x sin sin x  sin  sin  sin  x 

n элементов

18. y   5 w

w   5 w

w

1 2

 

2 3  3 4 4 5

19. y 1

n

3 6

элементов

 

 

2 !5 !

К элементов

20. y

3 7

2 !3 !

11

4!

К элементов

21. y

x   2 x   3 x

 

1 3  3 5 5 7

n элементов

x x 2

22. y x

1!              2 !

v

 

23. y 1

x 2

2!

x 4

4 !

k

24. y 1

2 февраля

5   7

3 2 4 2



n

25. y 1   2

3

3 2

2 мая

n

Лабораторная работа № 4.

Программы с подпрограммами

 

задача 4.1

  • Составить программу для табулирования функции в соответствии с вариантом задания на заданном промежутке (столбец «Функция и промежуток» в таблице вариантов заданий)
  • вычисление значения функции оформить в программе как подпрограмму-функцию, описать в отчете как «черный ящик», разработать для нее МПЗ, составить схему алгоритма;
  • разработать МПЗ, проверив определена ли заданная функция на указанном промежутке, и СА для главной программы. Во время табулирования функции провести вычисления, указанные в столбце «Задача» таблицы вариантов заданий;
  • результаты табулирования функции вывести на экран в виде таблице:
X Y
x 1 y 1
x 2 y 2
x n y n
    • для вывода заголовка столбцов таблицы составить подпрограмму без параметров;
    • провести трассировку программы, исследовав переходы между главной программой и функцией.

Рекомендации к выполнению работы Табулирование функции

Под термином «табулирования функции» понимают вычисления n значений определенной функции y = f (x) для х, значение которого принадлежат промежутку [a, b] и изменяется с шагом x (рис.1) [1, 2; 7]. Итак,

необходимо вычислить значения:

y 1

y 2

y n

f x 1 , где

f x 2 , где

f x n , где

x 1 a,

x 2 x 1 x,

 

x n b.

Если задано n — количество точек на

промежутка, тогда

x b a.

n 1

Процесс вычисления значений функции носит циклический характер, тело цикла составляют действия

x1 = a x2 = x1 + x … xn = b               X

Рис. 1

y f x , x   x x .

параметром цикла есть переменная х с начальным значением               x   a, изменение

параметра происходит в теле цикла. Условием окончания цикла будет x b (или обратная, как условие продолжения цикла).

Кроме того в программе в теле цикла к изменению х необходимо вывести на экран значения х и у.

формирование таблицы

Результаты вычисления выводятся на экран в виде таблицы, формируется в программе с помощью оператора WriteLn (printf). Например, для вывода шапки необходимо задать такую ​​последовательность:

 

Или с использованием символов псевдографики, которые берутся из таблицы ASCII-кодов символов (некоторые коды приведены в табл.1). Для того чтобы задать в программе оператор Writeln (printf), который выводит символы псевдографики необходимо праву цифровую группу клавиш переключить в режим набора цифр (включить NumLock) и, удерживая клавишу ALT, набрать код нужного символа. Например, для вывода верхней границы таблицы необходимо задать символы с кодами 218, 196, 196 … 194, 196 …, 191:

 

Оформление отчета по лабораторной работе

Отчет по лабораторной работе оформляется согласно общим требованиям к оформлению отчетов.

 

Таблица 1 — Символы псевдографики
код символ код символ
179 195
180 196
191 197
192 217
193 218
194

Варианты задания 4.1

 

Функция и промежуток задания
1 y x 3 4 x 3 при х [2, 3] больше по модулю значения функции.
2 y   x 3 4 x 2

при х               [1, 6]

x 2 1

среднее значение функции на заданном промежутке.
3 x 3 3

y               при х [2, 5]

x 3

количество значений функции больших по К.
4 x 2 2

y               при х [5, 1)

x 1

максимальное значение функции и при каком значении оно достигается.
5 y x 3 3 x 5 при х [0, 6] максимальное и минимальное значения функции.
6 5 x

y                             2 x при х [2, 5]

2

определить сколько положительных значений функции.
7 y               x 1 x 2 при x [1, 10] минимальное по модулю значения функции.
8 y 3 x 2 x при х [2, 9] среднее арифметическое среди тех значений у, больше Р.
9 y 1 x 2 1 x 5 x при х [6, 6]

2 февраля

сколько отрицательных значений принимает функция на промежутке.
10 y e x 2 4 при x [6, 6] значения х при котором функция принимает наибольшее значение.
11 e x 2 5

y               при х (1, 4]

x 1

значения х при котором функция принимает наименьшее значение.
12 y l g 6 x 3 2 x 5 п ри х (- 0.8, 5] среднее арифметическое положительных значений функции.
13 y l n x 2 5 x 5 п ри х (- 10, 1.3] среднее арифметическое отрицательных значений функции.
14 y sin 2 x при х [-

2

количество значений функции, крупнее 0.5.
15 x 3

y cos при х [-

2

количество значений функции, попадающих в промежуток [0.2, 0.4].
Функция и промежуток задания
16 y   x 2 sin 2 x 2 x sin x

при х               (0, 2 ]

x 3

сумму значений функции меньших заданное В.
17 y l g a 2 x 1 п ри х (0, 2], а — цел е. сумму отрицательных значений функции.
18 y sin 3 x ln 10 x при х [1.5, 7.5]

2

 

количество значений функции превышающих 1.
19 y 3sin 2 5 x 0.5 при х [0, 0.2] наименьшее значения функции.
20 y e x sin x 2 при x [0, 3.0] произведение отрицательных значений функции.
21 y               1 x при х [0, / 2)

1 tg x 2

количество значений функции, в которых дробная часть больше 0.5.
22 y sin x cos ax 2 при х [0,6] количество значений функции, которые по модулю больше чем предыдущее значение.
23 y cos 2 x tg x при х [0.2, 8] значения х, в которых функция не определена на заданном промежутке.
24 y               sin x при х [0, 3]

5 cos x

среднее арифметическое значений у, меньше значения аргумента х.
25 y cos ax e x при х [0, 5] количество значений у, крупнее заданное С.

 

 

задача 4.2

    • Использовав свой вариант завдання1.2 (л.р.№1), переделать программу, оформив вычисления с этого варианта задания как подпрограмму. Описать эту подпрограмму как «черный ящик», определить, какие данные будут передаваться по значению, а какие по ссылке, разработать для подпрограммы МПЗ, составить схему алгоритма;
    • разработать МПЗ и СА для главной программы.
    • Оформить отчет согласно общих требований.

Рекомендации к выполнению работы

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

 

Математическая постановка задачи.

Для определения площади и периметра прямоугольника необходимо знать длины двух его сторон. Введем обозначения:

а — длина прямоугольника, задается в метрах (м); b — ширина прямоугольника (м);

P — периметр прямоугольника (м); S — площадь прямоугольника (м 2).

 

входные данные действия Исходные данные
a, b действительного типа. Ограничения: a, b> 0. P 2 a b ;

S a b.

P, S — настоящие.

Если оформлять эту программу как подпрограмму и подать ее как «черный ящик», имеем:

 

 

 

 

 

 

 

 

a P

b S

 

 

 

 

 

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

Текст подпрограммы будет таким:

6.Главная программа. Входные данные:

с1, с2 — длины сторон прямоугольника.Выходные дни данные:

Rp — периметр прямоугольника;

Rs — площадь прямоугольника.

 

 

 

 

 

 

 

Uses Crt; #include <stdio.h>
var c1, c2, Rp, Rs: real;
{Описание подпрограммы} / * Описание подпрограммы * /
Begin main ()
{Float c1, c2, Rp, Rs;
WriteLn ( ‘Введите данные:’); printf ( «Введите данные: ‘);
ReadLn (c1, c2) scanf ( «% f% f», & c1, & c2)
Rect (c1, c2, Rp, Rs) rect (c1, c2, & Rp, & Rs)
WriteLn ( ‘Периметр =’, Rp, printf ( «Периметр =% f \ tПлоща =% f \ n», Rp,
«Пдоща = ‘, Rs) Rs)
End. }

 

задача 4.3

Составить программу с использованием подпрограмм из стандартных библиотек для управления выводом на экран в составе двух подпрограмм:

1. Первая функция — в текстовом режиме работы экрана выводит цветным шрифтом в центре экрана информацию о разработчике программы и поздравления с ближайшим праздником для преподавателя;

2. Вторая — в графическом режиме работы экрана выводит эмблему разработчика, которая состоит как минимум с:

трех контурных и трех заполненных определенным стилем геометрических примитивов;

ФИО разработчика, выводимого на экран в горизонтальном и вертикальном направлениях различными стилями шрифта, размером и цветом.

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

В отчете привести описание всех использованных библиотечных подпрограмм и описание с указанием экранных координат, цветов и стилей изображений, выводит программа.

Задания для самостоятельного выполнения

В главной программе создать текстовое меню, в котором 3 пункта: текстовая заставка, графическая эмблема, выход. Выбор пункта меню осуществляется через нажатие клавиши с номером пункта.

* — это задания для самостоятельного выполнения по желанию !!!

Лабораторная работа №5.

Обработка массивов данных

 

Задача 5.1 2

    • Составить математическую постановку задачи, схему алгоритма и программу для обработки одномерного массива данных согласно варианту задания;
    • описать две подпрограммы, передав в них массив как параметр: первая — для ввода, вторая — для вывода элементов массива на экран по 10 элементов в экранный строка;
    • перед выводом результатов работы необходимо, очистить экран, вывести входной массив, а затем результаты работы программы;
    • * Описать программный модуль (библиотеку), в которую перенести подпрограммы

ввода / вывода массива; передать в эти подпрограммы открытый массив; проверить работоспособность на массивах разных размеров.

 

Рекомендации к выполнению работы

Ввода / вывода массива

В языке Паскаль для передачи массивов в качестве параметров подпрограмм необходимо

[1, 2; 4, 9]:

      • описать тип для массива в разделе type;
      • при передаче в подпрограмму описать массив как параметр переменную.Например, заданный целочисленный массив из 50 элементов [4].

Const N = 50; Type

 

 

Var

Ar_Type = array [1 ..N] of integer;

 

A, B: Ar_Type; {Оисано два массива A и В}

Procedure Input_Ar (var X: Ar_Type)

{В процедуры передается параметр переменная массив X}

 

 

 

 

 

 

 

 

end;

Var I: byte; begin

WriteLn ( ‘Введение элементов массива’); for I: = 1 to N do

begin

Write ( ‘Введите элемент «, i: 3,’: ‘); Read (X [i]);

end;

Begin

Input_Ar (A); Input_Ar (B)

end.

 

2 — Отчет по лабораторной оформляется согласно требованиям по оформлению отчетов для программ с подпрограммами (Л.Р.№4).

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

WriteLn ( ‘Вывод элементов массива’); for I: = 1 to N do

begin

Write (X [i]: 5);

if I mod 10 = 0 then WriteLn; end;

В результате работы такого цикла элементы массива будут выводиться по десять в экранный строку.

На языке Си ввода / вывода массива можно организовать так:

#include <stdio.h>

#define N 50

void input_ar (int * x) / * передача массива в качестве параметра-переменной * /

{int i;

printf ( «Введение элементов массива \ n»); for (i = 0; i <N; i ++)

{Printf ( «Введите элемент% d:» i) scanf ( «% d», & x [i]);

}

}

Общий синтаксис передачи массива в функцию языка Си такой [6-8; 10]:

тип_рузультату_функции имя_функции

(Тип_елементив_масиву * имья_масиву)

Обращение к параметра массива в теле функции осуществляется по обычному массива:

имья_масиву [индекс_елемента]

открытые массивы

К сожалению процедура Input_Ar не является достаточно универсальной, она предназначена только для ввода массива одного типа Ar_Type. Если в программе возникнет необходимость ввести целочисленный массив с другим количеством элементов, процедурой Input_Ar невозможно будет воспользоваться для этого. Более универсальной эта процедура станет, если она будет предназначена для ввода целочисленного массива произвольного размера. Для этого необходимо воспользоваться открытым массивом. [1, 2; 4, 9]

Передача массива в функцию языка Си больше похожа на открытые массивы языка Паскаль, так как при передаче массива его размер практически ничем не ограничен. Если желательно, чтобы функция обрабатывала массивы разные по размеру, вторым параметром в такую ​​функцию целесообразно передать количество элементов в массиве [6-8; 10].

Варианты задания 5.1

1. Массив из 100 целых чисел заменить все отрицательные элементы на их модули.

2. Массив из 100 целых чисел найти суммы всех положительных и всех отрицательных элементов.

3. В массиве из 100 целых чисел при условии равенства элемента 0 заменить его

«Соседей» слева и справа соответственно на -1 и 1.

4. В массиве из 100 целых чисел найти сумму наибольшего и наименьшего из отрицательных элементов.

5. Соответствующему элементу массива В присвоить true, если элемент массива Х положительный.

6. В массиве из 100 целых чисел найти сумму минимального и максимального элементов.

7. В массиве из 100 целых чисел заменить 0 все элементы, индекс которых равно числу Фибоначчи.

8. В целочисленном массива Х (100) заменить значение элементов на значение с противоположным знаком.

9. В массиве из 50 действительных значений определить суммы S_p S_np парных и непарных элементов.

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

11. В массиве из 100 целых чисел поменять местами соседние элементы (1-й со 2-м, 3-й с

4-м и т.д.).

12. Записать в массив К (20) элементы ряда Фибоначчи.

13. Проверить образуют элементы массив Х (10) ряд Фибоначчи.

14. В массиве из 100 элементов определить сумму элементов, расположенных между макимальный и минимальным значениями.

15. Определить образуют элементы массива В (75) последовательность, приходит.

16. Определить все элементы массива В (100) не превышают диапазона [a, b].

17. Найти               произведение               элементов               массива               К (70), что               находятся               слева               от максимума.

18. Поменять местами элементы массива с индексами одной четности (1-й и 3-й, 2

й и 4-й и т.д.).

19. Записать в массив К (10) цифры заданного целого числа Т.

20. Получить значение целочисленной переменной К, цифры которой записаны поразрядно в массив Х.

21. Определить количество элементов массива Т (50), что больше своих соседей слева и справа.

22. Элементы массива из 100 действительных чисел расположить в обратном порядке.

23. Определить количество элементов целочисленного массива А (100), четность которых совпадает с четностью их индексов.

24. Определить количество изменений знака в массиве действительных чисел К (100). Под изменением знака понимается расположение рядом отрицательного и положительного значения, например, в последовательности 17, 4, 5, -7, 8, -3 будет три смены знака.

25. В               целочисленном               массиве               В (100) определить               количество               элементов, равны макимальный.

задача 5.2

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

описать подпрограмму для ввода элементов массива с помощью генератора случайных чисел;

описать подпрограмму для вывода массива на экран;

* Добавить в программного модуля (библиотеки) с задания 5.1 подпрограммы ввода / вывода матрицы; при вводе предусмотреть возможность введения матрицы вручную и с помощью генератора.

Рекомендации к выполнению работы

Использование генератора случайных чисел

Генератор случайных чисел — специальная библиотечная подпрограмма, которая возвращает случайное значение. В языке Паскаль работа генератора возможна в двух режимах: генерация случайного целого в пределах от 0 до заданного значения (в примере 1 для переменной k будет сгенерированное число от 0 до 1000) или генерация действительного в пределах от 0 до 1 (пример 1, язык Паскаль , переменная r) [2, 4]

В языке Си в отличие от Паскаль есть две функции генератора, но они дают только целые числа: функция int random (int num) дает случайное целое в пределах от 0 до num-1; функция int rand (void) дает случайное целое в пределах от 0 до RAND_MAX = 32767 [6-8].

Следует заметить, что для использования функций-генераторов в языке СИ необходимо подключить библиотеку <stdlib.h>.

Перед тем как начать генерацию случайных чисел необходимо провести инициализацию генератора (включить его), используя процедуру Паскаль randomize [2, 4] или функцию randomize () языка Си [6-8].

Пример 1. Использование генератора для получения целого и действительного значений.

 

#include <stdlib.h>
var k: integer; int k; float r;
r: real; main ()
begin {
randomize; randomize ();
k = random (1000) k = random (1000)
r = random; r = (float) rand () / 100.0;
end. }

Но возникает вопрос: как получить отрицательное значение? Для этого можно еще раз применить генератор. Справедливо считать, что существует одинаковая вероятность получить положительное или отрицательное значение, так использовав

* — это задания для самостоятельного выполнения по желанию !!!

генератор еще раз, можно проверить, если полученное значение больше 0,5,

считаем число положительным, нет — отрицательным (или наоборот).

Пример 2.Использование генератора для получения отрицательных и положительных значений.

 

#include <stdlib.h>
var k: integer; int k;
main ()
begin {
randomize; randomize ();
k = random (1000) k = random (1000)
if random <0.5 then k = — k; if (random (100) <50) k = -k;
end. }

 

варианты задания

1. В матрицы М (N, M) найти сумму элементов четных строк.

2. В матрицы М (N, M) найти сумму отрицательных элементов.

3. В матрицы М (N, M) заменить элементы четных строк на цифры от 0 до 9.

4. В матрицы М (N, M) поменять местами элементы 1-го и 2-го строк, 3-го и 4-го и т.д.

5. В матрицы М (N, M) найти сумму элементов нечетных строк.

6. В матрицы М (N, M) все элементы строки, в которой находится минимальный элемент матрицы заменить на противоположное значение по знаком.

7. В матрицы М (N, M) найти сумму элементов главной и боковой диагоналей.

8. В матрицы М (N, M) поменять местами элементы главной и боковой диагоналей.

9. В матрицы М (N, M) найти сумму отрицательных элементов нечетных столбиков.

10. В матрицы М (N, M) поменять местами элементы строк и столбцов.

11. Определить М (N, M) симметричная матрица М (10б 10) относительно главной диагонали.

12. В матрицы М (N, M) найти сумму элементов четных столбцов.

13. Для каждой строки матрицы М (N, M) вывести сообщение, если его элементы упорядочены по возрастанию.

14. Для каждого столбца матрицы М (N, M) вывести сообщение, если его элементы упорядочены по убыванию.

15. Для каждой строки матрицы М (N, M) вывести сообщение, если его элементы симметричны.

16. Для каждого столбца матрицы М (N, M) вывести сообщение, если его элементы образуют арифметическую прогрессию.

17. Для каждого столбца матрицы М (N, M) вывести сообщение, если его элементы образуют геометрическую прогрессию.

18. В матрицы Р (N, M) найти произведение элементов каждой строки.

19. В матрицы Р (N, M) найти сумму элементов каждого столбца.

20. Определить произведение двух матриц размером NxN.

21. Определить произведение матрицы NxN и массива из N элементов.

22. Транспонировать матрицу А (N, M).

23. Определить определитель матрицы К (3, 3).

24. В матрицы Х (N, N) определить является ли она магическим квадратом.

25. Определить номер строки матрицы С (N, N), сумма элементов которого наибольшая.

Задача 5.3. Обработка строк символов языка Паскаль

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

каждое задание описать как отдельную подпрограмму без параметров;

в главной программе организовать меню для выбора задач или выхода из программы.

 

Рекомендации к выполнению работы

Строка символов языка Паскаль описывается типом string и представляет собой упакованный массив символов, то есть packed array [0..255] of char.Таким образом, каждый символ строки имеет свой порядковый номер (индекс). Нулевой элемент содержит общий размер (длина) строки (рис 5.1). [1, 2; 4, 9]

Var s: string; S

s [0] s [1] s [2] s [3] s [4] . . . s [254] s [255]
Chr (255) a b c @ $ d

 

Рис. 5.1

 

Если в задаче нет необходимости использовать все 256 символов строки, можно при описании задать другую длину:

Var s: string [10]; {строка длиной в 10 символов}

Несмотря на то, что строка это массив, над строками в языке Паскаль допустимо выполнение таких операций [1, 2; 4, 9]:

    • присвоение строк одинаковой длины (по описанием)
    • сравнения строк одинаковой длины;
    • добавления (склеивание, конкатенация) строк.

Кроме того строки вводятся и выводятся как простые переменные, а не в цикле как массивы.

введение строки вывод строки
ReadLn (s) WriteLn (s)

Определенные проблемы могут возникнуть при введении двух строк подряд.  Если их вводить в одном операторе ReadLn, например, ReadLn (s1, s2), то в результате вся информация попадет в первую строку. Для того, чтобы этого избежать необходимо каждую строку вводить в отдельном операторе ReadLn (но не в Read):

WriteLn ( ‘Input s1:’); ReadLn (s1) WriteLn ( ‘Input s2:’); ReadLn (s2)

В языке Паскаль существует несколько процедур и функций обработки строчной информации, которые подробно описаны в [1, 2; 4].

Надо заметить, что функция поиска подстроки в строке Pos находит только первое вхождение подстроки в строку.Поэтому для выполнения 4-го задания в вариантах необходимо:

1. Найти первое вхождение подстроки;

2. Удалить его из строки (и выполнить другие необходимые действия в соответствии с вариантом задания);

3. Вернуться к поиску следующего вхождения. Понятно, что речь идет об организации циклического процесса: While pos (…… ……) <> 0 do {пока pos находит подстроку }

Begin ………… End;

 

Варианты заданий 5.3

задания
1 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «read ‘;

2) после первого буквосочетание ‘tr’ вставить «ue ‘;

3) в строку X скопировать 5 символов из строки S, начиная со 2 позиции;

4) все вхождения ‘ed’ заменить на «ing».

2 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «do ‘;

2) после первой буквы «e» вставить буквосочетание «nd ‘;

3) в строку X скопировать 4 символа из строки S, начиная с середины строки

4) заменить все буквосочетания ‘it’ на «is ‘;

3 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «are ‘;

2) после первой буквы ‘a’ вставить буквосочетание «bc»;

3) в строку X скопировать 6 символы строки S, начиная с позиции следующей за первой буквой «a»

4) удалить из S каждый символ ‘*’

4 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «we»

2) после первого буквосочетание «el» вставить «se ‘;

3) в строку X скопировать 3 символы строки S, начиная с 5 позиции

4) все вхождения ‘km’ заменить на «cn»

5 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «red;

2) после первого буквосочетание ‘th’ вставить «e»;

3) в строку X скопировать 5 символов из строки S, начиная с 6 позиции;

4) удалить из строки все запятые и точки.

6 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «var»

2) после первого буквосочетание ‘th’ вставить «en»;

3) в строку X скопировать все символы строки S, начиная с середины строки

4) подсчитать количество буквосочетаний «sh»

7 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «they ‘;

2) после первой буквы «s» вставить буквосочетание «tring ‘;

3) в строку X скопировать 6 последних символов из строки S;

4) после каждой буквы «w» добавить букву «q».

задания
8 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «for ‘;

2) после первой буквы ‘r’ вставить «eal ‘;

3) в строку X скопировать 4 символа из строки S, начиная с 5 позиции;

4) удалить из S все вхождения «abc».

9 Заданная строка S. Преобразовать S следующим образом:

5) удалить из S первое вхождение буквосочетание «while ‘;

6) после первой буквы «c» вставить «har ‘;

7) в строку X скопировать 5 символов из строки S, начиная с 3 позиции;

8) удалить из S все вхождения «qwerty».

10 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение «true»;

2) после первой буквы «i» вставить буквосочетание «ng ‘;

3) в строку X скопировать 5 символов из строки S, начиная с 6 позиции ;

4) заменить все «x» на буквосочетание «ks».

11 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение «case ‘;

2) после первой буквы «р» вставить букву «e»;

3) в строку X скопировать 4 символа из строки S, начиная с середины строки;

4) после каждой буквы «i» добавить буквосочетание «am».

12 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «no»;

2) после первой «begin» вставить «end ‘;

3) в строку X скопировать 6 символов из строки S, начиная со 2 позиции ;

4) удалить из строки все вхождения буквосочетания «xyz».

13 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «end ‘;

2) после первой буквы «t» вставить буквосочетание «rue ‘;

3) в строку X скопировать 6 символов из строки S, начиная с первой буквы

w;

4) все вхождения ‘ed’ заменить на «ing».

14 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «begin ‘;

2) после первой буквы «e» вставить буквосочетание «nd ‘;

3) в строку X скопировать 4 символа из строки S после первого пропуска ;

4) заменить все буквосочетания ‘er’ на «s».

15 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «const ‘;

2) после первой буквы «v» вставить буквосочетание «ar ‘;

3) в строку X скопировать 7 символов из строки S, начиная с 10 позиции ;

4) заменить все буквосочетание «were» на «are».

16 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «while ‘;

2) после первой буквы «f» вставить буквосочетание «or ‘;

3) в строку X скопировать 6 символов из строки S после первой точки;

4) подсчитать количество буквосочетаний «ing».

задания
17 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение «type ‘;

2) после первой буквы «w» вставить буквосочетание «hile ‘;

3) в строку X скопировать 3 символы строки S, начиная с 4 позиции;

4) удалить из S все вхождения букв «m» и «f».

18 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «int ‘;

2) после первого буквосочетание ‘un’ вставить «til ‘;

3) в строку X скопировать 3 символы строки S после первой комы ;

4) повторить каждую букву «a».

19 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «er ‘;

2) после первого буквосочетание ‘un’ вставить «til ‘;

3) в строку X скопировать 4 символа из строки S после первой «q»;

4) подсчитать количество буквосочетаний «sh».

20 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «tr ‘;

2) после первого буквосочетание ‘func’ вставить «tion ‘;

3) в строку D скопировать 3 символы строки S после первой «k ‘;

4) подсчитать количество буквосочетаний «th».

21 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «in ‘;

2) после первого буквосочетание ‘co’ вставить «de ‘;

3) в строку Z скопировать 5 символы строки S после первой «t ‘;

4) подсчитать количество буквосочетаний «ro».

22 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «ng ‘;

2) после первого буквосочетание ‘tu’ вставить «rn ‘;

3) в строку X скопировать 2 символа из строки S после первой «q»;

4) подсчитать количество буквосочетаний «ght».

23 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «not ‘;

2) после первого буквосочетание ‘so’ вставить «on»;

3) в строку X скопировать 4 символа из строки S после первой «j»;

4) подсчитать количество буквосочетаний «re».

24 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «fun»;

2) после первого буквосочетание ‘li’ вставить «fe ‘;

3) в строку X скопировать 4 символа из строки S после первой «d ‘;

4) подсчитать количество буквосочетаний «vo».

25 Заданная строка S. Преобразовать S следующим образом:

1) удалить из S первое вхождение буквосочетание «re ‘;

2) после первого буквосочетание ‘go’ вставить «od ‘;

3) в строку X скопировать 3 символы строки S после первой «s ‘;

4) подсчитать количество буквосочетаний «le».

Лабораторная работа №6.

Обработка структурированных типов данных

 

задания

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

в программе описать тип записи (структуру) для своей задачи (столбец

«Данные») и массив из N записей (структур) этого типа. Разработать набор тестовых данных до 10 записей.

каждое задание (варианты заданий, столбец «Задание») описать как отдельную подпрограмму (процедуру или функцию), передав массив записей в качестве параметра;

вывести на экран данные из массива в табличном виде (оформить как подпрограмму с массивом — параметром).Границы таблицы на экране можно задать символами ‘*’ или символами псевдографики;

после вывода таблицы с входными данными результаты работы программы;

* добавить в программу подпрограммы для сохранения данных в файл и считывания данных из файла (Паскаль — типизированный файл, Си — обычный текстовый).

Рекомендации к выполнению работы

К структурированных типов данных (СТД) относятся тип запись record языка Паскаль и тип struct языка Си.

Рассмотрим пример описания и обработки СТД для списка студентов. По каждому студенту задается фамилия, номер зачетной книжки и оценка по определенной дисциплине в баллах от 0 до 100. Подадим необходимые данные в виде таблицы:

Фамилия студента Номер зачетной книжки оценка
Иваненко П.П. 1402 97

Шапка этой таблицы состоит из трех столбцов (полей), то есть и СТД будет иметь три поля. Осталось определиться с идентификатором и типом каждого поля:

Фамилия студента Номер зачетной книжки оценка
идентификатор PIB Nomer Ocinka
Тип (Pascal) string [20] word byte
Тип (C) char [20] unsigned int unsigned short

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

 

 

* — задание выполняется самостоятельно с желанию.

 

 

 

 

 

 

 

 

Теперь можно описать переменную:

 

 

Pascal C
Var
Student: StudentType; struct StudentType student;

 

Для того чтобы полям переменной СТД присвоить значение, необходимо обращаться отдельно к каждому поля, используя оператор раскрытия записи (структуры) «. «(Точка).Общий синтаксис:

зминнаСТД. поле

 

 

Pascal C
Student. PIB = ‘Иваненко П.П. «; strcpy (student.PIB, «Иваненко П.П.»);
Student. Nomer = 1402; student. Nomer = 1402;
Student. Ocinka = 97; student. Ocinka = 97;

 

Теперь переменная Student сохраняет данные о студенте Иваненко П.П., у которого номер зачетки 1402, и который получил оценку 97 баллов.

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

strcpy (строка-приемник, строка-источник)

библиотеки <strings.h>, которая выполняет копирование содержимого из строки-источника к рядка- приемника.

Присвоение данных записи Student с использованием оператору присоединения Паскаль (в языке Си оператора присоединения не существует!) будет выглядеть так:

with Student do begin

PIB = ‘Иваненко П.П. «; Nomer = 345;

Ocinka = 5;

end;

 

Использование массива записей

С использованием вышеописанного типа можно задать массив записей для сохранения данных о студенческой группе:

 

Pascal C
Var
StudentGroup: array [1 ..N] of

StudentType;

struct StudentType

StudentGroup [N];

 

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

Для доступа к элементам массива используется операция индексирования и раскрытия записи:

 

Pascal C
StudentGroup [1].PIB =

«Андрейченко ‘;

strcpy (StudentGroup [0].PIB, «Андрейченко»)
StudentGroup [1].Nomer = 1367; StudentGroup [0].Nomer = 1367;
StudentGroup [1].Ocinka = 75; StudentGroup [0].Ocinka = 75;

 

или оператором присоединения: with StudentGroup [1] do begin

PIB = ‘Андрейченко’; Nomer = 1367;

Ocinka = 75;

 

 

цикла:

end;

Если проводить, введение элементов массива, то подойдет такой оператор

 

 

Pascal C
for i: = 1 to N do for (i = 0; i <N; i ++)
with StudentGroup [i] do {
begin
Write ( ‘Введите фамилию «, i: 3,

«Студента: ‘);

printf ( «\ nВведить фамилия студента: ‘);
Read (PIB) scanf ( «% s», & studentgroup [i].PIB)
Write ( ‘Введите номер его

зачетки: ‘);

printf ( «\ n Введите номер его зачетки: ‘);
Read (Nomer) scanf ( «% u», & studentgroup [i].Nomer)
Write ( ‘Введите его оценку:’); printf ( «\ n Введите его оценку: ‘);
Read (Ocinka) scanf ( «% u», & studentgroup [i].Ocinka)
end; }

варианты заданий

данные задания
1 Данные о стоимости международных телефонных переговоров (фамилия абонента, количество минут, стоимость) общую стоимость разговоров; фамилия абонента, разговаривал по самому низкому тарифу
2 Сведения о товарах на складе (название товара, цена за единицу, количество единиц) самую дорогую               партию               товара; общую стоимость товаров на составе
3 Данные для учета лекарств в аптеке (название, количество упаковок, интенсивность продаж в день) названия лекарств, запас которых остался на К дней среднюю интенсивность потребления лекарств
4 Сведения об операторах мобильной связи (название оператора, код, стоимость минуты в сети) средняя стоимость минуты разговора; сведения об операторах, стоимость минуты у которых не больше Р
5 Результаты сдачи вступительных экзаменов в институт (фамилия абитуриента, оценка по математике и диктанта) фамилии абитуриентов, средний балл которых больше В; количество абитуриентов, не сдавших экзамены
6 сведения               о               проведение спортивных соревнований (команда1, очки, команда2, очки) команды-победители; общее количество набранных очков
7 сведения               о               результаты проведения                             олимпиады               по программированию (фамилия студента, количество решенных задач, количество набранных баллов) фамилии               студентов,               заняли призовые места
8 Сведения о пропусках студентами занятий (фамилия студента, количество пропущенных лекций и практических) Фамилии студентов, пропустили количество занятий превышающую К; общее количество пропущенных занятий
9 Сведения о расписании движения поездов (№ поезда, пункт назначения, время отправления) номера поездов, следующих в пункт Р; количество поездов, отправляющихся ночью
10 Сведения о графике проведения кружков (название кружка, день недели, время) количество кружков, проводятся в заданный день; названия кружков, проводятся в 12:00 дня
11 Сведения об объеме учебного времени по дисциплине (название дисциплины, количество лекций, лабораторных и практических занятий) общий объем учебного времени по дисциплинам; названия дисциплин, в которых количество лекций больше общее количество практических занятий
12 Сведения о дисплейные классы (№ класса, фамилия               старшего оператора, количество компьютеров) номера               классов, количество компьютеров в которых больше К; фамилии операторов, которые закреплены за несколькими классами
13 сведения               о               характеристики характеристики               машин, объем
данные задания
стиральных машин (название, объем загрузки, частота вращения барабана, цена) загрузки и цена которых не более заданных; среднюю стоимость машин
14 Сведения о специальностях университета (название специальности, количество               студентов, форма обучения (очная, заочная)) данные о специальности с количеством студентов большей К; среднее количество               студентов               по специальностям
15 данные               метеорологического наблюдения за неделю (день, температура воздуха, атмосферное давление) среднюю температуру и давление за неделю; день, когда температура воздуха или давление превышали среднее значение
16 Данные о жилой площади квартир дома (№ квартиры, количество комнат, площадь) среднюю площадь комнаты в доме; данные о квартирах, средняя площадь комнат в которых больше полученное среднее значение по дому
17 Данные о маршрутах общественного транспорта (номер маршрута, название, интервал движения) среднее значение интервала; данные о маршрутах, интервал движения которых меньше среднего значения
18 Данные о расположении телевизионных ретрансляторов               (номер

ретранслятора, географические координаты, радиус действия)

данные о ретрансляторы, область действия которых пересекается
19 Сведения о туристические путевки (название страны, количество путевок, стоимость одной) названия стран, стоимость путевки в которых не превышает заданного значения Р; общую стоимость всех путевок
20 Сведения о поставщиках сырья одного вида (название фирмы-поставщика, стоимость единицы, объем поставки) данные поставщиков, стоимость сырья в которых наименьшая; общий объем и стоимость приобретенного сырья
21 Сведения о должностных окладах работников (название должности, количество мест, оклад, коэффициент надбавки за вредность работы) названия должностей, на которых с / п (с учетом надбавки) больше Т; общий объем с / п
22 Данные о работе Internet-кафе (название, время открытия и закрытия, стоимость услуг) данные о кафе с наибольшей продолжительностью работы; среднюю стоимость услуг
23 сведения о               реки страны (название,

длина, площадь бассейна)

данные о реках, длина которых больше Р; общую площадь водного бассейна страны
24 Сведения о государственных света (название праздника, день, месяц, количество выходных дней) общее количество праздничных дней данные о праздниках по заданному месяцем
25 Данные о студентах, имеющих академические задолженности (фамилия студента, количество несобранные данные о студентах с наибольшей академ. задолженностью; среднее количество несданных экзаменов и зачетов

 

 

Лабораторная работа №7.

Обработка типа множество Паскаль

 

задания

    • составить математическую постановку задачи, схему алгоритма и программу на языке Паскаль для обработки множеств;
    • описать тип данных для множества согласно варианта;
    • описать две переменные-множества и провести их инициализацию с помощью конструктора множества;
    • основной программы (или в подпрограммы) для нахождения пересечения, объединения, разности двух множеств, проверки на включение одного множества к другому и проверки на включение множеству заданного элемента;
    • * описать подпрограммы для введение и вывода элементов множеств.

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

 

Рекомендации к выполнению работы

Для удобства разработки программы необходимо описать тип множества, а затем переменную-множество этого типа, например:

Type

 

 

 

 

Var

Тип_множина = set of диапазон_значень_елементив; Digits = set of ‘0’ .. ‘9 ‘;

AlphaBet = set of ‘A’ .. ‘Z ‘; Double_dig = set of 10..99;

 

D: Digit; A: AlphaBet; Dig: Double_dig;

При описании типа элементов множества необходимо помнить, что:

  • базовым типом при задании диапазона значений для элементов может быть беззнаковый целый или символьный тип данных;
  • общее количество элементов множества не может превышать 256;
  • при описании типа множества в качестве диапазона значений элементов допустимо использовать типы byte и char, например:

Type

Set_1 = set of byte; Set_2 = set of char;

Инициализация переменных-множеств и операции над множествами               подробно описаны в [1, 2; 4, 9].

* — эта задача выполняется самостоятельно по желанию.

Ввода / вывода элементов переменных-множеств

Введение элементов переменных-множеств можно организовать так:

1. Запросить у пользователя количество элементов в множестве;

2. По заданным количеством организовать цикл, в котором вводить переменную, тип которой соответствует базовому типа элемента множества. Если множество была описана определенным диапазоном, то необходимо проверить, принадлежит ли значение введенной переменной заданному диапазону, если нет, то вывести об этом сообщение. Иначе включить введенную смену множеству операцией include.

Вывод элементов переменных-множеств можно организовать так: в цикле по всем возможным элементах множества проверять, если очередной элемент принадлежит множеству, вывести его на экран.

 

оформление отчета

В отчете приводится:

1) задачи и вариант задания;

2) математическая постановка задачи для операций над множествами с тестовым примером;

3) анализ результатов работы программы;

4) текст программы.

 

варианты заданий

задания
1 Описать тип для множества, включая цифры от ‘0’ до ‘9’
2 Описать тип для множества, включая буквы от ‘A’ до ‘J’
3 Описать тип для множества, включая буквы от ‘K’ в ‘S’
4 Описать тип для множества, включая буквы от ‘T’ до ‘Z’
5 Описать тип для множества, включая символы от ‘!’ к ‘/’.
6 Описать тип для множества, включая английские буквы от «a» до «i»
7 Описать тип для множества, включая английские буквы от «j ‘до’ t ‘
задания
8 Описать тип для множества, включая английские буквы от «s ‘до’ z ‘
9 Описать тип для множества, включая украинские буквы от «А» до «С»
10 Описать тип для множества, включая украинские буквы от ‘К’ до ‘В’
11 Описать тип для множества, включая украинские буквы от «Ф» до «Я»
12 Описать тип для множества, включая украинские буквы от ‘а’ до ‘с’
13 Описать тип для множества, включая украинские буквы от «к» к «п»
14 Описать тип для множества, включая украинские буквы от «р ‘к’ ч ‘
15 Описать тип для множества, включая числа от 1 до 31. Задать два множества: одна — праздничные дни января этого года, вторая — выходные дни (суббота, воскресенье) января этого года.
16 Описать тип множества для трьохзнакових целых. Задать два множества: одна — существующие коды операторов мобильной связи (без учета первый 0), вторая — коды операторов, которыми пользуются члены Вашей семьи (друзья).
17 Описать тип множества для целых. Задать два множества: одна — степени 2

от 0 до 16, вторая — степени 4 от 0 до 8.

18 Описать тип множества для целых. Задать два множества: одна — праздничные дни мая этого года, вторая — рабочие дни мая (понед. — пятн.) Независимо от того выпадает он на праздничный день или нет.
19 Описать тип множества для целых. Задать два множества: одна — результаты таблицы умножения на 3, вторая — результаты таблицы умножения на 6.
20 Описать тип множества для целых. Задать два множества: одна — високосные годы 20 века (первый високосный 1904), вторая — високосные годы 21 века (первый високосный 2004).
21 Описать тип множества для символов. Задать два множества: одна — знаки арифметических операций языка Паскаль (операции mod, div обозначить первыми буквами), вторая — знаки арифметических операций языка Си.
22 Описать тип множества для символов. Задать два множества: одна — все скобки, которые могут использоваться в языке Паскаль, вторая — скобки языка Си.
23 Описать тип множества для символов. Задать два множества: одна — буквы, с которых начинаются фамилии студентов Вашей группы, вторая — буквы, с которых начинаются фамилии студентов параллельной группы.
24 Описать тип множества для символов. Задать два множества: одна — первые буквы из международных марок автомобилей восточных производителей, вторая — первые буквы из международных марок автомобилей западных производителей.
25 Описать тип множества для целых. Задать два множества: одна — двознакови парные, вторая — степени двойки от 0 до 10.

Лабораторная работа №8.

Динамическое распределение памяти

 

Задача 8.1. Типизированные и нетипизированные указатели

Составить программу, в которой:

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

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

записать в выделенные области памяти определенные значения (сначала присвоением, а затем — введением с клавиатуры)

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

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

 

Рекомендации к выполнению работы

Указатель — переменная, хранящая адрес области (ячейки) в оперативной памяти. Переменная-указатель (СП) может быть типизированным или нетипизированного.

Паскаль Си
типизированный указатель
Var
имья_ЗП: ^ тип, тип * имья_ЗП;
p: ^ integer; int * p;
нетипизированных указатель
Var
имья_ЗП: pointer; void * имья_ЗП;
t: pointer; void * t;

 

В приведенном выше примере переменная-указатель р — типизированный указатель. Это означает, что она может хранить адрес области памяти, в которую записано только целочисленное значение (при описании переменной задан целочисленный тип данных).

Переменная-указатель t — нетипизированных указатель, то есть эта переменная сохраняет адрес области памяти, в которую записаны данные неопределенного типа. Но известно, что все данные должны быть описаны определенным типом, поэтому при работе с нетипизированного указателем необходимо всегда !!! явно приводить тип (см. соответствующий раздел ниже).

 

Выделение памяти для указателей

После описания Смена-указателя (СП) ее значение неопределенное, ведь при описании, никакую адрес в эту область не происходило. Следовательно, необходимо выделить область памяти и записать адрес этой области в ЗП.

Паскаль Си
типизированный указатель
New (имья_ЗП) имья_ЗП = (тип *) malloc (sizeof (тип))
New (p) p = (int *) malloc (sizeof (int));
нетипизированных указатель
GetMem (имья_ЗП,

размер области);

имья_ЗП = malloc (размер области);
GetMem (t, sizeof (real)) t = malloc (sizeof (float))

В языке Паскаль для выделения памяти под типизированной и нетипизированных указатели используются различные процедуры (New и GetMem). В языке С функция выделения памяти одинакова для нетипизированных и типизированных указателей. При этом функция malloc ориентирована на работу с нетипизированного указателями, поэтому при выделении памяти под типизированные указатели необходимо явно приводить тип результата malloc к типу указателя.

Кроме того вторым параметром malloc (а также GetMem в Pascal) является размер области памяти, которую необходимо выделить. В приведенном выше примере выделяется область памяти размером равным размеру действительного значения типа real (float).

 

раскрытие ссылки

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

Паскаль Си графическая интерпретация
Var p, q: ^ integer; int * p, q;
begin p =

(Int *) malloc (sizeof (int));

New (p) New (q) q =

(Int *) malloc (sizeof (int));

p = q; p = q;
end.

 

В приведенном примере описаны два типизированные указатели p и q. Для них выделены области памяти одинакового размера. После этого происходит присвоение p = q, которое приведет к тому, что к переменной г. будет записана та же адрес, хранящийся в переменной q (при этом адрес, хранившейся в г. будет потеряно!).

При работе с указателями необходимо четко различать, когда ведется работа по адресам выделенных областей памяти, а когда с содержанием выделенных областей памяти (т.е. данным, на которые ссылаются указатели). Чтобы получить доступ к области памяти, на которую ссылается указатель, необходимо применить операцию раскрытия ссылки:

 

Паскаль Си
имья_ЗП ^ * имья_ЗП
p ^ * p

Рассмотрим пример, в котором в выделенные области памяти для указателей p

и q записываются определенные значения, а их произведение выводится на экран.

 

 

Паскаль Си графическая интерпретация
p ^: = 10; * P = 10;
q ^ = 15; * P = 15;
WriteLn ( ‘Произведение =’,

p ^ * q ^)

printf ( «Произведение =% d»,

(* P) ​​* (* q))

 

Приведение типов для нетипизированных указателей

При работе с нетипизированного указателями при вскрытии ссылки необходимо явно приводить тип (t — нетипизированных указатель из предыдущего раздела):

 

Паскаль Си
тип (имья_ЗП ^) * (Тип_ЗП) имья_ЗП
real (t ^) * (Float *) t

В языке Паскаль и Си подход к явному приведения типов нетипизированных указателей различается:

    • в языке Паскаль сначала раскрывается ссылки (приобретается доступ к содержимому области памяти), а затем содержимое области памяти приводится к необходимому типа;
    • в языке Си сначала нетипизированных указатель приводится к типизированного указателя, а затем раскрывается ссылки.

Освобождение памяти для указателей

после               того, как               «все               работы »с               использованием               указателя закончены,

обязательно необходимо освободить выделенную область памяти:

 

 

оформление отчета

В отчете для этой задачи, а также для следующих задач 8.2-8.3

необходимо привести:

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

варианты заданий

p1 p2 p1 p2
1 byte, word, 2 integer, byte,
3 word, short, 4 longint, word,
5 short, integer, 6 real, short,
7 integer, longint, 8 byte, longint,
9 longint, real, 10 word, real,
11 real, byte, 12 short, byte,
13 byte, short, 14 integer, word,
15 word, integer, 16 longint, short,
17 short, longint, 18 real, integer,
19 integer, real, 20 byte, real,
21 longint, byte, 22 word, byte,
23 real, word, 24 short, word,
25 byte, integer, 26 integer, short,
27 word, longint, 28 longint, integer,
29 short, real, 30 real, longint,

 

Задача 8.2.Указатели и структурированные типы данных

Составить программу, в которой описать типизированной и нетипизированных указатель на тип запись (структуру) по лабораторной работе 6, выделить память, инициализировать поля записи (структуры), вывести их значения на экран.

 

Рекомендации к выполнению работы

Описание указателя на структурированный тип данных (запись Паскаль или структуру языка Си) выполняется следующим образом:

Паскаль Си
Описание структурированного типа
Type
TSomeRecord = record struct Some {
A: integer; int A;
B: real; float B
end; };
типизированный указатель
p: ^ TSomeRecord; struct Some * p;

 

Выделение памяти для записи (структуры) осуществляется аналогично любому другому стандартного типа данных (см. Задачу 8.1).

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

    • сначала раскрывается ссылки, в результате чего получается доступ к области памяти, где хранятся данные полей записи (структуры);
    • через операцию ‘.’ указывается поле структуры, значение которого берется.

Следует заметить, что в языке Си доступ к полям структур можно осуществить двумя способами: через раскрытие ссылки и оператор ‘.’ или с помощью оператора «->» (стрелка).

 

Паскаль Си
типизированный указатель
p ^.A: = 10; * P.A = 10; или так p-> A = 10;
p ^.B = 0.5; * P.B = 0.5; или так p-> B = 0.5;

При работе с нетипизированного указателями доступ к полям осуществляется аналогично но с обязательным явным приведением типа указателя (см. Задачу 8.1).

 

Задача 8.3.Обработка строк символов в Си-программах

Составить программу на языке Си для обработки строк символов, используя задания по ЛР№5.3. В работе использовать функции библиотеки <strings.h>.

 

Рекомендации к выполнению работы

В языке Си строка — это массив символов, как и в языке Паскаль. А массивы в языке Си неразрывно связаны с указателями. Поэтому при работе со строками в языке Си необходимо явное использование указателей на символьный тип.

Функции работы со строками библиотеки <strings.h> подробно рассмотрены в [5-8, 10].Но в языке си не передбачно функций удаления части строки (подстроки) или вставки подстроки в строку. Поэтому выполнение этих операций необходимо осуществлять в несколько этапов и применять переменные-указатели.

 

Удаление подстроки из строки

Пусть в программе описаны строки s1, s2 и указатель p: char s1 [10] = «abcdef», s2 [10] = «de»;

char * p;

Для того чтобы удалить подстроку s2 с s1 сначала необходимо проверить, входит пидярдок s2 к s1, и сохранить адрес первого вхождения в указатель р:

p = strstr (s1, s2)

Если функция strstr нашла подстроку, возвращается ненулевое значение адреса. Так что для удаления подстроки s2 останется скопировать часть строки s1, расположенной после вхождения s2 ( «хвост» строки):

if (p) {

 

strcpy (p, p + strlen (s2)) printf ( «\ n% s \ n», s1)

} Else printf ( «\ nNo such substring !!!\ N «);

s2 «хвост»

↑               ↑

 

Следует заметить, что для того чтобы удалить из строки все вхождения подстроки, необходимо организовывать такое удаление в цикле аналогично использования функции pos языка Паскаль (см. Задачу 5.3 соответствующей лабораторной работы).

Вставка подстроки в строку

Рассмотрим пример, когда в строку s1 после подстроки s2, он добавляется еще

раз.

для               выполнения               вставки               необходимо               будет               использовать               дополнительный

промежуточный строку s3: char s3 [10] = «\ 0»;

Во-первых необходимо проверить, входит подстроку s2 в s1 и определить адрес, с которого начинается «хвост».

p = strstr (s1, s2) + strlen (s2)

s1

s2 «Хвост»

↑ р = p + strlen (s2)

s2

Если подстрока s2 найден, и новая длина строки с добавлением еще одного подстроки не превышает заданную максимальную длину в 10 символов, можно выполнять сложение.

if (p && (strlen (s1) + strlen (s2)) <10) {

strcpy (s3, p) / * 1.копиювання «хвоста» в промежуточный строку * /

strcpy (p, s2) / * 2.копиювання на место «хвоста» подстроки s2 * / p = p + strlen (s2) /*3.переведення указателя в конец нового подстроки s2 * / strcpy (p, s3) / * 4. добавления «хвоста» * /

printf ( «\ n% s \ n», s1) }

else printf ( «\ nNo such string or length is very much !!!\ N «);

 

s1

1.

 

s3 2.

 

s1

3.

↑ р = p + strlen (s2)

s1

4.

 

Следует заметить, что приведенные способы реализации удаления и вставки пидридкив не являются единственными возможными, но, по мнению автора, являются достаточно эффективными.

Рекомендуемая литература

Язык Паскаль

1. Глинский Я., Анохин В.Е., Ряжск В.А.  Паскаль. Turbo Pascal и Delphi:

учеб. посибн .: третий вид. — Львов: Деон, 2002 — 144 с.

2. Ковалюк Т.В. Основы программирования. — М .: Издательская группа BHV, 2005. — 384 с.

3. Пильщиков В.Н.. Сборник упражнений по языку Паскаль: Учеб. пособие для вузов. — М .: Наука; Гл. ред. физ.-мат. лит., 1989. — 160 с.

4. Фаронов В.В. Турбо Паскаль 7.0.Начальный курс. учеб. пособие — М .: Нолидж, 1997- 616 с., ил.

Язык С / С ++

5. Глинский Я., Анохин В.Е., Ряжск В.А. C ++ и С ++ Builder. — Львов: Деол, 2003. — 193 с.

6. Керниган Б., Ритчи Д. Язык программирования Си / Пер. с англ. — четвёртый изд. —

М .: Вильямс, 2007. — С. 304.

7. Ковалюк               Т.В.алгоритмизация               и               программирования: Учебник. — Львов:

«Магнолия 2006», 2013. — 400 с.

8. Шпак З.Я. Программирование на языке С. — Львов: Орияна-Нова, 2006. — 432 с.

 

методическая литература

9. Красовская В. Основы программирования и алгоритмические языки.Язык программирования Паскаль. Основные понятия и управляющие конструкции: Конспект лекций, ч.1 / Красовская В. — М.: КНУБА, 2003 — 64 с.

10. Красовская В. Основы программирования и алгоритмические языки.Язык программирования Си [Электронный ресурс]: Конспект лекций, ч.2 / Г.В. Красовская — М.: КНУБА, 2008 — 54 с. — Режим доступа: http://org.knuba.edu.ua/mod/resource/view.php?id=2151 (дата обращения 26.11.2014)

11. Красовская В. Основы программирования и алгоритмические языки [Электронное издание]: Методические указания к лабораторным работам / Красовская В. — К: КНУБА, 2012. — 80 с. — режим доступа: http://org.knuba.edu.ua/mod/resource/view.php?id=2711 (дата обращения 26.11.2014)

12. Красовская В. Основы программирования и алгоритмические языки: методические указания к изучению дисциплины / Красовская В. — М.: КНУБА, 2007. — 52 с.

13. Красовская В. Основы программирования и алгоритмические языки: методические указания к практическим занятиям / Красовская В. — М.: КНУБА, 2007. — 40 с.

14. Красовская В. Основы программирования и алгоритмические языки: методические указания к выполнению индивидуального задания и курсовой работы / Красовская В. — М.: КНУБА, 2007. — 60

 

[Всего голосов: 4    Средний: 5/5]

Читать  Тест Основы алгоритмизации – Программирование на языке PASCAL