Выдержка из текста работы
Ключевые слова: MICROSOFT VISUAL STUDIO, ЯЗЫК ПРОГРАММИРОВАНИЯ С#, ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ, СХЕМА АЛГОРИТМА, ФУНКЦИЯ, КЛАСС, WINDOWS FORMS APLICATION
Курсовая работа выполнена с целью решить практические задания в среде программирования Visual Studio Express C# 2012.
Данная курсовая работа состоит из практической части, в которой подробно описано решение задач.
В практической части курсового проекта содержатся математическая формулировка поставленных задач, разработка схемы алгоритма, машинное тестирование разработанной программы.
При решении задач использовались данные из практических задач и различные формулы позволяющие найти неизвестные величины.
В каждой задаче подробно описан ход се решение, состоящий из аналитической части, в которой описываются формулы, использующиеся при решении задачи, условия, входные и выходные данные, и практической части, в которой показан алгоритм решения задачи, листинг программы.
В заключении подводятся итоги проделанной работы.
Оглавление
НОРМАТИВНЫЕ ССЫЛКИ
ВВЕДЕНИЕ
1. ЗАДАНИЕ №1
1.1 Формулировка задачи
1.2 Спецификации задачи
1.3 Математическая постановка задачи
1.4 Описание вычислительных методов
1.5 Схема алгоритма. Описание
1.6 Текст программы
1.7 Ручной подсчёт отладочного варианта
1.8 Результат машинного тестирования программы
2. ЗАДАНИЕ №2
2.1 Формулировка задачи
2.2 Спецификации задачи
2.3 Математическая постановка задачи
2.4 Схема алгоритма. Описание
2.5 Текст программы
2.6 Результат машинного тестирования программы
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЯ
НОРМАТИВНЫЕ ССЫЛКИ
В настоящей пояснительной записке используются ссылки на следующие нормативные документы:
ГОСТ 7.32-2001 «Отчет о научно-исследовательской работе. Структура и правила оформления».
ГОСТ 2.105-95 «Общие требования к текстовым документам»
ГОСТ Р 7.0.5-2008 «Библиографическая ссылка. Общие требования и правила составления»
ГОСТ 7.1-2003 «Библиографическая запись. Библиографическое описание. Общие требования и правила составления»
ГОСТ 7.80-2000. «Библиографическая запись. Заголовок. Общие требования и правила составления»
ГОСТ 19.701-80 — ЕСПД. Схемы алгоритмов, программ, данных и систем.
1.1 Формулировка задачи
Даны две функции: y=axІ+bx+c и z=xі+dxІ+ex+f. Выяснить, в каких точках их графики пересекают оси OX и OY, а также пересекаются между собой (если пересекаются). Построить оба графика.
1.2 Спецификации задачи
Входные данные:
- Коэффициенты a, b, с, d, e, f (Вводится с клавиатуры).
Выходные данные:
- Значения точек, в которых графики пересекают оси оХ и оY, значение точки, где пересекаются сами графики. Графики функции.
1.3 Математическая постановка задачи
В таблице 1 приведен ряд переменных, представляющих исходные данные и результаты работы программы. Этот ряд может быть дополнен на стадии разработки алгоритма.
Общее описание алгоритма.
Таблица 1 — Характеристика переменных
Имя переменной |
Смысл переменной |
Назначение переменной |
|
a |
Коэффициент а |
Исходная |
|
b |
Коэффициент b |
Исходная |
|
c |
Коэффициент c |
Исходная |
|
d |
Коэффициент d |
Исходная |
|
e |
Коэффициент e |
Исходная |
|
f |
Коэффициент f |
Исходная |
|
x |
Неизвестный параметр в уравнении |
Промежуточная |
|
l |
Начало интервала |
Промежуточная |
|
r |
Конец интервала |
Промежуточная |
|
v |
Результат бинарного поиска |
Промежуточная |
|
sqrtD |
Квадратный корень из дискриминанта |
Промежуточная |
|
s1,s2,s3 |
Массив точек пересечения графиков с осями и между собой |
Результат |
1.4 Описание вычислительных методов
После ввода исходных данных пользователем, а именно коэффициентов кубического и квадратного уравнений, производится вычисление производной кубического уравнения, затем находятся корни полученного квадратного уравнения по формуле:
Полученные значения — это точки изгиба кубического полинома, разбивающие его на монотонные интервалы. После этого необходимо найти ноль функции на каждом из монотонных интервалов.
Зная границы монотонных интервалов, при помощи бинарного поиска ищется решение кубического уравнения.
1.5 Схема алгоритма. Описание
Программа состоит из следующих методов: btWork_Click — обрабатывает событие нажатия на кнопку, в котором выполняются следующие операции: ввод исходных данных (коэффициентов уравнений), построение графиков функций, расчет и вывод результатов пересечения графиков функций с осями ОХ, ОY, между собой. С помощью метода solve выполняется поиск списка корней кубического полинома. Метод binsearch с помощью бинарного поиска выполняет поиск корня на монотонном интервале квадратичного полинома. Метод f возвращает значение кубического полинома в точке.
Исходный программы код приведён в листинге 1
Схема алгоритма приведена в приложении А.
1.6 Текст программы
Код программы приведён в листинге 1.
Листинг 1 — Код программы к заданию 1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Task4
public partial class frMain : Form
public frMain()
InitializeComponent();
// Константы для бинпоиска.
const double minX = -1e4, maxX = 1e4;
// Значение кубического полинома в точке.
double f(double a, double b, double c, double d, double x)
return a * x * x * x + b * x * x + c * x + d * d;
// Поиск корня на монотонном интервале квадратичного полинома.
double binsearch(double a, double b, double c, double d, double l, double r)
// Если нуля нет,
if ((f(a, b, c, d, l) > 0 && f(a, b, c, d, r) > 0) ||
(f(a, b, c, d, l) < 0 && f(a, b, c, d, r) < 0))
// вернем признак того, что корня нет.
return Double.NaN;
// Иначе, в цикле пока интервал не сузился до погрешности,
while (r — l > 1e-6)
// Берем середину интервала,
double m = (l + r) / 2;
// В зависимости от значения функции в точке, переносим границы поиска.
if (((f(a, b, c, d, m) > 0) && (f(a, b, c, d, l) > 0)) ||
((f(a, b, c, d, m) < 0) && (f(a, b, c, d, l) < 0)))
l = m;
else
r = m;
// Возвращаем ответ.
return l;
// Поиск списка корней кубического полинома.
List<double> solve(double a, double b, double c, double d)
// Ищем производную, берем дискриминант.
double A = a * 3, B = b * 2, C = c, D = B * B — 4 * A * C;
double x1, x2, v;
List<double> answer = new List<double>();
// Рассматриваем случай линейной функции.
if (Math.Abs(A) < 1e-9)
// Тогда интервала поиска два.
x1 = -C / B;
v = binsearch(a, b, c, d, x1, maxX);
if (v != Double.NaN && (answer.Count == 0 || Math.Abs(answer.Last() — v) > 1e-9))
answer.Add(v);
return answer;
// Если действительных корней у производной нет, ищем корни на всём интервале, т.к. функция монотонна.
if (D < 0)
v = binsearch(a, b, c, d, minX, maxX);
if (v != Double.NaN && (answer.Count == 0 || Math.Abs(answer.Last() — v) > 1e-9))
answer.Add(v);
// Случай спаренных действительных корней производной.
else if (Math.Abs(D) < 1e-9)
x1 = -(B / 2 * A);
// Два интервала, на которые разбивает этот корень, ищем корень на обоих.
v = binsearch(a, b, c, d, minX, x1);
if (v != Double.NaN && (answer.Count == 0 || Math.Abs(answer.Last() — v) > 1e-9))
answer.Add(v);
v = binsearch(a, b, c, d, x1, maxX);
if (v != Double.NaN && (answer.Count == 0 || Math.Abs(answer.Last() — v) > 1e-9))
answer.Add(v);
else
// Случай различных корней.
double sqrtD = Math.Sqrt(d);
x1 = (-B + sqrtD) / (2 * A);
x2 = (-B — sqrtD) / (2 * A);
// Ищем на каждом из трёх отрезков.
v = binsearch(a, b, c, d, minX, x1);
if (v != Double.NaN && (answer.Count == 0 || Math.Abs(answer.Last() — v) > 1e-9))
answer.Add(v);
v = binsearch(a, b, c, d, x1, x2);
if (v != Double.NaN && (answer.Count == 0 || Math.Abs(answer.Last() — v) > 1e-9))
answer.Add(v);
v = binsearch(a, b, c, d, x2, maxX);
if (v != Double.NaN && (answer.Count == 0 || Math.Abs(answer.Last() — v) > 1e-9))
answer.Add(v);
return answer;
private void btWork_Click(object sender, EventArgs e)
// Считываем данные.
double A = Convert.ToDouble(tbA.Text),
B = Convert.ToDouble(tbB.Text),
C = Convert.ToDouble(tbC.Text),
D = Convert.ToDouble(tbD.Text),
E = Convert.ToDouble(tbE.Text),
F = Convert.ToDouble(tbF.Text);
// Рисуем график.
ch.Series[0].Points.Clear();
ch.Series[1].Points.Clear();
for (double x = -1.9; x <= 2; x += 0.1)
ch.Series[0].Points.AddXY(x, A * x * x + B * x + C);
ch.Series[1].Points.AddXY(x, x * x * x + D * x * x + E * x + F);
// Выводим данные пользуясь описанными выше функциями.
List<double> s1, s2, s3;
lb.Items.Clear();
lb.Items.Add(«Первая функция:»);
lb.Items.Add(«OX:»);
s1 = solve(0, A, B, C);
for (int i = 0; i < s1.Count; i++)
lb.Items.Add(«(» + s1[i].ToString(«f3») + «; » + f(0, A, B, C, s1[i]).ToString(«f3») + «)»);
lb.Items.Add(«OY:»);
lb.Items.Add(«(» + 0.ToString(«f3») + «; » + f(0, A, B, C, 0).ToString(«f3») + «)»);
lb.Items.Add(«Вторая функция:»);
lb.Items.Add(«OX:»);
s2 = solve(1, D, E, F);
for (int i = 0; i < s2.Count; i++)
lb.Items.Add(«(» + s2[i].ToString(«f3») + «; » + f(1, D, E, F, s2[i]).ToString(«f3») + «)»);
lb.Items.Add(«OY:»);
lb.Items.Add(«(» + 0.ToString(«f3») + «; » + f(1, D, E, F, 0).ToString(«f3») + «)»);
lb.Items.Add(«Точки пересечения:»);
s3 = solve(1, D — A, E — B, F — C);
for (int i = 0; i < s3.Count; i++)
lb.Items.Add(«(» + s3[i].ToString(«f3») + «; » + f(1, D — A, E — B, F — C, s3[i]).ToString(«f3») + «)»);
1.7 Ручной подсчёт отладочного варианта
Пусть задано кубическое уравнение следующего вида:
В данном уравнении:
, , ,
Приведем уравнение к каноническому виду. Делаем замену переменных, от переменной x переходим к переменной y через равенство:
Получим новое уравнение от переменной y:
где: ,
Определим еще одну переменную Q:
Число действительных корней кубического уравнения зависит от знака Q:
Q > 0 — один действительный корень и два сопряженных комплексных корня.
Q < 0 — три действительных корня.
Q = 0 — один однократный действительный корень и два двукратных комплексных, или, если p = q = 0, то один трехкратный действительный корень.
По формуле Кардано, корни кубического уравнения в канонической форме равны:
где:
Применяя данные формулы, для одного из трёх значений б необходимо брать такое в, для которого выполняется условие бв = — p / 3 (такое значение в всегда существует).
Рассмотрим все возможные значения б и в (кубический корень всегда дает 3 значения!):
Итак, берем первое значение б и подбираем к нему в. В результате перебора приходим к паре б1и в2
Записываем все 3 корня сразу для переменной x:
Полная запись:
Приближенное значение: , ,
Тогда пересечение с осью ОХ — -1, с осью ОY — -1і+(-1)І-1+1 = 0
1.8 Результат машинного тестирования программы
Результат работы программы показан на рисунке 1.
Рисунок 1 — Результат работы программы
2.1 Формулировка задачи
Элементами динамического списка являются записи, в которых хранится информация о студентах ФКТАС: имя, фамилия, группа и оценки за последнюю сессию. Обеспечить ввод этих данных и разбить всех студентов в новые списки по группам, элементами которых являются записи с полями: группа, количество студентов в группе, массив с фамилиями студентов (отсортированный по алфавиту), средний балл группы за сессию. Найти лучшую по успеваемости группу.
2.2 Спецификации задачи
Входные данные:
- имя,
- фамилия,
- группа,
- оценки за последнюю сессию.
Выходные данные:
- Группа;
- Количество студентов;
- Список студентов;
- Средний балл группы,
- Лучшая по успеваемости группа.
2.3 Математическая постановка задачи
В таблице 2 приведен ряд переменных, представляющих исходные данные и результаты работы программы. Этот ряд будет дополнен на стадии разработки алгоритма.
Таблица 2 — Характеристика переменных
Имя |
Смысл переменной |
Назначение |
Ограничения |
|
fname |
Имя студента |
Исходная |
Строковый тип данных |
|
lname |
Фамилия студента |
Исходная |
Строковый тип данных |
|
group |
Группа |
Исходная |
||
mark |
Оценка |
Исходная |
Целочисленный тип данных |
|
students |
Массив, хранящий информацию о студентах |
Промежуточная |
||
count |
Число студентов в группе |
Промежуточная |
||
sum |
Сумма оценок студентов в группе |
Промежуточная |
||
i |
Счётчик цикла |
Промежуточная |
||
j |
Счётчик цикла |
Промежуточная |
2.4 Схема алгоритма. Описание
программирование математический квадратичный массив
После запуска программы пользователю предлагается заполнить массив, хранящий информацию о студентах. Производится ввод данных о студентах, а именно имя, фамилия, группа, оценки за последнюю сессию. После заполнения всех данных, на экран с помощью метода Output() распечатывается вся полученная информация, а именно группа, количество студентов в группе, массив с фамилиями студентов (отсортированный по алфавиту), средний балл группы за сессию, лучшая по успеваемости группа.
Если на стадии ввода названия групп обнаружено, что такая группа уже содержится в списке, в ней происходит обновление данных.
Схема алгоритма приведена в приложении Б.
2.5 Текст программы
Т.к. текст программы занимает достаточно большой объём, он приведен в приложении В (листинг 2).
2.6 Результат машинного тестирования программы
Результат работы данной программы представлен на рисунке 2.
Рисунок 2 — Результат тестирования программы
1. Павловская Т.А. C#. Программирование на языке высокого уровня: учебник для вузов. — СПб.: Питер, 2007. — 432 с.
2. Шилдт Г. C# 4.0: полное руководство. Пер. с англ. — М.: Вильямс, 2011.
3. Письменный Д. Т. Конспект лекций по высшей математике. Полный курс. — М.: Айрис-пресс, 2010. — 608 с.