| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 382 人关注过本帖
标题:运行有BUG 说明在帖子末尾
只看楼主 加入收藏
朱稳
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2011-11-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
运行有BUG 说明在帖子末尾
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30 //30是因为可能怕数组越界
void rmb_units(int k);
void big_write_num(int l);

int main()
{
    char c[N],*p;
    int a,i,j,len,len_integer=0,len_decimal=0;   //len_integer整数部分长度,len_decimal小数部分长度
    printf("--------------------------------------------------------------------------------\n");
    printf("*本程序将阿拉伯数字小写金额转换成中文大写金额!*\n");
    printf("\n--------------------------------------------------------------------------------\n");
    printf("please input (阿拉伯数字小写金额): ¥");
    scanf("%s",c);
    p=c;
    len=strlen(p);
    for(i=0;i<=len-1 && *(p+i)<='9' && *(p+i)>='0';i++); /*求出整数部分的长度*/
        if(*(p+i)=='.' || *(p+i)=='/0')   //*(p+i)=='/0'没小数点的情况
            len_integer=i;
        else
        {
            printf("\nError: 输入有错误,整数部分含有错误的字符!!!!!\n");
            system("pause");
            exit(EXIT_FAILURE);
        }
    if(len_integer>13)
    {
        printf("!---------------超过范围,最大万亿!整数部分最多位!程序暂停!---------------!\n");
        system("pause");
        printf("\n!---------程序继续执行,注意:超过万亿部分只是简单读出数字的中文大写!----------!\n");
    }
    printf("\n===================================转换开始!===================================\n");
    printf("¥%s 的中文大写金额如下所示:\n\n人民币/RMB : ",c);
    /*转换整数部分*/
    for(i=0;i<len_integer;i++)
    {
        a=*(p+i)-'0';
        if(a==0)
        {
            if(i==0)
            {
                if(*(p+1)!='.' && *(p+1)!='/0' && *(p+1)!='0')
                {
                    printf("\n!------------输入有错误!第一位为而后整数部分有非字符,请检查!---=--------!\n");
                    system("pause");
                    printf("\n!--------------程序继续执行,注意:整数部分的剩下部分将被忽略!----------------!\n");
                }
                printf("零圆");
                break;   //若第一个是则忽略其他整数部分
             }
            else if(*(p+i+1)!='0' && i!=len_integer-5 && i!=len_integer-1 && i!=len_integer-9)   //圆、万、亿位为时选择不加零                           {
            {
                printf("");
                continue;                           
            }
                       
                else if(i==len_integer-1 || i==len_integer-5 || i==len_integer-9)   //圆万亿单位不能掉
                {
                    rmb_units(len_integer+1-i);
                    continue;
                }
                    else
                    continue;
            }
               big_write_num(a);              //阿拉伯数字中文大写输出
                rmb_units(len_integer+1-i);   //人民币货币单位中文大写输出
           }
        /*求出小数部分的长度*/
        len_decimal=len-len_integer-1;
        if(len_decimal<0)
            {
                len_decimal=0;
                printf("");   //或正
            }
        if(len_decimal>2)      //只取两位小数
                len_decimal=2;
        //printf("%d----%d-----%d/n",len,len_integer,len_decimal);
        p=c;
        /*转换小数部分*/
        for(j=0;j<len_decimal;j++)    
            {
                a=*(p+len_integer+1+j)-'0';    //定位到小数部分,等价于a=*(p+len-len_decimal+j)-'0';
                if(a<0 || a>9)
                    {
                        printf("\n!!!!---------# Error: 输入有错误,小数部分含有错误的字符!---------!!!!\n");
                        system("pause");
                        exit(EXIT_FAILURE);
                    }
                if(a==0)
                    {
                        if(j+1<len_decimal)
                         {
                             if(*(p+len_integer+j+2)!='0')      
                                printf("");
                             else
                                {
                                 printf("");
                                 break;
                                 }
                         }
                          continue;
                     }
                big_write_num(a);
                rmb_units(1-j);
            }
        printf("\n");
        printf("\n===================================转换完成!===================================\n");
        system("pause");       
    }
    /*人民币货币单位中文大写输出*/
    void rmb_units(int k)
      {
         //相当于const char rmb_units[]="fjysbqwsbqisbqw";
         //"分角圆拾佰仟万拾佰仟亿拾佰仟万";
          switch(k)
              {
                   case 3:case 7:case 11: printf("");break;
                   case 4:case 8:case 12: printf("");break;
                   case 5:case 9:case 13: printf("");break;
                   case 6: case 14:       printf("");break;
                   case 10:               printf("亿");break;
                   case 2:                printf("");break;
                   case 1:                printf("");break;
                   case 0:                printf("");break;
                   default:               break;
              }
      }
    /*阿拉伯数字中文大写输出*/
    void big_write_num(int l)
      {
        //相当于const char big_write_num[]="0123456789";
        //"零壹贰叁肆伍陆柒捌玖"
        switch(l)
             {
                  case 0:printf("");break;
                  case 1:printf("");break;
                  case 2:printf("");break;
                  case 3:printf("");break;
                  case 4:printf("");break;
                  case 5:printf("");break;
                  case 6:printf("");break;
                  case 7:printf("");break;
                  case 8:printf("");break;
                  case 9:printf("");break;
                  default:break;
             }
      }

 
网上找的一段 运行有BUG 如果输入100或者1000之类的数字就会出错
函数功能是将阿拉伯数字转换为大写的中文
2012-04-03 14:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
既然发现运行有问题,就不要这个程序,自己写一个呗。

授人以渔,不授人以鱼。
2012-04-03 14:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
程序代码:
#include <cstdio>
#include <clocale>
#include <string>
#include <conio.h>

// 函数原型
const std::wstring ToCapital(double money);

// 程序入口
void wmain(void)                                            // wmain()表示宽字符程序,可接收宽字符参数
{
    setlocale(LC_ALL, "chs");                               // 使用中文语言

    double money(0.0);
    wprintf_s(L"请输入小写金额:");
    while (wscanf_s(L"%lf", &money) != 1)
    {
        wprintf_s(L"输入错误,请重新输入!\n");
        wprintf_s(L"请输入小写金额:");
    }
    wprintf_s(L"大写:%s\n", ToCapital(money).c_str());

    _getwch();
}

// 功能:将金额数值money转换为中文大写金额字符串
// 返回:若转换不成功返回空串
const std::wstring ToCapital(double money)
{
    const wchar_t Name[] = L"分角元拾佰仟万拾佰仟亿拾佰仟兆";
    const wchar_t Numeral[] = L"零壹贰叁肆伍陆柒捌玖";

    wchar_t str[_countof(Name) * 2];
    wchar_t buffer[81];
    wchar_t* p = nullptr;

    // 将数值转换为小数点后两位的字符串,同时处理四舍五入
    if (swprintf_s(buffer, L"%.2f", money) > static_cast<int>(wcslen(Name) + 1))
    {
        wprintf_s(L"金额溢出!\n");
        return std::wstring();
    }

    // 反转字符串之后消除小数点
    _wcsrev(buffer);
    p = buffer + 2;                                     // 小数点所在位置,这是由前面设定只取小数点后两位决定的
    while (*p != L'\0')
    {
        *p = *(p + 1);
        ++p;
    }
    *p = L'\0';

    // 构造大写金额字符串
    p = str;
    for (int i = 0; i < buffer[i] != L'\0'; ++i)
    {
        *p++ = Name[i];
        *p++ = Numeral[buffer[i] - L'0'];
    }
    *p = L'\0';

    // 返回所需结果
    return std::wstring(_wcsrev(str));
}


[ 本帖最后由 TonyDeng 于 2012-4-3 20:37 编辑 ]

授人以渔,不授人以鱼。
2012-04-03 16:59
lusvan
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-4-3
收藏
得分:0 
朱稳啊 在这里遇到你
2012-04-04 00:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
古时有个皇帝叫“朱温”,你起这个名字,也不怕避忌的。

授人以渔,不授人以鱼。
2012-04-04 04:50
朱稳
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2011-11-2
收藏
得分:0 
回复 4楼 lusvan
请问你是?我认识你吗?还是开玩笑的啊?
2012-04-05 19:08
lusvan
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-4-3
收藏
得分:0 
回复 6楼 朱稳
哎 我们班长也叫朱稳
2012-04-08 15:40
快速回复:运行有BUG 说明在帖子末尾
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019474 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved