2013-06-11 2 views
1

Мне было дано задание создать процедуру, которая сканирует поплавок, называемый getfloat.сканирование поплавка, получение кажущихся случайными значений

по какой-то причине, я получаю случайные значения. Если я вхожу в «1», он печатает 49. Почему это происходит? А также, когда я вводил значения, я не вижу их на экране? когда я использую scanf, например, вижу, что я нажимаю на маленьком черном экране. но теперь экран просто пуст, и когда я нажимаю кнопку ввода, он показывает плохой результат:

Пример - ввод: -1. Выход: 499,00000 Вот мой код:

#include <stdio.h> 
#include <conio.h> 
#include <math.h> 
#include <ctype.h> 
void getfloat(float* num); 
void main() 
{ 
    float num=0; 
    printf("Enter the float\n"); 
    getfloat(&num); 
    printf("\nThe number is %lf\n",num); 
    getch(); 
} 
void getfloat(float* num) 
{ 
    float c,sign=1,exponent=10; 
    c=getch(); 
    if((!isdigit(c))&&(c!='+')&&(c!='-')) //if it doesnt start with a number a + or a -, its not a valid input 
    { 
     printf("Not a number\n"); 
     return; 
    } 
    if(c=='-') //if it starts with a minus, make sign negative one, later multiply our number by sign 
     sign=-1; 
    for(*num=0;isdigit(c);c=getch()) 
     *num=(*num*10)+c; //scan the whole part of the number 
    if(c!='.') //if after scanning whole part, c isnt a dot, we finished 
     return; 
    do //if it is a dot, scan fraction part 
    { 
     c=getch(); 
     if(isdigit(c)) 
     { 
      *num+=c/exponent; 
      exponent*=10; 
     } 
    }while(isdigit(c)); 
    *num*=sign; 
} 

ответ

1

Существует ряд проблем.

1) Ваш опубликованный код не соответствует вашему примеру "input: -1. Output: 499.00000", я получаю 0 из-за отсутствия getch() после нахождения '-'. См. № 6.

1) 'c' - символ. Когда вы вводите '1', c взял код для письма 1, который в вашем случае является кодировкой ASCII, равен 49. Чтобы преобразовать цифру из ее значения ASCII в числовое значение, вычесть 48 (код ASCII для буквы '0', часто делается в c - '0'

*num=(*num*10)+c; 
*num+=c/exponent; 

становится

*num = (*num*10) + (c-'0'); 
*num += (c-'0')/exponent; 

2) Хотя вы объявляете c как float, рекомендуется объявить его как int. int - тип возврата от getch().

3) Функция getch() «используется для получения символа с консоли, но не эха на экране». Вот почему вы их не видите. Вместо этого рассмотрите getchar().

4) [Изменить: удалить Избегайте =-. Спасибо @ Даниэль Фишер]

5) Ваш экспоненциальный расчет нуждается в доработке. Примечание: ваш экспонент может получить знак.

6) Когда вы проверите if(c=='-'), вы не получите еще c. Вы также можете протестировать else if(c=='+') и использовать это значение c.

Удачи вам в вашем путешествии C.

+0

Форма составных операторов присваивания '= -' и т. Д. Была отменена _long_ до того, как был ратифицирован первый стандарт. 'sign = -1;' был однозначным 'sign = -1;' (только менее читаемым) во всех компиляторах C, написанных последним (по крайней мере) 30 лет. [«В B и начале C оператор был записан = + вместо + =, эта ошибка, исправленная в 1976 году ...»] (http://cm.bell-labs.com/cm/cs/who/ DMR/Чустские.html) Педантичное примечание: «c берет код ASCII для буквы» не обязательно, это может быть также EBCDIC (или другие кодировки, но ASCII-совместимые и EBCDIC - единственные, которые, как я знаю, будут использоваться). –

+0

@ Daniel Fischer Я так редко вижу несостоявшийся '= -', что я, как и вы, был уверен, что он устарел. Мой тест кода, _appeared_, хотя и выполнял функцию '- ='. Я рассмотрю это позже. Правда о «c берет ASCII ... не обязательно быть истинным» вообще, но OP «если я вхожу» 1 «он печатает 49», безусловно, указывает на ASCII. BTW, в ASCII или EBCDIC, (c - '0') делает скрытое 'c' его числовое значение. – chux

+0

Моя отладка кода была ошибочной, когда я напечатал 'sign' после' sign = -1; '(я предположил, что это был тип' '' '' '' '' '' '' '' '' '' '' '' '' '', а затем предполагалось, что (хотя теперь устаревший) синтаксис 'C'. mea culpa) – chux

0

Небольшая подсказка: 49 является ASCII для character 1. Вы используете Геч(), который дает возвращаемое значение char.

1

49 является кодом Ascii для номера 1. Поэтому, когда (0'<=c && c <='9') необходимо вычесть , чтобы получить номер сам.