Программирование на языке высокого уровня Лекция 7. Методы класса как подпрограммы. Решение нелинейных уравнений Кафедра АСОИУ ОмГТУ, 2012 Богатов Р.Н.
Подпрограмма. Процедура. Функция. Метод Машинный язык: Подпрограмма принимает и возвращает значения через глобальные переменные, регистры или стэк. Pascal: Процедура = подпрограмма Функция = подпрограмма, возвращающая значение C: Функция может возвращать или не возвращать значение (процедур нет) C#, Java и другие: Данные и код инкапсулированы в классы. Инкапсулированные подпрограммы называются методами. // пример вызова процедуры на языке Assebmler mov ax, 0 mov dx, 123 call my_proc // пример вызова процедур и функций на языке Pascal writeln; y := sin(x); // пример вызова функций на языке Си getch(); c = getch(); y = sin(x); // пример вызова методов на языке C# textBox1.Hide(); x = r.NextDouble(); y = Math.Sin(x); // пример вызова процедуры на языке Assebmler mov ax, 0 mov dx, 123 call my_proc // пример вызова процедур и функций на языке Pascal writeln; y := sin(x); // пример вызова функций на языке Си getch(); c = getch(); y = sin(x); // пример вызова методов на языке C# textBox1.Hide(); x = r.NextDouble(); y = Math.Sin(x);
Подпрограмма. Процедура. Функция. Метод Машинный язык: Подпрограмма принимает и возвращает значения через глобальные переменные, регистры или стэк. Pascal: Процедура = подпрограмма Функция = подпрограмма, возвращающая значение C: Функция может возвращать или не возвращать значение (процедур нет) C#, Java и другие: Данные и код инкапсулированы в классы. Инкапсулированные подпрограммы называются методами. // пример вызова процедуры на языке Assebmler mov ax, 0 mov dx, 123 call my_proc // пример вызова процедур и функций на языке Pascal writeln; y := sin(x); // пример вызова функций на языке Си getch(); c = getch(); y = sin(x); // пример вызова методов на языке C# textBox1.Hide(); x = r.NextDouble(); y = Math.Sin(x); // пример вызова процедуры на языке Assebmler mov ax, 0 mov dx, 123 call my_proc // пример вызова процедур и функций на языке Pascal writeln; y := sin(x); // пример вызова функций на языке Си getch(); c = getch(); y = sin(x); // пример вызова методов на языке C# textBox1.Hide(); x = r.NextDouble(); y = Math.Sin(x); public partial class Form1 : Form { int N; int[] a; private void button1_Click(object sender, EventArgs e) { N = (int)numericUpDown1.Value; a = new int[N]; massiv_sluchaino(0, 100); massiv_v_textbox(); massiv_sort(); massiv_v_textbox(); massiv_perevorot(); massiv_v_textbox(); } void massiv_v_textbox() { for (int i = 0; i < N; i++) textBox1.Text += String.Format("a[{0}] = {1}\r\n", i + 1, a[i]); textBox1.Text += "\r\n"; } void massiv_sluchaino(int min, int max) {... } public partial class Form1 : Form { int N; int[] a; private void button1_Click(object sender, EventArgs e) { N = (int)numericUpDown1.Value; a = new int[N]; massiv_sluchaino(0, 100); massiv_v_textbox(); massiv_sort(); massiv_v_textbox(); massiv_perevorot(); massiv_v_textbox(); } void massiv_v_textbox() { for (int i = 0; i < N; i++) textBox1.Text += String.Format("a[{0}] = {1}\r\n", i + 1, a[i]); textBox1.Text += "\r\n"; } void massiv_sluchaino(int min, int max) {... } private void button1_Click(object sender, EventArgs e) {... label1.Text = "Максимум = " + massiv_max(); label2.Text = "Сумма без крайних эл-в = " + massiv_part_sum(1, N-2); } int massiv_max() { int max = int.MinValue; for (int i = 0; i < N; i++) if (a[i] > max) max = a[i]; return max; } int massiv_part_sum(int i, int j) { int sum = 0; for (int k = i; k max) max = a[i]; return max; } int massiv_part_sum(int i, int j) { int sum = 0; for (int k = i; k
Решение нелинейного уравнения public partial class Form1 : Form { double x1, x2, eps; int N; private void button1_Click(object sender, EventArgs e) { x1 = Convert.ToDouble(textBox4.Text); // начало отрезка изоляции x2 = Convert.ToDouble(textBox5.Text); // конец отрезка изоляции eps = Convert.ToDouble(textBox6.Text); // точность N = Convert.ToInt32(textBox7.Text); // предельное число итераций metod_del_popolam(); //metod_iteraziy(); //metod_Newtona(); } double y(double x) { return Math.Cos(x) - x * x * x; } void metod_del_popolam() {... } public partial class Form1 : Form { double x1, x2, eps; int N; private void button1_Click(object sender, EventArgs e) { x1 = Convert.ToDouble(textBox4.Text); // начало отрезка изоляции x2 = Convert.ToDouble(textBox5.Text); // конец отрезка изоляции eps = Convert.ToDouble(textBox6.Text); // точность N = Convert.ToInt32(textBox7.Text); // предельное число итераций metod_del_popolam(); //metod_iteraziy(); //metod_Newtona(); } double y(double x) { return Math.Cos(x) - x * x * x; } void metod_del_popolam() {... } void metod_del_popolam() { textBox1.Text = ""; double a = x1, b = x2, c = 0, fc = 0; double fa = y(a); double fb = y(b); // проверка на наличие корней (fa*fb>=0) int i = 1; for (; i < N; i++) { c = (a + b) / 2; fc = y(c); //...вывод протокола итерации (если нужно) if (b - c < eps) break; if (fa * fc < 0) { b = c; fb = fc; } else { a = c; fa = fc; } // вывод или возврат результата } void metod_del_popolam() { textBox1.Text = ""; double a = x1, b = x2, c = 0, fc = 0; double fa = y(a); double fb = y(b); // проверка на наличие корней (fa*fb>=0) int i = 1; for (; i < N; i++) { c = (a + b) / 2; fc = y(c); //...вывод протокола итерации (если нужно) if (b - c < eps) break; if (fa * fc < 0) { b = c; fb = fc; } else { a = c; fa = fc; } // вывод или возврат результата } // вывод протокола итерации textBox1.Text += String.Format( "a = {0:0.###}\t c = {1:0.###}\t b = {2:0.###}\t f(c) = {3:0.###}\r\n", a, c, b, fc); // вывод результата textBox1.Text = String.Format( "x = {0}\r\ny(x) = {1}\r\ndx = {2}\r\nИтераций = {3}\r\n\r\n", c, fc, b-c, i) + textBox1.Text; // вывод протокола итерации textBox1.Text += String.Format( "a = {0:0.###}\t c = {1:0.###}\t b = {2:0.###}\t f(c) = {3:0.###}\r\n", a, c, b, fc); // вывод результата textBox1.Text = String.Format( "x = {0}\r\ny(x) = {1}\r\ndx = {2}\r\nИтераций = {3}\r\n\r\n", c, fc, b-c, i) + textBox1.Text;
Решение нелинейного уравнения double y_x(double x) { return Math.Pow(Math.Cos(x), 1/3.0); } void metod_iteraziy() { textBox2.Text = ""; double x = (x1+x2)/2, prev_x = x; int i = 1; for (; i < N; i++) { x = y_x(prev_x); //...вывод протокола итерации(если нужно) if (Math.Abs(prev_x - x) < eps) break; prev_x = x; } //...вывод или возврат результата } double y_x(double x) { return Math.Pow(Math.Cos(x), 1/3.0); } void metod_iteraziy() { textBox2.Text = ""; double x = (x1+x2)/2, prev_x = x; int i = 1; for (; i < N; i++) { x = y_x(prev_x); //...вывод протокола итерации(если нужно) if (Math.Abs(prev_x - x) < eps) break; prev_x = x; } //...вывод или возврат результата } double dy(double x) { return - Math.Sin(x) - 3 * x * x; } void metod_Newtona() { textBox3.Text = ""; double x = (x1+x2)/2, prev_x = x; int i = 1; for (; i < N; i++) { x = prev_x - y(prev_x) / dy(prev_x); //...вывод протокола итерации(если нужно) if (Math.Abs(prev_x - x) < eps) break; prev_x = x; } //...вывод или возврат результата } double dy(double x) { return - Math.Sin(x) - 3 * x * x; } void metod_Newtona() { textBox3.Text = ""; double x = (x1+x2)/2, prev_x = x; int i = 1; for (; i < N; i++) { x = prev_x - y(prev_x) / dy(prev_x); //...вывод протокола итерации(если нужно) if (Math.Abs(prev_x - x) < eps) break; prev_x = x; } //...вывод или возврат результата } void metod_hord() { textBox8.Text = ""; double a = x1, b = x2, c = 0; int i = 1; for (; i < N; i++) { c = a - y(a) * (a - b) / (y(a) - y(b)); //...вывод протокола итерации(если нужно) if (Math.Abs(c - a) < eps) break; b = a; a = c; } //...вывод или возврат результата } void metod_hord() { textBox8.Text = ""; double a = x1, b = x2, c = 0; int i = 1; for (; i < N; i++) { c = a - y(a) * (a - b) / (y(a) - y(b)); //...вывод протокола итерации(если нужно) if (Math.Abs(c - a) < eps) break; b = a; a = c; } //...вывод или возврат результата }
Решение нелинейного уравнения
Реализовать генератор псевдо-случайных чисел в виде нескольких методов, аналогичных Random.Next и Random.NextDouble. Домашнее задание