从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根(较小的先输出,即先输出p-q,后输出p+q)。根据一元二次方程的求根公式,令 p=−b2a,q=b2−4ac√2a
时间: 2023-06-05 11:47:35 浏览: 116
本题需要编写一个解一元二次方程ax^2+bx+c=0的程序,其中a、b和c分别为输入的任意值。程序需要输出方程的根,根据一元二次方程的求根公式得出,方程的两个根分别是p=(-b+sqrt(b^2-4ac))/(2a)和q=(-b-sqrt(b^2-4ac))/(2a)。其中,sqrt表示开方,根据求根公式,还需要计算Delta=b^2-4ac,p和q的值均可以使用Delta计算得出。
相关问题
用汇编语言编写,使用x64架构,使用Dosbox环境,统一用16位:从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根,能对输入参数进行判断,结果保留两位小数,数据的输入和结果的输出都要有必要的提示,且提示独占一行
很好,这个问题需要使用汇编语言编写程序,使用x64架构,并在Dosbox环境下运行。我将为你提供参考代码,你可以在此基础上进行修改和优化。
```
.model small
.stack 100h
.data
msg1 db 'Please input the value of a, b, c:', '$'
msg2 db 'The equation has no solution!', '$'
msg3 db 'The equation has one solution: x=', '$'
msg4 db 'The equation has two solutions: x1=', '$'
msg5 db ' and x2=', '$'
a dw ?
b dw ?
c dw ?
delta dw ?
x1 dd ?
x2 dd ?
.code
main proc
mov ax, @data
mov ds, ax
;显示提示信息1
lea dx, msg1
mov ah, 9
int 21h
;读取a的值
mov ah, 1
int 21h
sub al, '0'
mov a, ax
;读取b的值
mov ah, 1
int 21h
sub al, '0'
mov b, ax
;读取c的值
mov ah, 1
int 21h
sub al, '0'
mov c, ax
;计算delta
mov ax, b
imul b
mov cx, 4
mov bx, a
imul c
sub ax, bx
mov delta, ax
;判断delta的值
cmp delta, 0
jg delta_positive ;delta>0
je delta_zero ;delta=0
jmp delta_negative ;delta<0
delta_positive:
;计算x1和x2
mov ax, b
neg ax
mov bx, delta
fsqrt
mov dx, 0
mov x1, ax
mov x2, ax
mov ax, b
mov cx, 2
imul cx
idiv x1
mov x1, ax
mov ax, x1
neg ax
mov x2, ax
;显示提示信息4和5
lea dx, msg4
mov ah, 9
int 21h
mov ax, x1
call print_float
lea dx, msg5
mov ah, 9
int 21h
mov ax, x2
call print_float
jmp end_prog
delta_zero:
;计算x1
mov ax, b
neg ax
mov cx, 2
imul cx
mov dx, 0
mov x1, ax
mov ax, x1
mov dx, 0
;显示提示信息3
lea dx, msg3
mov ah, 9
int 21h
mov ax, x1
call print_float
jmp end_prog
delta_negative:
;显示提示信息2
lea dx, msg2
mov ah, 9
int 21h
jmp end_prog
end_prog:
mov ah, 4ch
int 21h
main endp
;打印浮点数
print_float proc
push ax
push bx
push cx
push dx
mov cx, 100 ;小数位数
mov bx, 10 ;除数
mov dx, 0 ;存储小数部分
div_loop:
xor dx, dx
div bx
push dx ;将余数存入栈中
dec cx
cmp ax, 0 ;商为0时退出循环
jne div_loop
mov bx, 10 ;除数
mov cx, 0 ;计数器清0
int_part: ;计算整数部分
xor dx, dx
div bx
push dx ;将余数存入栈中
inc cx ;计数器加1
cmp ax, 0 ;商为0时退出循环
jne int_part
mov ah, 2 ;打印整数部分
pop ax
add al, '0'
int 21h
dec cx ;计数器减1
mov ah, 2 ;打印小数点
mov dl, '.'
int 21h
print_loop: ;打印小数部分
pop ax
add al, '0'
mov ah, 2
int 21h
inc cx
cmp cx, 100 ;最多打印100位小数
je end_print
cmp sp, 0 ;栈空退出循环
jne print_loop
end_print:
pop dx
pop cx
pop bx
pop ax
ret
print_float endp
end main
```
这个程序首先显示提示信息,读取a、b、c的值,计算delta,然后根据delta的值计算方程的根并输出结果。如果方程无解,程序会输出提示信息“the equation has no solution”。
请注意,这个程序使用了一个打印浮点数的子程序。这个子程序通过栈来实现对小数部分的存储和打印。由于x64架构下没有直接的浮点数处理指令,我们需要手动计算并打印浮点数。
从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根。根据一元二次方程的求根公式,令 p=−b2a,q=∣∣b2−4ac∣∣√2a 当b2−4ac=0时,输出两个相等的实根x1=x2=p;当b2−4ac>0时,输出两个不相等的实根:x1=p+q,x2=p−q;当b2−4ac<0时,输出一对共轭复根:x1=p+qi,x2=p−qi。当a=0时,输出"it is not a quadratic equation!\n"。
### 回答1:
以下是Python代码实现:
a = float(input("请输入a的值:"))
b = float(input("请输入b的值:"))
c = float(input("请输入c的值:"))
if a == :
print("it is not a quadratic equation!\n")
else:
p = -b / (2 * a)
q = abs(b**2 - 4 * a * c) ** .5 / (2 * a)
if b**2 - 4 * a * c == :
x1 = x2 = p
print("方程有两个相等的实根:x1 = x2 = ", x1)
elif b**2 - 4 * a * c > :
x1 = p + q
x2 = p - q
print("方程有两个不相等的实根:x1 = ", x1, ",x2 = ", x2)
else:
x1 = complex(p, q)
x2 = complex(p, -q)
print("方程有一对共轭复根:x1 = ", x1, ",x2 = ", x2)
输出结果:
请输入a的值:1
请输入b的值:-5
请输入c的值:6
方程有两个不相等的实根:x1 = 3. ,x2 = 2.
请输入a的值:2
请输入b的值:-4
请输入c的值:2
方程有两个相等的实根:x1 = x2 = 1.
请输入a的值:3
请输入b的值:-4
请输入c的值:5
方程有一对共轭复根:x1 = (.6666666666666666+1.1055415967851332j) ,x2 = (.6666666666666666-1.1055415967851332j)
请输入a的值:
请输入b的值:3
请输入c的值:2
it is not a quadratic equation!
### 回答2:
解题思路:
据题意需要从键盘任意输入三个变量 a,b,c。因此,需要在程序第一行用 input() 函数分别输入三个变量值,这三个值都需要转换成 float 类型,因为一般情况下输入值为字符串类型,不转换变量不能进行计算。
其次,需要判断是否是一元二次方程。当 a=0 时,则该方程不是二次方程。需要输出 "it is not a quadratic equation!",并结束程序。
接下来,需要根据求根公式对 b²-4ac 的值进行判断。当 b²-4ac 等于 0 时,有两个相等的实根 x1=x2=-b/2a。当 b²-4ac 大于 0 时,方程有两个不相等的实根 x1=(-b+sqrt(b²-4ac))/2a,x2=(-b-sqrt(b²-4ac))/2a。当 b²-4ac 小于 0 时,则有一对共轭复根 x1=-b/2a+qi,x2=-b/2a-qi。
最后,需要通过 print() 函数进行输出,输出文字信息或计算结果。
完整代码如下:
a = float(input("请输入 a 值:"))
b = float(input("请输入 b 值:"))
c = float(input("请输入 c 值:"))
if a == 0:
print("it is not a quadratic equation!")
else:
p = -b/(2*a)
q = abs(b**2-4*a*c)/(2*a)**0.5
if b**2-4*a*c > 0:
x1 = p+q
x2 = p-q
print("有两个不相等的实根,分别是:x1=", x1, "x2=", x2)
elif b**2-4*a*c == 0:
x1 = x2 = p
print("有两个相等的实根,都是:x1=x2=", x1)
else:
re = -b/(2*a)
im = abs(b**2-4*a*c)**0.5/(2*a)
x1 = complex(re, im)
x2 = complex(re, -im)
print("有一对共轭复根,分别是:x1=", x1, "x2=", x2)
### 回答3:
这道题目要求我们编写一个程序,根据输入的a、b、c值,计算一元二次方程的解并输出。下面是我编写的程序:
```
#include <stdio.h>
#include <math.h>
int main()
{
float a, b, c, p, q, x1, x2;
printf("请输入a、b、c的值:\n");
scanf("%f%f%f", &a, &b, &c);
if (a == 0)
{
printf("it is not a quadratic equation!\n");
}
else
{
p = b * b / (2 * a);
q = sqrt(fabs(b * b - 4 * a * c)) / (2 * a);
if (b * b - 4 * a * c == 0)
{
x1 = x2 = -p;
printf("方程有两个相等的实根:x1 = x2 = %f\n", x1);
}
else if (b * b - 4 * a * c > 0)
{
x1 = p + q;
x2 = p - q;
printf("方程有两个不相等的实根:x1 = %f,x2 = %f\n", x1, x2);
}
else
{
x1 = p + q * I;
x2 = p - q * I;
printf("方程有一对共轭复根:x1 = %f + %fi,x2 = %f - %fi\n", creal(x1), cimag(x1), creal(x2), cimag(x2));
}
}
return 0;
}
```
这个程序首先读入a、b、c的值,然后判断a是否为0,如果是则输出一条错误提示信息;否则根据一元二次方程的求根公式计算p和q的值。接着根据判别式的大小分别输出方程的不同解。注意需要使用cmath库的复数运算函数来对复数进行标准输出。
阅读全文