2014-12-13 12 views
6

Chương trình này được cho là để chuyển đổi độ F vào độ C:"while()" hoạt động?

#include <stdio.h> 
int main() { 
    float fahrenheit, celsius; 
    int max, min, step; 

    max = 100; 
    min = 0; 
    step = 5; 

    fahrenheit = 0.0; 
    //celsius = (fahrenheit - 32.0) * 5.0/9.0; DOESN'T WORK HERE 

    printf("\n"); 
    printf("This program converts fahrenheit into celsius \n"); 

    while(fahrenheit <= max) { 
     celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */ 
     printf("%3.0f %6.2f\n", fahrenheit, celsius); 
     fahrenheit = fahrenheit + step; 
    } 
} 

Như tôi đã nêu trong bình luận nguồn của tôi, khi tôi cố gắng đưa công thức cho C vào cơ thể của main() chức năng, tôi nhận được -17.8 cho mỗi giá trị đơn fahrenheit. Kết quả trông giống như thế này -

0 -17.78 
5 -17.78 
10 -17.78 
15 -17.78 
20 -17.78 
25 -17.78 

v.v ... Tuy nhiên, khi tôi đặt công thức celsius vào hàm while(), tôi nhận được các giá trị celsius chính xác cho mỗi giá trị fahrenheit. Có vẻ như sau:

0 -17.78 
5 -15.00 
10 -12.22 
15 -9.44 
20 -6.67 

Tại sao điều đó xảy ra?

Đây là mã không hoạt động. Nó giống với mã ở trên, ngoại trừ vị trí của công thức celsius. (Ít nhất, tôi nghĩ rằng đó là.)

#include <stdio.h> 
//this program is supposed to convert fahrenheit into celsius 
int main() { 
    float fahrenheit, celsius; 
    int max, min, step; 

    max = 100; 
    min = 0; 
    step = 5; 

    fahrenheit = 0.0; 
    celsius = (fahrenheit - 32.0) * 5.0/9.0; 

    printf("\n"); 
    printf("This program converts fahrenheit into celsius \n"); 

    while(fahrenheit <= max) { 
     printf("%3.0f %6.2f\n", fahrenheit, celsius); 
     fahrenheit = fahrenheit + step; 
    } 
} 
+7

'while' không phải là một hàm; đó là từ khóa chỉ định một loại tuyên bố cụ thể. Mã trong câu hỏi của bạn hoạt động chính xác. Chúng ta cần xem mã * không * làm việc. –

+0

@KeithThompson Ông đã cung cấp mã không hoạt động: Mã giống nhau, nhưng mã chuyển đổi được chuyển ra khỏi vòng lặp. – fuz

+0

@FUZxxl: Vâng, anh ấy đã chỉnh sửa câu hỏi sau bình luận của tôi. –

Trả lời

7

Khi bạn thiết lập một giá trị cho một biến, giá trị thực tế được tính toán, và sau đó lưu trữ vào biến. Tuy nhiên, công thức không phải là lưu trữ công thức cho biến. Vì vậy, khi bạn chạy

celsius = (fahrenheit - 32.0) * 5.0/9.0; 

ngoài của while vòng lặp, nó sử dụng giá trị hiện tại của fahrenheit (đó là 0.0), và tính toán giá trị cho celsius, đó là -17,78.

Bên các while vòng lặp, mặc dù fahrenheit thay đổi, celsius sẽ không, bởi vì không có báo cáo bên trong while vòng lặp để thực sự thay đổi giá trị của biến. Đây là lý do tại sao bạn phải di chuyển câu lệnh vào vòng lặp while, để đảm bảo rằng giá trị celsius cập nhật mỗi lần thay đổi giá trị fahrenheit.

-2

Bạn không thể mong đợi giá trị của fahrenheit thay đổi bên ngoài vòng lặp như bạn đang chuyển đổi một giá trị duy nhất:

(-32.0) * 5.0/9.0 = -17.8 (every time) 

Thời gian duy nhất giá trị với sự thay đổi là nếu bạn đang thay đổi giá trị của fahrenheit riêng của mình. Bên ngoài vòng lặp. Điều đó không xảy ra.

Ngoài ra, so sánh int với một float không bao giờ là ý tưởng hay. Lý do là một số dấu chấm động, được lưu trữ trong Định dạng điểm nổi chính xác IEEE-754 không phải là một biểu diễn chính xác về giá trị được cung cấp để lưu trữ. (Ví dụ 32,2 không được lưu trữ ở định dạng dấu chấm động như chính xác 32,2) Trong khi bạn có thể làm một so sánh tương đối:

while(fahrenheit <= max) 

Đó là thực tế tốt hơn để làm:

int i = 0; 
for (i = 0; i < max; i+=5) { 
    fahrenheit += (float)i; 
    celsius = (fahrenheit - 32.0) * 5.0/9.0; 
... 

Bạn đang thay đổi fahrenheit đây trong vòng lặp và sau đó bạn có thể mong đợi giá trị của celsius để thay đổi tương ứng.

Về so sánh điểm nổi, bạn sẽ muốn đọc The Floating-Point Guide - What Every Programmer Should Know .... Vấn đề là bạn không so sánh những gì bạn nghĩ bạn đang có.

+6

nên là một chú thích –

+1

C sẽ cast 'i' vào một float anyway, trong' (i - 32.0) '. – yellowantphil

+0

Vâng, tôi biết rõ về quảng bá và tiêu chuẩn, nhưng rõ ràng là việc nhấn mạnh việc học tập không bao giờ làm tổn thương. –

2

Đó là vì trong khi đó là vòng lặp được sử dụng để lặp lại một khối mã.

Nếu bạn đặt celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */ bên ngoài khối trong khi nó sẽ lặp lại chỉ một lần (và nó sẽ là khi fahrenheit = 0.0), nhưng nếu bạn đặt celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */ bên trong khối trong khi celsius sẽ thay đổi giá trị của mình như fahrenheit, trong khi điều kiện fahrenheit <= max là đúng.

+0

Bạn có ý gì khi 'bucle'? – b4hand

+0

Nó có nghĩa là vòng lặp ... Tôi nghĩ rằng nó cũng có thể nói bucle trong tiếng Anh, tôi đã sai. – OiciTrap

+0

nit nhỏ: Vòng lặp sẽ vẫn lặp qua fahrenheit từ 0 đến 100, không chỉ một lần, nó sẽ không in kết quả khác – kdopen

2

Mã:

celsius = (fahrenheit - 32.0) * 5.0/9.0; 

gán biến celsius với (fahrenheit - 32.0) * 5.0/9.0

Nơi bạn gọi mã bên ngoài vòng lặp while, F là 0 để C trở nên -17,78

Nếu bạn đặt mã bên trong vòng lặp while, nó sẽ gán lại celsius mỗi lần khối vòng lặp while. Fahrenheit thay đổi bên trong vòng lặp này vì vậy mỗi khi vòng lặp while thực hiện, cả fahrenheit và celsius sẽ khác nếu bạn gán lại celsius với celsius = (fahrenheit - 32.0) * 5.0/9.0; bên trong vòng lặp while.

3

Chào mừng bạn đến với SO. Bạn đang đến để nắm bắt với một trong những phát biểu kiểm soát dòng chảy cơ bản hiện diện trong mọi ngôn ngữ lập trình.

Về cơ bản, bất kỳ chương trình máy tính nào cũng là một chuỗi các hướng dẫn và bạn có thể dự tính máy tính thực hiện từng chương trình từ trên xuống dưới cùng của trang.

Về mặt logic, điều đó có nghĩa là mọi lệnh chỉ được thực thi một lần, trừ khi có cách để báo chương trình "đi ngược" và thực hiện lại thao tác. Đó là những gì tuyên bố while (nó không phải là một chức năng). Trong một tuyên bố trong khi tiếng Anh (thường gọi là while loop) làm điều gì đó như thế này

if a condition is true 
    execute some instructions 
    go back and check the condition and keep looping 
else 
    continue after the loop 

Vì vậy, vòng lặp chính của bạn có một khối lệnh được thực hiện chỉ một lần (mỗi điều trước while).

Sau đó, các câu lệnh bên trong vòng lặp while được lặp lại với fahrenheit tính giá trị khác nhau mỗi lần qua vòng lặp: 0, 5, 10, 15, ..., 95, 100. Khi bạn thêm 5 lần trước , fahrenheit có giá trị 105, vì vậy chương trình rời khỏi vòng lặp và tiếp tục trên (trong trường hợp này, kết thúc main() chức năng và thoát khỏi chương trình.

Nếu bạn có celsius tính bên ngoài vòng lặp, nó chỉ xảy ra một lần. Sau đó, mỗi lần qua vòng lặp, nó in ra giá trị bạn đã tính - mặc dù fahrenheit liên tục thay đổi.

Khi bạn mo đã tính toán bên trong vòng lặp while, celsius được tính toán lại trên mỗi lần truyền qua vòng lặp, sử dụng giá trị mới fahrenheit và do đó tạo ra một kết quả khác nhau.

Hy vọng điều này sẽ giúp

Các vấn đề liên quan