Мне было дано задание создать процедуру, которая сканирует поплавок, называемый 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;
}
Форма составных операторов присваивания '= -' и т. Д. Была отменена _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 - единственные, которые, как я знаю, будут использоваться). –
@ Daniel Fischer Я так редко вижу несостоявшийся '= -', что я, как и вы, был уверен, что он устарел. Мой тест кода, _appeared_, хотя и выполнял функцию '- ='. Я рассмотрю это позже. Правда о «c берет ASCII ... не обязательно быть истинным» вообще, но OP «если я вхожу» 1 «он печатает 49», безусловно, указывает на ASCII. BTW, в ASCII или EBCDIC, (c - '0') делает скрытое 'c' его числовое значение. – chux
Моя отладка кода была ошибочной, когда я напечатал 'sign' после' sign = -1; '(я предположил, что это был тип' '' '' '' '' '' '' '' '' '' '' '' '' '', а затем предполагалось, что (хотя теперь устаревший) синтаксис 'C'. mea culpa) – chux