028.从键盘读入实数

简介: 028.从键盘读入实数
#define ERR 5
#define OK 6
#include <stdio.h>
int status;
double result,sig,scale;
int sign(int c)/*处理数的符号函数*/
{
  if(c=='-')/*若为负号,置负数标记*/
    sig=-sig;
}
int integer(int c)/*转换整数部分,转换一位整数位*/
{
  result=result*10.0+c-'0';
}
int decimal(int c)/*转换小数部分,转换一位小数位*/
{
  result+=(c-'0')*scale;
  scale/=10.0;
}
/*状态表*/
int statbl[ ][4]={{   1,2,3,ERR},/*0*/
          {ERR,2,3,ERR},/*1*/
          {OK,2,4,OK},/*2*/
          {ERR,4,ERR,ERR},/*3*/
          {OK,4,OK,OK}};/*4*/
/*转换函数表*/
int(*funtbl[ ][4])( )={{sign,integer,NULL,NULL},
                  {NULL,integer,NULL,NULL},
                  {NULL,integer,NULL,NULL},   
                  {NULL,decimal,NULL,NULL},
                                    {NULL,decimal,NULL,NULL}};
int readreal(double *dp)
{
  int c,ckind;
  sig=1.0;
  result=0.0;
  scale=0.1;
  while((c=getchar( ))==' '||c=='\n'||c=='\t');/*跳过前导空白符*/
  status=0;/*置初始状态*/
  for(;;)
  {
    /*分类当前字符*/
    if(c=='+'||c=='-') ckind=0;/*数的符号字符*/
    else if(c>='0'&&c<='9') ckind=1;/*数字符*/
    else if(c=='.') ckind=2;/*小数点*/
    else ckind=3;/* 其它字符 */
    if(funtbl[status][ckind])/* 如有转换函数 */
      (*funtbl[status][ckind])(c);/* 执行相应的函数 */
    status=statbl[status][ckind];/*设置新的状态*/
    if(status==ERR||status==OK)break;/* 结束:出错或成功 */
    c=getchar();
  }
  ungetc(c,stdin); /* 归还数德结束符 */
  if(status==OK)
  {
    *dp=result *sig;/* 读入数按指针参数赋给相应变量 */
    return 1;
  }
  return -1; /* 出错返回 */
}
main()
{
  double x;
  clrscr();
  printf("\nPlease input real numbers (use nonreal char to end input):\n");
  while(readreal(&x)==1)
    printf("The real number you input is: %f\n",x);
  printf("\nYou have inputted nonreal char.\n Press any key to quit...\n"); 
  getch();
}
相关文章
|
4月前
输出字母沙漏
输出字母沙漏
单个字符的输入输出
单个字符的输入输出
61 0
|
2月前
从键盘输入一些字符
【7月更文挑战第9天】从键盘输入一些字符。
42 15
|
3月前
|
C语言
C语言:从键盘读入三个整数,按从大到小输出
C语言:从键盘读入三个整数,按从大到小输出
|
3月前
|
存储
从键盘输入10个整数,输出最大值
从键盘输入10个整数,输出最大值
|
3月前
|
算法
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
使用链式栈,实现十进制转八进制:键盘输入一个十进制数,经过链式栈的相关算法,输出八进制数
|
4月前
|
C++
41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
41.用c++编写程序:从键盘上任意输20个1-99之间的整数,分别统计其个位数0-9的数字各有多少
39 0
|
4月前
|
存储 C语言
在C语言中编写,用于从键盘接收输入的整数并判断该数是否能被3整除
在C语言中编写,用于从键盘接收输入的整数并判断该数是否能被3整除
55 0
|
4月前
写一个将华氏温度转换成摄氏温度的程序
写一个将华氏温度转换成摄氏温度的程序
76 0
|
11月前
【Leetcode -500.键盘行 -504.七进制数】
【Leetcode -500.键盘行 -504.七进制数】
26 0