C语言程序设计的一道题,一个把阿拉伯数字转换成中文大写数字的程序。我自己编写如下:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言程序设计的一道题,一个把阿拉伯数字转换成中文大写数字的程序。我自己编写如下:相关的知识,希望对你有一定的参考价值。
# include <stdio.h>
# include <string.h>
void ChangeType1(char * px, char * pn, char * pw, int len);
void ChangeType2();
int main(void)
char x[100]; //存放输入数字
char num[10] = '零','一','二','三','四','五','六','七','八','九';
char num2[10] = '零','壹','贰','叁','肆','伍','陆','柒','捌','玖';
char wei[4] = '\0','十','百','千';
char danwei[3] = '\0','万','亿';
char wei2[4] = '\0','拾','佰','仟';
int len; //判断数字长度,限万亿
int lx; //选择转换类型
char * pn = num, * pn2 = num2, * px = x, * pw = wei, * pw2 = wei2, * pdw = danwei;//设定指针变量
printf("请输入您要转换的阿拉伯数字:");
gets(x);
while (len=strlen(x) > 13)
printf("\n");
printf("您输入的数字过大,请重新输入:");
scanf("%s", x);
printf("\n您输入的数字是%s\n", x);
printf("请选择需要转换的类型<类型1/类型2,输入1或者2进行选择>:\t");
scanf("%d", &lx);
len = strlen(x);
ChangeType1(px, pn, pw, len);
/*if (lx==1)
ChangeType1();
else
ChangeType2();
printf();*/ //根据用户选择的类型执行函数
return 0;
void ChangeType1(char * px, char * pn, char * pw, int len)
char str[100];
char a[100];
char * pa; pa = a;
char * pstr; pstr = str;
strcpy(str, &*px);
char str1, str2;
if (len<=4)
while (len>=0)
strncpy(a, str, 1);
*(a+1) = '\0';
strncpy(str, str+1, len);
*(str+len-1) = '\0';
str1 = *(pn+*(pa));
str2 = *(pw+len);
puts(strcat(&str1, &str2));
len = len - 1;
else ; //未完待续……
这个还没写完,但是那个函数怎么在Exe上面没有执行呢?当然哪个大神要是能把整个C程序编写出来就更好了~~~小弟在此拜谢!!
char num2[10] = '零','壹','贰','叁','肆','伍','陆','柒','捌','玖';
char wei[4] = '\0','十','百','千';
char danwei[3] = '万','亿';
char wei2[4] = '拾','佰','仟';
这几个定义不对,因为汉字占两个字节,所要num等的长度要乘以2
wei2和danwei两个,当字符串遇到\0就会结束,所要这样定义是不对的
你要这么定义,也就是定义二维数组
num[10][] = "零",一”,“二”,“三”,“四”,“五”,“六”,“七”,“八”,“九”;
其他的汉字定义也一样,我就不写了,下面我利用的时候,就默认改过了
思路,首先判断输入的x的长度,接着转换为0~9
lx=strlen(x);
for(i=0;i<lx;i++)
x[i]=x[i]-'0';
接着就是输出了,这个要交替输出
也就是输出一个x的字符0~9对应的num中的数,接着输出对应的万千亿等标识
代码是
for(i=0;i<lx;i++)
d=lx-i; //这里要计算这个位在这个字符到最后的位置,你懂
//这个可能控制不好,也就是一位的差距,你自己调试一下就可以
puts(num2[x[i]]); //输出x中的数对应的汉字
//接下来输出相应的百千万亿等汉字
if(d==2||d==6||d==10) //在十、十万、十亿位置输出十
puts(wei[0]);
if(d==3||d==7||d==11) //在百,百万、百亿位置输出百
puts(wei[1]);
if(d==4||d==8||d==12) //在千,千万,千亿位置输出千
puts(wei[2]);
if(d==5) //在万位输出万
puts(danwei[0]);
if(d==9) //在第九位输出亿
puts(danwei[1])
本回答被提问者采纳
程序员面试50题—把字符串转换成整数[算法]
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题。建议读者在往下看之前自己先编写代码,再比较自己写的代码和下面的参考代码有哪些不同。
首先我们分析如何完成基本功能,即如何把表示整数的字符串正确地转换成整数。还是以"345"作为例子。当我们扫描到字符串的第一个字符‘3‘时,我们不知道后面还有多少位,仅仅知道这是第一位,因此此时得到的数字是3。当扫描到第二个数字‘4‘时,此时我们已经知道前面已经一个3了,再在后面加上一个数字4,那前面的3相当于30,因此得到的数字是3*10+4=34。接着我们又扫描到字符‘5‘,我们已经知道了‘5‘的前面已经有了34,由于后面要加上一个5,前面的34就相当于340了,因此得到的数字就是34*10+5=345。
分析到这里,我们不能得出一个转换的思路:每扫描到一个字符,我们把在之前得到的数字乘以10再加上当前字符表示的数字。这个思路用循环不难实现。
由于整数可能不仅仅之含有数字,还有可能以‘+‘或者‘-‘开头,表示整数的正负。因此我们需要把这个字符串的第一个字符做特殊处理。如果第一个字符是‘+‘号,则不需要做任何操作;如果第一个字符是‘-‘号,则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。
接着我们试着处理非法输入。由于输入的是指针,在使用指针之前,我们要做的第一件是判断这个指针是不是为空。如果试着去访问空指针,将不可避免地导致程序崩溃。另外,输入的字符串中可能含有不是数字的字符。每当碰到这些非法的字符,我们就没有必要再继续转换。最后一个需要考虑的问题是溢出问题。由于输入的数字是以字符串的形式输入,因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。
现在已经分析的差不多了,开始考虑编写代码。首先我们考虑如何声明这个函数。由于是把字符串转换成整数,很自然我们想到:
int StrToInt(const char* str);
这样声明看起来没有问题。但当输入的字符串是一个空指针或者含有非法的字符时,应该返回什么值呢?0怎么样?那怎么区分非法输入和字符串本身就是”0”这两种情况呢?
接下来我们考虑另外一种思路。我们可以返回一个布尔值来指示输入是否有效,而把转换后的整数放到参数列表中以引用或者指针的形式传入。于是我们就可以声明如下:
bool StrToInt(const char *str, int& num);
这种思路解决了前面的问题。但是这个函数的用户使用这个函数的时候会觉得不是很方便,因为他不能直接把得到的整数赋值给其他整形变量,显得不够直观。
前面的第一种声明就很直观。如何在保证直观的前提下当碰到非法输入的时候通知用户呢?一种解决方案就是定义一个全局变量,每当碰到非法输入的时候,就标记该全局变量。用户在调用这个函数之后,就可以检验该全局变量来判断转换是不是成功。
enum Status {kValid = 0, kInvalid};
int g_nStatus = kValid;
///////////////////////////////////////////////////////////////////////
// Convert a string into an integer
///////////////////////////////////////////////////////////////////////
int StrToInt(const char* str)
{
g_nStatus = kInvalid;
long long num = 0;
if(str != NULL)
{
const char* digit = str;
// the first char in the string maybe ‘+‘ or ‘-‘
bool minus = false;
if(*digit == ‘+‘)
digit ++;
else if(*digit == ‘-‘)
{
digit ++;
minus = true;
}
// the remaining chars in the string
while(*digit != ‘\0‘)
{
if(*digit >= ‘0‘ && *digit <= ‘9‘)
{
num = num * 10 + (*digit - ‘0‘);
// overflow
if(num > std::numeric_limits<int>::max())
{
num = 0;
break;
}
digit ++;
}
// if the char is not a digit, invalid input
else
{
num = 0;
break;
}
}
if(*digit == ‘\0‘)
{
g_nStatus = kValid;
if(minus)
num = 0 - num;
}
}
return static_cast<int>(num);
}
原文:http://zhedahht.blog.163.com/
以上是关于C语言程序设计的一道题,一个把阿拉伯数字转换成中文大写数字的程序。我自己编写如下:的主要内容,如果未能解决你的问题,请参考以下文章