Автор работы: Пользователь скрыл имя, 09 Февраля 2013 в 16:22, контрольная работа
При выполнении задания сначала в программе необходимо организовать ввод с клавиатуры некоторого значения переменной x. Затем при помощи операторов If, записывая условия с учётом приоритета логических операций и операций отношения, переменной f присваивается значение соответствующего условию выражения, в котором при необходимости должны использоваться стандартные арифметические функции В вариантах, содержащих выражения с тангенсами, котангенсами и сложными степенями, необходимо их преобразование с использованием формул:
Министерство образования и науки РФ
Федеральное государственное
бюджетное образовательное
КОНТРОЛЬНАЯ РАБОТА №1
по дисциплине «Основы алгоритмизации и языки программирования»
«Программирование на языке Паскаль»
Вариант №3
Методические указания к контрольной работе № 1
Основная цель изучения дисциплины «Информатика-2» -
изучить язык высокого уровня Pascal, научиться формулировать несложные алгоритмы, реализовывать их в виде программ и отлаживать при помощи существующего программного обеспечения.
Контрольная работа № 1 состоит из трех отдельных заданий, по каждому из которых Вы должны составить и отладить программу, которую Вы должны прислать вместе с ответами на контрольные вопросы (там, где они есть).
Задание № 1. Выражения и условный оператор if
Задание: Вычислить значение функции f в точке x. Значение x должно вводиться с клавиатуры. Вывести полученный результат на экран. Ответить на вопросы. Варианты функций и вопросы приведены в нижеследующей таблице.
При выполнении задания сначала в программе необходимо организовать ввод с клавиатуры некоторого значения переменной x. Затем при помощи операторов If, записывая условия с учётом приоритета логических операций и операций отношения, переменной f присваивается значение соответствующего условию выражения, в котором при необходимости должны использоваться стандартные арифметические функции В вариантах, содержащих выражения с тангенсами, котангенсами и сложными степенями, необходимо их преобразование с использованием формул:
Не следует брать данный пример за образец при выполнении своего задания; попробуйте самостоятельно записать оптимальный вариант программы, используя два условных оператора, один вложенный в другой.
В конце программы полученное значение f должно выводиться на экран.
В соответствии с вариантом, задание имеет вид:
Решение:
Программа содержит следующий код:
Program Z1;
uses crt;
var x, f1, f2, f3:real;
begin clrscr;
write ('Введите координату точки Х');
readln(x);
f3:=(x*(x+1))/(Ln(x*x+1));
if x>=0 then writeln ('Значение функции в точке Х',f3:4:4)
else if x<(-3) then
begin f1:=x/(sqrt(sqr(x)-2*x-15));
writeln ('Значение функции в точке Х',f1:4:4);
end
else
begin f2:=x*(sin(3/x));
writeln (''Значение функции в точке Х',f2:4:4);
end;
readln;
end.
В ходе выполнения задания, я решил воспользоваться алгоритмом отличным от представленного в примере. Первой рассчитывается теряя функция, которая удовлетворяет всем Х, большим нуля. Второй – функция на промежутке от минус бесконечности до минус трех. Если, введенное значение, Х не принадлежит двум другим промежуткам, то последней рассчитывается первая функция.
Результаты представлены ниже:
Ответы на вопросы:
Какие операции и стандартные функции использовались в выражениях программы? – Были использованы операции сложения, вычитания, умножения, деления, нахождения квадрата и квадратного корня аргумента, а также логические операции и операции отношения.
Какого типа результат этих операций и функций? – Результат того же типа, как и у переменной – вещественного.
Задание № 2. Операторы циклов
Задание: Вычислить сумму s значений функции f в точках xi , которые берутся с заданного интервала [a; b] через равные отрезки длиной h. Длина отрезка рассчитывается по формуле
Здесь i = 1, 2, 3 ... n — номер точки; n — задаваемое количество точек; a — начало и b — конец интервала изменения x. Вывести на экран результаты вычислений, полученные при помощи следующих циклов:
While логическое_выражение Do тело_цикла;
Repeat тело_цикла Until логическое_выражение;
For параметр:=мин._значение To макс. Do тело_цикла;
For параметр:=макс._значение DownTo мин. Do тело_цикла.
Ответить на вопросы.
При выполнении задания сначала в программе требуется задать значения исходных данных: границы интервала a и b, количество точек n.
Затем при помощи операторов циклов, записываемых в программе последовательно друг за другом в любом порядке следования, необходимо в каждом из циклов вычислить сумму s и вывести её на экран, т.е. в одной программе решить задачу четырьмя способами. Таким образом, в результате выполнения программы на экране должны быть четыре значения s, совпадающие между собой.
В соответствии с вариантом, задание имеет вид:
Решение:
Program Z2;
uses crt;
var a, b, W, R, FT, FD, h, f, f1, S: real;
i, n: integer;
begin clrscr;
W:=0;
a:=0.5; //согласно условию задачи
b:=0.8;
n:=20;
h:=(b-a)/(n-1); //расчет размера шага
while a<=(b+h) do // создание цикла
begin
a:=a+h;
f1:=(a*a*a-27)/(a*a+1);// расчет функции
f:=Exp(f1*Ln(cos(a)/sqrt(a)));
W:=W+f;
end;
writeln('Summa=' , W:2:4); // вывод результата
a:=0.5;
f1:=0;
f:=0; // обнуление
R:=0;
S:=0;
repeat
a:=a+h;
f1:=(a*a*a-27)/(a*a+1);
f:=Exp(f1*Ln(cos(a)/sqrt(a)));
R:=R+f;
S:=S+1;
Until S>=n;
writeln('Summa=',R:4:4); // вывод результата
a:=0.5;
f1:=0;
f:=0;
FT:=0;
S:=0;
For i:=1 to n do// создание цикла
begin
a:=a+h;
f1:=(a*a*a-27)/(a*a+1);
f:=Exp(f1*Ln(cos(a)/sqrt(a)));
FT:=FT+f;
end;
writeln ('Summa=' ,FT:4:4);// вывод результата
a:=0.5;
f1:=0;
f:=0;
FD:=0;
For i:=n Downto 1 do// создание цикла
begin
a:=a+h;
f1:=(a*a*a-27)/(a*a+1);
f:=Exp(f1*Ln(cos(a)/sqrt(a)));
FD:=FD+f;
end;
writeln ('Summa=' ,FD:4:4);// вывод результата
writeln ('‚Суммы равны’);
readln;
end.
В ходе программы рассчитывается одна функция на заданном интервале. Суммируются все результаты с шагом h. Чтобы избежать составления большого выражения, я разбил исходную функцию на f1 и f. Подсчет суммы всех значений производился согласно условию. Результаты приводятся ниже:
Ответы на вопросы:
Опишите оператор For…To…Do… , в чем его основные отличия от остальных циклов Pascal? – Это оператор, который организует цикл. Для его выполнения необходимо заранее знать количество исполнений какой-либо операции. Имеет структуру: For минимальный параметр:=значение To максимальное значение параметра Do выполнение оператора, тело цикла.
Задание № 3. Массивы и подпрограммы
Результатом выполнения третьего задания, изложенного ниже в двадцати вариантах, должна быть программа, написанная с использованием подпрограмм — не менее двух процедур и одной функции.
Задание в зависимости от варианта связано с действиями либо над матрицей m[n, k], у которой количество строк n и столбцов k может быть от двух до десяти, либо над квадратной матрицей m[n, n], у которой количество строк и столбцов равно n (2 ≤ n ≤10). Таким образом, в программе должен быть предусмотрен ввод пользователем количества строк и столбцов матрицы при исполнении программы.
Также, в зависимости от варианта компоненты, матрицы могут быть либо вещественного, либо целого типа. Значения компонент матрицы следует задавать случайным образом в таком диапазоне, чтобы получаемые данные были нетривиальными, т.е. неочевидными, не лежащими на поверхности. В каждом варианте приведён пример аналитического (без использования программирования) решения частной задачи этого варианта. Целью этих примеров является пояснение непонятных мест в задании варианта. Во всех примерах в квадратных скобках указываются номера строк и (или) столбцов компонент матрицы.
В соответствии с вариантом, задание имеет вид:
Найти максимальное значение компонент вещественной матрицы m[n, k].
Подсчитать количество компонент матрицы m[n, k], совпадающих с максимумом.
Записать в одномерный массив v[q] значения: −1, если сумма индексов максимальной компоненты матрицы m[n, k] является нечётным числом, и 1 — если чётным числом.
Заменить в матрице m[n, k] максимальные компоненты единицами.
На экран вывести исходную матрицу m[n, k], значение максимума, количество максимумов, массив v[q], изменённую матрицу m[n, k].
Решение:
Program Z3;
uses
crt;
var M1:array[1..10,1..10] of real; // создание исходного массива
N,m:integer;
V:array[1..10] of integer;
LenV:integer;
procedure initM(K,L:integer); // процедура генерации массива
var i,j:integer;
begin
randomize;
for i:=1 to K do
for j:=1 to L do
M1[i,j]:=(random(20)-j/2);
end;
procedure OutM(K,L:integer); // процедура вывода массива
var i,j:integer;
begin
for i:=1 to K do
begin
for j:=1 to L do
write(M1[i,j]:7:2);
writeln;
end;
end;
function FindMax(K,L:integer):real;// функция поиска максимума
var i,j:integer;
max1:real;
begin
max1:=m1[1,1];
for i:=1 to K do
for j:=1 to L do
if m1[i,j]>max1 then
begin
max1:=m1[i,j];
end;
FindMax:=max1;
end;
Function CountMax(K,L:integer):integer;
var i,j,Count:integer;
max:real;
begin
Count:=0;
LenV:=1;
max:=FindMax(K,L);
for i:=1 to K do
for j:=1 to L do
if M1[i,j]=max then
begin
if (i+j) mod 2=0 then v[LenV]:=1 else v[LenV]:=-1; {заполнение одномерного массива }
M1[i,j]:=1;
inc(LenV);
inc(Count);
end;
CountMax:=Count;
end;
procedure OutMasV;// процедура вывода одномерного массива
var i:integer;
begin
for i:=1 to LenV-1 do
write(v[i]:3);
writeln;
end;
begin clrscr;
writeln('‚Введите размеры матрицы M ');
readln(n,m);
initM(n,m);
writeln('Исходная матрица :');
OutM(n,m);
writeln('Значение максимума = ',FindMax(n,m):1:3);
writeln(Количество максимумов = ',CountMax(n,m));
writeln(Массив V[q]:');
OutMasV;
writeln('Измененная матрица : ');
OutM(n,m);
readln;
end.
Результат работы программы
полностью удовлетворяет