Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Chương trình đoán số theo phương pháp chia đôi bị lỗi, nhờ các cao thủ phân tích lại dùm ạ. hix

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    36

    Mặc định Chương trình đoán số theo phương pháp chia đôi bị lỗi, nhờ các cao thủ phân tích lại dùm ạ. hix

    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:
    1. #include <stdio.h>
    2.  
    3. int codinh, doan, dau, cuoi, i, traloi;
    4.  
    5. void main()
    6.     {
    7.         printf("Moi nhap vao 1 so de may tinh doan: ");
    8.         scanf("%d", codinh);
    9.         fflush(stdin);
    10.         dau = 1; cuoi=1000;
    11.         doan = (int)(dau + cuoi / 2);
    12.        
    13.         i = 1;
    14.         while (i != 10 && doan != codinh)
    15.             {
    16.                 printf("Doan lan %d. So cua ban la %d phai khong? (c: cao hon, t: thap hon, x: chinh xac) ",++i,doan);
    17.                 scanf("%d", traloi);
    18.                 fflush(stdin);
    19.                 if (traloi = 89 )
    20.                     {
    21.                         doan = (int)((dau + cuoi) / 2);
    22.                     }
    23.                 else
    24.                 if (traloi = 118)
    25.                     {
    26.                         dau = doan;
    27.                         doan = (int)((dau + cuoi) / 2);
    28.                     }
    29.                 else
    30.                     {
    31.                         printf("Chinh xac! May tinh da doan dung so cua ban la %d sau it hon 10 lan doan", codinh);
    32.                         break;
    33.                     }
    34.             }
    35.     }
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi tuansaker3291 : 05-09-2011 lúc 06:22 PM.

  2. #2
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà nội
    Bài viết
    210

    Code:
    scanf("%d", codinh);
    sai lỗi cơ bản vậy
    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ở

  3. #3
    Ngày gia nhập
    08 2011
    Bài viết
    36

    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

  4. #4
    Ngày gia nhập
    08 2011
    Bài viết
    36

    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.

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    160

    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.

  6. #6
    Ngày gia nhập
    08 2011
    Bài viết
    36

    Mặc định Chương trình đoán số theo phương pháp chia đôi bị lỗi, nhờ các cao thủ phân tích lại dùm ạ. hix

    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 ^^

  7. #7
    Ngày gia nhập
    08 2011
    Bài viết
    36

    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:

    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;
     					}
     			}
    	}
    close topic toàn bộ ^^

Các đề tài tương tự

  1. Trả lời: 4
    Bài viết cuối: 10-09-2012, 06:34 PM
  2. gộp mảng 1 chiều,các anh sữa dùm em.
    Gửi bởi mremty trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 07-12-2011, 10:57 PM
  3. in ra màn hình tổng các số chia hết cho 3, sửa lỗi dùm mình!
    Gửi bởi alibaba7034 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 13-10-2010, 11:24 PM
  4. Sửa lỗi dùm bài Tìm kiếm theo chiều sâu trên đồ thị
    Gửi bởi langthienning trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 16-06-2009, 05:22 PM
  5. Hỏi code mô tả việc duyệt cây theo chiều rộng và theo chiều sâu
    Gửi bởi vitco trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 27-03-2008, 02:47 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn