Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 6 của 6
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Chương trình tính sin x của mình này sai ở đâu các bạn nhỉ ?

    Như tít ạ, đây là 2 code của mình viết để tính sin x, nhưng kết quả đều ra sai. Mình trình non chưa hiểu tại sao, bạn nào biết chỉ ra hộ mình lỗi sai để sửa với ạ, cảm ơn nhiều [IMG]images/smilies/kiss.gif[/IMG]

    Đây là bài sử dụng hàm ạ


    Mã:
    #include <stdio.h>#include <conio.h>#include <math.h>float giaithua(float k);float somu(float x, float y); main(){    clrscr();    float x,s=0,i,t,n=0;    printf("Nhap so x:"); scanf("%f",&x);    t=0;    while (t<=0.0001)    {        i=2*n+1;        s=s+pow(-1,n)*(somu(x,i)/giaithua(i));        t=(x*n)/giaithua(n);        n=n+1;    }    printf("sin (%.0f) = %.2f 
    ",x,s);    getch();} float giaithua(float k){    float i,s=1;    for (i=1; i<=k; i++) s=s*i;    return s;} float somu(float x, float y){    float i,s=1;    for (i=1; i<=y; i++) s=s*x;    return s;}
    còn đây là bài viết bình thường:

    Mã:
    #include <stdio.h>#include <conio.h>#include <math.h>main(){    int n=1,x,i;    unsigned long giaithua,somu;    float t=0,sinx;    clrscr();    printf("Nhap x:"); scanf("%d",&x);    do        {            giaithua=1; somu=x;            for (i=1; i<=(2*n+1); i++)                {                    giaithua=giaithua*i;                    somu=somu*x;                }            sinx=sinx+pow(-1,n)*(somu/giaithua);            n=n+1;            giaithua=1;            for (i=1;i<=n;i++) giaithua=giaithua*i;            t=(x*n)/giaithua;        }    while (t>0.0001);    printf("sin (%d) = %f",x,sinx);    getch();}

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bài trên nhầm dấu chỗ while rồi.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    Bài trên nhầm dấu chỗ while rồi.
    Bạn có thể chỉ rõ cho mình là nhầm ở chỗ nào và giải thích không ạ ?, mình nhìn lại vẫn chưa ra vấn đề.
    Cảm ơn bạn !

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    bạn có thế tham khảo code này để tự tìm ra lỗi của mình nhé.

    Mã:
    #include <stdio.h>#include <stdlib.h>int main(){    double sinx, temp, x;   // x tinh theo radian    int i = 0;    scanf("%lf", &x);    sinx = temp = x;    while (temp > 0.000001 || temp < -0.000001)   // lam tron den 5 so thap phan    {        i++;        temp = temp*x/(2*i+1)*x/(2*i);  // x^(2i+1)/(2i+1)!        if (i%2==0) sinx = sinx + temp;        else sinx = sinx - temp;    }         printf("%.5f",sinx);    return 0;}

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi HieuApp
    bạn có thế tham khảo code này để tự tìm ra lỗi của mình nhé.

    Mã:
    #include <stdio.h>#include <stdlib.h>int main(){    double sinx, temp, x;   // x tinh theo radian    int i = 0;    scanf("%lf", &x);    sinx = temp = x;    while (temp > 0.000001 || temp < -0.000001)   // lam tron den 5 so thap phan    {        i++;        temp = temp*x/(2*i+1)*x/(2*i);  // x^(2i+1)/(2i+1)!        if (i%2==0) sinx = sinx + temp;        else sinx = sinx - temp;    }         printf("%.5f",sinx);    return 0;}
    Đoạn
    temp = temp*x/(2*i+1)*x/(2*i); // x^(2i+1)/(2i+1)!
    là làm sao nó tính được ra x^(2i+1)/(2i+1)! thế bạn nhỉ ?
    bạn có thể nói là mình sai ở phần nào ko, vì mình vẫn chưa nhìn ra thấy sai ở đâu cả (

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    sai ở cái điều kiện vòng while, phải là while (t >= 0.0001)

    tại sao trong code kia t phải <= 0.0001?



    đừng đặt tên biến 1 chữ, ko hiểu t là cái gì ở đây?

    Ta hiểu t là giá trị chênh lệch giữa biến cũ và biến mới, khi bé hơn 0.0001 thì dừng vòng lặp. Vậy điều kiện để chạy vòng lặp là (trị tuyệt đối của t) > 0.0001. Nhưng tại sao t=(x*n)/giaithua(n); ??


    nếu thích hiểu theo kiểu delta < 0.0001 thì dừng thì xài while(1), và t phải tính là somu(x,i)/giaithua(i)


    Mã:
    int n = 0;  //sửa lại type của n là intint i = 1;  //sửa lại type của n là intfloat delta;float s = 0; while (1){    delta = pow(x, i) / giaithua(i); //khỏi cần hàm somu nếu đã xài pow()    s += pow(-1, n) * delta;  // s += ... có nghĩa là s = s + ...    if (delta <= 0.0001) break;     ++n;  //xài toán tử ++ để tránh phải tính n+1    i += 2;  //tránh phải xài phép nhân}

    cách tối ưu hơn là ko cần tính giaithua(), ko cần pow(x,i)


    Mã:
    float xx = x*x;float delta = x;float s = x;int i = 1;int sign = 1; while (1){    i += 2;    sign *= -1;    delta *= xx / (i * (i-1));    s += sign * delta;    if (delta <= 0.0001) break; }

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •