sai lỗi cơ bản vậyCode:scanf("%d", codinh);
Tình hình là em đang viết 1 chuơng trình nhập vào 1 số trong khoảng từ 1 - 1000, máy tính sẽ đưa ra các phương án dự đoán số nhập vào để người dùng kiểm tra, nếu lớn hơn thì trả lời là lớn hơn và ngược lại. Nếu cao hơn thì nhập vào "c" còn thấp hơn thì nhập vào "t" còn đúng thì nhập "x". Tư tưởng em định làm là dùng thuật toán chia đôi vì khoảng phân ly nghiệm số là cho trước là từ 1 tới 1000, em định chia đôi khoảng nghiệm cách liên tục cho đến khi tìm ra nghiệm (chỉ hạn chế 10 lần đoán, sai thì đành chịu). Sau đây là code của em và hiện nó ko chạy được, có ai có ý kiến giúp em với ạ?: Nhân tiện nếu ai có giải thuật hay hơn thì bảo em luôn, mới học C đựoc vài hôm nên còn nhiều bỡ ngỡ, mong các tiền bối giúp đỡ nhiệt tình ạ!
C Code:
#include <stdio.h> int codinh, doan, dau, cuoi, i, traloi; void main() { dau = 1; cuoi=1000; doan = (int)(dau + cuoi / 2); i = 1; while (i != 10 && doan != codinh) { printf("Doan lan %d. So cua ban la %d phai khong? (c: cao hon, t: thap hon, x: chinh xac) ",++i,doan); if (traloi = 89 ) { doan = (int)((dau + cuoi) / 2); } else if (traloi = 118) { dau = doan; doan = (int)((dau + cuoi) / 2); } else { break; } } }
Đã được chỉnh sửa lần cuối bởi tuansaker3291 : 05-09-2011 lúc 06:22 PM.
sai lỗi cơ bản vậyCode:scanf("%d", codinh);
Quá yêu em khiến em xem
Đó như là sơ hở
Em điểu khiển và biến tôi thành 1 thằng khở
Cảm ơn bạn, mà đâu chỉ có thế, bài sai tùm lum rùi, để xem lại nào. hix. tại chưa nghĩ kỹ.hix
hix. Giả thuật gần đúng rùi nhưng ko biết trong quá trình xử lý số của mình có vấn đề gì mà nó cứ ra gần sát rùi là do xung đột giá trị đầu cuối nên dừng hay sao ý...hix
Các cao thủ cho em ý kiến với ạ...hix
Đã được chỉnh sửa lần cuối bởi tuansaker3291 : 05-09-2011 lúc 06:20 PM.
Góp 1 số ý:
1. Bạn đừng dùng scanf("%c") cho biến kiểu int. Tiềm ẩn rất nhiều nguy hiểm. Phải khai báo traloi kiểu char / unsigned char.
2. Xét thiếu trường hợp đầu == cuối - 1 và số cần đoán là cuối. Gặp phải trường hợp này, phép chia 2 sẽ luôn lặp lại hỏi số cần đoán là đầu đúng không? Và không bao giờ đoán ra số cuối
3. Không lý do gì bạn phải quy các ký tự ra số cả. Làm vậy vừa mất công hơn vừa khó nhìn, dễ nhầm hơn. Cứ viết 'c', 'x', 't' là được rồi.
4. Bạn bị lặp code doan = (int)((dau + cuoi) / 2);. Nên để dòng này ở ngay đầu vòng lặp, trước printf() (và chỉ 1 dòng ở đó là đủ)
5. printf("Chinh xac! May tinh da doan dung so cua ban la %d sau it hon 10 lan doan", codinh) là lỗi logic. Thay vì in ra số máy tính đoán được, bạn lại in số người dùng nhập vào. Dù rằng nếu máy tính đoán đúng thì 2 số đó là như nhau, nhưng như vậy nếu máy tính đoán sai / code bạn có lỗi nào đó thì sẽ khó phát hiện hơn. Túm lại lỗi tư duy kiểu đó cần hết sức tránh.
P.S: Nói rõ hơn về ý #1, do bạn khai báo traloi là global variable nên nó sẽ được khởi tạo là 0, vì vậy bạn dùng scanf("%c") vẫn ra đúng. Nếu bạn khai báo trong main chẳng hạn, thì biến nằm trên stack và sẽ không được khởi tạo, nên nó sẽ lưu 1 giá trị bất kỳ. Khi bạn scanf("%c") thì nó chỉ thay đổi byte cuối của int đó thôi, các byte khác vẫn giữ giá trị có sẵn, và khi so sánh thì sẽ sai. Túm lại là đối số của scanf("%c") phải là kiểu [unsigned] char
Đã được chỉnh sửa lần cuối bởi fbchicken : 05-09-2011 lúc 03:57 PM.
Cảm ơn tất cả, mình chạy đúng hết rùi, closetopic và miễn bình luận nhé,bài trên sai hơi bị nhiều, mong các bạn thông cảm do đây là baì về nhà nên đã cố tình bị sửa sai đôi chút. hi. Các cao thủ thì nhìn ra ngay. Sau ngày mùng 7 sẽ có code chuẩn ^^
Code chuẩn của chương trình sau khi hoàn thành đây, cảm ơn các bác đã cho em các ý kiến quý báu trong quá trình làm bài:
close topic toàn bộ ^^Code:#include <stdio.h> int codinh, doan, dau, cuoi, i, traloi; void main() { printf("Chuong trinh du doan so nhap vao - Phung Quang Tuan - k7 Tin\n\n"); while (1) { printf("Moi nhap vao 1 so de may tinh doan trong pham vi 1-1000: "); scanf("%d", &codinh); fflush(stdin); if (codinh > 0 && codinh <1001) break; } dau = 1; cuoi=1000; doan = 0; i = 1; while (i != 11 && doan != codinh) { doan = (int)((dau+(cuoi - dau) / 2)); printf("Doan lan %d. So la %d phai khong? (c: cao hon, t: thap hon, x: chinh xac) ",i++,doan); scanf("%c", &traloi); fflush(stdin); if (traloi == 99 ) { dau = doan; } else if (traloi == 116) { cuoi = doan; } else { printf("Chinh xac! May tinh da doan dung so %d cua ban sau it hon 10 lan doan\n\n", doan); break; } } }