Файл: Классификация языков программирования высокого уровня ( Обзор актуальных технологий программирования ).pdf
Добавлен: 01.04.2023
Просмотров: 254
Скачиваний: 2
СОДЕРЖАНИЕ
1. Обзор актуальных технологий программирования
1.1 Классификация языков программирования по уровням
1.2. Краткая характеристика языков программирования высокого уровня
2. Использование языков программирования высокого уровня для решения задач вычислительной математики
2.1. Методы численного интегрирования
2.2. Решение задания на языке высокого уровня С
Выводы по 1 главе
В результате написания данной главы мы определили, что язык программирования — формальная система знаков, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, выполняемые исполнителем (компьютером) под ее контролем.
К основным языкам программирования высокого уровня относятся: Фортран, Кобол, Алгол, Pascal, Java, C, C++, C#, Objective C, Smalltalk, Delphi.
2. Использование языков программирования высокого уровня для решения задач вычислительной математики
2.1. Методы численного интегрирования
Постановка задачи
Найти значение интеграла, пользуясь методом трапеций, методом Симпсона и методом Ньютона для различных n (n=6, 12, 30). Сравнить с точным значением интеграла и оценить погрешности методов при указанных n. Изобразить график подынтегральной функции и заштриховать область, площадь которой равна значению интеграла.
Программа предусматривает возможность ввода исходных данных с клавиатуры и чтение из файла, также программа осуществляет вывод результатов на экран и запись в файл. Диалоговое взаимодействие пользователя с программой реализуется через систему меню, что предоставляет пользователю последовательно выполнять различные действия.
Эти методы применяются для приближенного вычисления определенного интеграла вида: . Функция f(x) задана на отрезке [a, b]. Этот отрезок разбивается на n равных частей длины h=(b-a)/n.
Определенный интеграл представляет собой площадь, ограниченную кривой f(x), осью x и прямыми x=a и x=b. Приблизительно эта площадь представляется суммой площадей полос, основания которых одинаковы и равны h, а высоты равны значениям функции в точках разбиения. Обозначим точки разбиения x0=a, x1=a+h, x2= a+2h,…xn=b, а значения функции в этих точках соответственно yo=f(x0); y1=f(x1), y2=f(x2), … yn=f(xn).
Метод трапеций:
Метод Симпсона:
гдеn=2*m число разбиений отрезка [a, b], кратное двум.
Метод Ньютона:
гдеn=m*3– число разбиений отрезка [a, b], кратное трем
2.2. Решение задания на языке высокого уровня С
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define a -1
#define b 1
#define I 2.350402
int N;
void menu();
float y(float x);
intget_n();
float Simpson();
float Trap();
floatNewton();
intconsole_n();
intfile_n();
void output(float f, inti);
void console_I(float f, inti);
void file_i(float f, inti);
int main()
{
menu();
return 0;
}
void menu()
{
printf("\n %3.d\n", b);
printf(" I = S(e^x)dx\n");
printf(" %1.d\n\n", a);
printf("1. Solve by Simpson\n2. Solve by trapeze\n3. Solve by Newton\n4. Exit\n>> ");
int c;
float f;
scanf("%d", &c);
switch (c)
{
case 1 :
{
system("cls");
f = Simpson();
break;
}
case 2 :
{
system("cls");
f = Trap();
break;
}
case 3 :
{
system("cls");
f = Newton();
break;
}
case 4 :
{
system("cls");
exit(1);
break;
}
default :
{
system("cls");
menu();
}
}
output(f, c);
printf("Push any button to return to menu...");
getch();
system("cls");
menu();
}
void console_I(float f, inti)
{
system("cls");
if (i == 1)
printf("Solved by Simpson method: n = %d\n", N);
else if (i == 2)
printf("Solved by trapeze method: n = %d\n", N);
else
printf("Solved by Newton method: n = %d\n", N);
printf("\n %3.d\n", b);
printf(" I = S(e^x)dx = %f\n", f);
printf(" %1.d\n\n", a);
printf("Exact value: %f\n", I);
printf("Difference: %f\n", I - f);
}
void file_I(float f, inti)
{
FILE *t;
t = fopen("C:/Documents and Settings/User/Рабочийстол/Прога/Курсач/output_f.txt", "w");
if (i == 1)
fprintf(t, "Solved by Simpson method: n = %d\n", N);
else if (i == 2)
fprintf(t, "Solved by trapeze method: n = %d\n", N);
else
fprintf(t, "Solved by Newton method: n = %d\n", N);
fprintf(t, "\n %3.d\n", b);
fprintf(t, " I = S(e^x)dx = %f\n", f);
fprintf(t, " %1.d\n\n", a);
fprintf(t, "Exact value: %f\n", I);
fprintf(t, "Difference: %f\n", I - f);
fclose(t);
}
void output(float f, inti)
{
int c;
printf("Output I:\n1. File\n2. Console\n3. File&Console\n>> ");
scanf("%d", &c);
if (c == 1)
file_I(f, i);
else if (c == 2)
console_I(f, i);
else
{
console_I(f, i);
file_I(f, i);
}
}
float y(float x)
{
return expf(x);
}
intget_n()
{
int n, c;
printf("Input n:\n1. From file\n2. From console\n>> ");
scanf("%d", &c);
if (c == 1)
n = file_n();
else
n = console_n();
N = n;
return n;
}
intconsole_n()
{
system("cls");
int n;
printf("Enter n: ");
scanf("%d", &n);
return n;
}
intfile_n()
{
FILE *f;
int n;
f = fopen("C:/Documents and Settings/User/Рабочийстол/Прога/Курсач/input_n.txt", "r");
fscanf(f, "%d", &n);
fclose(f);
return n;
}
float Simpson()
{
float n;
n = get_n();
float h = (b - a) / n, sum = 0;
inti, p;
for (i = 1; i< n; i++)
{
if ((int)i % 2 == 0)
p = 2;
else
p = 4;
sum += p*y(a + h * i);
}
sum += y(a) + y(b);
sum *= (h/3);
return sum;
}
float Trap()
{
float n;
n = get_n();
float h = (b - a) / n, sum = 0;
inti;
for (i = 0; i< n; i++)
sum += y(a + i * h) + y(a + (i + 1) * h);
sum *= h / 2;
return sum;
}
float Newton()
{
float n;
n = get_n();
float h = (b - a) / n, sum1 = 0, sum2 = 0, sum;
inti;
for (i = 1; i< n; i++)
if ((int)i % 3 == 0)
sum1 += y(a + i * h);
else
sum2 += y(a + i * h);
sum = 3.0 / 8 * h * (y(a) + y(b) + 2 * sum1 + 3 * sum2);
returnsum;
}
Тестирование
Предварительно вычислив данный интеграл, мы имеем некое точное значение, с которым будем сравнивать результаты нашей программы.
Решим интеграл тремя разными способами, но при одном n, допустим n = 12.
Точное значение = 2.350402.
Решим методом Симпсона:
ограммирование matlab паскаль язык
Решим методом трапеций:
Решим методом Ньютона:
Судя по результатам, можно сделать вывод о том, что программа работает правильно.
2.3. Решение задания на языке высокого уровня Паскаль
Листинг программы
Модульmain:
programKursVar4;
uses menu;
begin
menu_1;
end.
Модульmenu:
unit menu;
Interface
procedure menu_1;
Implementation
uses crt, math, output;
procedure menu_1;
var c, n : integer;
f : real;
begin
clrscr;
writeln(' 1');
writeln(' I = S(e^x)dx');
writeln(' -1');
writeln('1. Solve by Simpson');
writeln('2. Solve by trapeze');
writeln('3. Solve by Newton');
write('>> ');
read(c);
case c of
1: begin
clrscr;
f := Simpson(n);
end;
2: begin
clrscr;
f := Trap(n);
end;
3: begin
clrscr;
f := Newton(n);
end;
4: begin
clrscr;
halt;
end;
else
begin
menu_1;
end;
end;
output_I(f, c, n);
writeln('Push any button to proceede to main menu...');
readln;
menu_1;
end;
end.
Модульmath:
unit math;
Interface
function Simpson(var n: integer): real;
function Trap(var n: integer): real;
function Newton(var n: integer): real;
function y(x: real): real;
Implementation
uses crt, input;
var a, b : integer;
function Simpson(var n: integer): real;
var h, sum : real;
i, p: integer;
begin
n := get_n;
a := -1; b := 1;
h := (b - a) / n;
sum := 0;
for i := 1 to n - 1 do
begin
if i mod 2 = 0 then
p := 2
else
p := 4;
sum := sum + p * y(a + h * i);
end;
sum := sum + y(a) + y(b);
sum := sum * (h / 3);
Simpson := sum;
end;
function Trap(var n: integer): real;
var h, sum : real;
i : integer;
begin
n := get_n;
a := -1; b := 1;
h := (b - a) / n;
sum := 0;
for i := 0 to n - 1 do
sum := sum + y(a + i * h) + y(a + (i + 1) * h);
sum := sum * (h / 2);
Trap := sum;
end;
function Newton(var n: integer): real;
var h, sum1, sum2, sum: real;
i : integer;
begin
n := get_n;
a := -1; b := 1;
h := (a - b) / n;
sum1 := 0; sum2 := 0;
for i := 0 to n - 1 do
if i mod 3 = 0 then
sum1 := sum1 + y(a + i * h)
else
sum2 := sum2 + y(a + i * h);
sum := 3 / 8 * h * (y(a) + y(b) + 2 * sum1 + 3 * sum2);
Newton := sum;
end;
function y(x : real): real;
begin
y := exp(x);
end;
end.
Модульinput:
unit input;
Interface
function get_n : integer;
function file_n : integer;
function console_n : integer;
Implementation
uses crt;
function get_n : integer;
var c : integer;
begin
clrscr;
writeln('Input N:');
writeln('1. From file');
writeln('2. From console');
write('>> ');
readln(c);
if c = 1 then
get_n := file_n
else
get_n := console_n;
end;
function file_n : integer;
var t : text;
n : integer;
begin
clrscr;
assign(t, 'input_n.txt');
reset(t);
read(t, n);
close(t);
clrscr;
file_n := n;
end;
function console_n : integer;
var n : integer;
begin
clrscr;
write('Input N: ');
readln(n);
delay(300);
clrscr;
console_n := n;
end;
end.
Модульoutput:
unit output;
Interface
procedure output_I(f : real; i, n : integer);
procedure file_I(f : real; i, n : integer);
procedure console_I(f : real; i, n : integer);
Implementation
uses crt;
procedure output_I(f : real; i, n : integer);
var c : integer;
begin
writeln('Output I:');
writeln('1. File');
writeln('2. Console');
writeln('3. File&Console');
write('>> ');
readln(c);
if c = 1 then
file_I(f, i, n)
else
if c = 2 then
console_I(f, i, n)
else
begin
file_I(f, i, n);
console_I(f, i, n);
end;
end;
procedure file_I(f : real; i, n : integer);
var t : text;
r : real;
begin
assign(t, 'output_f.txt');
rewrite(t);
if i = 1 then
writeln(t, 'Solved by Simpson method: n = ', n)
else
if i = 2 then
writeln(t, 'Solved by trapeze method: n = ', n)
else
writeln(t, 'Solved by Newton method n = ', n);
writeln(t, ' 1');
writeln(t, ' I = S(e^x)dx = ', f);
writeln(t, ' -1');
r := exp(1) - exp(-1);
writeln(t, 'Exact value: ', r);
r := f - r;
writeln(t, 'Difference: ', r);
close(t);
end;
procedure console_I(f : real; i, n : integer);
var r : real;
begin
clrscr;
if i = 1 then
writeln('Solved by Simpson method: n = ', n)
else
if i = 2 then
writeln('Solved by trapeze method: n = ', n)
else
writeln('Solved by Newton method n = ', n);
writeln(' 1');
writeln(' I = S(e^x)dx = ', f);
writeln(' -1');
r := exp(1) - exp(-1);
writeln('Exact value: ', r);
writeln('Difference: ', f - r);
end;
end.
Тестирование
Решим методом трапеций:
Решим методом Ньютона:
Решим методом Симпсона:
Судя по результатам, можно сделать вывод о том, что программа работает правильно.
Таким образом, в данной главе нами была осуществлена задача вычислительной математики на двух языках: #Си и Pascal.
Данная задача может послужить ярким примером использования структурного программирования, так как включает в себя его основы:
использования следующих структур: следования, ветвлений и циклов; использование модульного программирования и использование нисходящего программирования.
Плюсы и минусы итоговой программы:
Плюсы:
1. Программа включает в себя такие структуры как: условные операторы, операторы множественного выбора, функции, процедуры, модули, файлы.
2. Занимает небольшой объем оперативной памяти.
3. Совмещена практически с любой операционной системой.
4. Может запускаться как с использованием среды, так и с помощью файла exe.
5. Цикл, который реализует повтор программы после вычисления, так как пользователь может захотеть сверить результаты расчетов с помощью разных методов вычисления интегралов.
Минусы:
Данная программа не имеет проверки ввода количества разбиений отрезка, как с клавиатуры, так и из файла.
Пользователь не имеет возможности выйти из программы до ее завершения.
В дальнейшем минусы могут быть исправлены, улучшив программу и сделав ее более функциональной и адаптированной.
Выводы по 2 главе
В данной главе нами мы использовали язык программирования Си и Паскаль (высокого уровня), для решения задач по вычислительной математики. В результате чего, пришли к выводу, что эти языки крайне похожи, но имеют серьезные различия в синтаксисе.
Так, например, в обоих языках есть подпрограммы ввода и вывода, но в Си это printf и scanf, а в Паскале write и read. Так со многими командами, но они имеют одинаковый смысл, что делает несложным перевод кода с одного языка на другой. Структурное программирование заметно упрощает процесс написания программы. Благодаря использованию подпрограмм упрощается исправление ошибок, допущенных в ходе написания программы. А нисходящее программирование снижает количество ошибок. Дальнейшее применение этой программы вполне возможно. Модули вычисления интегралов можно использовать в других, более сложных программах, что является серьезным преимуществом структурного программирования.
ЗАКЛЮЧЕНИЕ
В результате написания первой главы данной курсовой работы мы определили, что язык программирования это формальная система знаков, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, выполняемые исполнителем (компьютером) под ее контролем.