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 !!!
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.P/S: nhiều người không biết chứ không phải mình bạn đâu ^^
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 ?
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.
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ỉ !!!
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 !!!
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 chodouble
chứ không phảifloat
. Vì khi em infloat
thì nó tự động biến thànhdouble
và%f
indouble
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ẹ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 !!!
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ả !!!
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ý !!!
Đú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 đó.
Do logic của bạn sai.
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