搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 808|回复: 12
收起左侧

为什么输出结果就是不对呢。。。。。

[复制链接]

该用户从未签到

4

主题

14

好友

3071

积分

序章

积分
3071
发表于 2013-4-19 16:15:05 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
题目:


    在很多软件中,输入拼音的首写字母就可以快速定位到某个词条。比如,在铁路售票软件中,输入: “bj”就可以定位到“北京”。怎样在自己的软件中实现这个功能呢?问题的关键在于:对每个汉字必须能计算出它的拼音首字母。

    GB2312汉字编码方式中,一级汉字的3755个是按照拼音顺序排列的。我们可以利用这个特征,对常用汉字求拼音首字母。

    GB2312编码方案对每个汉字采用两个字节表示。第一个字节为区号,第二个字节为区中的偏移号。为了能与已有的ASCII编码兼容(中西文混排),区号和偏移编号都从0xA1开始。

    我们只要找到拼音a,b,c,...x,y,z 每个字母所对应的GB2312编码的第一个汉字,就可以定位所有一级汉字的拼音首字母了(不考虑多音字的情况)。下面这个表给出了前述信息。请你利用该表编写程序,求出常用汉字的拼音首字母。


a 啊 B0A1
b 芭 B0C5
c 擦 B2C1
d 搭 B4EE
e 蛾 B6EA
f 发 B7A2
g 噶 B8C1
h 哈 B9FE
j 击 BBF7
k 喀 BFA6
l 垃 C0AC
m 妈 C2E8
n 拿 C4C3
o 哦 C5B6
p 啪 C5BE
q 期 C6DA
r 然 C8BB
s 撒 C8F6
t 塌 CBFA
w 挖 CDDA
x 昔 CEF4
y 压 D1B9
z 匝 D4D1


【输入、输出格式要求】

    用户先输入一个整数n (n<100),表示接下来将有n行文本。接着输入n行中文串(每个串不超过50个汉字)。

    程序则输出n行,每行内容为用户输入的对应行的汉字的拼音首字母。

    字母间不留空格,全部使用大写字母。

    例如:
    用户输入:
3
大家爱科学
北京天安门广场
软件大赛

    则程序输出:
DJAKX
BJTAMGC
RJDS




我的程序:
#include"stdio.h"
#include"string.h"
main()
{
   char a[23][3]={"啊","芭","擦","搭","蛾","发","噶","哈","击","喀","垃","妈","拿","哦","啪","期","然","撒","塌","挖","昔","压","匝"};
   char c[23]={'a','b','c','d','e','f','g','h','j','k','l','m','n','o','p','q','r','s','t','w','x','y','z'};
   char b[100][102];
   char d[100][102];
   char t[3];
   int n,i,j,k;
   scanf("%d",&n);
   for(i=0;i<n;i++)
     scanf("%s",b[i]);
   for(i=0;i<n;i++)
   {
              j=0;
       while(b[i][j]!='\0')
           {
           t[0]=b[i][j];
                   t[1]=b[i][j+1];
                   t[2]='\0';
                   for(k=0;k<22;k++)
                     if(strcmp(t,a[k])>=0&&strcmp(t,a[k+1])<0)
                       break;
           j=j+2;
      
     }
           d[i][j/2]=c[k];
           
           }
           d[i][j/2]='\0';
   for(i=0;i<n;i++)
   {
           j=0;
         while(d[i][j]!='\0')
              {
             printf("%c",d[i][j]-32);
             j++;
           }
           printf("\n");

      
   }
}
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
发表于 2013-4-19 17:00:16 | 显示全部楼层
是不是你代码的文件格式并不是gbk而导致的呢。windows下文件编码很多是ascii的。。。。或者是这题是交到oj上。。。但oj却用utf-8读你的代码,导致汉字“啊”之类的无法与从scanf读入的gbk汉字形成正确的比较。。。简而言之应该是用他给你的那个表来对编码进行比较。取低位来比较。。。你这样取巧有一定可能失败
等死星人
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

14

好友

3071

积分

序章

积分
3071
 楼主| 发表于 2013-4-19 23:35:36 | 显示全部楼层

有输出结果,但都是(null)
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
发表于 2013-4-19 23:50:38 | 显示全部楼层
紫色的雨 发表于 2013-4-19 23:35
有输出结果,但都是(null)

那是你char d没清零吧。。。。
等死星人
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

14

好友

3071

积分

序章

积分
3071
 楼主| 发表于 2013-4-20 00:03:11 | 显示全部楼层
foodszhu 发表于 2013-4-19 23:50
那是你char d没清零吧。。。。

应该不需要吧,我试试
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
发表于 2013-4-20 00:18:24 | 显示全部楼层
紫色的雨 发表于 2013-4-20 00:03
应该不需要吧,我试试

其实我也不太清楚。。。现在在ubuntu下全utf-8出现不了这些问题。。。明天切windows帮你看看吧。。。
我记得当年我们做过的是utf-8转gbk.。。。一开始不懂。。。一直错。。最后才知道自己在控制台输入的是gbk码。。而oj上是utf-8码。。所以在自己机子上运行对却一直过不了。。。你这可能也是类似情况。。自己输出一下数字而不是字串看下是否正确吧。。
等死星人
回复 支持 反对

使用道具 举报

签到天数: 3 天

连续签到: 1 天

[LV.2]偶尔看看I

41

主题

60

好友

2万

积分

第一章

守望者

积分
21763
发表于 2013-4-20 08:56:40 | 显示全部楼层
嗯 关注一下  @foodszhu  
如果有来生,要做一棵树,站成永恒,没有悲欢的姿势。一半在土里安详,一半在风里飞扬,一半洒落阴凉,一半沐浴阳光,非常沉默非常骄傲,从不依靠从不寻找。
回复 支持 反对

使用道具 举报

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
发表于 2013-4-20 10:58:08 | 显示全部楼层
果然是我昨天想太多啊。。你这没什么问题。。只是d[j/2]=c[k];放错位置了。。。一改就好了。。。昨天废话了半天表示抱歉。。。。

                               
登录/注册后可看大图

[mw_shl_code=c,true]#include <stdio.h>
#include <string.h>
int main()
{
    char a[23][3]= {"啊","芭","擦","搭","蛾","发","噶","哈","击","喀","垃","妈","拿","哦","啪","期","然","撒","塌","挖","昔","压","匝"};
    char c[23]= {'a','b','c','d','e','f','g','h','j','k','l','m','n','o','p','q','r','s','t','w','x','y','z'};
    char b[100][102] = {{0}};
    char d[100][102] = {{0}};
    char t[3] = {0};
    int n,i,j,k;
    scanf("%d",&n);
    for(i = 0; i < n; i++)
    {
        scanf("%s", b);
    }
    for(i=0; i<n; i++)
    {
        j=0;
        while(b[j]!='\0')
        {
            t[0]=b[j];
            t[1]=b[j+1];
            t[2]='\0';
            for(k = 0; k < 22; k++)
                if(strcmp(t, a[k]) >= 0 && strcmp(t, a[k+1]) < 0)
                    break;
            d[j/2]=c[k];
            j=j+2;
        }
    }
    d[j/2]='\0';
    for(i=0; i<n; i++)
    {
        j=0;
        while(d[j]!='\0')
        {
            printf("%c",d[j]-32);
            j++;
        }
        printf("\n");
    }
}[/mw_shl_code]
等死星人
回复 支持 反对

使用道具 举报

该用户从未签到

30

主题

127

好友

2万

积分

技术宅认证程序员

重度中二患者

积分
28325
发表于 2013-4-20 11:01:04 | 显示全部楼层
Mr_Alex 发表于 2013-4-20 08:56
嗯 关注一下  @foodszhu

这我一直在。。。昨天懒得没切windows没办法自己运行一下。。。今早切过来才知道错在哪。。。囧。。。
等死星人
回复 支持 反对

使用道具 举报

签到天数: 5 天

连续签到: 1 天

[LV.2]偶尔看看I

30

主题

20

好友

1万

积分

第一章

积分
10307
发表于 2013-8-21 21:54:31 | 显示全部楼层
楼楼好厉害啊,话说大神们都好厉害,看完代码我瞬间 ,懵了挖
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

37

好友

1万

积分

第一章

积分
18487
发表于 2013-8-22 00:25:04 | 显示全部楼层
我以前也做了个拼音输入法的题。WA的居然是保存格式不一样。导致本机和OJ对不上。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

37

好友

1万

积分

第一章

积分
18487
发表于 2013-8-22 00:27:04 | 显示全部楼层
Description
大家都很熟悉拼音输入法,你们试过去模拟一下拼音输入法的过程么?

Input
首先输入一个拼音列表,每行以“拼音 汉字”的形式输入,比如“wo 我”表示“我”字的拼音是“wo”,会出现拼音相同的情况,比如“wo 我”,“wo 喔”,这时以他们出现的顺序为序号区分,即“wo”这个拼音的第一个字是“我”,第二个字是“喔”。
输入拼音列表以单独的一行“end”结束。
接下来输入若干行询问的拼音,每行以“拼音 序号n”的形式输入,比如“wo 1”。
输入的询问拼音以单独的一行“end”结束。

Output
对于每一行输入询问的拼音,输出一个该拼音的第n个中文(如果n大于该拼音下的中文数,那么就输出该拼音下的最后一个中文)。
如果输入的拼音不存在之前的拼音列表中,则输出单独的一行"NO"。

Sample Input
wo 我
wo 喔
ni 你
ni 泥
end
wo 1
ni 3
ta 2
end
Sample Output


NO
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

37

好友

1万

积分

第一章

积分
18487
发表于 2013-8-22 00:30:22 | 显示全部楼层
开始直接用链表,结果TLE了。然后我就直接读下标,结果服务器一个汉字3个字节,
而我2个字节。。。。。
[mw_shl_code=c,true]#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define max 1001
typedef struct Node
{
    int data;
    char en[max];
    char cn[max*10];
    struct Node *next;
}LNode,*List;
int List_add(List L,char *a)
{
    int ok=0;
    while(L->next!=NULL)
    {
        L=L->next;
        if(strcmp(L->en,a)==0)
        {
            ok=1;
            break;
        }
    }
    if(ok==1)
    {
        char str[10];
        scanf("%s",str);
        strcat(L->cn,str);
    }
    else
    {
        List New=(LNode*)malloc(sizeof(LNode));
        strcpy(New->en,a);scanf("%s",New->cn);
        New->next=L->next;
        L->next=New;
    }
}
int List_show(List L,char *a)
{
    int i=0,n;
    char str[10];
    scanf("%d",&n);
    while(L->next!=NULL)
    {
        L=L->next;
        if(strcmp(L->en,a)==0)
        {
            i=1;
            int len=strlen(L->cn);
            if(n>len/2)
            str[0]=L->cn[len-2],str[1]=L->cn[len-1],str[2]='\0';
            else
            str[0]=L->cn[2*n-2],str[1]=L->cn[2*n-1],str[2]='\0';
            printf("%s\n",str);return 0;
        }
    }
    if(i==0)printf("NO\n");
}
int main()
{
    List L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    char a[max];
    while(scanf("%s",a)!=EOF)
    {
        if(strcmp(a,"end")==0)break;
        List_add(L,a);
    }
    while(scanf("%s",a)!=EOF)
    {
        if(strcmp(a,"end")==0)break;
        List_show(L,a);
    }
    return 0;
}
[/mw_shl_code]
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-5-1 23:37 , Processed in 0.083152 second(s), 19 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

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