LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1217|回复: 26

新手写代码(改过),还希望大虾再看下

[复制链接]
发表于 2005-1-14 02:38:04 | 显示全部楼层 |阅读模式
请大家帮我看看。
这是我写的将小写阿拉伯数字转换成大写中文的代码?

编辑成功了,但是不能运行

在代码后面我写了,很详细的解释。

希望大家帮下我



#include <stdio.h>
main()
{
double x,y;
char *ch[]={"0","1","2","3","4","5","6","7","8","9"}; //因为UNIX下不能显示中文,只有先中这个代理
char *ch1[]={"w","q","b","s"};  //w是万 q是千 b是百 s是十
char num[2][4];    //存放整数部分的数组
char snum[3];       //存放小数部分的数组
long i,n,j,t,o;
printf("input:");
scanf("%f",&x);   
n=(long)x;            //得到整数部分
y=x-n;                  //得到小数部分
t=(long)y*100+0.5;     //将多少位小数转化成只有两位小数,再转成整数。如0.123就转化为12

for(i=0;n!=2;i++)         //将整数部分存在数组中
{for(o=0;o!=4;o++)
{
num[o]=(char)(n%10);
n/=10;
}
}



for(i=0;t!=0;i++)                 //将小数部分存在数组中
{
snum=(char)(t%10);
t/=10;
}

for(i=0;i<=2;i++)                  //转化部分
{
for(o=3;i>=3;o--)
{
if(num[o]>1 && num[o]<9)       //先判断1-9的数,0后面判断
{printf("%s",ch[(int)num[o]]);    //通过数字输出相应的 中文
printf("%s",ch1[o-1]);                //这是输出  十 百 千   等
}
else if(num[o-1]==0);             //判断0,如果下一位还是0就不输出
else printf("0");

if(i==0) printf("yi");                     //这是判断输出 元  万  亿
else if(i==1) printf("wan");
else if(i==2) printf("yuan");
}
}

if(snum[0]+snum[1]>0)           //小数部分的判断
{
if(snum[0]>0) printf("%sjiao",ch[(int)snum[0]]);
else printf("零");
if(snum[1]>0) printf("%sfen",ch[(int)snum[0]]);
}
}
 楼主| 发表于 2005-1-14 02:44:40 | 显示全部楼层
GCC 提示我说是段错误
回复 支持 反对

使用道具 举报

发表于 2005-1-14 09:12:44 | 显示全部楼层
自己用gdb调试一下吧。
回复 支持 反对

使用道具 举报

发表于 2005-1-14 10:31:12 | 显示全部楼层
#include <stdio.h>
main()
{
double x,y;
char *ch[]={"0","1","2","3","4","5","6","7","8","9"};
char *ch1[]={"w","q","b","s"};
char num[2][4];
char snum[3];
long i,n,j,t,o;
printf("input:");
scanf("%f",&x);
n=(long)x;
y=x-n;
t=(long)y*100+0.5; ‘//将多少位小数转化成只有两位小数,再转成整数。如0.123就转化为12’
                              //这里是个错误,注意C语言中的优先级,
                              //‘()’是最大的,所以 t不管如何都是 =0;
for(i=0;n!=2;i++)      //这种写法不能说错!(另外数组循环关 n 什么事,看不明白)
{for(o=0;o!=4;o++)  //不过这种代码如果给其他程序员看的话,他们不骂才怪!
{                            //有别于大家达成共识的做法!除非这个代码只有你自己看
                             //你可能还对你的这种写法感到高兴呢!:)
num[o]=(char)(n%10);
n/=10;
}
}



for(i=0;t!=0;i++) ‘//将小数部分存在数组中’
                         //为什么用t作为判断的条件!况且 t在上面已经是0了,
                         //所以该循环永远不可能执行
{
snum=(char)(t%10);
t/=10;
}

for(i=0;i<=2;i++)
{
for(o=3;i>=3;o--)    //这里又是瞎写,上面已经令i=0了,怎么还可能 i>=3
                            //下面我也不想在看了!请看我给你的建议!
{
if(num[o]>1 && num[o]<9) //先判断1-9的数,0后面判断
{printf("%s",ch[(int)num[o]]); //通过数字输出相应的 中文
printf("%s",ch1[o-1]); //这是输出 十 百 千 等
}
else if(num[o-1]==0); //判断0,如果下一位还是0就不输出
else printf("0");

if(i==0) printf("yi"); //这是判断输出 元 万 亿
else if(i==1) printf("wan");
else if(i==2) printf("yuan");
}
}

if(snum[0]+snum[1]>0) //小数部分的判断
{
if(snum[0]>0) printf("%sjiao",ch[(int)snum[0]]);
else printf("零");
if(snum[1]>0) printf("%sfen",ch[(int)snum[0]]);
}
}
建议:
如果是初学者,请不要在linux下写程序!因为没有好的调试工具!
还有如果你汇编不好的话,更是不能在其下写程序!在linux要想写好程序的话,要弄懂的东西太多了!

还是直接在windows下用vc写程序(我说的不是写MFC程序,在vc下是可以写纯c/c++程序的,这个你可以给你举个开源软件的例子“bochs",在windows上运行的bochs 就是用vc编译的)吧,比什么Turbo C 好用多了,调试起来又方便!
回复 支持 反对

使用道具 举报

发表于 2005-1-14 11:06:00 | 显示全部楼层
什么叫调试方便?用 IDE 自带的调试器?那才叫不方便呢。仔细设置好的打印消息提供的帮助比一个调试工具提供的要强上不知道多少倍。用 gdb 获得的出错位置和堆栈信息基本上是足够了。在大多数情况下,如果你认为这些加上程序中插入的打印信息还不够的话,只能说明程序写得有问题。

BTW,写 C 程序?当然是在 UNIX/Linux 下最好。就连写汇编程序在 UNIX/Linux 下都比 DOS/Windows 下自然。
回复 支持 反对

使用道具 举报

发表于 2005-1-14 11:26:15 | 显示全部楼层
你说的没错!那是因为你牛,可以看懂gdb调试时的堆栈情况!
linux下写汇编确实不错,并且AT&T汇编可以自己指定用那个寄存器!写嵌入式的汇编更是方便!

那么请问以上对于一个新手,可以做到吗?有多少程序员会在调试时看堆栈情况!
就源码级调试来说,GDB真的那么方便吗?我没有看出来!可能是我不熟!
这样说吧我公司的技术总监在unix做了10几年的开发了,他也没说unix开发起来是多么的爽啊!

IDE的调试环境当然方便!要不然为什么会有那么多IDE环境!并且linux也有IDE的啊!比如什么DDD等!
那你说是为什么?

引用你的话:
“BTW,写 C 程序?当然是在 UNIX/Linux 下最好。就连写汇编程序在 UNIX/Linux 下都比 DOS/Windows 下自然。”

请问好的原因是什么!你不会说我可以得到源代码吧!

我认为看问题不能附带感情!一实用为先!我们都要生存吃饭!
回复 支持 反对

使用道具 举报

发表于 2005-1-14 12:23:53 | 显示全部楼层
1. 调试是一门需要很多技巧的工作。如果是调试自己很熟悉的代码,最快最好的方式不是在程序中设置断点,或者利用调试器单步执行程序,而是在程序中插入必要的信息,加上对程序逻辑的仔细分析和(可能会需要的)用调试器得到的堆栈信息来推理出需要的结果。也就是说,这要虽然需要更多的思考,却可以减少被调试器误导的机率从而减少调试的时间。所以,一旦程序出错就立刻开始调试而不加分析的方法是不适合 UNIX 的,UNIX 比这个要理性得多 自然,就源码级的调试来说,gdb 可能是不如 IDE 中集成的调试器方便,但如果使用图形化的前端 ddd,同样可以方便地完成源码级的调试。
    如果是调试自己不熟悉的代码,就另说了。
2. Linux 下有许多非 IDE 的编程工具有很多。也许你觉得 IDE 更方便。的确,IDE 提供了一个完整的从编写源代码到编译、链接、调试甚至打包发布的环境,但是这是优点也是缺点。优点自是不必说了,缺点在于,由于一切都是包装好了的,自由调整的空间非常小。用 IDE 的人实际上被 IDE 束缚了。我知道 Visual C++ 也提供了在命令行下使用的工具,但是这些工具使用起来实在是不比 Linux 自然。利用分开的工具,你可以仔细检查各个步骤,正重要的是,可以理解整个过程。一些问题的解决是必须建立在对过程的理解上的。IDE 做了过多的隐藏,方便却不实用。
3. 开发 C 程序,单就语言上说在各个系统下是差不多的;如果说到工具,自然是 UNIX/Linux 下的好一些了。原因嘛,上面已经说过了啊
4. 如果你不同意我在上面写的,说明你和我对编程的理解不一样,我们也不必争论了,呵呵
5. DDD 可不是集成开发环境,它只是 gdb 的图形前端。
6. 不会看堆栈情况的程序员,只能说是半个程序员,并不是真正的程序员。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-14 20:26:10 | 显示全部楼层
多谢大家~~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-14 20:26:52 | 显示全部楼层
我改好了再给大家看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-15 09:52:10 | 显示全部楼层

新手写代码(改过),还希望大虾再看下

还是上次的将 阿拉伯数字转化成大写中文的代码!

经过上次各位大虾的教悔,
修改了一下,再给大虾看看.

#include <stdio.h>
main()
{
double x,y;
char *ch[]={"1","2","3","4","5","6","7","8","9"};
char *ch1[]={"w","q","b","s"};
char num[2][4];
char snum[3];
long i,n,j,t,o,y1;
printf("input:");
scanf("%f",&x);
n=(long)x;
y=x-n;
                                    //将整数部分放进数组
for(i=0;i!=3;i++)                //这里是将过位数的一个数字,分被方放进数组中:例如12345678
{for(o=0;o!=4;o++)               //存放的格式就是
{                            //num[0][]={9,8,7,6} num[1][]={5,4,3,2} num[2][]={1,0,0,0}
num[o]=(char)(n%10);           //我这样作的目的是为了通过num[] i 就可以判断是输出 元
n/=10;                       //万 亿 同样也可以同过num[][o] o来判断十 百 千
}
}
//将小数部分放进数组
y=y*100+0.5;

y1=(long)y;
for(i=0;y1!=0;i++)
{snum=(char)(y1%10);
y1=y1/10;}
                                    //判断数组中的数 输出响影的 中文
for(i=2;i>=0;i--){
for(o=3;o>=0;o--){
if((int)num[o]>1 && (int)num[o]<9)      //如果num[][] 是1-9之间就在这处理
{printf("%s",ch[(int)num[o]]);
printf("%s",ch1[o-1]);                         //输出1-9的中文
}
else if(num[o-1]==0);            //如果是num[][o]是0 就判断num[][o-1]是否是0 不是就
else printf("0");                   //输出0的中文 是就跳过
if(i==0) printf("yi");                //判断输出 元 万 亿
else if(i==1) printf("wan");
else if(i==2) printf("yuan");
}

if(snum[0]+snum[1]>0)
{
if(snum[0]>0) printf("%sjiao",ch[(int)snum[0]]);
else printf("0");
if(snum[1]>0) printf("%sfen",ch[(int)snum[0]]);
}
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表