E sắp phải hoàn thiện bài này nhưng bài này chuối qá ,mong các bác tận tình giúp đỡ [IMG]images/smilies/smile.png[/IMG]
Đề :
Các kiến thức cơ sở:
1. Nghiệm của phương trình một ẩn
Xét phương trình
f(x) = 0 (1)
trong đó f(x) là một hàm số cho trước của đối số x.
Giá trị x0 được gọi là nghiệm của (1) nếu:
f(x0) = 0
Nghiệm của (1) có thể là số thực hoặc số phức, nhưng ở đây ta chỉ xét các nghiệm thực.

2. Sự tồn tại nghiệm của phương trình
Nếu hàm số f(x) liên tục trên đoạn [a,b] và f(a) và f(b) trái dấu, tức là
f(a)f(b)<0 (2)
Thì phương trình (1) có ít nhất một nghiệm trong khoảng [a,b].

3. Phương pháp chia đôi tìm nghiệm xấp xỉ của phương trình
Đặt a0 = a, b0 =b và cho trước một giá trị  > 0 đủ nhỏ để làm điều kiện xấp xỉ nghiệm và dừng quá trình tính toán. Sau đó ta chia đôi đoạn [a,b], tức là đặt:
x0 = a0+b0/2
Ta thấy ngay là nếu x0 là nghiệm của (1) thì kết thúc, nếu không thì trong hai đoạn [a,x0] hoặc [x0,b] sẽ có một đoạn chứa nghiệm (tức là hàm f(x) trái dấu ở hai đầu của đoạn). Ta lại tiếp tục chia đôi đoạn chứa nghiệm, cho đến khi gặp được nghiệm chính xác hoặc độ dài đoạn thẳng nhỏ hơn  thì ta có thể coi mọi giá trị trong đoạn này là nghiệm xấp xỉ của (1).

MỨC 1.
Hãy viết hàm có dạng
float f(float)
{//Câu lệnh tính giá trị hàm
}
sau đó viết thực đơn thực hiện các công việc sau:

1. Nhập các giá trị thực a, b sao cho a<b. Kiểm tra điều kiện tồn tại nghiệm của phương trình (1) trong đoạn [a,b], nếu không chứa nghiệm thì yêu cầu nhập lại. Nếu sau 5 lần nhập không thành công thì thông báo và thoát khỏi chương trình.
2. Nhập giá trị epsilon khá nhỏ để làm điều kiện dừng quá trình tìm nghiệm.
3. Thực hiện tính toán và hiển thị kết quả.

Z. Kết thúc.

MỨC 2.
Không viết hàm f(x) trực tiếp, mà dùng con trỏ hàm. Lúc này hàm tìm nghiệm bằng phương pháp chia đôi có thể có dạng như sau:
void chiadoi(double (*f)(double),double a,double b,double epsilon, int kmax)
{
}
Lúc này có thể viết nhiều hàm mô tả các hàm thường sử dụng trong thực tế, ví dụ:
double g(double x) {return (x*x+x-2);}
sau đó ta khai báo một biến con trỏ hàm và sử dụng như các lệnh sau:
double (*f)(double);
f=g;
chiadoi(f,a,b,epsilon,kmax);

Thực hiện các công việc như mức 1, nhưng có thêm tham số số bước lặp tối đa là kmax. Nếu sau kmax bước mà vẫn chưa nhận được kết quả thì kết thúc.
Các kết quả được đưa vào tệp văn bản và viết chức năng hiển thị nội dung tệp văn bản.
-----------
Tiếp theo là bài của e :| bài này chuối qá mong các bác nhiệt tình giúp đỡ [IMG]images/smilies/online.gif[/IMG]


#include <stdio.h>
#include <stdlib.h>

float g(float x) {return (x*x+x-2);}
void chiadoi(float (*f)(float),float a,float b,float epsilon, int kmax)
{
if((kmax--)==0)
return;
float x = (a+b)/2;
if(f(x)==0){
printf("
nghiem tim dc la x = %f",x);

}
else{
chiadoi(f,a,x,epsilon,kmax);
chiadoi(f,x,b,epsilon,kmax);
}

}

int main(int argc, char *argv[])
{
// khai bao con tro va bien
float (*f)(float);
f=g;
int kmax;
float a,b,epsilon,i,xa,xb;
// Nhap gia tri tu ban phim
printf("
Nhap so lan nhap toi da: ");
scanf("%d",&kmax);

for(i = 0;i<5;i++){
printf("
Nhap a: ");
scanf("%f",&a);
printf("
Nhap b: ");
scanf("%f",&b);
xa=f(a);
xb=f(b);
printf("%f %f %f %f",xa,a,xb,b);
if((xa*xb)<0)
break;
if(i==5)
return 0;
}
printf("
Nhap epsilon: ");
scanf("%f",&epsilon);

chiadoi(f,a,b,epsilon,kmax);

system("PAUSE");
return 0;
}
//