Задача состоит в следующем: Дано уравнение: ax2 + bx + c = 0. Необходимо написать программу, которая по введённым целочисленным параметрам a,b,c решит это уравнение. На вход даются три целых числа — a,b,c, по модулю не превышающих 1000.
В выходной файл через пробел необходимо вывести количество корней этого уравнения, после этого все корни этого уравнения в порядке неубывания, если этого сделать нельзя, то вывести -1. Казалось бы, простая задача? Не тут-то было. Я перепробовала все способы, но чтобы ее приняли, необходимо рассмотреть все варианты решения. Вот мой код:
#include #include using namespace std; int main() < int a, b, c; cin >> a >> b >> c; int d; d = (b * b) — (4 * a * c); if (a == 0) < if (b != 0) < cout if (b == 0) < cout > if ((a != 0) and (b == 0) and (c == 0)) < cout else < if (d >= 0) < int x1, x2; x1 = (-b + sqrt(d)) / (2 * a); x2 = (-b — sqrt(d)) / (2 * a); if (x1 == x2) < cout if (x1 > x2) < cout if (x2 > x1) < cout > > >
Отслеживать
6.3 Квадратное уравнение. «Поколение Python»: курс для начинающих. Курс Stepik
46.4k 16 16 золотых знаков 56 56 серебряных знаков 97 97 бронзовых знаков
Источник: ru.stackoverflow.com
Написать программу решения квадратного уравнения
Уравнение вида a⋅x 2 + b⋅x + c = 0 — квадратное уравнение.
a, b, c — действительные числа, a ≠ 0.
Для того чтобы вычислить корни квадратного уравнения, нужно сначала найти дискриминант.
- если D 0, то уравнение имеет два действительных корня:
- x1 = (-b + √D) / (2⋅a);
- x2 = (-b + √D) / (2⋅a).
Программа для решения квадратного уравнения на языке программирования Паскаль
Функция sqr языка Pascal используется для возведения числа в квадрат.
Функция sqrt используется для получения квадратного корня числа.
В программе используется форматированный вывод вещественных чисел. variable:8:3 — означает, что для вывода переменной предусмотрено 8 символов, 5 из них под целую часть и 3 под дробную.
Программа для решения квадратных уравнений на C++
Довольно часто в пособиях по программированию встречаются задания по нахождению решений каких-нибудь математических уравнений. Задача нахождения корней квадратного уравнения — это довольно тривиальная задача, как и многие другие задачи. Решается она очень просто при помощи листа бумаги и ручки, но решение можно автоматизировать посредством написания прикладной программы и её использования. В этой статье мы напишем такую программу.
Pascal.Программа квадратное уравнение.
Алгоритм решения квадратного уравнения
Многие знают, что уравнение вида ax 2 + bx + c = 0 , где a не равно 0, называют квадратным уравнением.
Существуют различные способы решения квадратных уравнений, но мы рассмотрим решение через дискриминант.
Обозначается дискриминант буквой D . Из школьного курса знаем, что D = b 2 — 4ac .
Существует несколько условий:
- Если D > 0, то решение имеет 2 различных вещественных корня.
- Если D = 0, то оба вещественных корня равны.
- Если D для вводавывода в консоли, #include для работы с математическими функциями и область using namespace std;
Для вас это может быть интересно:
Программа для решения квадратных уравнений на C++ : 24 комментария
- Nicknixer Автор записи 15.10.2016
Не так сложно, как Вам кажется! Немного литературы, немного практики и смотреть на код решения такой задачи Вы будете по-другому.
Доброго времени суток! Помогите пожалуйста написать программу, которая считает сколько символов в ряде двумерного массива. То есть , например массив 5 на 5, сколько символов в 1 ряде, сколько во 2 и т.д.
Ответил вам по электронной почте
Критику принимаете?
Программа дырявая как сито.
Если число очень маленькое, но положительное, например 10^(-20) — у вас будет переполнение или типо того. Оператор > проверяет знак числа (это отдельный бит), а оператор == для дробных чисел не имеет смысла, т.к. в младших разрядах числа обычно находится какой-нибудь мусор, который при таком сравнении дает false.
x = ( -1*b + sqrt(b*b — 4*a*c) ) / (2 * a);
x = ( -1*b — sqrt(b*b — 4*a*c) ) / (2 * a);
Тут есть три вопроса:
1) зачем два раза вычислять одно и тоже (я про корень)
2) что делать если мне корни надо как-то использовать, а не просто вывести (тут есть проблема, ведь у меня то один корень — то два). Чтобы лучше понять в чем проблема — попробуйте вынести вычисление корней в отдельную функцию. У вас то вообще, если корень один — то их выведется все равно два, одинаковых.
3) в переменной «a» может быть ноль (или близкое к нулю число) — при этом мы получим деление на ноль (а точнее, переполнение).
Но это ведь еще не все. Что будет если и «a» и «b» равны нулю? — тебе надо рассмотреть два варианта — если c = 0 (условно, близко к нулю), то корней бесконечно много. А если c != 0, то корней нет.
Вообще, эта задача — прекрасный пример для юнит-тестирования и демонстрации принципов разработки через тестирование. Именно его я рассматривал в своей статье по теме тестирования: Юнит-тестирование. Пример. Boost Unit Test.
Дело в том, что тут куча вариантов сделать ошибку, при этом их понимание приходит не сразу, т.е. школьник решая задачу напишет по формуле которой учили (ну и вот как у вас). А потом надо разбираться и смотреть как программа может сломаться, при этом разрабатывать тесты.
- Николай Сергейчук Автор записи 09.02.2017
Принимаем
Согласен с вами во всём! Программу можно реализовать намного лучше, используя различные проверки и валидацию входных данных.
Однако, статья рассчитана на аудиторию, которая только начинает познавать программирование или делает лабораторную. Чтобы людям легче было понять, реализация данной программы упрощена до невозможности. И, возможно, несправедливо было с моей стороны не предупредить их о возможных ошибках в работе программы, которые могут вскрыться позже, если подать на вход определенные значения.
Кстати, у вас интересная статья по тестированию!
Николай, доброго времени суток! Можете помочь с написанием програмки в с++? 1-1/2!+1/3!-1/4!+1/5! и так до 1/100! ? Чтобы при заднии в строке номера члена последовательности выдавал сумму до него по такой вот формуле? Буду очень благодарен!
Пожалуйста подскажите как ввести экран правильный ответ дискриминанта
Помогите решить в Dev C++
Sqrt x^2+1+sqrt|x|,x0
Здравствуйте, можете помочь с решением биквадратного и триквадратного уравнения?
#include
using namespace std;
int main()
b;
cout <> c;
D = pow(b, 2) — 4 * a * c;
cout
ну и? если даже тупо скопировать код и вставить его в cpp.sh , ничего не работает. поебота какая то этот с++
Уважаемая, Лена! Я, надеюсь, вы знаете, что код программы, написанной на языке программирования C++ нельзя тупо вставить в блокнот и сохранить под названием «cpp.sh»? Если не знали, то я, видимо, открыл для вас Америку!
помогите решить. заданы 3 перемены a.b.c записать вы радение на С
b,
b и а не равно != с
iconcerts где забыл
#include
Я ради интереса написал программу нахождения корней квадратного уравнения на С++, с выводом корней как в десятичном виде, так и в виде простой дроби (причём уже сокращённой), потому что выводя корни в десятичном виде программа их одновременно сокращает и округляет и 1/3 превращается в 0.333333 хотя на самом деле 0.333333 (3), то есть для проверки правильно ли нашёл корни ваш ребёнок, вы с получите что-то типа: X1= 0.285714; X2=0.214286, а на самом деле это будет X1=2/7; X2=3/14, кроме того, если корень из дискриминанта не получается целым числом, вы уже получите двойную неточность: сначала при извлечении корня программа отсечёт значение до 4-6 цифр после запятой с округлением, а затем сделает то же самое при делении числителя на знаменатель. Я и здесь сделал вывод корней в двух значениях: в десятичном и в виде выражения X1= (-b + sqrt(D))/(2*a); X2= (-b — sqrt(D))/(2*a), то есть выводится примерно вот так X1=-5+sqrt(21)/2; X2=-5-sqrt(21)/2 с одновременным разложением дискриминанта под корнем на множители, вынесением этих множителей из-под корня, если они выносятся нацело, их перемножением и дальнейшим сокращением. Вот, например, имеем a=3, b=15, c=3, при решении получаем D=189 программа выдаёт десятичные корни X1= -0.208712 и X2= -4.79129, а в виде выражения имеем: X1= -5+sqrt(21)/2, то есть первоначально получаем: X1= -15+sqrt(189)/6, -> 189=21*9 -> -15+3sqrt(21)/6 далее идёт сокращение на 3 и итог -5+sqrt(21)/2
День добрый.
Недавно начал изучать C++. Решил попробовать написать решение квадратного уравнения именно через оператор вида «условие ? выполняется : не выполняется». Т.е. если условие выполняется, то имеем два решения (даже если d = 0, то тоже должно быть два решения x1 = x2), если d a;
std::cout <> b;
std::cout <> c;
d = pow(b, 2) — 4 * a*c;
d >= 0 ? xfst = ((-b + sqrt(d)) / double(2 * a)) , xscd = ((-b — sqrt(d)) / double(2 * a)) : std::cout
- Николай Сергейчук Автор записи 12.02.2020
if (d >= 0) = 0 ) = 0) = 0, y2 >= 0) 0 then begin
x1 := (-b + sqrt(d)) / (2*a);
x2 := (-b — sqrt(d)) / (2*a);
writeln(‘x1=’,x1:3:2,’; x2=’,x2:3:2);
end
else
if d = 0 then begin
x1 := (-b) / (2*a);
writeln(‘x=’,x1:5:2);
end
else
writeln(‘Корней нет’);
end.
main() 0)
else
if (d = 0)
else printf(«Корней нет.»);
printf(«n»);
>
Ключ -lm при компиляции gcc.
python квадратное уравнение
print(«Введите коэффициенты для квадратного уравнения (ax^2 + bx + c = 0):»)
a = float(input(«a b c Дискриминант D = %.2f» % discr)
if discr > 0:
import math
x1 = (-b + math.sqrt(discr)) / (2 * a)
x2 = (-b — math.sqrt(discr)) / (2 * a)
print(«x1 = %.2f nx2 = %.2f» % (x1, x2))
elif discr == 0:
x = -b / (2 * a)
print(«x = %.2f» % x)
else:
print(«Корней нет»)
input «a b c x1 = » + x1 + «, x2 x Корней нет»
endif
endif
Команда decimal указывает сколько знаков после запятой следует выводить.
Источник: al-shell.ru
ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу решения квадратного уравнения с проверкой на наличие вещественных (не комплексных) корней на основе только операторов if
Возможный результат выполнения программы показан на рис. 4.1.
Рис. 4.1. Результат решения квадратного уравнения
В программе последовательно проверяются условия с помощью операторов if. В последнем случае, когда коэффициент а = 0, квадратное уравнение вырождается и превращается в линейное. Решение в этом случае очевидно.
В программу подключена библиотека math.h для действий с математическими функциями, например sqrt().
В первом операторе if применено логическое условие И (amp;) для проверки того, что дискриминант не равен отрицательному значению и одновременно, чтобы первый коэффициент квадратного уравнения не был равен нулю. Аналогичное условие прописано и для последнего оператора if.
1. Объясните включение float перед функцией sqrt().
2. В программу введите изменения для вычисления комплексных корней квадратного уравнения без подключения дополнительных библиотек.
3. В программе предусмотрите ситуацию, когда все коэффициенты квадратного уравнения равны нулю.
4. В программе предусмотрите подстановки найденных корней в заданное квадратное уравнение с выводом возможной невязки. Предусмотрите также меры по уменьшению невязки.
5. Предусмотрите циклический ввод коэффициентов квадратного уравнения и вывода решения троекратно.
6. Предусмотрите проверку всех возможных условий задания коэффициентов квадратного уравнения.
Пример 2. Написать программу решения квадратного уравнения с проверкой на наличие вещественных корней на основе конструкции if – else. Вид квадратного уравнения:
Программный код решения примера
#include #include #include int main(void) < float a, b, c; float D, x1, x2, x; printf(«nt Equation a*x^2 + b*x + c = 0n»); printf(«nt Enter the coefficient a: «); scanf_s(«%f», printf(«t Enter the coefficient b: «); scanf_s(«%f», printf(«t Enter the coefficient c: «); scanf_s(«%f», D = b*b — 4*a*c; if (D >= 0 a!= 0 b!= 0) < x1 = -b/(2*a) + (float)sqrt(D)/(2*a); x2 = -b/(2*a) — (float)sqrt(D)/(2*a); printf(«nt The roots of the equation:nt x1 = %1.4f, x2 = %1.4fn», x1, x2); >else < if (a == 0 b!= 0) < x = -c/b; if (c!= 0) printf(«nt As a = %1.0f,nt the solution of the equation is: %1.4fn», a, x); else printf(«nt As a = %1.0f and c = %1.0f,nt the solution of the equation is: %1.0fn», a, -x); >if (D < 0) printf(«nt The roots of complexn»); >printf(«n Press any key: «); getch(); return 0; > |
В программе использованы вложенные операторы if.
Результат выполнения программы при исключительной ситуации представлен на рис. 4.2.
Рис. 4.2. Выполнение программы с двумя нулевыми коэффициентами
1. Добавьте в программу преобразование типов при использовании функции sqrt().
2. В программе предусмотрите вычисление комплексных и мнимых корней квадратного уравнения.
3. Предусмотрите ввод целочисленных коэффициентов квадратного уравнения, используя тип int. В отчет вставьте возможный результат выполнения программы.
4. Напишите программу ввода вещественных чисел и вывода абсолютного значения этого числа на основе конструкции if – else.
Пример 3. Написать программу классификации введенного с терминала символа на основе конструкции if – else if – else [1].
Символами будем считать строчные и прописные буквы латинского алфавита, цифры от 0 до 9, и специальные символы.
Программный код решения примера
Результат выполнения программы показан на рис. 4.3.
Рис. 4.3. Результат классификации символа
1. Сформируйте одно условие ввода букв как прописных, так и строчных с последующим выводом: This is an alphabetic character.
2. Напишите программу циклического ввода символов и вывода результата их классификации до момента нажатия цифры 10Х, где Х – номер компьютера (1, 2, ¼), на котором выполняется лабораторная работа.
3. Напишите программу решения квадратного уравнения с применением конструкций if – else if – else.
Пример 4. Написать программу расчета простого арифметического выражения на основе оператора switch.
Программный код решения примера
#include #include int main (void) < float value1, value2; char operat; printf(«nt Printed on the keyboard expression: «); scanf_s(«%f%c%f», operat, sizeof(char), switch (operat) < case ‘+’: printf(«nt Result: %1.4fn», value1 + value2); break; case ‘-‘: printf(«nt Result: %1.4fn», value1 — value2); break; case ‘*’: printf(«nt Result: %1.4fn», value1 * value2); break; case ‘/’: if (value2 == 0.0) printf(«nt Division by zero.n»); else printf(«nt Result: %1.4fn», value1 / value2); break; default: printf(«nt Unknown arithmetic operatornt error or enter a number. Break!n»); break; >// End switch printf(«n Press any key: «); getch(); return 0; > |
В программе использована полная форма оператора switch. Оператор break инициирует немедленный выход из него. Возможно использование вложенных операторов switch.
Вероятный результат выполнения программы представлен на рис. 4.4.
Рис. 4.4. Расчет простого арифметического выражения
1. Проверьте деление числа на нуль и ввод недопустимого символа.
2. Примените условие равенства нулю вводимого числа без знака «==».
3. Напишите программу расчета простого выражения с помощью конструкций if – else if – else.
4. Напишите программу деления суток на «morning» (утро), «day» (день),
«afternoon» (послеобеденное время), «evening» (вечер), «night» (ночь). Время ввода задается пользователем с клавиатуры.
Пример 5. Написать программу вычисления двух целых случайных чисел и определения наибольшего из них. Определение наибольшего числа произвести с помощью оператора условия?.
Программный код решения примера
#include #include #include #include int main (void) < int a, b, maxab; unsigned int some; long int L; L = (long) time(NULL); some = (unsigned) L/2;// для рандомизации случайных чисел srand(some); a = rand(); b = rand(); printf(«nt Random numbers: a = %d; b = %dn», a, b); // Оператор условия для определения максимального числа maxab = (a >b)? a: b; printf(«nt Maximum number: %dn», maxab); printf(«n Press any key: «); getch(); return 0; > |
В программе использованы функции генерации псевдослучайных чисел rand() и задания исходного псевдослучайного числа srand(). Указанные функции входят в стандартную библиотечную функцию stdlib.h. Функция time() применяется в библиотечной функции time.h, которая поддерживает функции, обращающиеся к системному времени.
Для переменных L и some выполнено приведение типов.
При каждом обращении к функции rand() возвращается целое в интервале между нулем и значением RAND_MAX, которое в любой реализации должно быть не меньше числа 32 767 [2].
Возможный результат выполнения программы показан на рис. 4.5.
Рис. 4.5. Результат определения максимального числа
1. При выводе максимального числа предусмотрите сообщение об имени числа, т. е. a или b.
2. В цикле сформируйте вектор десяти случайных чисел из интервала [0, 1] и выведите на дисплей.
3. Для задания системного времени примените директиву define N X, где Х – номер компьютера, на котором выполняется лабораторная работа.
4. Примените оператор условия? для определения абсолютного значения вещественного числа, которое должно вводиться пользователем с клавиатуры.
Пример 6. Используя оператор условия? и переключатель switch, написать программу определения времени года по вводимым числам от 1 до 12, считая, что цифра 1 соответствует январю, цифра 2 – февралю и т. д.
Программный код решения примера
#include #include int main (void) < int x; printf(«nt Enter a whole number between 1 and 12: «); scanf_s(«%d», switch (x >0 x < 3? 1: x == 12? 1: x >2 x < 6? 2: x >5 x < 9? 3: x >8 x < 12? 4: x >12 || x < 1? 5: 5) < case 1: printf(«nt This Wintern»); break; case 2: printf(«nt This Springn»); break; case 3: printf(«nt This Summern»); break; case 4: printf(«nt This Autumnn»); break; case 5: printf(«nt This is a mistake (Error)n»); break; >printf(«n Press any key: «); getch(); return 0; > |
В программе три месяца зимы кодируются цифрой 1, три месяца весны –2, три месяца лета –3, три месяца осени – цифрой 4. Если введенная цифра не входит в целочисленный интервал [1; 12], то эта ситуация кодируется цифрой 5.
Возможный результат выполнения программы представлен на рис. 4.6.
Рис. 4.6. Результат программы по определению времени года
1. Проверьте программу по вводимым вещественным числам. Объясните результат.
2. Проверьте программу по вводимым буквам или знакам, имеющимся на клавиатуре. Объясните результат.
3. В программе вместо 5-го пункта, т. е. вместо case 5, примените операцию default.
4. Напишите программу определения времени года по вводимым числам без операторов условия?.
Пример 7. Написать программу распечатки четных целых чисел от 0 до 30.
Программный код решения примера
#include #include int main (void) < int x; printf(«nt Even numbers from 0 to 30:nn»); for (x = 0; x < 31; x++) < if (x % 2) continue; printf(«tt %3dn», x); >printf(«n Press any key: «); getch(); return 0; > |
В программе в качестве проверки условия использовано деление по модулю (х % 2). Если остаток от деления числа х не равен нулю, то опрератор (утверждение, инструкция) continue передает управление непосредственно инструкции, проверяющей условное выражение, после чего циклический процесс продолжается. С помощью программы выводятся только четные числа, а при обнаружении нечетного числа происходит преждевременный переход к следующей итерации цикла, и функция printf() опускается.
Результат выполнения программы показан на рис. 4.7.
Рис. 4.7. Результат вывода четных чисел
1. В программу включите действие подсчета суммы четных чисел.
2. Подсчитайте число итераций оператора цикла.
3. В программе вместо цикла for примените цикл if. Объясните действие инструкции continue.
4. В программе вместо цикла for примените цикл do – if. Объясните действие инструкции continue.
5. Напишите программу вывода четных чисел без оператора continue. Подсчитайте число итераций оператора цикла.
6. Сделайте вывод четных чисел из интервала от Х до 10Х, где Х – номер компьютера, на котором выполняется лабораторная работа. Подсчитайте сумму четных чисел.
Пример 8. Написать программу подсчета суммы трех чисел из трех вложенных циклов и, если сумма делится без остатка на число 3, прекратите сравнение чисел и выйдите из циклов с последующей распечаткой этой суммы и слагаемых. Первый цикл – с 51 до 1, второй – с 41 до 1, третий – с 1 до 50. Первый цикл изменяется на 7 единиц, второй – на 1, третий – на 7 единиц.
Программный код решения примера с оператором goto
#include #include int main (void) < int a, b, c, i, j, k; a = b = c = 0; for (i = 51; i >= 1; i -= 7) for (j = 41; j >= 1; —j) for (k = 1; k sum3: printf(«nt The sum (%d + %d + %d) is equal %dn», a, b, c, a + b + c); printf(«n Press any key: «); getch(); return 0; > |
В программе использовано декрементирование (уменьшение на единицу) переменной j в форме —j. Переменная i с каждой итерацией цикла уменьшается на 7 единиц. Переменная k с каждой итерацией цикла увеличивается на 7 единиц. После оператора if включены фигурные скобки для выполнения нескольких действий при выполнении заданного условия оператора if.
Результат выполнения программы представлен на рис. 4.8.
Рис. 4.8. Итеративный подсчет числовой суммы, делящейся на 3
Примечание. Оператор goto нельзя применять для перехода в тело цикла, т. е. метка не должна быть внутри оператора цикла. Она может появиться текстуально до или после оператора goto.
1. В программу включите подсчет числа итераций каждого из циклов.
2. Вместо оператора безусловного перехода goto примените оператор break. Произведите также подсчет числа итераций каждого из циклов. Сравните с аналогичными результатами предыдущего пункта задания.
3. В программе вместо операторов for примените операторы if. Выполните действия двух предыдущих пунктов задания.
4. Напишите программу ввода символа до тех пор, пока не будет введен заранее определенный символ, например ‘ w ‘. Используйте оператор goto. Предусмотрите отступ от левого края дисплея.
Пример 9. Написать программу распечатки на консоль простых чисел из диапазона от 2 до N, где N – число, вводимое пользователем с клавиатуры, которое не превосходит, например, 1 000.
Как известно, простое число – это целое положительное число больше единицы, которое не делится без остатка ни на одно другое целое положительное число, кроме единицы и самого себя. Единица не считается простым числом.
Возможный программный код решения примера
#include #include #include // для exit() #define Nmax 50 int main (void) < int i, j; int ok, in; int N; printf(«n Enter an integer from 2 to %d: «, Nmax); in = scanf_s(«%d», if (in == 0 || N < 2 || N >Nmax) < printf(«n Error input. Press any key: «); getch(); exit(1); >printf(«n Prime numbers from 2 to %d:nn», N); for (i = 2; i printf(«nn Press any key: «); getch(); return 0; > |
В программе с помощью оператора if осуществляется проверка правильности ввода данных с клавиатуры. Кроме того, этим же оператором проверяется остаток от деления двух чисел и условной истинности, когда переменная ok не равна нулю. С помощью препроцессорной директивы define определяется верхняя допустимая граница для простых чисел.
Пример выполнения программы показан на рис. 4.9.
Рис. 4.9. Пример вывода на консоль простых чисел
1. В программе вместо оператора цикла for примените оператор if.
2. В программе примите допустимое число Nmax, равное 9 999. Предусмотрите при этом форматированный вывод на консоль простых чисел построчно, по 15 чисел в каждой строке. Используйте тернарный оператор.
3. Предыдущий пункт задания выполните с помощью операторов if, else.
Контрольные вопросы
1. Как организуются множественные действия в операторе условия if?
2. Какой формат записи имеет тернарный оператор условия?
3. Какой оператор условия рекомендуется использовать для программирования меню?
4. В чем различие и сходство между операторами break и continue?
5. Как можно обеспечить выход из вложенных циклов?
6. Как можно организовать переходы в различные точки программы на С?
7. Какие логические операторы отношения используются в языке С?
8. Что произойдет, если в операторе switch после метки case не использовать оператор break?
9. Что произойдет, если в операторе switch не поставить метку default и условие переключения не совпадет ни с одной меткой case?
Источник: studopedia.info