Сегодня мы напишем программу, которая выведет нам решение квадратного уравнения на С#. Сделаем мы всё это в Windows Forms. В программе мы найдём дискриминант и оба корня.
Для создания программы нам понадобится знание начальной школы и трёх формул.
Формула нахождения дискриминанта:
Формула нахождения корней выражения, если дискриминант больше нуля:
И формула нахождения одного корня выражения, если дискриминант равен нулю:
Ну и, пожалуй, стоит вспомнить сам вид квадратного выражения:
Теперь пора приступать к программе.
Для начала создаём незамысловатую форму под наши нужды:
Здесь у нас 3 TextBox’a, 2 Label’a и 1 кнопка Button. Выводить решение мы будем в отдельном MessageBox’е.
Приступаем к коду. Дважды щёлкаем на Button и в открывшемся участке кода начинаем писать.
Сначала объявляем переменные, которым будут присвоены значения,введённые пользователем в TextBox’ы:
double a = Convert.ToDouble(textBox1.Text); double b = Convert.ToDouble(textBox2.Text); double c = Convert.ToDouble(textBox3.Text); |
Конвертируем данные из TextBox’ов в тип повышенной точности с плавающей точкой double, так как они имеют строковый тип, а нам нужен числовой.
Затем объявляем дискриминант и пишем его формулу:
double d = b * b — 4 * a * c; |
Мы знает три варианта развития событий при решении дискриминанта:
1) Если дискриминант больше нуля, то уравнение имеет два корня.
2) Если дискриминант равен нулю, то уравнение имеет лишь один корень.
3) Если дискриминант меньше нуля, то уравнение не имеет корней вообще.
Теперь перенесём написанное нами в код благодаря оператору условия if:
if (d < 0) { MessageBox.Show(«Дискриминант меньше нуля. Корней нет.»); } |
Если мы введём в нашу форму числа, нажмём кнопку «Решить уравнение» и окажется, что дискриминант будет меньше нуля, то программа нам выдаст в новом окне вот такое сообщение:
Теперь создадим условие, если дискриминант равен нулю:
if(d == 0) { double x=(—b/(2*a)); MessageBox.Show(«Дискриминант равен нулю. Корень равен «+x+«.»); } |
Мы создаём переменную, в которую занесётся решение формулы , а потом выводим эту переменную в MessageBox. Обратите внимание на форму записи такого вывода. Простой текст выводится в кавычках, а переменные выводятся при обрамлении их плюсами.
Вывод будет вот такой:
Ну и, наконец, условие, когда дискриминант больше нуля:
if(d > 0) { double x1 = ((—b — Math.Sqrt(d)) / (2 * a)); double x2 = ((—b + Math.Sqrt(d)) / (2 * a)); MessageBox.Show(«Дискриминант равен « +d+ «. Первый корень равен «+x1+«. Второй корень равен «+x2+«.»); } |
Считаем корни по формуле и выводим их точно так же, как было описано выше.
Вот так работает наша программа, выдающая решение квадратного уравнения на С#. Исходный код программы ниже:
Скачать исходник
Создайте форму на которой будут расположены label1, label2, label3, textBox1, textBox2, textBox3, и button1 , затем дабл клик на кнопку button1 откроется обработчик события клик по кнопке и впишите туда следующий код:
C# | ||
|
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Сегодня мы напишем программу, которая выведет нам решение квадратного уравнения на С#. Сделаем мы всё это в Windows Forms. В программе мы найдём дискриминант и оба корня.
Для создания программы нам понадобится знание начальной школы и трёх формул.
Формула нахождения дискриминанта:
Формула нахождения корней выражения, если дискриминант больше нуля:
И формула нахождения одного корня выражения, если дискриминант равен нулю:
Ну и, пожалуй, стоит вспомнить сам вид квадратного выражения:
Теперь пора приступать к программе.
Для начала создаём незамысловатую форму под наши нужды:
Здесь у нас 3 TextBox’a, 2 Label’a и 1 кнопка Button. Выводить решение мы будем в отдельном MessageBox’е.
Приступаем к коду. Дважды щёлкаем на Button и в открывшемся участке кода начинаем писать.
Сначала объявляем переменные, которым будут присвоены значения,введённые пользователем в TextBox’ы:
Решение квадратного уравнения
Уравнение вида a⋅x 2 + b⋅x + c = 0 — квадратное уравнение.
a, b, c — действительные числа, a ≠ 0.
Для того чтобы вычислить корни квадратного уравнения, нужно сначала найти дискриминант.
D = b 2 — 4⋅a⋅c;
- если D 0, то уравнение имеет два действительных корня:
- x1 = (-b + √D) / (2⋅a);
- x2 = (-b + √D) / (2⋅a).
Поиск по сайту
Выражение вида f(x)=0 называется уравнением. Число х называется корнем уравнения, если при его подстановке уравнение обращается в верное равенство. В статье рассмотрим методы решения уравнений — как точных, так и численных (приближенных).
Решение квадратных уравнений
Квадратным уравнением называется уравнение вида
Классическая формула для нахождения его корней (действительных и комплексных):
где выражение D = b 2 − 4ac называется дискриминантом уравнения, от его значения зависит количество и характер решений:
- Если D>0, то корней уравнения будет два и оба они будут действительными числами;
- Если D=0, то будет лишь один дейсвительный корень уравнения;
- Если D 2 +10x+200=0; данное уравнение не имеет действительных корней, но имеет пару сопряженных комплексных корней: x1 = -1-6,2449979983984i, x2 = -1+6,2449979983984i;
- x 2 -8x+16=0; данное уравнение имеет один двукратный корень x1=x2=4;
- x 2 -5x+6=0; данное уравнение имеет два различных корня x1=2, x2=3.
Напишем программу для решения этих уравнений:
На выходе получим:
5x^2 — 10x + 200 = 0
x0 = (-1, -6,2449979983984)
x1 = (-1, 6,2449979983984)
x^2 — 8x + 16 = 0
x0 = (4, 0)
x1 = (4, 0)
x^2 — 5x + 6 = 0
x0 = (3, 0)
x1 = (2, 0)
Воспользуемся WolframAlpha для проверки значений:
Решение кубических уравнений
Кубическим уравнением называется уравнение третьего порядка, которое имеет вид
Кубическое уравнение всегда имеет 3 корня, которые могут быть как вещественными, так и комплексными. Для решения кубических уравнений используется метод Виета-Кардано.
Формулы Кардано и Виета требуют применения специальных функций, и в том случае, когда требуется провести большую серию вычислений корней кубического уравнения с не слишком сильно меняющимися коэффициентами, более быстрым алгоритмом является использование метода Ньютона или других итерационных методов (с нахождением начального приближения по формулам Кардано-Виета), о которых мы поговорим дальше.
Рассмотрим в качестве примера следующие кубические уравнения:
- x^3 — 6x^2 + 11x — 6 = 0
- x^3 — 6x^2 + 11x + 6 = 0
Напишем программу для решения кубических уравнений с помощью метода Виета-Кардано:
Напишем программу для тестирования метода:
x^3 — 6x^2 + 11x — 6 = 0
x0 = (1, 0)
x1 = (3, 0)
x2 = (2, 0)
x^3 — 6x^2 + 11x + 6 = 0
x0 = (-0,434841368216901, 0)
x1 = (3,21742068410845, 1,85643189109788)
x2 = (3,21742068410845, -1,85643189109788)
Решим эти же уравнения с помощью WolframAlpha.
Решение биквадратных уравнений
Биквадратное уравнение — уравнение четвёртой степени вида
где a,b,c — заданные комплексные числа и a != 0. Подстановкой y = x 2 сводится к квадратному уравнению относительно y. Такой переход от одной неизвестной величины к другой называется методом замены неизвестных.
Рассмотрим в качестве примера кубические уравнения:
- 5x^4 — 10x^2 + 200 = 0
- x^4 — 8x^2 + 16 = 0
- x^4 — 5x^2 + 6 = 0
Таким образом немного модифицируем первую функцию для решения биквадратных уравнений:
Напшем программу для тестирования метода:
На выходе получим такие результаты:
5x^4 — 10x^2 + 200 = 0
x0 = (1,63164875514566, -1,91370783040891)
x1 = (-1,63164875514566, 1,91370783040891)
x2 = (1,63164875514566, 1,91370783040891)
x3 = (-1,63164875514566, -1,91370783040891)
x^4 — 8x^2 + 16 = 0
x0 = (2, 0)
x1 = (-2, 0)
x2 = (2, 0)
x3 = (-2, 0)
x^4 — 5x^2 + 6 = 0
x0 = (1,73205080756888, 0)
x1 = (-1,73205080756888, 0)
x2 = (1,4142135623731, 0)
x3 = (-1,4142135623731, 0)
По ссылкам раз, два, три можно убедиться в правильности решений.
источники:
http://programm.top/c-sharp/programs/quadratic-equation/
http://msugvnua000.web710.discountasp.net/Posts/Details/4394
Пример создания распределенного приложения, демонстрирующего удаленное взаимодействие между компьютерами в сети. Пространство имен System.Runtime.Remoting. Протокол Http
В данной теме описывается один из способов разработки простейшего распределенного приложения, которое использует удаленное взаимодействие между компьютерами в сети. По данному примеру можно научиться разрабатывать приложения, которые взаимодействуют между собой в локальной сети. Тема предусматривает наличие базовых навыков работы в Microsoft Visual Studio 2010.
Содержание
- Условие задачи
- Соображения
- Выполнение
- 1. Запустить Microsoft Visual Studio 2010
- 2. Разработка общей сборки с метаданными
- 2.1. Что такое общая сборка?
- 2.2. Создание модуля общей сборки
- 2.3. Текст модуля общей сборки
- 2.4. Объяснение к методу решения квадратного уравнения
- 2.5. Компиляция. Создание .dll — файла общей сборки
- 2.6. Закрыть решение (проект)
- 3. Создание программного кода, который будет размещаться на компьютере-сервере
- 3.1. Создание приложения типа Console Application
- 3.2. Добавление ссылок на сборки
- 3.2.1. Добавление ссылки на сборку System.Runtime.Remoting
- 3.2.2. Добавление ссылки на сборку ClassLibrary1
- 3.2.3. Подключение пространств имен сборок ClassLibrary1 и System.Runtime.Remoting в программный код файла Program.cs
- 3.3. Написание кода серверной части
- 3.3.1. Действия, которые нужно выполнить на сервере
- 3.3.2. Текст кода серверной части
- 3.4. Компиляция. Файлы серверной части
- 4. Разработка приложения клиентской части
- 4.1. Создание приложения клиентской части по шаблону Windows Forms
- 4.2. Проектирование формы
- 4.2.1. Размещение элементов управления Label, Button, TextBox на форме
- 4.2.2. Настройка свойств фомы и элементов управления
- 4.3. Текст модуля формы Form1.cs
- 4.4. Алгоритм работы программы-клиента
- 4.5. Написание программного кода клиентской части
- 4.5.1. Добавление ссылок на сборки
- 4.5.2. Подключение пространств имен
- 4.5.3. Написание кода метода Form1_Load()
- 4.5.4. Программирование события клика на кнопке «Вычислить». Текст клиентской части
- 5. Тестирование взаимодействия между клиентом и сервером на одном компьютере без использования локальной сети
- 6. Копирование серверной части на другой компьютер
- 7. Определение имени сервера в сети из компьютера-клиента
- 8. Корректирование клиентского программного кода. Замена имени localhost
- 9. Тестирование взаимодействия между клиентом и сервером на разных компьютерах, объединенных между собой в локальную сеть
- Связанные темы
Поиск на других ресурсах:
Условие задачи
1. Разработать распределенное приложение, которое содержит следующие части:
- серверная часть. Сервер должен содержать функции решения математических задач. В данном случае, в качестве примера сервер содержит метод, который решает квадратное уравнение. Серверная часть должна быть разработана как консольное приложение;
- клиентская часть. Клиент содержит программный код, который получает результат из серверной части. Клиент вызывает функцию решения квадратного уравнения, которая реализована и выполняется на сервере. Клиентская часть должна быть разработана как приложение типа Windows Forms.
2. Взаимодействие между клиентом и сервером организовать на основе протокола Http.
3. Приложение реализовать в системе Microsoft Visual Studio 2010 с использованием языка программирования C# .NET.
4. Для организации взаимодействия между компьютерами использовать средства из пространства имен System.Runtime.Remoting.
⇑
Соображения
Для проверки правильности выполнения задачи, нужно наличие как минимум двух компьютеров, которые объединенные между собой в локальную сеть.
Разработка распределенного приложения осуществляется на одном компьютере в MS Visual Studio 2010. Тестирование взаимодействия клиентской и серверной частей осуществляются также на одном компьютере.
После завершения тестирования, серверный код размещается на компьютере-сервере. Клиентский код из компьютера-клиента делает запрос на компьютер-сервер, получает ответ и выводит этот ответ на экран. В нашем случае клиентский код вызывает серверную функцию решения квадратного уравнения.
⇑
Выполнение
1. Запустить Microsoft Visual Studio 2010
⇑
2. Разработка общей сборки с метаданными
2.1. Что такое общая сборка?
Для того, чтобы клиент и сервер взаимодействовали между собой, нужно наличие еще одной части программного кода – общей сборки. Общая сборка содержит метаданные типов, которые являются допустимыми для удаленного вызова. Метаданные типов – это информация о типах данных, которые используются при удаленном вызове. Эта информация нужна как клиенту, так и серверу.
В конечном счете, после создания, программный код общей сборки должен размещаться как на компьютере клиента, так и на компьютере сервера. В противном случае, связь между клиентом и сервером невозможно будет установить.
⇑
2.2. Создание модуля общей сборки
В нашем случае общая сборка не является исполняемым файлом. Это есть библиотека, которая сохраняется в формате *.dll.
В Microsoft Visual Studio 2010 для создания библиотеки используется шаблон Class Library. В данном примере, чтобы создать модуль общей сборки нужно выполнить команду
File -> New -> Project...
Откроется окно «New Project», в котором нужно выбрать Visual C# -> Class Library. В нашем случае папка для размещения библиотеки: «D:Programs». Имя библиотеки ClassLibrary1 (по умолчанию). По желанию, можно изменить папку и имя библиотеки.
Рис. 1. Создание библиотеки по шаблону Class Library
После выбора OK, создается проект, который содержит один файл Class1.cs. Листинг файла следующий:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ClassLibrary1 { public class Class1 { } }
По умолчанию создается класс с именем Class1 в пространстве имен ClassLibrary1. В нашем случае оставляем все как есть. По желанию можно изменить название класса и пространства имен.
⇑
2.3. Текст модуля общей сборки
В модуль Class1.cs нужно ввести необходимый программный код. Этот код будет выполняться на стороне сервера. А вызов этого кода будет осуществлять клиент.
В соответствии с условием задачи, сервер может решать математические задачи. Поэтому, в класс Class1 нужно вписать функцию решения квадратного уравнения. В нашем случае функция называется CalcEquation(). По желанию, сюда можно вписать другие функции, которые решают разные задачи.
Также класс Class1 наследует данные и методы класса MarshalByRefObject. Класс MarshalByRefObject обеспечивает доступ к объектам в пределах домена приложения в приложениях, которые поддерживают удаленный доступ. Это специально разработанный класс для поддержки распределенного доступа к приложениям.
В классе MarshalRefObject есть метод CreateObjRef(), который будет использован в нашем проекте. Метод CreateObjRef() содержит всю необходимую информацию для генерирования прокси. Прокси применяется чтобы соединиться с удаленным объектом.
Листинг модуля общей сборки следующий (файл Class1.cs):
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ClassLibrary1 { // класс Class1 наследует класс MarshalByRefObject public class Class1 : MarshalByRefObject { // функция вычисления квадратного уравнения public bool CalcEquation(double a, double b, double c, out double x1, out double x2) { double d; // дискриминант // Решение квадратного уравнения // вычисление дискриминанта d = b * b - 4 * a * c; if (d > 0) { x1 = (-b - Math.Sqrt(d)) / (2 * a); x2 = (-b + Math.Sqrt(d)) / (2 * a); return true; } else if (d == 0) { x1 = x2 = (-b) / (2 * a); return true; } else { x1 = x2 = 0; return false; } } } }
⇑
2.4. Объяснение к методу решения квадратного уравнения
Метод решения квадратного уравнения CalcEquation() получает входными параметрами значения коэффициентов a, b, c. Если уравнение имеет решение, то метод возвращает true и значение корней уравнения в параметрах-переменных x1, x2. Если уравнение не имеет решения, то метод возвращает false и нулевые значения параметров-переменных x1, x2.
⇑
2.5. Компиляция. Создание .dll — файла общей сборки
На этом шаге нужно откомпилировать проект командой
Build -> Build Solution
В результате будет создан *.dll-файл общей сборки с именем ClassLibrary1.dll, которая размещается в папке
D:ProgramsClassLibrary1ClassLibrary1binDebug
Этот файл нужно будет разместить в папках с исполняемыми модулями на компьютере-клиенте и на на компьютере-сервере. Файл общей сборки готов.
Рис. 2. Файл ClassLibrary1.dll
⇑
2.6. Закрыть решение (проект)
Общая сборка разработана. Чтобы закрыть решение (Solution) нужно выполнить команду
File->Close Solution
На следующем этапе будет разрабатываться программный код серверной части распределенного приложения.
⇑
3. Создание программного кода, который будет размещаться на компьютере-сервере
После создания файла (модуля) общей сборки на одном и том же компьютере нужно разработать программный код, который будет размещаться на компьютере-сервере.
Чтобы сервер отвечал на запросы клиента, программный код серверной части должен быть запущен на выполнение в момент запроса.
3.1. Создание приложения типа Console Application
В соответствии с условием задачи, на серверной части нужно создать приложение типа Console Application. Это осуществляется стандартным способом с помощью команды
File -> New -> Project...
В результате откроется окно New Project (рисунок 3), в котором нужно:
- выбрать шаблон Visual C# -> Console Application;
- оставить имя проекта по умолчанию ConsoleApplication1. По желанию можно изменить это имя;
- выбрать папку для проекта D:Programs (или другую папку);
- установить опцию «Create directory for solution».
Рис. 3. Окно создания консольного приложения
В результате будет создано обычное консольное приложение, которое содержит файл Program.cs. В этом файле объявляется пространство имен ConsoleApplication1, в котором реализован класс Program.
Листинг файла следующий
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { } } }
⇑
3.2. Добавление ссылок на сборки
Чтобы использовать программный код общей сборки нужно подключить:
- сборку System.Runtime.Remoting. Эта сборка содержит все необходимые средства для удаленного доступа;
- общую сборку ClassLibrary1, которая была разработана в п.2. В этой сборке размещается метод решения квадратного уравнения.
⇑
3.2.1. Добавление ссылки на сборку System.Runtime.Remoting
Чтобы добавить ссылку на сборку System.Runtime.Remoting нужно выполнить следующую последовательность команд.
В окне Solution Explorer вызвать команду Add Reference… как показано на рисунке 4. Для этого нужно сделать клик правой кнопкой мыши на элементе References.
Рис. 4. Команда Add Reference…
В результате откроется диалоговое окно Add Reference (рисунок 5), в котором нужно:
- активировать вкладку .NET;
- в перечне сборок выбрать сборку System.Runtime.Remoting;
- подтвердить выбор кнопкой OK.
Рис. 5. Подключение сборки System.Runtime.Remoting.dll
После этого в Solution Explorer в проекте ConsoleApplication1 будет отображена сборка System.Runtime.Remoting (рисунок 6).
Рис. 6. Подключенная к проекту сборка System.Runtime.Remoting
⇑
3.2.2. Добавление ссылки на сборку ClassLibrary1
Добавление ссылки на сборку ClassLibrary1 осуществляется такой же командой «Add Reference…», как подключение сборки System.Runtime.Remoting (рисунок 4).
В результате откроется окно Add Reference, в котором нужно активировать вкладку Browse как показано на рисунке 7.
В окне, с помощью нисходящего меню «Папка» нужно выбрать папку, в которой размещается ранее разработанная общая сборка (см. п. 2) с именем ClassLibrary1.
В нашем случае выбирается папка (см. п. 2.4):
D:ProgramsClassLibrary1ClassLibrary1binDebug
Рис. 7. Выбор папки и файла общей сборки
После выбора OK, в окне Solution Explorer в перечне References ссылок на использованные сборки появится сборка ClassLibrary1.
Рис. 8. Сборка ClassLibrary1 в перечне сборок серверного приложения
⇑
3.2.3. Подключение пространств имен сборок ClassLibrary1 и System.Runtime.Remoting в программный код файла Program.cs
После подключения сборок к проекту, нужно подключить необходимые пространства имен в файле Program.cs. Добавляются 4 пространства имен:
using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using ClassLibrary1;
На данный момент текст файла Program.cs следующий
using System; using System.Collections.Generic; using System.Linq; using System.Text; // добавление пространств имен using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using ClassLibrary1; // библиотека общей сборки namespace ConsoleApplication1 { class Program { static void Main(string[] args) { } } }
⇑
3.3. Написание кода серверной части
3.3.1. Действия, которые нужно выполнить на сервере
На компьютере-сервере нужно выполнить три основных действия:
- Создать канал связи. Для этого хорошо подходит класс HttpChannel. Есть и другие классы. Создается объект канала типа HttpChannel;
- Зарегистрировать канал с помощью статического класса ChannelServices. В этом классе есть метод RegisterChannel(). Этот метод получает параметром канал (тип HttpChannel в нашем случае) и опцию задействования службы безопасности (bool);
- Зарегистрировать сервис как WKO-тип (Well Known Object, хорошо известный объект). Это осуществляется с помощью класса RemotingConfiguration. В этом классе есть статический метод RegisterWellKnownServiceType(), который осуществляет регистрацию сервиса.
⇑
3.3.2. Текст кода серверной части
Ниже приведен текст программного кода серверной части
using System; using System.Collections.Generic; using System.Linq; using System.Text; // добавление пространств имен using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using ClassLibrary1; // библиотека общей сборки namespace ConsoleApplication1 { class Program { static void Main(string[] args) { // 1. Создать канал между клиентом и сервером, создать объект типа HttpChannel HttpChannel ch = new HttpChannel(5000); // номер порта = 5000 - выбран наугад // 2. Зарегистрировать канал ch, в методе RegisterChannel() указывается уровень безопасности false ChannelServices.RegisterChannel(ch, false); // 3. Зарегистрировать сервис как WKO RemotingConfiguration.RegisterWellKnownServiceType( typeof(ClassLibrary1.Class1), "MathFunctions.soap", WellKnownObjectMode.Singleton); // 4. Вывести сообщения, что сервис в состоянии выполнения Console.WriteLine("MathFunctions service is ready..."); // 5. Остановить, оставить сервис в состоянии выполнения, пока не будет нажата клавиша Enter Console.ReadLine(); } } }
Объясним некоторые фрагменты кода серверной части.
Сначала создается канал связи, который представлен объектом ch типа HttpChannel. Конструктор класса HttpChannel() получает параметром номер порта, через который происходит связь между компьютерами. Номер порта может быть числом от 0 до 65535. Рекомендуется задавать номер порта выше значения 1024.
На втором этапе происходит регистрация канала ch с помощью класса ChannelServices. Это осуществляет метод класса RegisterChannel(). Первый параметр метода – это канал ch, который нужно зарегистрировать. Второй параметр – флажок типа bool. Значение флажка true требует запуск канала в пределах IIS (Internet Information Server) с целью обеспечения безопасности. Поскольку, наше приложение запускается за пределами IIS, то значение флажка нужно установить в false.
На третьем этапе нужно зарегистрировать сервис как WKO-тип (Well Known Object). Это реализуется с помощью класса RemotingConfiguration. В этом классе есть метод RegisterWellKnownServiceType(). Этот метод получает три параметра:
- тип данных, который есть типом нашего созданного класса Class1 в общей сборке ClassLibrary1. В нашем случае здесь нужно передать typeof(ClassLibrary1.Class1);
- строка, которая идентифицирует наш сервис на компьютере-сервере. В нашем случае выбрано «MathFunctions.soap». По желанию можно выбрать другое название;
- значением из перечисления WellKnownObjectMode.Singleton. Это значит, что серверный объект разделяется всеми клиентами сервера.
В конце вызывается метод Console.Readline(). Этот метод необходим, чтобы зафиксировать выполнение консольного приложения, поскольку серверная часть должна быть все время запущена. В это время клиенты смогут к ней обращаться. Завершение работы сервера – клавиша Enter.
⇑
3.4. Компиляция. Файлы серверной части
На этом шаге нужно откомпилировать текст командой
Build -> Build Solution
для получения исполняемого (*.exe) файла. В результате будет создан исполняемый файл с именем
D:ProgramsConsoleApplication1ConsoleApplication1binDebugConsoleApplication1.exe
На рисунке 9 отображено содержимое папки Debug с файлами проекта серверной части. Как видно из рисунка 9, автоматически подгружается файл общей сборки ClassLibrary1.dll.
Рис. 9. Содержимое папки Debug с исполняемым файлом ConsoleApplication1.exe серверной части и файлом сборки ClassLibrary1.dll
Оба файла ConsoleApplication1.exe и ClassLibrary1.dll нужно будет разместить (скопировать) на компьютере-сервере.
После этого проект, который соответствует серверной части, завершен.
⇑
4. Разработка приложения клиентской части
В сети с несколькими компьютерами, клиентов может быть сколько угодно, а сервер один. Сервер должен отвечать на запросы клиентов. В нашем случае достаточно разработать одно приложение, которое делает запросы к серверу. Затем исполняемый .exe файл (модуль) этого приложения и .dll файл общей сборки нужно скопировать (распространить) по всей сети на клиентские компьютеры.
4.1. Создание приложения клиентской части по шаблону Windows Forms
Проект по шаблону Windows Forms создается стандартным способом:
File->New Project...
В результате откроется окно New Project. В окне New Project нужно выбрать вкладку
Visual C# -> Windows Forms Application
как показано на рисунке 10.
Рис. 10. Проект типа Windows Forms Application, который будет размещаться на компьютере клиента
В проекте задаются:
- имя проекта WindowsFormsApplication1;
- папка проекта D:Programs.
После выбора OK будет создана новая форма проекта как показано на рисунке 11.
Рис. 11. Новая форма проекта
⇑
4.2. Проектирование формы
4.2.1. Размещение элементов управления Label, Button, TextBox на форме
Нужно разместить на форме следующие элементы управления (рисунок 12):
- четыре элемента управления типа Label. По умолчанию создаются объекты с именами label1, label2, label3, label4;
- один элемент управления типа Button. По умолчанию создается объект с именем button1.
Рис. 12. Размещение элементов управления на форме
⇑
4.2.2. Настройка свойств фомы и элементов управления
Подробное описание того, как осуществляется настройка элементов управления на форме можно найти в теме:
- Пример программирования события в C#. Разработка программы для определения площади поверхности шара
На этом шаге, с помощью окна Properties, нужно настроить следующие свойства формы и элементов управления:
- в форме Form1, свойство Text = «Решение квадратного уравнения»;
- в форме Form1, свойство StartPosition = CenterScreen;
- в Label1, свойство Text = «a = «;
- в Label2, свойство Text = «b = «;
- в Label3, свойство Text = «c = «;
- в Label4, свойство Text = «Результат: «.
После настройки элементов управления, окно формы будет иметь вид как показано на рисунке 13.
Рис. 13. Окно программы-клиента после настройки
После этого можно разрабатывать программный код клиента.
⇑
4.3. Текст модуля формы Form1.cs
Главной форме программы-клиента соответствует модуль (файл) с именем Form1.cs.
На данный момент листинг файла Form1.cs имеет следующий вид:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } }
⇑
4.4. Алгоритм работы программы-клиента
На компьютере клиенте нужно выполнить следующие действия:
- создать канал соединения с сервером. В нашем случае используется класс HttpChannel. В отличие от сервера, клиенту номер порта не нужен. Поэтому, при создании класса будет вызываться конструктор HttpChannel() без номера порта. Для сервера номер порта обязательно нужно задавать, чтобы клиент знал где его найти. А клиенту номер порта не нужен, так как для создания канала система сама выберет первый подходящий порт;
- зарегистрировать канал в системе с помощью класса ChannelServices, в котором есть соответствующий метод RegisterChannel();
- создать экземпляр (объект) типа Class1. Этот класс есть реализованный в общей сборке (см. п.2). В этом классе есть метод вычисления квадратного уравнения CalcEquation(). Для создания экземпляра используется класс Activator. В классе Activator есть статический метод GetObject(), который создает прокси между клиентом и сервером для загруженного объекта WKO. Метод GetObject() возвращает объект типа Object, через который можно будет вызвать его отдаленные методы (в нашем случае, метод CalcEquation());
- вызвать метод CalcEquation() из созданного экземпляра. Получить результат решения квадратного уравнения и вывести его на форму. Это все будет осуществляться в обработчике события клика на кнопке «Вычислить».
⇑
4.5. Написание программного кода клиентской части
4.5.1. Добавление ссылок на сборки
Для того, чтобы использовать код общей сборки, на компьютере-клиенте нужно подключить:
- программный код общей сборки ClassLibrary1.dll;
- программный код сборки System.Runtime.Remoting.dll.
Это осуществляется командой «Add Reference…» так же, как было сделано для серверной части (см. п.п. 3.2.1, 3.2.2).
После подключения, вкладка References в окне Solution Explorer будет иметь вид, как показано на рисунке 14.
Рис. 14. Вкладка References в окне Solution Explorer. Подключенные сборки ClassLibrary1 и System.Runtime.Remoting
⇑
4.5.2. Подключение пространств имен
Как и в случае с серверной частью, в файле Form1.cs нужно подключить пространства имен общей сборки и System.Runtime.Remoting с помощью директивы using.
... // подключение пространств имен using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using ClassLibrary1; // общая сборка ...
⇑
4.5.3. Написание кода метода Form1_Load()
Создание канала между сервером и клиентом в клиентской части будет выполняться только один раз. После того, как канал создан, многократно может вызываться метод CalcEquation() из серверной части.
Учитывая вышесказанное, целесообразно запрограммировать событие Load формы Form1. Это событие вызывается в начале создания формы. В нашей программе этому событию соответствует обработчик Form1_Load(). В обработчике нужно разместить программный код создания канала, регистрации канала и создания отдаленного объекта.
Ниже приведен текст обработчика события Form1_Load():
private void Form1_Load(object sender, EventArgs e) { // Выполнение действий на стороне клиента // 1. Создать канал между клиентом и сервером HttpChannel ch = new HttpChannel(); // номер порта не нужен // 2. Зарегистрировать канал ChannelServices.RegisterChannel(ch, false); // 3. Создать объект удаленного доступа к серверу remote = (Class1)Activator.GetObject( typeof(Class1), "http://localhost:5000/MathFunctions.soap"); // localhost - временное имя нашего компьютера }
⇑
4.5.4. Программирование события клика на кнопке «Вычислить». Текст клиентской части
На этом шаге нужно запрограммировать обработку события клика на кнопке «Вычислить» (button1). Подробное описание того как программируется событие описывается в теме:
- Пример программирования события в C#. Разработка программы для определения площади поверхности шара.
Текст программы-клиента с реализованным обработчиком события клика на кнопке «Вычислить» приведен ниже
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // подключение пространств имен using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using ClassLibrary1; // общая сборка namespace WindowsFormsApplication1 { public partial class Form1 : Form { Class1 remote; // переменная, которая представляет удаленный доступ public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 4. Вызвать метод CalcEquation() из серверной части для вычисления квадратного уравнения double a, b, c; double x1, x2; bool f; a = Double.Parse(textBox1.Text); b = Double.Parse(textBox2.Text); c = Double.Parse(textBox3.Text); // вызов удаленного метода f = remote.CalcEquation(a, b, c, out x1, out x2); // вывод результата if (f) label4.Text = "Результат: x1 = " + x1.ToString() + "; x2 = " + x2.ToString(); else label4.Text = "Уравнение не имеет корней."; } private void Form1_Load(object sender, EventArgs e) { // Выполнение действий на стороне клиента // 1. Создать канал между клиентом и сервером HttpChannel ch = new HttpChannel(); // номер порта не нужен // 2. Зарегистрировать канал ChannelServices.RegisterChannel(ch, false); // 3. Создать объект удаленного доступа к серверу remote = (Class1)Activator.GetObject( typeof(Class1), "http://localhost:5000/MathFunctions.soap"); // localhost - временное имя нашего компьютера } } }
В вышеприведенном коде пока что задается общее имя нашего компьютера localhost. Если будет сеть, то это имя нужно будет заменить на компьютере-клиенте на сетевое имя компьютера сервера. Клиентский проект нужно будет снова перекомпилировать.
⇑
5. Тестирование взаимодействия между клиентом и сервером на одном компьютере без использования локальной сети
Тестирование взаимодействия между клиентом и сервером проводится на одном компьютере, который в системе носит имя localhost. После проведения тестирования это имя будет изменено на имя компьютера-сервера в сети.
Для проведения тестирования нужно:
- запустить серверное приложение (рисунок 15) из папки сервера (см. п. 3);
- запустить на выполнение клиентское приложение (рисунок 16) из папки клиента (см. п. 4);
- ввести в клиентское приложение данные и провести вычисления.
Рис. 15. Выполнение серверной части
Приблизительный результат выполнения клиентского приложения приведен на рисунке 16.
Рис. 16. Клиентская программа
Важно: если закрыть программу-сервер и попробовать провести вычисления на клиенте, то возникнет исключительная ситуация. Система не сможет найти приложение-сервер. Значит, для проведения тестирования, сервер должен все время выполняться.
Клиентов можно запускать сколько угодно и производить запросы к серверу.
⇑
6. Копирование серверной части на другой компьютер
На этом шаге нужно скопировать файлы ConsoleApplication1.exe и ClassLibrary1.dll на компьютер-сервер. Это осуществляется с помощью, например, обычного файлового менеджера. Файлы копируются в заведомо подготовленную папку.
⇑
7. Определение имени сервера в сети из компьютера-клиента
Если компьютеры объединены в локальную сеть, то каждый из них имеет свое уникальное имя. Способ определения имени компьютера в сети зависит от конкретной реализации операционной системы. В общем случае, чтобы определить это имя, нужно вызвать утилиту Control Panel (Панель управления). В этой утилите можно выбрать элемент System (Система). Откроется окно, в котором можно прочитать имя компьютера.
⇑
8. Корректирование клиентского программного кода. Замена имени localhost
Если известно имя компьютера-сервера в локальной сети, тогда нужно в клиентской части сделать изменения. В исходном коде файла Form1.cs в методе Form_Load() вместо строки
"http://localhost:5000/MathFunctions.soap"
нужно ввести
"http://MyComp:5000/MathFunctions.soap"
где MyComp – имя компьютера-сервера в локальной сети. Скорей всего у вас будет другое имя.
Итак, текст обработчика события загрузки формы в нашем случае следующий:
... private void Form1_Load(object sender, EventArgs e) { // Выполнение действий на стороне клиента // 1. Создать канал между клиентом и сервером HttpChannel ch = new HttpChannel(); // номер порта не нужен // 2. Зарегистрировать канал ChannelServices.RegisterChannel(ch, false); // 3. Создать объект удаленного доступа к серверу remote = (Class1)Activator.GetObject( typeof(Class1), "http://MyComp:5000/MathFunctions.soap"); // MyComp - имя сервера в сети } ...
После этого нужно перекомпилировать клиентский проект, чтобы сформировать новый исполняемый модуль. На рисунке 17 изображен файл WindowsFormsApplication1.exe клиентского модуля. В этой папке также есть общая сборка ClassLibrary1.dll.
Рис. 17. Папка с клиентским исполняемым модулем WindowsFormsApplication1
⇑
9. Тестирование взаимодействия между клиентом и сервером на разных компьютерах, объединенных между собой в локальную сеть
На этом этапе нужно протестовать работу между клиентом и сервером на разных компьютерах, которые объединенные между собой в локальную сеть.
Для этого, нужно:
- с помощью файлового менеджера скопировать в некоторую папку на компьютер-сервер файлы ConsoleApplication1.exe и ClassLibrary1.dll;
- запустить на сервере файл ConsoleApplication1.exe. Предварительно на сервере должна быть установлена библиотека .NET Framework 4.0;
- скопировать в нужную папку файлы WindowsFormsApplication1.exe (клиентское приложение) и ClassLibrary1.dll;
- запустить на клиентской части файл WindowsFormsApplication1.exe, ввести данные, проверить результат выполнения функции из сервера.
Важно: чтобы между клиентом и сервером было взаимодействие, компьютер-клиент должен иметь соответствующие права доступа к компьютеру-серверу. Например, на сервере может быть включен общий доступ к его ресурсам. Это все осуществляется соответствующими настройками на компьютере-сервере. В данной теме это не рассматривается.
⇑
Связанные темы
- Пример создания Web-приложения в MS Visual Studio — C#
⇑
Установленные визуальные компоненты
и свойства
labelA
labelB
labelC
textBoxA
textBoxB
textBoxC
textBoxRez
buttonReh
buttonCl
Установка
свойств labelA,
labelB, labelC
(name)
ForeColor
Text
TextAlign
AutoSize
Установка
свойств
textBoxA, textBoxB, textBoxC
(name)
Установка
свойств textBoxRez
(name)
Multiline
Установка
свойств
buttonReh, buttonCl
(name)
Text
Компонент
TextBox
AceptsReturn –
нажатие
Enter создает
новую
строку
Lines
– строки
Multiline
–несколько строк
ReadOnly
– только для чтения
ScrollBars
– полоса прокрутки
TextAlign
— выравнивание
WordWrap
– перенос символов без нажатия Enter
Методы TextBox
AppendText
– добавление текста
Clear
–очистка
Copy
– копирование выбранных строк
Select
– выбор заданного текста
Show
– компонент делается видимым
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
namespace
KvadratUravnenie
{
public
partial
class
Form1
: Form
{
public
Form1()
{
InitializeComponent();
}
private
void
button1_Click(object
sender, EventArgs
e)
{
double
a, b, c, d, x1, x2;
//textBox4.Text
= «»;
a
= Convert.ToDouble(textBox1.Text);
b
= Convert.ToDouble(textBox2.Text);
c
= Convert.ToDouble(textBox3.Text);
d
= b * b — 4 * a * c;
if
(d >= 0)
{
d
= Math.Sqrt(d);
x1
= (-b + d) / (2 * a);
x2
= (-b — d) / (2 * a);
textBox4.Text
+= «Корни
уравнения:
\r\n»;
textBox4.Text
+= «x1=
»
+ x1.ToString()+»\r\n»;
textBox4.Text
+= «\nx2=
»
+ x2.ToString()+»\r\n»;
textBox4.AppendText(«Задача
решена»);
}
else
textBox4.Text
= «Нет
действительных
корней»;
}
private
void
button2_Click(object
sender, EventArgs
e)
{
textBox1.Text
= «»;
textBox2.Text
= «»;
textBox3.Text
= «»;
textBox4.Text
= «»;
}
private
void
button3_Click(object
sender, EventArgs
e)
{
Close();
}
}
}
Соседние файлы в предмете Информатика
- #
- #
- #
- #
- #
- #
Приветствую всех сегодня рассмотрим пример решения квадратного уравнения. Их часто задают в университетах, а так же в школах старших классов. Для начала посмотрим на условия задания: Написать программу вычисления корней квадратного уравнения вида ax2+bx+c = 0. Значения a, b и c вводить в режиме диалога. Предусмотреть проверку существования корней уравнения и выдать соответствующие сообщения. Для решения задачи использовать метод-процедуру. Зная задание приступим его решению.
Рассмотрим код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
//изучаем C# на nookery.ru static void Main(string[] args) { // Ввод данных уравнения — значения a, b и c // После ввода данных мы обрезаем лишние пробелы по краям методом Trim() // и преобразовываем тип string во float Console.Write(«Введите значение a = «); float a = float.Parse(Console.ReadLine().Trim()); Console.Write(«Введите значение b = «); float b = float.Parse(Console.ReadLine().Trim()); Console.Write(«Введите значение c = «); float c = float.Parse(Console.ReadLine().Trim()); // Вычисление дискриминанта float d = b * b — 4 * a * c; // При дискриминанте меньшим 0 — выводим ошибку if (d < 0) { Console.Write(«Дискриминант d < 0<!— hu —>. Решение квадратного уравнения невозможно.»); } else { // Объявляем корни уравнения float x1, x2; // При дискриминанте равным 0 оба корня равны if (d == 0) { x1 = x2 = —(b / 2 * a); } else { // Извлекаем корень из дискриминанта float sqrtD = (float)System.Math.Sqrt(d); // Высчитываем корни уравнения x1 = (—b + sqrtD) / (2 * a); x2 = (—b — sqrtD) / (2 * a); } // Выводим результат Console.Write(«d = « + d.ToString() + » x1 = « + x1.ToString() + » x2 = « + x2.ToString()); } // Ждем нажатия клавиши, чтобы завершить выполнение программы Console.ReadLine(); } |
Код приведенный выше для решения квадратного уравнения, за комментирован с достаточно полным разъяснением, при написании программы не должно возникнуть никаких проблем.