C语言设计 (第四版) 谭浩强 习题2.4(8)
习题 2.4(8) 求方程式 a x 2 + b x + c = 0 ax^2 + bx + c = 0 ax2+bx+c=0的根。
一元二次方程的根有三种情况:
- 有两个不等的实根;
- 有两个相等的实根;
- 无解。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法1:使用条件语句
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
int a, b, c, delta;
double x1, x2;
scanf_s("%d %d %d", &a, &b, &c);
delta = b * b - 4 * a * c;
if(delta > 0){
x1 = (double)((-1) * b + sqrt((double)delta)) / 2 * a;
x2 = (double)((-1) * b - sqrt((double)delta)) / 2 * a;
printf("x1 = %.2f, x2 = %.2f\n", x1, x2);
}
else if(delta == 0){
x1 = x2 = (-1) * b / 2 * a;
printf("x1 = x2 = %.2f\n", x1);
}
else{
printf("The equation has no solution!\n");
}
system("pause");
return 0;
}
方法2:使用switch语句、指针、函数的模块化设计
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//输入函数
void input(int *arr, int size){
for(int i = 0; i < size; i++){
scanf_s("%d", &arr[i]);
}
}
//判别式函数
int discriminant(int *arr){
arr[3] = arr[1] * arr[1] - 4 * arr[0] * arr[2];
if(arr[3] > 0){
return 1;
}
else if(arr[3] == 0){
return 0;
}
else{
return -1;
}
}
//求解方程函数
void equationOutput(int *arr){
double x1, x2;
switch(discriminant(arr)){
case 0:
x1 = x2 = (-1) * arr[1] / 2 * arr[0];
printf("x1 = x2 = %.2f\n", x1);
break;
case 1:
x1 = (double)((-1) * arr[1] + sqrt((double)arr[3])) / 2 * arr[0];
x2 = (double)((-1) * arr[1] - sqrt((double)arr[3])) / 2 * arr[0];
printf("x1 = %.2f, x2 = %.2f\n", x1, x2);
break;
default:
printf("The equation has no solution!\n");
break;
}
}
int main(){
//分配数组,其中arr[0]代表系数a,arr[1]代表系数b,arr[2]代表系数c,arr[3]用于存储判别式结果。
int *arr = (int*)malloc(4 * sizeof(int));
input(arr, 3);
equationOutput(arr);
free(arr);
system("pause");
return 0;
}