2012-07-26 12 views
7

Próbuję się nauczyć C i wymyślić następujący mały program.Programowanie typów danych

#include "stdafx.h" 

void main() 
{ 
    double height = 0; 
    double weight = 0; 
    double bmi = 0; 

    printf("Please enter your height in metres\n"); 
    scanf_s("%f", &height); 
    printf("\nPlease enter your weight in kilograms\n"); 
    scanf_s("%f", &weight); 
    bmi = weight/(height * height); 
    printf("\nYour Body Mass Index stands at %f\n", bmi); 
    printf("\n\n"); 
    printf("Thank you for using this small program. Press any key to exit"); 
    getchar(); 
    getchar(); 
} 

Program doskonale się komplikuje, jednak odpowiedź zwrócona przez program nie ma sensu. Jeśli wprowadzę 1,8 dla wzrostu i 80 dla wagi, bmi będzie jak 1. # NF00, co nie ma sensu.

Co robię źle?

+10

nie jest to '% lf' dla podwaja? W każdym razie [nie powinieneś używać 'void main'.] (Http://stroustrup.com/bs_faq2.html#void-main) – chris

+0

@chris dobrze wiedzieć. Zawsze uczono mnie, że 'void main' jest dla C, a' int main' dla C++. Zastanawiam się, skąd bierze się nawyk nowych programistów C/C++. – Darthfett

+0

@Darthfett, myślę, że istnieje kilka książek, które używają 'void main'. Mogę sobie wyobrazić, że to jest to, skąd się to wszystko bierze. – chris

Odpowiedz

10

scanf (i scanf_s) format %f oczekuje wskaźnika na typ float.

Po prostu zmień typ zmiennych height i weight na float, aby to naprawić.

+0

Dzięki :) To działało idealnie! Użyłem% f od tutoriala, którego użyłem, użytego% f dla podwójnego. – Matthew

+1

@Matthew Myślę, że nadszedł czas, aby uzyskać nowy samouczek. –

+0

Zgaduję więc: dziękuję jeszcze raz :) – Matthew

4

myślę problem w scanf_s składniach, ty, pominięte 3-rd argument, który jest rozmiar bufora w bajtach. Spróbuj następujących:

scanf_s("%lf", &valueToGet, sizeof(double)); 
+1

Uhm, on nie skanuje "char" tutaj, wiesz –

+0

tak, wiem to tylko przykład, aby pokazać, jaki 3 argument jest potrzebny, który wziąłem szybko z msdn, jak próbowałem szybko odpowiedzieć na odpowiedź, nie dopasuj ten przykład do danego zadania, przepraszam za to)) –

+0

Przypuszczalnie mówisz o 'scanf_s', ale napisałeś' scanf'? Również specyfikator formatu jest nieprawidłowy. Napraw błędy lub usuń odpowiedź. –

3

Wadą scanf() i printf() jest to, że wymaga bardzo ścisłej format dowolny niedopasowanie pomiędzy ciągiem sterującym i argumentu może spowodować drastyczny błąd, który sprawia, że ​​wejście lub wyjście zrobić bez w ogóle sens. I ten błąd często popełniają początkujący.

2

Jeśli używasz specyfikatora formatu % f, musisz użyć typu danych zmiennoprzecinkowych zamiast podwójnego.

0

Problem polega na tym, ponieważ:

format '%f' expects argument of type 'float*', but argument 2 has type 'double*' 

Istnieją dwa sposoby, aby sobie z tym poradzić:

  1. Albo zmienne należy float:

    double height = 0; --> float height = 0; 
    double weight = 0; --> float weight = 0; 
    double bmi = 0;  --> float bmi = 0; 
    
  2. lub format specifier powinien odpowiada double.

    scanf_s("%f", &height); --> scanf_s("%lf", &height); 
    
    scanf_s("%f", &weight); --> scanf_s("%lf", &weight); 
    
    printf("\nYour Body Mass Index stands at %f\n", bmi); 
                  | 
                  V 
    printf("\nYour Body Mass Index stands at %lf\n", bmi);