[Xin mod hết tối] Nhờ mọi người ngó hộ bài C :D

Thảo luận trong 'Thư giãn' bắt đầu bởi BadBoy199x, 19/6/13.

  1. BadBoy199x

    BadBoy199x T.E.T.Я.I.S

    Tham gia ngày:
    12/6/12
    Bài viết:
    528
    Nơi ở:
    Hà Giang Cỉty
    Em mới học C đc mấy tuần thui ạ, nay có cái đề này :
    [spoil]
    Write a function with the header
    void foo(float x, int n, float *v)
    that calculates *v by the formula below:
    [​IMG]
    where x is a real number and n is a non-negative integer (you do not need to check data).

    Đoạn mã người ta cho sẵn:

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

    void foo(float x, int n, float *v) // You should complete the foo() function here

    int main()
    { system("cls");
    float x1, x2, v1,v2;
    x1 = 1, x2 = 2;
    int n = 100;
    printf("\n");
    foo(x1,n,&v1); foo(x2,n,&v2);
    printf(" v1 = %f \n\n", v1);
    printf(" v2 = %f \n\n", v2);
    system("pause");
    return(0);
    }
    Và output phải ra :
    v1 =2.841471
    v2 =2.909297

    [/spoil]

    Còn đây là bài em vừa làm
    [spoil]
    #include <stdio.h>
    #include <stdlib.h>
    void foo(float x, int n, float *v)
    { int i,i1, i2, mu =1, giaithua=1;
    for (i1=1;i1<=n;i1++)
    {
    for(i2=1; i2< (i1*2)+1; i2++)
    {
    mu*=x;
    giaithua*=i2;
    }
    if (i1%2==0)
    i=1;
    else i=-1;

    *v=*v+(i*(mu/giaithua));
    }
    *v=2+*v;
    }


    // You should complete the foo() function here

    int main()
    { system("cls");
    float x1, x2, v1,v2;
    x1 = 1, x2 = 2;
    int n = 100;
    printf("\n");
    foo(x1,n,&v1); foo(x2,n,&v2);
    printf(" v1 = %f \n\n", v1);
    printf(" v2 = %f \n\n", v2);
    system("pause");
    return(0);
    }
    [/spoil]

    Cơ mà em chạy toàn bị lỗi treo luôn :2cool_sad:

    Mấy bác cao thủ đi ngang qua ngó dùm em với, tại bên box lập trình vắng quá cũng ngại hỏi (Nếu có thể thì xin cho em biết em làm sai chỗ nào với nhé) :D
     
  2. BadBoy199x

    BadBoy199x T.E.T.Я.I.S

    Tham gia ngày:
    12/6/12
    Bài viết:
    528
    Nơi ở:
    Hà Giang Cỉty
    Đờ mờ, hẻo vờ lờ :2cool_beated:
     
  3. herosf2006

    herosf2006 Mega Man Lão Làng GVN

    Tham gia ngày:
    19/3/08
    Bài viết:
    3,456
    Nơi ở:
    Đà Nẵng
    người ta cho sẵn rồi, làm làm gì nữa :3cool_nosebleed:
     
  4. enix-dark

    enix-dark Sonic the Hedgehog Lão Làng GVN

    Tham gia ngày:
    18/4/07
    Bài viết:
    4,599
    trong hàm foo(....)
    *v=*v+(i*(mu/giaithua));

    thg` v này ở hàm main còn chưa khởi tạo giá trị ban đầu cho nó thì cộng làm sao đc .....

    thay vì *v = *v + 2 thì vứt quách nó đi và đầu hàm khởi tạo *v = 2.0 tốt hơn nhiều

    mà học C ở đâu vậy,hình như bên nc ngoài chứ VN mình nhớ chả có mấy trg` dạy C mới đầu mà chơi h/s poịnter theo kiểu này
     
    Chỉnh sửa cuối: 19/6/13
  5. nghia9a

    nghia9a 30 tỷ/1m2 à??? LÊN ĐỒN!! Lão Làng GVN

    Tham gia ngày:
    14/4/07
    Bài viết:
    13,731
    Nơi ở:
    Trại gà
    mịe, chả hiểu quái gì :2cool_beated:
     
  6. glouds

    glouds Mayor of SimCity Lão Làng GVN

    Tham gia ngày:
    12/12/10
    Bài viết:
    4,458
    -Chưa khai báo func
    - "mu*=1; luythua*=1" = ???. Nó có phải pointer đâu mà gán sao vào?

    Đọc sơ qua có 2 cái syntax error. Còn thuật toán thì tự xử.
    PS: Thuật toán sai tốt.
    PS2: @INTP: v* = 2+ x/1! - x^3/3! + x^5/5! .... + (-1)^n*(x^(2n+1)/(2n+1)!)
     
    Chỉnh sửa cuối: 19/6/13
  7. INTP

    INTP T.E.T.Я.I.S Lão Làng GVN

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    ta cũng tính vào coi thử nhưng mà up cái formula lên upanh đếch coi đc :-"
     
  8. BadBoy199x

    BadBoy199x T.E.T.Я.I.S

    Tham gia ngày:
    12/6/12
    Bài viết:
    528
    Nơi ở:
    Hà Giang Cỉty
    "mu*=1; luythua*=1"
    Em đâu có chỗ này đâu nhỉ ? pointer có mỗi v thui mà...

    Cơ mà "sai tốt" là thế lào ak ?
     
  9. enix-dark

    enix-dark Sonic the Hedgehog Lão Làng GVN

    Tham gia ngày:
    18/4/07
    Bài viết:
    4,599

    ????
    - thuật toán đúng là sai vì đơn giản chủ topic chưa chạy đc lên cũng ko biết kq nó như thế nao`

    -thật ra ko nhất thiết phải khai báo function trong trường hợp này vì nó đc viết trc hàm main lên vẫn nhận vô tư,chỉ khi nó viết dưới thg main thì mới khai báo

    - (*a=?) != (a*=?)

    1 cái là gán giá trị pointer đó còn một cái kia là nhân giá trị của a (numeric)
     
    Chỉnh sửa cuối: 19/6/13
  10. INTP

    INTP T.E.T.Я.I.S Lão Làng GVN

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    thuật toán ko sai đâu. Chỉ gặp vấn đề nhỏ là giai thừa quá lớn. 13! > 6 tỷ quá sức chịu đựng của int :-" Cho n bằng 5 thôi chứ 100 thì ;))

    suy nghĩ lại cách nào mà tính tổng này mà vượt qua 13! đc xem ;))

    - biến mu phải là float, ko phải là int
    - phải khởi tạo *v = 2 trong foo, hoặc v1=0, v2=0 trong main()
    - giaithua ko chứa nổi 13! Tìm cách khác mà tính từng phần tử ;))
     
  11. BadBoy199x

    BadBoy199x T.E.T.Я.I.S

    Tham gia ngày:
    12/6/12
    Bài viết:
    528
    Nơi ở:
    Hà Giang Cỉty
    em làm theo #4 với cho mu + giaithua = double luôn
    Lần này chạy được ra kết quả là

    v1 = 1.520804 (Lúc đầu cho = 2 mà kq lại ra 1 chấm ??)

    v2 = -1#IND00 (wtf ?)
    Chắc đúng là thuật toán sai rùi :4cool_confuse:

    Em học FPT ak :1cool_byebye:
     
  12. INTP

    INTP T.E.T.Я.I.S Lão Làng GVN

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    * ý tưởng cho thuật toán thì đúng, nhưng gán i2 sai giá trị :-"

    sửa i2 < (i1*2)+1
    thành i2 < i1*2

    và phải reset lại giá trị mu và giaithua trước khi tính nó
    thêm
    mu =1;
    giaithua=1;
    ngay sau for (i1=1;i1<=n;i1++)

    nhớ cho n=5 thôi, 100 thì phải tính cách khác

    à còn sai dấu nữa
    if (i1%2==0) i=-1;
    else i=1;
    mới đúng -.- Vì hạng tử đầu tiên là +x/1!, i1 lại bắt đầu từ 1 là số lẻ nên nếu i%2==0 (i chẵn) thì dấu phải là -1. Lần sau đặt tên biến có nghĩa tí, vd là "sign" hay chỉ cần if else là tính + hoặc - khỏi cần thêm biến.
     
    Chỉnh sửa cuối: 19/6/13
    BadBoy199x thích bài này.
  13. glouds

    glouds Mayor of SimCity Lão Làng GVN

    Tham gia ngày:
    12/12/10
    Bài viết:
    4,458
    Nhầm, đang nói khúc này

    mu*=x;
    giaithua*=i2;

    vẫn sai điểm đó, khai báo 2 biến mũ với giai không phải là pointer mà vẫn dùng lệnh trỏ vào.

    @INTP: cái giá trị là (-1)^n thì n chẵn dương n lẻ âm có gì sai? Với lại hạng tử đầu tiên la 0 chứ không phải 1.
    PS: Có vẻ float chịu không nổi n=100. Chuyển cả mu với giaithua về int thì ra.
     
    Chỉnh sửa cuối: 19/6/13
  14. BadBoy199x

    BadBoy199x T.E.T.Я.I.S

    Tham gia ngày:
    12/6/12
    Bài viết:
    528
    Nơi ở:
    Hà Giang Cỉty
    Cái đó theo em học là
    mu = mu*x
    giaithua = giaithua*i2
    Chứ ko phải pointer ak
     
  15. INTP

    INTP T.E.T.Я.I.S Lão Làng GVN

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    để ý mỗi hạng tử (ko xét dấu) là:

    x^(2n+1)/(2n+1)!

    có thể viết lại là

    x*x*x*x*x*...*x*x //2n+1 số x
    chia cho
    1*2*3*4*5*...*(2n)*(2n+1) //2n+1 số

    = x/1 * x/2 * x/3 * x/4 * x/5 * ... * x/(2n) * x/(2n+1)

    với cách như lày thì ko phải tính n! => ko bị tràn số :-"

    - - - Updated - - -

    ông glouds nhầm rồi *= là toán tử trong C. a *= 2 đồng nghĩa với a = a*2, chứ ko phải là * deref đâu. Cái *= này nhiều ngôn ngữ cũng có mà.
     
  16. BadBoy199x

    BadBoy199x T.E.T.Я.I.S

    Tham gia ngày:
    12/6/12
    Bài viết:
    528
    Nơi ở:
    Hà Giang Cỉty
    Em làm theo bác chuẩn trăm phần trăm :9cool_sweet_kiss: (Cơ mà vẫn để n=100 :1cool_byebye:)
    Cái lỗi ko reset từ đầu vòng lặp em mắc bao lần rùi mà ko nhớ đc :D

    Rồi, bây h là đến phần hỏi đáp:
    Em cho i chạy từ 1 đến n (for (i1=1;i1<=n;i1++)) thì nghĩa là em để i1 có ý nghĩa như n trong biểu thức. vậy nếu i chẵn thì phải là 1 chứ sao lại -1 nhỉ ?

    Và cả tử và mẫu trong biểu thức đều là (2n+1), vậy sao lại chỉ cho chạy đến 2n thui ạ ?
     
  17. glouds

    glouds Mayor of SimCity Lão Làng GVN

    Tham gia ngày:
    12/12/10
    Bài viết:
    4,458
    @INTP: Vỗ tay cái. Heheh. (30 char đủ chưa nhỉ). Cách chia phân số rất hay.
    @BB199x: Có vẻ bên kia không nhìn ra được số hạng tổng quát nên nhầm.
     
    Chỉnh sửa cuối: 19/6/13
  18. INTP

    INTP T.E.T.Я.I.S Lão Làng GVN

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    nếu n=0 thì vẫn tính 2 + x/1! à?

    vậy thì để dấu ngược lại, i1 chạy từ 0, i2<= i1*2 + 1

    ta làm theo cách của ta, uncomment mấy dòng printf để nó in ra mấy hạng tử
    Mã:
    void foo(float x, int n, float *v)
    {
        int i, j;
        *v = 2.0f;
        //printf("2 ");
        for (i=0; i<=n; ++i)
        {
            float element = 1.0f;
            for(j=1; j<=i*2+1; ++j)
                element *= x/j;
            //printf("%c %.7f ", '+' + i%2*2, element);
            *v += (i%2 ? -element : element);
        }
        //printf("\n");
    }
    http://ideone.com/ZwhyXx

    mốt post code chạy trên này cho tiện theo dõi :-"
     
    Chỉnh sửa cuối: 19/6/13
  19. bang_gia

    bang_gia Sonic the Hedgehog Lão Làng GVN

    Tham gia ngày:
    23/1/05
    Bài viết:
    4,777
    Nơi ở:
    Xứ thiên đường
    ĐỤng mớ con trỏ là chóng cả mặt mày.:2cool_beated:
     
  20. INTP

    INTP T.E.T.Я.I.S Lão Làng GVN

    Tham gia ngày:
    16/5/11
    Bài viết:
    639
    cái này cũng đâu phải con trỏ gì, chỉ là truyền tham chiếu kiểu C thôi mà. Vì C ko có tham chiếu như C++ nên phải xài con trỏ.
     

Chia sẻ trang này