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

Đề tài: Nhờ cao thủ giúp đỡ DevC^^

  1. #1
    Ngày gia nhập
    12 2015
    Bài viết
    0

    Mặc định Nhờ cao thủ giúp đỡ DevC^^

    Các bạn giải thích dùm mình với:
    chương trình của mình:
    Code:
    #include <stdio.h>
    #include <conio.h>
    main()
    {
    		int a=10,b=5;
    		char op;
    		printf("Nhap vao phep toan: ");
    		gets(&op);
    		switch(op)
    		{
    			case '+':
    				{
    					printf("Tong 2 so a va b la: %d \n",a+b);
    					break;
    				}
    			case '-':
    				{
    					printf("Hieu 2 so a va b la: %d \n",a-b);
    					break;
    				}
    			case '*':
    				{
    					printf("Tich 2 so a va b la: %d \n",a*b);
    					break;
    				}
    			case '/':
    				{
    					printf("Thuong 2 so a va b la: %d \n",a/b);
    					break;
    				}
    			default:
    				printf("Khong xac dinh duoc phep toan!\n");		
    		}
    }
    khi chạy chương trình thì chỉ in ra được kết quả là 10(bằng giá trị của a)
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Untitled.png
Lần xem:	7
Size:		20.7 KB
ID:		59968
    tuy nhiên khi thêm int c=a+b; trước hàm printf(a+b) thì kết quả lại đúng.

    - - - Nội dung đã được cập nhật ngày 25-12-2017 lúc 04:29 PM - - -

    Code:
    #include <stdio.h>
    #include <conio.h>
    main()
    {
    		int a=10,b=5;
    		char op;
    		printf("Nhap vao phep toan: ");
    		gets(&op);
    		switch(op)
    		{
    			case '+':
    				{
    					int c=a+b;
    					printf("Tong 2 so a va b la: %d \n",a+b);
    					break;
    				}
    			case '-':
    				{
    					printf("Hieu 2 so a va b la: %d \n",a-b);
    					break;
    				}
    			case '*':
    				{
    					printf("Tich 2 so a va b la: %d \n",a*b);
    					break;
    				}
    			case '/':
    				{
    					printf("Thuong 2 so a va b la: %d \n",a/b);
    					break;
    				}
    			default:
    				printf("Khong xac dinh duoc phep toan!\n");		
    		}
    }
    Mình thêm dòng int c=a+b; vào như này thì kết quả ra đúng @@

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    483

    Code của bạn, mình đã chữa:
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. int main()
    4. {
    5.     int a=10, b=5;
    6.     char op[2];
    7.     printf("Nhap vao phep toan: ");
    8.     gets(op);
    9.     switch(op[0])
    10.     {
    11.         case '+':
    12.             printf("Tong so a va b la: %d\n", a+b);
    13.             break;
    14.         case '-':
    15.             printf("Hieu so a va b la: %d\n",a-b);
    16.             break;
    17.         case '*':
    18.             printf("Tich so a va b la: %d\n",a*b);
    19.             break;
    20.         case '/':
    21.             printf("Thuong so a va b la: %d\n",a/b);
    22.             break;
    23.         default:
    24.             printf("Khong xac dinh duoc phep toan!\n");
    25.     }
    26.     return 0;
    27. }

    Ví dụ:
    Code:
    h:\testC\bin\Debug>testC
    Nhap vao phep toan: +
    Tong so a va b la: 15
    
    h:\testC\bin\Debug>testC
    Nhap vao phep toan: -
    Hieu 2 so a va b la: 5
    
    h:\testC\bin\Debug>testC
    Nhap vao phep toan: /
    Thuong so a va b la: 2
    
    h:\testC\bin\Debug>testC
    Nhap vao phep toan: *
    Tich so a va b la: 50
    
    h:\testC\bin\Debug>testC
    Nhap vao phep toan: ?
    Khong xac dinh duoc phep toan!
    
    h:\testC\bin\Debug>
    P/S. Code trên chỉ để chỉ chỗ sai trong code của bạn, chứ mình không nghĩ bạn nên dùng gets() vào việc này (hay bất cứ việc nào khác).
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    08 2017
    Bài viết
    1,210

    Không hiểu nổi !
    Tôi dùng cả gcc, borland và vc, biên dịch chạy thử đều bị như #1.

    Sửa một chút thì nó chạy được
    C Code:
    1. #include <stdio.h>
    2. //#include <conio.h>
    3.  
    4. int main(){
    5.         int a = 10, b = 5, c; // không dùng tới c - chỉ khai báo chơi thôi - bỏ nó đi nó lại bị như trên!
    6.         char op;
    7.         printf("Nhap vao phep toan: "); gets(&op);
    8.         switch(op){
    9.             case '+':
    10.                 printf("Tong 2 so a va b la: %d \n", a+b);
    11.                 //c = a+b;
    12.                 //printf("Tong : %d \n", c);
    13.                 break;
    14.             case '-':
    15.                 printf("Hieu 2 so a va b la: %d \n", a-b);
    16.                 //c = a-b;
    17.                 //printf("Hieu : %d \n", c);
    18.                 break;
    19.             case '*':
    20.                 printf("Tich 2 so a va b la: %d \n", a*b);
    21.                 //c = a*b;
    22.                 //printf("Tich : %d \n", c);
    23.                 break;
    24.             case '/':
    25.                 printf("Thuong 2 so a va b la: %d \n", a/b);
    26.                 //c = a/b;
    27.                 //printf("Thuong : %d \n", c);
    28.                 break;
    29.             default:
    30.                 printf("Khong xac dinh duoc phep toan!\n");
    31.                 break;             
    32.         }
    33. }


  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    483

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    Không hiểu nổi !
    Tôi dùng cả gcc, borland và vc, biên dịch chạy thử đều bị như #1.
    Chắc bạn chưa đọc code của mình.

    Tuy vậy, có lẽ mình nên giải thích rõ ràng vì lỗi này có thể là khó hiểu ngay cả cho một số bạn có kinh nghiệm.

    gets() đọc một xâu dạng C-string. Nghĩa là khi đọc n ký tự, nó sẽ ghi bộ nhớ n+1 byte, Byte tận cùng là '\0'.

    Code ở #1 của bạn chủ thớt chỉ dành cho nó 1 byte, nên byte thứ 2 nó sẽ ghi đè vào vùng nhớ khác, cụ thể trong trường hợp này là ghi đè vào biến b, cụ thể hơn nữa là ghi đè vào byte thấp nhất của b (do kiến trúc low-endian), vốn có giá trị là 5. Vì các byte cao hơn của b đều có giá trị là 0 nên cuối cùng, giá trị của b bị thay đổi từ 5 thành 0.

    Code ở #2 của mình cũng sẽ gặp lỗi tương tự nếu nhập từ bàn phím vào 2 hay nhiều ký tự.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  5. #5
    Ngày gia nhập
    08 2017
    Bài viết
    1,210

    Có lẽ không như Ada giải thích.
    Tôi không những đọc code bạn viết mà đã biên dịch và chạy thử trước khi tôi ý kiến ở #3.
    Nói thêm ở #3 khai báo thêm biến c, không dùng tới, nó chạy đúng, các phần khác giữ nguyên.

    Trường hợp ghi đè, hoặc trỏ (truy xuất) tới vùng nhớ khác, tôi bị vài lần, rất đau đầu.

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    483

    Mặc định Nhờ cao thủ giúp đỡ DevC^^

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    Có lẽ không như Ada giải thích.
    Tôi không những đọc code bạn viết mà đã biên dịch và chạy thử trước khi tôi ý kiến ở #3.
    Nói thêm ở #3 khai báo thêm biến c, không dùng tới, nó chạy đúng, các phần khác giữ nguyên.

    Trường hợp ghi đè, hoặc trỏ (truy xuất) tới vùng nhớ khác, tôi bị vài lần, rất đau đầu.
    Đây là code của bạn, mình viết thêm một chút để minh họa ý của mình.
    C Code:
    1. int main(){
    2.     short int a = 'A', b = 'B', c = 'C';
    3.     char op;
    4.     printf("Nhap vao phep toan: "); gets(&op);
    5.     printf("c=%4s b=%4s a=%4s\n", &c, &b, &a);
    6.     printf("a=%4.4x b=%4.4x c=%4.4x\n", a, b, c);
    7.     switch(op){
    8.         case '+':
    9.             printf("Tong 2 so a va b la: %x \n", a+b);
    10.             break;
    11.         case '-':
    12.             printf("Hieu 2 so a va b la: %x \n", a-b);
    13.             break;
    14.         case '*':
    15.             printf("Tich 2 so a va b la: %x \n", a*b);
    16.             break;
    17.         case '/':
    18.             printf("Thuong 2 so a va b la: %x \n", a/b);
    19.             break;
    20.         default:
    21.             printf("Khong xac dinh duoc phep toan!\n");
    22.             break;
    23.     }
    24. }

    Ví dụ:
    Code:
    d:\bin\Debug>test0
    Nhap vao phep toan: +
    c=     b=   B a=   A
    a=0041 b=0042 c=0000
    Tong 2 so a va b la: 83
    
    d:\bin\Debug>test0
    Nhap vao phep toan: +a
    c=   a b=   B a=   A
    a=0041 b=0042 c=0061
    Tong 2 so a va b la: 83
    
    d:\bin\Debug>test0
    Nhap vao phep toan: +ab
    c=  ab b=     a=   A
    a=0041 b=0000 c=6261
    Tong 2 so a va b la: 41
    
    d:\bin\Debug>test0
    Nhap vao phep toan: +abc
    c= abc b=   c a=   A
    a=0041 b=0063 c=6261
    Tong 2 so a va b la: a4
    
    d:\bin\Debug>test0
    Nhap vao phep toan: +abcd
    c=abcd b=  cd a=
    a=0000 b=6463 c=6261
    Tong 2 so a va b la: 6463
    
    d:\bin\Debug>test0
    Nhap vao phep toan: +abcde
    c=abcde b= cde a=   e
    a=0065 b=6463 c=6261
    Tong 2 so a va b la: 64c8
    
    d:\bin\Debug>test0
    Nhap vao phep toan: +abcdef
    c=abcdef b=cdef a=  ef
    a=6665 b=6463 c=6261
    Tong 2 so a va b la: cac8
    
    d:\bin\Debug>test0
    Nhap vao phep toan: +abcdefghijklmn
    c=abcdefghijklmn b=cdefghijklmn a=efghijklmn
    a=6665 b=6463 c=6261
    Tong 2 so a va b la: cac8
    
    *** PROGRAM CRASHES ***
    Đã được chỉnh sửa lần cuối bởi Ada : 27-12-2017 lúc 07:21 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  7. #7
    Ngày gia nhập
    08 2017
    Bài viết
    1,210

    Đề tài hay.
    Sau nhiều năm vẫn còn bug

  8. #8
    Ngày gia nhập
    08 2017
    Bài viết
    1,210

    Thấy hay khen hay
    Thấy dở chê dở
    Nói về cái sai là khác với bôi nhọ

  9. #9
    Ngày gia nhập
    08 2017
    Bài viết
    1,210

    Đây là đề tài đáng lưu ý

    Khả năng tiềm ẩn lỗi, rất khó debug khi xảy ra

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