В прошлом уроке нами была написана программа, которая переводит градусы в радианы. Количество элементов, используемых в ней было заметно не велико. В этом же уроке создадим более универсальное приложение.
Постановка задачи:
Написать программу решения квадратного или биквадратного уравнения.
Решение задачи:
Аналогично прошлому уроку расположим на диалоговом окне следующие элементы, а также сразу изменим у них названия (см. рис. ниже):
- три метки (Static Text) для вывода заголовков полей;
- три поля редактирования (Edit Control);
- один элемент Group Box;
- две радиокнопки (Radio Button) для выбора типа уравнения;
- флажок (Check Box), определяющий как будет происходить вывод;
- метку для вывода результатов;
- кнопки для решения уравнения и выхода из программы;
Определим переменные для полей редактирования, радиокнопок и флажка. Щелкаем правой кнопкой мыши по первому полю ввода, выбираем «Добавить переменную…». Заполняем окно так, как это сделано на скриншоте.
Аналогично добавляем переменные для двух оставшихся полей (m_EditB, m_EditC).
Следующий шаг — определение переменных для радиокнопок. Заходим в свойства элемента Group Box и устанавливаем значение «Группа»->True. То же самое делаем и для обоих радиокнопок, после чего определяем имя и тип переменных для них (рис. ниже).
Установка свойства Group в True была необходима для того, чтобы можно было создать переменные как экземпляры класса RadioButton. Но если мы сейчас запустим программу, то переключения между кнопками не будет. Поэтому установим у второй радиокнопки свойство Group в True.
[important]При работе с группой радиокнопок нужно установить у них свойство Group в True, после чего назначить переменные для всех кнопок, а затем установить у всех кроме первой значение False[/important]Определим переменную, которая будет отвечать за значок, ее тип BOOL.
Изменим значение ID четвертой метки (расположена над кнопкой «Решить») на IDC_STATIC1. Определим переменную, отвечающую за работу с этой меткой (рис. ниже).
Переопределяем ID кнопки «Решить», впишем например ID_Solve.
Щелкаем два раза левой кнопкой мыши по кнопке «Решить», и попадаем в окно с кодом. Тут подключаем библиотеку math.h, после чего вводим в функцию OnBnClickedSolve() следующий текст.
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
void CKvodoDlg::OnBnClickedSolve()
{ char S[80]; FILE *f; double a, b, c, d, x1, x2, y1, y2, y3, y4; UpdateData(TRUE); //считываем значения a,b,c из полей редактирования a=m_EditA; b=m_EditB; c=m_EditC; //вычисляем дискриминант d=b*b—4*a*c; //Функция (метод) GetCheck() проверяет, выбрана ли радиокнопка, //в данном случае выбрана m_Kvadrat if (m_Kvadrat.GetCheck()) if (d<0) sprintf(S, «Корней нет»); else { x1=(—b+sqrt(d))/2/a; x2=(—b—sqrt(d))/(2*a); sprintf(S, «x1=%g\tx2=%g», x1, x2); } else { if (d<0) sprintf(S, «Корней нет»); else { x1=(—b+sqrt(d))/2/a; x2=(—b—sqrt(d))/(2*a); if ((x1<0) && (x2<0)) sprintf(S, «Корней нет»); else if ((x1>=0) && (x2>=0)) { y1=sqrt(x1); y2=—y1; y3=sqrt(x2); y4=—y3; sprintf(S, «четыре корня: y1=%f\ty2=%f\ty3=%f\ty4=%f»,y1,y2,y3,y4); } else if (x1>=0) { y1=sqrt(x1); y2=—y1; sprintf(S, «два корня: y1=%f\ty2=%f», y1,y2); } else { y1=sqrt(x2); y2=—y1; sprintf(S, «два корня: y1=%f\ty2=%f», y1,y2); } } } //в зависимости от флажка message if (m_message) { f=fopen(«Result.txt», «w»); fprintf(f, S); fclose(f); } else { m_Result=S; UpdateData(FALSE); }} |
Ну вот, у нас готова рабочая программа! И хотелось бы заметить, что последняя метка, через которую выводиться результат должна быть достаточного размера для того, чтобы показать всю строку ответа.
Часто бывает, что необходимо добавить начальные значения в поля ввода, для этого в том файле, в который мы только что вписали код, есть функция OnInitDialog(). Добавьте этот код перед значением return TRUE:
1
2 3 4 |
m_EditA=2;
m_EditB=3; m_EditC=—1; UpdateData(FALSE); |
Файлы исходного кода созданной нами программы доступны для скачивания по этой ссылке.