- Первые программы на Паскале
- Вычисление суммы натуральных чисел
- Вывод таблицы соответствия температур по Цельсию и Фаренгейту
- Вычисление суммы
- Решение линейного и нелинейного диофантовых уравнений
- Вычисление произведения и сумм в прямом и обратном порядке
- Программа паскаль решение линейных уравнений
- Курсовая работа: Разработка программы решения системы линейных уравнений
- Введение
- 1 . Описание математических методов решения систем линейных уравнений
- 1.1 Метод Гаусса
- 1.2 Матричный метод
- 1.3 Вычисление определителей второго и третьего порядка
- 2. Язык программирования Паскаль
- 2.1 Структура программы
- 2.2 Описание переменных
- 2.3 Основные конструкции языка
- 2.4 Структуры данных
- 2.4 Процедуры и функции
- 3. Описание программы
- 3.1 Работа программы
- 3.2 Блок-схема программы
- Заключение
- Список используемых источников и литературы
- Приложение
Видео:Информатика 8 класс. Решение линейного и квадратного уравнения на PascalABCСкачать
Первые программы на Паскале
Получив первоначальный запас теоретических знаний, попробуем применить его на практике. Сначала разберем примеры простых программ. Первая из них приведена в листинге 1.1.
Листинг 1.1. Самая первая программа
program first_program;
begin
end.
Это простейшая программа на языке Паскаль, которая лишь демонстрирует стандартную свою структуру. В ней не предусмотрен ни ввод, ни вывод данных. Нет арифметических выражений. Она предназначена для того, чтобы. просто быть, даже не выполняя никаких реальных действий. Эта программа как любойбиблиотечный модуль начинаются с заголовка (ключевое слово program, за которым следует имя программы). Имя программы может состоять из букв, цифр и символов подчеркивания. Длину имени можно считать произвольной, хотя вряд ли имеет смысл придумывать очень длинные имена. Кроме того, неважно, в каком регистре клавиатуры имя набрано. Между заголовком и оператором begin размещаются описания переменных и других объектов программы. Между зарезервированными словами begin и end находятся исполняемые операторы программы. Завершает программу точка. В этом первом примере нет ни описаний, ни исполняемых операторов.
Вычисление суммы натуральных чисел
Второй пример сложнее. Мы вычислим сумму натуральных чисел от 1 до 20. Читатель, знакомый с математикой, знает, что сумму первых n натуральных чисел можно найти но формуле Sn = n(n + 1 )/2. Используя эту формулу, мы сможем проверить, правильно ли работает программа и не допущены ли во время ее набора ошибки. При разработке программ их отладка, а также проверка правильности работы являются обязательной составной частью работы программиста. Ведь даже если все операторы программы написаны правильно с точки зрения формальных правил языка, ошибка может быть допущена в самом алгоритме или в его записи на языке программирования. Программу можно считать готовым продуктом, только если программист убедился сам и убедил заказчика в том, что программа работает правильно, дает правильный результат. Для тестирования программы используются такие наборы значений входных параметров или такие предельные случаи ее работы, для которых известен точный результат. Результат работы программы в этом случае сравнивается с точными значениями.
Листинг 1.2. Вычисление суммы натуральных чисел
program summation;
var
i, summa: Word;
begin
summa := 0;
for i := 1 to 20 do summa := summa + i;
WriteLn (‘1 + 2 + . + 20 = ’, summa);
Write(Нажмите клавишу :’);
ReadLn;
end.
В этой программе по сравнению с первым примером появились новые элементы. Это описание двух переменных I и summa типа Word.
Исполняемая часть программы, начинающаяся строкой begin и завершающаяся строкой end, уже не пустая, она содержит исполняемые операторы. Первая строка в разделе операторов — комментарий, заключенный и фигурные скобки (напомню, что в качестве ограничителей комментария допустимы и пары символов, состоящие из круглой скобки и звездочки). Оператор summa := 0; инициализирует переменную summa, используемую для хранения частичной суммы, присваивая ей нулевое значение. Замечу, что до первого оператора присваивания, содержащего имя переменной в левой части, ее значение не определено.
Затем идет цикл со счетчиком. В нашем примере тело цикла выполняется 20 раз, и каждый раз к значению переменной s прибавляется значение переменной — счетчика i.
Следующие две строки реализуют вывод результата на экран. Для этого в программах на языке Паскаль используются операторы вывода Write и WriteLn. Они содержатся в библиотечном модуле System и во время компиляции автоматически включаются в исполняемый код. Вначале выводится символьная строка. Текст, выводимый на экран, заключается в одиночные кавычки ‘. ‘. Затем выводится численное значение — summa.
Последние две буквы в имени процедуры WriteLn означают, что после того, как вывод закончен, курсор переходит на начало следующей строки. Следующий оператор предлагает пользователю нажать клавишу Enter, а оператор ReadLn без параметров ожидает нажатие этой клавший. После нажатия клавиши Enter выполнение программы завершается.
ВНИМАНИЕ В Паскале не различаются большие и маленькие буквы, то есть Sum, sum, SUM и т. д. представляют собой один и тот же идентификатор.
В арифметических выражениях используются символы арифметических операций. Эти символы приведены в табл. 1.2. Так, например, в произведениях между сомножителями должен находиться символ операции умножения *. Математическое выражение ax2 к программе на Паскале описывается как, а*х*х. Следует заметить, что особенностью языка Паскаль является отсутствие стандартной встроенной функции вычисления произвольной степени числа, кроме второй. Это, конечно же, неудобно при программировании сложных вычислений. При программировании арифметических выражении следует помнить о приоритетах операций, то есть о порядке их выполнения. Первыми выполняются арифметические операции умножения и деления, они считаются равноприоритетными операциями. Затем выполняются операции сложения и вычитания, тоже равноприоритетные. Если подряд идут несколько равнопрпоритетных операций, они выполняются слева направо. Порядок выполнения операций может быть изменен с помощью круглых скобок. При наличии в арифметическом выражении круглых скобок первыми будут выполняться операции в круглых скобках, начиная с самых внутренних.
Вывод таблицы соответствия температур по Цельсию и Фаренгейту
Следующая программа предназначена дли вывода таблицы соответствия между температурными шкалами Цельсия и Фаренгейта в интервале температур от точки замерзания воды до точки ее кипения. Температурная шкала Фаренгейта была предложена немецким физиком Габриэлем Фаренгейтом и используется в настоящее время в ряде англоязычных стран. В этой шкале при стандартном атмосферном давлении температура замерзания воды равна 32 °F, а температура кипения составляет 212 °F. В более привычной для нас шкале Цельсия аналогичными опорными точками являются, соответственно, 0 °С и 100 °С. Эти значения и используются для пересчета одних температур и другие. Нетрудно проверить, что формула для пересчета имеет вид: tf = 9/5*t + 32, где tf — температура но Фаренгейту, a tc — температура по Цельсию.
Листинг 1.3. Вывод таблицы соответствия температур по Цельсию и Фаренгейту
program Celsius_to_Fahrenheit;
var
i, Celsius, Fahrenheit: Word;
begin
Writeln(‘Таблица соответствия между температурными шкалами’);
Writeln(‘Цельсия и Фаренгейта’);
Writeln;
for i := 0 to 20 do beqin
Celsius := 5 * i;
Fahrenheit := 32 + Celsius * 9 div 5;
Write(‘ С =’, Celsius );
Write(‘ F =’, Fahrenheit);
Writeln;
end;
WriteLn(‘Нажмите ‘);
end.
Здесь есть новый элемент — операция div. В Паскале имеются две разновидности операции деления. Это обычная операция деления / и операция целочисленного деления div. В первом случае делимое и делитель могут быть любого числового типа, а во втором они должны быть целыми числами. Результат целочисленного деления — тоже целое число, которое получается отбрасыванием дробной части частного. Есть еще операция вычисления остатка от деления одного целого числа на другое — mod. В программе переменная Fahrenheit имеет целый тип Word, поэтому применение операции / привело бы к вещественному результату и, как следствие, к ошибке компиляции «Type mismatch» («Несоответствие типов»). Отметим, что Паскаль является языком со строгим контролем за соблюдением типов. Это несомненное достоинство языка, так как, принуждая программиста быть аккуратным при работе с переменными, система программирования на Паскале избавляет его от необходимости искать ошибки на этапе выполнения программы. Это значительно более трудная проблема.
Оператор вывода Write отличается от оператора WriteLn тем, что при выводе значений не происходит переход на следующую строку. В нашем случае оба числа будут выведены в одной строке.
Вычисление суммы
В следующей программе вычисляется сумма:
Листинг 1.4. Вычисление суммы
program summation_2;
var
i, n : Word;
t, add, Summa:Real;
begin
Write(‘Введите количество слогаемых n=’);
ReadLn(n);
Summa :=0;
for i := n downto 1 do
beqin
t := 1.0/i ;
add := Sqr(t);
Summa := Summa + add;
end;
Writeln(‘Сумма 1/i^2 от i=1 до’,n);
WriteLn(‘S = ‘, sunma);
WriteLn(‘Нажмите ‘);
ReadLn;
End.
В этой программе есть переменные типов Real и Word. Во втором операторе присваивания внутри цикла используется функция вычисления квадрата числа — Sqr. Кроме того, здесь мы встречаемся с разновидностью цикла for, в которой благодаря использованию ключевого слова downto вместо to значение управляющей переменной i уменьшается каждый раз на единицу.
В рассматриваемом случае лучше всего проводить суммирование в обратном порядке, то есть от слагаемых с наибольшими номерами, принимающими наименьшие значения, к слагаемым с наименьшими номерами, принимающими наибольшие значения. При суммировании в прямом порядке, начиная с некоторого номера, может возникнуть ситуация, когда при каждом проходе цикла к относительно большому значению суммы будет прибавляться сравнительно малое значение очередного слагаемого. Погрешность выполнения такой операции увеличивается — это особенность машинной арифметики. При суммировании в обратном порядке слагаемые не так сильно различаются между собой по величине, и, следовательно, точность вычисления полной суммы будет выше.
Решение линейного и нелинейного диофантовых уравнений
Следующая программа предназначена для решения диофантовых уравнений. Таким образом, мы попадаем в один из сложных разделов математики. Не стоит этого пугаться, ведь мы вооружены компьютером и знанием, правда, еще далеко не полным, языка программирования. Маленькая историческая справка. Открытие диофантовых уравнений связано с именем греческого математика
Диофанта, личности полулегендарной. О его жизни практически ничего не известно, но сегодня диофантов анализ — это обширная и важная область математики. Полная математическая теория разработана только для линейных уравнений, а общий метод решения нелинейных диофантовых уравнений нее еще неизвестен. Иногда анализ простого на вид нелинейного диофантова уравнения может представлять огромные трудности даже для математика высокой квалификации. Используя компьютер, оснащенный системой программирования на Турбо Паскале, мы сможем применить его возможности для решения как линейных, так и нелинейных диофантовых уравнений.
Самое простое линейное диофантово уравнение имеет вид
ax + by = с,
где а, b и с — заданные числа, а х и у — неизвестные. Особенность этих уравнений заключается в том, что для них ищутся целочисленные решения. Это можно сделать методом перебора.
Для того чтобы немного оживить наше повествование, решим следующую старинную задачу из области экономики сельского хозяйства. Зажиточный крестьянин потратил 100 рублей на покупку 100 различных домашних животных. Каждая корова обошлась ему в 10 рублей, свинья в 3 рубля, а овца в 50 копеек. Предполагая, что крестьянин приобрел по крайней мере по одному животному каждого вида, найдем, сколько голов скота каждого вида он купил. Условие задачи записывается в виде двух уравнений:
10x + Зу +z/2 = 100;
х + у + z= 100,
где х, у, z — количество коров, свиней и овец соответственно. Избавимся от знаменателя в первом уравнении, умножив сто на 2. Из полученного таким образом уравнения вычтем второе. Это позволяет исключить переменную z. Получаем уравнение 19x + 5у = 100. Решениями данного уравнения должны быть целые положительные числа (видел ли кто-нибудь отрицательное число коров?), меньшие 100. Следующая программа предназначена для решения данного уравнения.
Листинг 1.5. Решение линейного диофаитова уравнения
program diophantine equation_1;
var
x, у: integer;
begin
WriteLn(‘Целые решения уравнения 19x + 5y = 100 из диапазона’);
WriteLn(‘l :’);
ReadLn;
end.
Эта программа знакомит нас с новыми элементами. Здесь имеется двойной вложенный цикл for. Внутренний цикл содержит условный оператор if_ then. Оператор WriteLn выполняется только в том случае, когда истинно условие в операторе if. В данном случае это условие 19*х+5*у=100. Обратим внимание на то, что знак равенства обозначает здесь не оператор присваивания, а логическое отношение равенства двух значений. Результатом такого сравнения может быть или True (истина), если условие выполнено, или False (ложь), если условие не выполнено. Оператор вывода
WriteLn( ‘ (x, y) = (‘, x, ‘, ‘, y, ‘)’);
используется для вывода на экран четырех элементов, которые разделяются запятыми. Последовательности символов, начинающиеся и заканчивающиеся одиночными кавычками (‘), являются строками текста (строковыми константами). В нашем примере это ‘(х, у) = ( ‘ , ‘ , ‘ и ‘ )’. На экран будет выведен тот набор символов, который находится между кавычками. Нетекстовыми элементами списка вывода являются идентификаторы переменных х и у. На экран будут выведены значения этих переменных.
Как я уже упоминал, решение нелинейных диофантовых уравнений — это более сложная проблема. Но компьютер и умелое применение методов вычислительной математики часто позволяют быстро получить решение даже самых сложных задач. Вот пример кубического диофантова уравнения:
x3 = у2 + 2.
Известно его решение: х = 3, у = 5. Усложним задачу и решим уравнение
x3 = у2 + 63.
Понятно, что по сравнению с первым диапазон поиска решений придется увеличить.
Листинг 1.6. Решение нелинейного диофантова уравнения
program diophantine_equation_2;
var
х, у, z, w, n: LongInt;
begin
<Вначале найдем наибольшее n, для которого n^2 + 63 = z;
if w = z tnen
WriteLn( ‘ ( x, y ) = (‘, x, ‘ , ‘, y, ‘ ) ‘ )
else Dec(x);
end;
Write( ‘ Paбoта закончена, нажмите :’);
Readln;
end.
Для того чтобы увеличить диапазон поиска решений уравнения, целые переменные программы х, у, z, w, n описаны как переменные типа Longlnt («длинное целое») с диапазоном значений [- 2 147 483 648, +2 147483647]. Здесь же используется и оператор цикла repeat-until. И, наконец, в программе содержится обращение к встроенным функциям округления к нулю (Trunc), увеличения и уменьшения значения аргумента на единицу (Inc и Dec).
Вычисление произведения и сумм в прямом и обратном порядке
В следующей программе, предназначенной для вычисления произведения заданного числа сомножителей вида 1 + (-1)n/n2, отметим логическую функцию Odd из модуля System, которая принимает значение «истина» только в том случае, когда аргумент — нечетное число.
Листинг 1.7. Вычисление произведения
program product;
const
m = 400;
var
p, x : Exterded;
n : Word;
begin
product := 1.0:
for n := 2 to m do
begin
x := Sqr(1.0/n);
if Odd(n) then
product := product * (1.0 — x)
else
product := product * (1.0 + x);
end;
WriteLn(‘Произведение для 2 :’);
ReadLn;
end.
Следующая задача — вычисление суммы значений 1/n5 в прямом и обратном порядке. Здесь зарезервированное слово uses, дает возможность подключать к программе библиотечные модули. В данном примере используются процедуры для работы с экраном в текстовом режиме. Для очистки экрана используется процедура ClrScr, которая находится в библиотечном модуле Crt. Перед вычислением четвертой степени значения целой (типа Word) переменной k ее значение присваивается вещественной переменной х. Это делается для того, чтобы избежать переполнения. Ведь диапазон значений вещественных переменных значительно больше, чем диапазон значений целых переменных типа Word.
Листинг 1.8. Суммирование в прямом и обратном порядке
program forward_back_sum;
uses
Crt;
var
х, summa, ammus : Real;
k : Word;
begin
ClrScr;
WriteLn(‘ l/n^5, 1 to 1000′);
summa := 0.0;
for k := 1 to 1000 do
begin
x := k;
surma := surma + 1.0/(x*Sqr(Sqr(x)));
end;
ammus := 0.0;
for k := 1000 downto 1 do
begin
х := k;
ammus := ammus + l.0/(x*Sqr(Sqr(x)));
end;
WriteLn(‘Прямая сумма = ‘, summa);
WriteLn(‘Обратная сумма = ‘, arrrnus);
Writeln(‘ Разность = ‘, summa — ammus);
WriteLn:
Write( ‘ Нажмете :’);
ReadLn;
end.
Видео:Линейные программы. Решение задач. Ч.1.Скачать
Программа паскаль решение линейных уравнений
Обменять значения двух переменных, используя третью (буферную) переменную.
x — первая переменная;
y — вторая переменная;
b — буферная переменная (для хранения значения другой переменной).
Обмен значений двух переменных протекает по следующему алгоритму:
- В буферной переменной сохраняется значение первой переменной.
- Первой переменной присваивается значение второй.
- Второй переменной присваивается значение буферной переменной, это значение равно старому значению первой переменной.
Вывести на экран введенные пользователем данные в полях шириной, заданной по умолчанию, и полях шириной, определяемой пользователем.
Получить от пользователя данные, обработать их и вывести на экран
Вывести на экран действительное число в различных форматах представления.
Допустим, организации часто требуется красить баки цилиндрической формы. При этом они красят только верхнюю часть и стенки с внешней стороны.
Организации требуется программа, которая бы определяла, сколько банок краски необходимо для покраски того или иного бака.
Программа должна запрашивать у пользователя следующую информацию:
- диаметр бака;
- высота бака;
- расход краски (площадь поверхности, которую можно покрасить одной банкой краски).В результате программа должна выдавать количество требуемых банок. При получении дробного числа округление должно всегда происходить в большую сторону.
Площадь крыши бака (круга) вычисляется по формуле p * d 2 /4 (где p – число пи, d — диаметр).
Площадь боковой поверхности цилиндра: p * d * h (где h – высота).
Стандартная функция trunc выполняет «отбрасывание» дробной части и возвращает целое число.
Месячная выплата m по займу в s рублей на n лет под процент p вычисляется по формуле:
m = (s * r * (1 + r) n ) / (12 * ((1 + r) n – 1)), где r = p / 100.
Программа, вычисляющая значение m (месячную выплату) по известным s (сумме займа), p (проценту) и n (количеству лет), может выглядеть так:
Видео:Программа для решения корней квадратного уравнения с использованием дискриминанта на языке ПаскальСкачать
Курсовая работа: Разработка программы решения системы линейных уравнений
Название: Разработка программы решения системы линейных уравнений Раздел: Рефераты по информатике, программированию Тип: курсовая работа Добавлен 22:38:32 18 июля 2010 Похожие работы Просмотров: 1002 Комментариев: 21 Оценило: 3 человек Средний балл: 5 Оценка: неизвестно Скачать | |
Видео:Pascal Полный курс с нуля за 4 часаСкачать
Заключение
В данной курсовой работе рассмотрены математические методы решения систем линейных уравнений: матричный метод и метод Гаусса, приводятся основные конструкции языка Паскаль. Рассмотренные теоретические вопросы дают возможность создания программы на Паскале для решения систем линейных уравнений. В курсовой работе приводится текст данной программы, рассматривается структура программы, анализируются все подпрограммы. Данная программа может быть использована в различных областях, где требуется решение систем линейных уравнений.
Видео:Линейные уравненияСкачать
Список используемых источников и литературы
1. А.В. Могилев, Н.И. Пак, Е.К. Хеннер «Информатика», Москва, ACADEMA, 2000 г.
2. « Турбо Паскаль 7.0″, Киев, Торгово-издательское бюро BHV, 1997г.
3. С.А. Немнюгин, «Турбо ПАСКАЛЬ», Практикум, Питер, 2002г.
Приложение
«Решение систем линейных уравнений матричным способом и методом Гаусса»
type matr=array [1. n,1. n] of real;
mas=array [1. n] of real;
procedure PrintMatr2 (m,m1: matr; n,nz,nd: integer);
for i: =1 to n do
if (i=1) then write (np: 2,’: ‘)
for j: =1 to n do
write (m [i,j]: nz: nd); write (‘ ‘);
for j: =1 to n do
write (m1 [i,j]: nz: nd);
procedure MultString (var a,b: matr; i1: integer; r: real);
for j: =1 to n do
procedure AddStrings (var а,b: matr; i1, i2: integer; r: real);
for j: =1 to n do
a [i1,j]: =a [i1,j] +r*a [i2,j] ;
b [i1,j]: =b [i1,j] +r*b [i2,j] ;
procedure MultMatr (a,b: matr; var c: matr);
for i: =1 to n do
for j: =1 to n do
for k: =1 to n do
function sign (r: real): shortint;
if (r>=0) then sign: =1 else sign: =-1;
procedure GetMatr (a: matr; var b: matr; m, i,j: integer);
var ki,kj,di,dj: integer;
for ki: =1 to m-1 do
if (ki=i) then di: =1;
for kj: =1 to m-1 do
if (kj=j) then dj: =1;
b [ki,kj]: =a [ki+di,kj+dj] ;
procedure gauss (a: matr; b: mas; var x: mas; n: integer);
For k: =1 to N-1 do
For i: =k+1 to n do
For j: =k+1 to N do
writeln (‘Вывод результатов решения системы уравнений методом Гаусса’);
writeln (‘x [‘,n,’] =’,x [n]: 6: 2);
for i: = (n-1) downto 1 do
For j: =i+1 to n do
x [i]: = (b [i] +s) /a [i, i] ;
writeln (‘x [‘, i,’] =’,x [i]: 6: 2);
procedure matrica (a: matr; y: mas; n: integer);
for i: =1 to n do
for j: =1 to n do z [i,j]: =0;
for i: =1 to n do
for j: =1 to n do
for i: =1 to n do
взятую со знаком i-того элемента j-ой строки. Таким образом,
на месте элементова a [i, i] возникает сумма модулей элементов i-того
столбца (ниже i-ой строки) взятая со знаком бывшего элемента a [i, i],
равенство нулю которой говорит о несуществовании обратной матрицы >
for j: =i+1 to n do
AddStrings (a,z, i,j,sign (a [i, i]) *sign (a [j, i]));
if (abs (a [i, i]) >eps) then
MultString (a,z, i,1/a [i, i]);
for j: =i+1 to n do
AddStrings (a,z,j, i,-a [j, i]);
writeln (‘Обратной матрицы не существует. ‘);
if (a [n,n] >eps) then
for i: =n downto 1 do
for j: =1 to i-1 do
AddStrings (a,z,j, i,-a [j, i]);
else writeln (‘Обратной матрицы не существует. ‘);
writeln (‘Начальная матрица, обратная к ней матрица: ‘);
for i: =1 to n do s [i]: =0;
for i: =1 to n do
for j: =1 to n do
s [i]: =s [i] +z [i,j] *y [j] ;
writeln (‘Вывод результатов решения системы уравненй матричным способом’);
for i: =1 to n do write (‘ ‘, s [i]: 5: 2);
writeln (‘ввод матрицы коэффициентов при неизвестных х’);
for i: =1 to N do
for j: =1 to N do
write (‘ введите a [‘, i,’,’,j,’] => ‘);
writeln (‘ввод столбца свободных членов’);
for i: =1 to N do
write (‘ введите b [‘, i,’] => ‘);
writeln (‘введите вариант ‘);
writeln (‘ 1 — решение системы линейных уравнений методом Гаусса ‘);
write (‘ 2 — решение системы линейных уравнений матричным методом => ‘);