30/09/2018, 16:05

Không tính được kiểu double

Hi mọi người,

Mình đang tập tành code C, mình đang tự ra 1 bài tập viết 1 chương trình Calculator. Nhưng mình gặp chút thắc mắc về khai báo biến. Mọi người có thể giải thích giúp mình tại sao khi mình khai báo kiểu double cho biến dưới đây thì console ko tính được còn với kiểu int thì vẫn bình thường !!!

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

int main(int argc, char *argv[])
{
    printf("Hello world!
");

    double sohang1 = 0, sohang2 = 0, ketqua1 = 0;

    printf("Nhap so hang thu 1:
");
    scanf("%f", &sohang1);
    printf("Nhap so hang thu 2:
");
    scanf("%f", &sohang2);

    ketqua1 = sohang1 + sohang2;

    printf("Tong hai so la: %0.1f + %0.1f = %0.1f

", sohang1, sohang2, ketqua1);

    return 0;
}

Có thể với mọi người bài này như trò trẻ con nhưng mình muốn hỏi để được giải thích rõ xem sự khác biệt của các kiểu biến số có ảnh hưởng tới phép tính của máy tính sao ???

Xin cám ơn mọi người trước !!!

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

Bạn dùng %lf để nhập vào double nhé. Do double không nhập vào được nên không tính được.

scanf("%lf", &sohang2);

P/S: nhiều người không biết chứ không phải mình bạn đâu ^^

MiN viết 18:18 ngày 30/09/2018

Ok em làm được rồi … thanks anh Đạt nhiều … sao lại lỗi cơ bản như vậy nhỉ … nhưng em thấy nhiều tài liệu hướng dẫn kiểu double và float thì dung %f mà anh ?

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

nhiều tài liệu hướng dẫn kiểu double và float thì dung %f mà anh ?

Vậy thì hoặc tài liệu sai hoặc là compiler sai. Mà anh không chắc về cái thứ hai lắm.

MiN viết 18:10 ngày 30/09/2018

Hihi anh ơi … nhưng trong clip hướng dẫn C - 40 của anh em cũng thấy anh dùng %f cho double mà nó vẫn hiểu … có khi cái compiler nó bị sao sao thiệt thì sao anh nhỉ !!!

MiN viết 18:06 ngày 30/09/2018

Vậy có phải là có 1 sự khác biệt giữa biến đã có giá trị và biến chưa có giá trị không anh … VD như em thấy khi biến có giá trị là 1 số thực do mình gán sẵn vào khi code thì khai báo %f cho double compiler vẫn hiểu … nhưng khi biến đó chưa có giá trị và mình dùng scanf để người dùng nhập vào thì compiler chỉ hiểu được khi mình dùng %lf cho double thôi !!!

Em cũng đã thử lại bài trên nhưng đổi thành kiểu float thì %f ko có vấn đề gì cả … chương trình chạy !!!

Thích thật !!!

Nguyễn Minh Dũng viết 18:10 ngày 30/09/2018

Video đó anh in ra chứ không phải anh nhập vào. In ra em có thể dùng %f bản chất là %f là dành cho double chứ không phải float. Vì khi em in float thì nó tự động biến thành double%f in double ra. Em cũng có thể dùng %lf để in ra. Có điều anh lười biếng quá anh xài %f cho lẹ

MiN viết 18:14 ngày 30/09/2018

Còn 1 cái nữa … khi em thay đổi vị trí của biến “ketqua1” thì chương trình cũng chạy ra kết quả không đúng … nó cho “ketqua1” = 0 … vậy tại sao cái compiler nó không tự hiểu dùm mình là “ketqua1” = 0 chỉ là giá trị tạm thời ban đầu … sau đó mình sẽ gán giá trị cho “sohang1” và “sohang2” để tính lại “ketqua1” … nó chỉ in ra thằng “ketqua1” như mình gán ban đầu thôi !!!

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

int main(int argc, char *argv[])
{
    printf("Hello world!\n");

        float sohang1 = 0, sohang2 = 0, ketqua1 = 0;

        ketqua1 = sohang1 + sohang2;

        printf("Nhap so hang thu 1:\n");
        scanf("%f", &sohang1);
        printf("Nhap so hang thu 2:\n");
        scanf("%f", &sohang2);


        printf("Tong hai so la: %0.1f + %0.1f = %0.1f\n\n", sohang1, sohang2, ketqua1);

    return 0;
}

Vậy là máy tính đọc code của mình từ trên xuống dưới và thực hiện theo trình tự đó luôn hả anh … không chịu thay đổi hả !!!

MiN viết 18:17 ngày 30/09/2018

Cách giải quyết cái vụ “ketqua1” ở trên đơn giản là em sẽ cop thêm 1 dòng “ketqua1 = sohang1 + sohang2” xuống vị trí trước dòng printf tổng 2 số là được !!!

Qua việc này em rút ra được nếu máy tính hoạt động theo trình tự code mình viết như vậy thì mình phải suy nghĩ sắp xếp cách code sao cho đỡ tốn time cũng như logic để nó hiểu nữa đúng ko anh … đâu phải mình hiểu thì nó hiểu đâu … bây h mới thấy máy tính nó ngu hơn mình thiệt … phải cầm tay chỉ việc cho nó từng ly từng tý !!!

Nguyễn Minh Dũng viết 18:19 ngày 30/09/2018

Đúng rồi, đó là cách C và nhiều ngôn ngữ khác hiểu chỉ thị của con người. Đấy là quy tắc mà con người đã đề ra cho C Vì mình đề ra quy tắc đó nên mình sẽ theo nó. Điều đó giúp cho code của nhiều người có thể gộp chung lại với nhau vì mình có chuẩn riêng.

Hình như cũng có ngôn ngữ thực hiện được điều em nói, tức là tự hiểu “ketqua1” = 0 chỉ là giá trị tạm thời. Anh có đọc qua Haskell, nếu anh nhớ không lầm thì Haskell có thể thực hiện được điều em muốn, theo một cách nào đó.

buithaiminh viết 18:08 ngày 30/09/2018

Do logic của bạn sai.

  • Đầu tiên bạn gán cho sohang1, sohang2, ketqua1 bằng 0
  • Sau đó bạn tính ra giá trị của ketqua1 = sohang1 + sohang2 vậy thì lúc này ketqua1 = 0 + 0
  • Tiếp theo bạn đọc vào giá trị của sohang1 và sohang2. Lưu ý lúc này giá trị của ketqua1 vẫn là 0
  • Kế tiếp bạn in ra ketqua1 (hiển nhiên vẫn là giá trị 0)

Bạn cộng 2 giá trị số hạng = 0 để lấy kết quả = 0. Sau đó bạn lại nhập vào giá trị 2 số hạng, thì lúc này bạn có nhập bao nhiêu đi nữa giá trị của biến ketqua1 vẫn không thay đổi (vì có làm gì động đến nó đâu thì làm sao nó thay đổi)

Lời khuyên: tìm hiểu thêm về debug

Hoài Nam viết 18:21 ngày 30/09/2018
#include <stdio.h>
#include <conio.h>

int main(int argc, char *argv[])
{
    printf("Hello world!\n");

    float sohang1 = 0, sohang2 = 0, ketqua1 = 0;

	do
	{
             ketqua1 = sohang1 + sohang2;
	     if(sohang1 != 0 || sohang2 != 0 ) break;
             printf("Nhap so hang thu 1:\n");
             scanf("%f", &sohang1);
             printf("Nhap so hang thu 2:\n");
             scanf("%f", &sohang2);
	}
	while(ketqua1==0);
        printf("Tong hai so la: %0.1f + %0.1f = %0.1f\n\n", sohang1, sohang2, ketqua1);

	getch();
	return 0;
}
Bài liên quan
0