⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_to_d.h

📁 学生信息管理系统
💻 H
字号:
/************************************************************
字符向双精度实数转换程序模块
主调函数原型:
  double c_to_d(char *str)    //意思就是char 转换成 double型
  使用方法:
  把一个字符串作参数传给str,即可返回一个双精度型的数据
  例如:将字符串"-13232.232"地址传给str,即可返回实数:-13232.232
                         written by 天涯浪子   08.5.11(母亲节)
************************************************************/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define LEN 100

/***************************************************
void main()  //程序编写过程中,本人用主函数来调试这
             //个模块,依个人喜好,可以删掉
{
	double  c_to_d(char *);  //声明实现转换的函数
	char str[LEN];
	gets(str);
	printf("%f\n",c_to_d(str));
}
****************************************************/

double  c_to_d(char *str)    //实现转换的函数
{
	void jianche(double *,char *,int *);//声明检测函数
	int n;
	double dNum;
	for(n=0;*(str+n)!='\0';n++)
		if(!((*(str+n)>='0' && *(str+n)<='9') \
			|| (*(str+n)=='+') \
			|| (*(str+n)=='-') \
			|| (*(str+n)=='*') \
			||(*(str+n)=='/') \
			||(*(str+n)=='%') \
			||(*(str+n)=='^') || \
			(*(str+n)=='.')))
		{printf("err [1]:from < double c_to_d(const char *str) > funcion ,data input error.contain illegal symbol!\n");exit(0);}
	n = strlen(str);
	jianche(&dNum,str,&n); //检测,分离整数部分与小数部分的函数
	return dNum;
}

void jianche(double *pdNum,char *str,int *pn)
{
	*pdNum = 0; //数据初始化;
	void zuanhuan(double *pdNum,char *str,int *pn);//声明整数部分转换函数
	void zuanhuan_(double *pdNum,char *str,int *pn);//声明小数部分转换函数
	char str_1[50],str_2[50],flag_str='\0';
	int i,n1=0,n2=0;
	for(i=0;i<50;i++) {
		*(str_1+i) = '\0';
		*(str_2+i) = '\0';
	}
	if(*str =='.')  //判断第一位是否为点
	{
		for(i=1;*(str+i);i++)
			str_2[i-1] = str[i];
		zuanhuan_(pdNum,str_2,pn);
	}
           else
		   {
			   if(*str =='-' ||*str =='+'){ //对第一位进行二次判断
                flag_str = *str;
			   		for(i=1;*(str+i);i++)
			    str[i-1] = str[i];
					str[i-1] ='\0';
					*pn=*pn-1;
			   }

               for(i=0; *(str+i) !='.' && *(str+i)!='\0'; i++);
				   n1=i;  //统计整数的位数,以确定实参

				   if(*pn == n1)
					   n2=0;
			       else
			   n2=*pn-n1-1;   //统计小数的位数,以确定实参
			 /*  printf("%d,%d\n",n1,n2); */   //编程检测行

			   for(i=0;i<n1;i++)
				   str_1[i] = str[i];
			   for(i=i;str[i];i++)
				   str_2[i-n1]=str[i+1];
			   /* printf("%s\n%s\n",str_1,str_2); */   //编程检测行,检测提取位的正确性

			   zuanhuan(pdNum,str_1,&n1);
			   zuanhuan_(pdNum,str_2,&n2);

			   if(flag_str=='-')
				   *pdNum=-*pdNum;
		   }
}

//整形数据转换函数
void zuanhuan(double *pdNum,char *str,int *pn)
{
  int i;
  for(i=*pn-1;i>=0;i--)
  {
	  switch(*(str+i))
	  {
	  case '0': *pdNum = *pdNum + 0; break;
	  case '1': *pdNum = *pdNum + 1*pow(10,(*pn-i-1)); break;
	  case '2': *pdNum = *pdNum + 2*pow(10,(*pn-i-1)); break;
	  case '3': *pdNum = *pdNum + 3*pow(10,(*pn-i-1)); break;
	  case '4': *pdNum = *pdNum + 4*pow(10,(*pn-i-1)); break;
	  case '5': *pdNum = *pdNum + 5*pow(10,(*pn-i-1)); break;
	  case '6': *pdNum = *pdNum + 6*pow(10,(*pn-i-1)); break;
	  case '7': *pdNum = *pdNum + 7*pow(10,(*pn-i-1)); break;
	  case '8': *pdNum = *pdNum + 8*pow(10,(*pn-i-1)); break;
	  case '9': *pdNum = *pdNum + 9*pow(10,(*pn-i-1)); break;
	  }
  }
}

//小数转换函数
void zuanhuan_(double *pdNum,char *str,int *pn)
{
    int i;
	for(i=0;*(str+i);i++)
		switch(*(str+i))
	{
		case '0': *pdNum = *pdNum + 0 *(1/pow(10,i+1)); break;
		case '1': *pdNum = *pdNum + 1 *(1/pow(10,i+1)); break;
		case '2': *pdNum = *pdNum + 2 *(1/pow(10,i+1)); break;
		case '3': *pdNum = *pdNum + 3 *(1/pow(10,i+1)); break;
		case '4': *pdNum = *pdNum + 4 *(1/pow(10,i+1)); break;
		case '5': *pdNum = *pdNum + 5 *(1/pow(10,i+1)); break;
		case '6': *pdNum = *pdNum + 6 *(1/pow(10,i+1)); break;
		case '7': *pdNum = *pdNum + 7 *(1/pow(10,i+1)); break;
		case '8': *pdNum = *pdNum + 8 *(1/pow(10,i+1)); break;
		case '9': *pdNum = *pdNum + 9 *(1/pow(10,i+1)); break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -