龙空技术网

C|问题模拟与数据表示之构造基础数据

小智雅汇 73

前言:

而今你们对“c语言sign函数怎么写”大致比较珍视,看官们都需要知道一些“c语言sign函数怎么写”的相关内容。那么小编在网络上网罗了一些有关“c语言sign函数怎么写””的相关知识,希望朋友们能喜欢,你们一起来学习一下吧!

问题求解要抽象化为数据处理,前提是要有合适的问题模拟与数据表示或事务的数字化,也就是构造合适的数据结构。与此同时,也可以将数据区分为动态的事务性数据和静态的基础数据(常用静态数组或常量数组表示),是否能够构造合适的基础数据,对于问题求解也至关重要。

1 任意进制数的转换

求n整除d的余数,就能得到n的d进制数的最低位数字,重复上述步骤,直至n为0,依次得到n的d进制数表示的最低位至最高位数字。由各位数字取出相应字符,就能得到n的d进制的字符串。

#include <stdio.h>  /* 函数trans将无符号整数n翻译成d(2<=d<=16)进制表示的字符串s */#define M sizeof(unsigned int)*8int trans(unsigned n, int d, char s[]){    static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符 */    char buf[M+1];    int j, i = M;    if(d<2||d>16)    {        s[0]='\0';	/* 不合理的进制,置s为空字符串 */        return 0;	/* 不合理的进制,函数返回0 */    }    buf[i]='\0';    do{        buf[--i]=digits[n%d];	/*译出最低位,对应字符存入对应工作数组中*/        n/=d;    }while(n);                                /* 将译出在工作数组中的字符串复制到s */    for(j=0;(s[j]=buf[i])!='\0';j++,i++);                                /* 其中控制条件可简写成s[j]=buf[i] */    return j;}/* 主函数用于测试函数 trans() */main(){    unsigned int num = 253;    int scale[]={2,3,10,16,1};    char str[33];    int i;    //clrscr();    for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++)    {        if(trans(num,scale[i],str))            printf("%5d = %s(%d)\n",num,str,scale[i]);        else            printf("%5d => (%d) Error! \n",num,scale[i]);    }    printf("\n Press any key to quit...\n");    getch();}
2 阿拉伯数字转换为罗马数字

将整数n(1≤n≤9999)转化成罗马数字。

整数n(1≤n≤9999)与罗马数字表示有以下对应关系:

1000 用一个字符m 来表示,有几个1000 就用几个m 来表示;

900 用两个字符cm 来表示;

500 用一个字符d 来表示;

400 用两个字符cd 来表示;

100 用一个字符c 来表示;有几个100 就用几个c 来表示;

90 用两个字符xc 来表示;

50 用一个字符l 来表示;

40 用两个字符xl 来表示;

10 用一个字符x 来表示;有几个10 就用几个x 来表示;

9 用两个字符iv 来表示;

5 用一个字符v 来表示;

4 用两个字符iv 来表示;

1 用一个字符i 来表示;有几个1 就用几个i 来表示。

为了便于程序处理,将阿拉伯数字与对应的罗马数字表示分存在两个数组中。转换时,从尽可能大的数开始考察,要转换的罗马字符能被当前考察的数相减后仅大于等于0的次数,就是该考察数所对应的罗马数字可连续出现的次数。例如数23,能连续减10两次仅大于等于0,能连续减1三次仅大于等于0,所以其罗马数字有两个字符x和3个字符i,即xxiii。

code:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define ROWS 4#define COLS 4const int nums[ROWS][COLS]={  {1000,1000,1000,1000},		                {900,500,400,100},		                {90,50,40,10},		                {9,5,4,1}};const char *roms[ROWS][COLS]={{"m","m","m","m"},		                {"cm","d","cd","c"},		                {"xc","l","xl","x"},		                {"ix","v","iv","i"}};void D2roman(int decimal,char roman[ ]);void checknum(int val);int main(){    int low,high;    char roman[25];    printf("请输入需要转换的范围(十进制数字):");    scanf("%d %d",&low, &high);        if(low>high)    {        int t = low;        low=high;        high=t;    }    for(;low<=high;low++)    {        D2roman(low,roman);        printf("%d\t%s\n",low,roman);    }    getchar();getchar();    return 0;}void checknum(int val)/*检查参数合理性*/{    if(val<1||val>9999)    {        printf("The number must be in range 1 ~ 9999 \n");        exit(0);    }}void D2roman(int decimal,char roman[ ])/*将整数转换成罗马数字表示*/{    int power,index;    roman[0]='\0';    for(power=0;power<ROWS;power++)        for(index=0;index<COLS;index++)            while(decimal>=nums[power][index])            {                strcat(roman,roms[power][index]);                decimal-=nums[power][index];            }}
3 从键盘读入实数

将从键盘读入的实数字符列转换成实数:

#define ERR 5#define OK 6#include <stdio.h>   /*设实数字符列有以下几种可能形式:数符 整数部分数符 整数部分.数符 整数部分.小数部分数符 .小数部分其中数符或为空,或为字符‘+’,或为字符‘.’,分别表示不带符号、带正号和带负号。整数部分和小数部分至少要有一个数字符组成。上述实数形式说明,在实数转换过程中,同一字符在不同情况下会有不同的意义。为标记当前实数转换的不同情况,程序引入状态变量,由状态变量的不同值表示当前实数转换过程中的不同情况。共有以下多种不同情况:状态变量为0 表示正准备开始转换,还未遇到任何与实数有关的字符;状态变量为1 表示已遇数的数符(符号字符);状态变量为2 表示正在转换实数的整数部分;状态变量为3 表示在未遇数字字符之前先遇小数点,必须要有小数部分;状态变量为4 表示在转换整数部分之后遇小数点,这种情况可以没有小数部分;状态变量为5(ERR)表示转换发现错误;状态变量为6(OK)表示转换正常结束。程序将输入字符分成数的符号字符、数字符、小数点、其他字符等几类,各状态遇各类字符后,应变成的新状态,如下所示。       数符 数字符 小数点 其他字符状态0  1    2      3      ERR状态1  ERR  2      3      ERR状态2  OK   2      4      OK状态3  ERR  4      ERR    ERR状态4  OK   4      OK     OK*/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;}// 状态表/*col:ckind 0符号,1数字,2小数点,3其它 row: status, */const int statbl[ ][4]={  {1,  2,3,  ERR},    /*status 0*/	                {ERR,2,3,  ERR},    /*status 1*/	                {OK, 2,4,  OK},     /*status 2*/	                {ERR,4,ERR,ERR},    /*status 3*/	                {OK, 4,OK, OK}};    /*status 4*//*转换函数表:状态0,1,2遇到数字调用integer;状态3,4遇到数字调用decimal*/const int(*funtbl[ ][4])( )={ {sign,integer,NULL,NULL},// 状态0遇到符号调用sign                        {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;	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();}

-end-

标签: #c语言sign函数怎么写