Вы находитесь на странице: 1из 12

Министерство образования и науки Российской Федерации

Санкт-Петербургский политехнический университет Петра Великого


Институт физики, нанотехнологий и телекоммуникаций
Направление «Физика»

К У Р С О В А Я Р А Б О Т А
по дисциплине «Практикум на ЭВМ»
вариант № 45

Выполнил
студент гр. (Антропов М.И.)
3430302/90002
<подпись> <фамилия и.о.>

Преподаватель
( Капралов В.Г.)
доц. к. ф.-м. н.
<должность, уч. степ.> <подпись> <фамилия и.о.>

«26» мая 2020 г.

Санкт-Петербург
2020
Содержание:
1. Задание M5023 (Создание, сохранение и использование функции и
подфункции, ввод/вывод).............................................................................................2
1.1. Постановка задачи..............................................................................................2
1.2. Пояснения к решению........................................................................................2
1.3. Листинг исходного кода программы................................................................3
1.4. Список файлов....................................................................................................3
2. Задание F1104 (Оператор IF)....................................................................................4
2.1. Постановка задачи..............................................................................................4
2.2. Пояснения к решению........................................................................................4
2.3. Листинг исходного кода программы................................................................4
2.4. Список файлов....................................................................................................5
3. Задание F1303 (Длинная арифметика)....................................................................4
3.1. Постановка задачи..............................................................................................4
3.2. Пояснения к решению........................................................................................4
3.3. Листинг исходного кода программы................................................................5
3.4. Список файлов....................................................................................................7
4. Задание F1401 (Вставка элемента в массив)...........................................................4
3.1. Постановка задачи..............................................................................................4
3.2. Пояснения к решению........................................................................................4
3.3. Листинг исходного кода программы................................................................5
3.4. Список файлов....................................................................................................7

1
1. Задание M5023 (Создание, сохранение и использование функции и
подфункции, ввод/вывод)
1.1. Постановка задачи
1) Создать вектор-столбец С из 10 элементов. Вектор заполнить
последовательными значениями от 1 до 10 с шагом 1. Используя вектор С,
создать квадратную матрицу Т, которую заполнить построчно значениями
от 1 до 100 с шагом 1.
2) Определить подфункцию, которая принимает два аргумента и возвращает
два значения. Первое значение - сумма аргументов, а второе - разность
аргументов.
3) Определить функцию, которая применяет подфункцию к матрице Т и
сформировать матрицу U, в нечетных строках которой расположена
разность элементов матрицы Т из одноименной и следующей строки,
U(k, m) = T(k,m) - T(k+1,m), k=2n+1, n=0…4
а в четных строках - расположена сумма элементов матрицы Т из
одноименной и предыдущей строки.
U(k, m) = T(k,m) + T(k-1,m) , k=2n, n=1…5
4) С помощью функции save записать в текстовый файл значения матриц T, U
и последние значения двух векторов, возвращаемых подфункцией из п.2.
Разделитель - пробел.
5) С помощью функции dlmread прочитать все содержимое текстового файла
в матрицу V.
6) Сформировать из матрицы V матрицы T1, U1 и вектора R1 и R2
совпадающие по структуре и значениям с данными, сохраненными ранее в
файл в п.4.
7) Cохранить сценарий в файл *.m.

1.2. Пояснения к решению


(1-4) Заголовок
(6) Создаем вектор-столбец «С»
(7-9) С помощью цикла на основе вектора «С» создаем матрицу T
(11) Применяем к матрице T функцию newmatr, которая с помощью
подфункции subfunc определяет новую матрицу U
(12-13) Определяем вектора x и y, значениями которых являются две
последних строки матрицы U
(14) Сохраняем T, U и вектора x и y в файл input5023.txt
(15) Читаем данные из файла в матрицу V
(16-17) Выделяем из матрицы V матрицы T1, U1, равные T, U
соответственно
2
(18-19) Выделяем также вектора R1, R2, равные x, y соответственно

1.3. Листинг исходного кода программы


1 %M5023
2 %Antropov M. I.
3 %3430302/90002
4 %25.05.20
5
6 C(:,1)=linspace(1,10,10);
7 for n=0:1:9
8 T(n+1,:)=C'+n*10
9 end
10 global k
11 U=newmatr(T);
12 x=U(k,:);
13 y=U(k+1,:);
14 save 'input5023.txt' T U x y -ascii;
15 V = dlmread ('input5023.txt');
16 T1 = V(1:10,:);
17 U1 = V(11:20,:);
18 R1 = V(21,:);
19 R2 = V(22,:);

1 newmatr.m:
2 function[U]=newmatr(T)
3 global k;
4 for i=1:1:5
5 k=2*i-1;
6 [U(k, :),U(k+1,:)] = subfunc(T(k,:),T(k+1,:));
7 end
8 end

1 subfunc.m:
2 function [y1,y2] = subfunc(x1,x2)
3 y1 = x1-x2;
4 y2 = x1+x2;
5 end

1.4. Список файлов


M5023.m
input5023.txt
newmatr.m
subfunc.m
3
2. Задание F1104 (Оператор IF)
2.1.Постановка задачи
1) Во входном файле input1104.txt в две строки записаны координаты двух
полей шахматной доски (координаты клетки – это 2 числа от 1 до 8: номер
столбца и номер строки)
2) В первом поле расположен шахматный конь. Может ли конь попасть на
другое поле за 1 ход?
3) Вывести на монитор сообщение YES, если это возможно, и NO, если – нет.
(Ход конем пропускать нельзя, т.е. для совпадающих начального и
конечного полей ответ NO.)

2.2.Пояснения к решению
(1-4) Заголовок
(9) Объявляем переменные
(11-15) Печать заголовка
(17) Открываем файл input1104.txt
(18) Считываем координаты первого X1, Y1 и второго X2, Y2 полей
(19-20) Вычисляем разницу X3 и Y3 между соответствующими
координатами (конь ходит так, что номер столбца меняется 2 и при этом
номер строки – на 1, или так, что номер столбца – на 1, а номер строки –
на 2, поэтому необходимое условие возможности хода коня – это
изменение координат именно таким образом)
(22-25) Проверяем может ли совершить шахматный конь ход,
соответствующий считанным координатам, если может, то печатаем
сообщение YES, если нет - NO

2.3.Листинг исходного кода программы

1 !F1104
2 !Antropov M.I.
3 !3430302/90002
4 !25.05.20
5
6 PROGRAM F1104
7 IMPLICIT NONE
8
9 INTEGER X1,Y1,X2,Y2,X3,Y3
10
11 PRINT *, 'F1104'
12 PRINT *, 'Antropov M.I.'
13 PRINT *, '3430302/90002'
4
14 PRINT *, '25.05.20'
15 PRINT *
16
17 OPEN (1, file = 'input1104.txt')
18 READ (1, *) X1,Y1,X2,Y2
19 X3 = abs(X1-X2);
20 Y3 = abs(Y1-Y2);
21
22 IF (X3 == 2 .AND. Y3 == 1 .OR. X3 == 1 .AND. Y3 == 2) THEN
23 PRINT *, 'YES'
24 ELSE
25 PRINT *, 'NO'
26 END IF
27 STOP
28 END

2.4.Список файлов
F1104.for
input1104.txt

3. Задание F1303 (Длинная арифметика)


3.1.Постановка задачи
1) Во входном файле input1303.txt в две строки записаны два длинных
целых числа. Количество цифр в каждом из чисел не более 1000. Все
цифры каждого из чисел записаны через пробел, например, число
1234567 будет записано следующим образом
1234567
2) Надо прочитать эти числа в 2 одномерных массива (по одной цифре в
ячейке массива)
3) Вычислить сумму прочитанных чисел и построчно вывести на монитор
сами числа и их сумму

3.2.Пояснения к решению
(1-4) Заголовок
(9-11) Объявляем переменные
(13-17) Печать заголовка
(19) Открываем файл input1303.txt
(21-24) С помощью цикла определяем длину K первого числа
(26-31) Считываем первое число A1
5
(37-40) С помощью цикла определяем длину M второго числа
(42-47) Считываем второе число A2
(49) Открываем цикл почленного сложения двух чисел A1 и A2
(50-58) Определяем значение текущего элемента сложения как сумму
соответствующих элементов слагаемых A1 и A2 и переменной FLAG,
значение которой 1, если при прошлом выполнении цикла значение
элемента было больше 9 (при этом оно уменьшается на 10), или 0, если
меньше 9
(59-62) Считаем длину L числа S, равного сумме чисел A1 и A2, и
проверяем чтобы складывались только значащие разряды
(65-69) Определяем наибольшую из длин K и M
(71-73) Проверяем правильно ли была посчитана длина L
(75-80) Печатаем числа A1, A2, а также результат их суммирования S

3.3.Листинг исходного кода программы

1 !F1303
2 !Antropov M. I.
3 !3430302/90002
4 !25.05.20
5
6 PROGRAM F1303
7 IMPLICIT NONE
8
9 INTEGER A1(1000), A2(1000), S(1001), BIG, FLAG
10 INTEGER i, ios, K, M, L, w
11 DATA L, FLAG, K, M, A1, A2, S /3005*0/
12
13 PRINT *, 'F1303'
14 PRINT *, 'Antropov M.I.'
15 PRINT *, '3430302/90002'
16 PRINT *, '25.05.20'
17 PRINT *
18
19 OPEN (1,file='input1303.txt',iostat=ios)
20
21 DO WHILE (ios==0)
22 K=K+1
23 READ (1,'(i1,1x)',advance='no',iostat=ios)w
24 ENDDO
25
26 IF(K>1000)THEN
27 GOTO 1
6
28 ELSE
29 REWIND (1)
30 READ (1,*),(A1(i),i=(1000-K+1),1000)
31 ENDIF
32
33 REWIND (1)
34 READ(1,*)
35 ios=0
36
37 DO WHILE (ios==0)
38 M=M+1
39 READ (1,'(i1,1x)',advance='no',iostat=ios)w
40 ENDDO
41
42 IF(M>1000)THEN
43 GOTO 1
44 ELSE
45 BACKSPACE(1)
46 READ (1,*),(A2(i),i=(1000-M+1),1000)
47 ENDIF
48
49 DO i=1001,1,-1
50 S(i)=A1(i-1)+A2(i-1)+S(i)
51 IF(S(i)>9)THEN
52 FLAG=1
53 S(i)=S(i)-10
54 ENDIF
55 IF(FLAG==1)THEN
56 S(i-1)=1
57 FLAG=0
58 ENDIF
59 L=L+1
60 IF((L>=K).AND.(L>=M))THEN
61 EXIT
62 ENDIF
63 ENDDO
64
65 IF(K>M)THEN
66 BIG=K
67 ELSE
68 BIG=M
69 ENDIF
70
71 IF(S(1001-BIG)/=0)THEN

7
72 L=L+1
73 ENDIF
74
75 PRINT *, 'FIRST NUMBER: '
76 PRINT'(1000(i1))',(A1(i), i=(1000-K+1),1000)
77 PRINT *, 'SECOND NUMBER: '
78 PRINT'(1000(i1))',(A2(i), i=(1000-M+1),1000)
79 PRINT *, 'SUMM: '
80 PRINT'(1000(i1))',(S(i), i=(1001-L+1),1001)
81
82 1 STOP
83 END

3.4.Список файлов
input1304new.txt
main.95

8
4. Задание M5023 (Создание, сохранение и использование функции и
подфункции, ввод/вывод)
4.1.Формулировка задачи
8) Создать вектор-столбец С из 10 элементов. Вектор заполнить
последовательными значениями от 1 до 10 с шагом 1. Используя вектор С,
создать квадратную матрицу Т, которую заполнить построчно значениями
от 1 до 100 с шагом 1.
9) Определить подфункцию, которая принимает два аргумента и возвращает
два значения. Первое значение - сумма аргументов, а второе - разность
аргументов.
10) Определить функцию, которая применяет подфункцию к матрице Т и
сформировать матрицу U, в нечетных строках которой расположена
разность элементов матрицы Т из одноименной и следующей строки, U(k,
m) = T(k,m) - T(k+1,m), k=2n+1, n=0…4 а в четных строках - расположена
сумма элементов матрицы Т из одноименной и предыдущей строки. U(k,
m) = T(k,m) + T(k-1,m) , k=2n, n=1…5
11) С помощью функции save записать в текстовый файл значения
матриц T, U и последние значения двух векторов, возвращаемых
подфункцией из п.2. Разделитель - пробел.
12) С помощью функции dlmread прочитать все содержимое текстового
файла в матрицу V.
13) Сформировать из матрицы V матрицы T1, U1 и вектора R1 и R2
совпадающие по структуре и значениям с данными, сохраненными ранее в
файл в п.4.
14) Cохранить сценарий в файл *.m.

4.1. Пояснения к решению


Создаем вектор-столбец «С». C помощью этого вектора и цикла получаем
матрицу T. Применяем к полученной матрице функцию newmatr, которая
посредством подфункции subfunc выводит новую матрицу. Сохраняем её
в матрицу U. Сохраняем T, U и вектора из последнего прохода цикла
функции newmatr в файл input5023.txt. Читаем данные из файла в матрицу

9
V. Выделяем из матрицы V матрицы T1, U1 равные T, U соответственно;
вектора R1, R2 равные x, y соответственно.

4.2.Листинг исходного кода программы


20 C(:,1)=linspace(1,10,10);
21 % Вектор-столбец из 10 элементов
22 global k;
23 for n=0:1:9
24 %Создание матрицы T
25 T(n+1,:)=C'+n*10
26 end
27 U=newmatr(T);
28 %Выполнение функции newmatr к матрице T
29 x=U(k,:);
30 y=U(k+1,:);
31 %Вектора, соответствующие последним значениям подфункции
subfunc
32 save 'input5023.txt' T U x y -ascii;
33 %Запись в текcтовый файл
34 V = dlmread ('input5023.txt');
35 T1 = V(1:10,:);
36 %Матрица, полученная из V, равная Т
37 U1 = V(11:20,:);
38 %Матрица, полученная из V, равная U
39 R1 = V(21,:);
40 %Вектор, полученный из V, равный x
41 R2 = V(22,:);
42 %Вектор, полученный из V, равный y

9 newmatr.m:
10 function[U]=newmatr(T)
11 %Функция, которая применяет подфункцию subfunc к аргументу и
выводит значение после преобразования
12 global k;
13 for i=1:1:5
14 k=2*i-1;
15 [U(k, :),U(k+1,:)] = subfunc(T(k,:),T(k+1,:));
16 End

1. subfunc.m:
2. function [y1,y2] = subfunc(x1,x2)
3. %Подфункция из п.2 цикла 1 из задания
4. y1 = x1-x2;
5. y2 = x1+x2;
10
6. End

4.3. Список файлов


M5023.m
input5023.txt
newmatr.m
subfunc.m

11