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: 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 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é)
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ư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)!)
"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 ?
???? - 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)
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ử
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 Em học FPT ak
* ý 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.
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.
để ý 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à.
Em làm theo bác chuẩn trăm phần trăm (Cơ mà vẫn để n=100 ) Cái lỗi ko reset từ đầu vòng lặp em mắc bao lần rùi mà ko nhớ đc 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 ạ ?
@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.
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
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ỏ.