题目:
翻译问题
缩率语在公司的语言以及技术文档中都会大量运用。 为了让新员工可以更快地适应公司的文化,更好地阅读公司的文档以及交流,公司决定开发一套专用的翻译系统,把相关文档中的缩率语和专有名词翻译成日常语言。输入数据:
输入数据包含三部分
1. 第一行包含一个整数 N ( N<=10000 ),表示总共有多少个缩率语的词条。
2. 紧接着有 N 行的输入,每行包含两个字符串,以空格隔开。第一个字符串为缩率语(仅包含大写英文字符,长度不超过 10 ),第二个字符串为日常语言(不包含空格,长度不超过 255 ) .
3. 从第 N+2 开始到输入结束为包含缩略语的相关文档。(总长度不超过 1000000 个字符)
输出数据:
输出将缩率语转换成日常语言的文档。(将缩率语转换成日常语言,其他字符保留原样)
输入样例
10
CEO 首席执行长官
CTO 首席技术总监
CFO 首席财务总监
PRO 升迁
BT 变态
BJ 杯具
PM 产品市场部
HR 人力资源部
PMD 产品推广部
MD 市场发展部
公司由CEO李三统领全局,并负责员工的PRO,由CTO张四负责技术,由CFO王五负责财务。公司包括PM、HR、PMD、MD等部门。CFO这人就是一BT,特别抠门,加班也不给员工发奖金,所以他在公司就是我们公司的BJ。
输出样例
公司由首席执行长官李三统领全局,并负责员工的升迁,由首席技术长官张四负责技术,由首席财务长官王五负责财务。公司包括产品市场部、人力资源部、产品推广部、市场发展部等部门。首席财务总监这人就是一变态,特别抠门,加班也不给员工发奖金,所以他在公司就是我们公司的杯具。
注意:
1 . 输入数据中是中英文混合的,中文采用 GBK 编码。
2 . 为保证答案的唯一性,缩率语的转换采用正向最大匹配(从左到右为正方向)的原则。请注意输入例子中 PMD 的翻译。
我的答案:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define MAX 100000
typedef struct dic
{
char shortCut[10];
char refer[255];
struct dic *next;
}dic;
void read(char buffer[],int i,char word[]);
void interprete(dic *head,char word[]);
int main()
{
int line;
int i;
char buffer[MAX];
char word[10];
dic *head,*tmp;
FILE *fp = fopen("record.txt","r");
head = tmp = (dic *)malloc(sizeof(dic));
strcpy(tmp -> shortCut,"");
strcpy(tmp -> refer,"");
tmp -> next = NULL;
if(!fp)
{
printf("ERROR...can't open file\n");
exit(1);
}
fscanf(fp,"%d",&line);
for(i = 0;i < line;i++)
{
tmp -> next = (dic *)malloc(sizeof(dic));
fscanf(fp,"%s%s",tmp -> next -> shortCut,tmp -> next -> refer);
tmp -> next -> next = NULL;
tmp = tmp -> next;
}
/*while(head -> next != NULL)
{
puts(head -> next -> refer);
head = head -> next;
}*/
fscanf(fp,"%s",buffer);
//puts(buffer);
for(i = 0;i < MAX && buffer[i] != '\n' && buffer[i] != '\0';i += 2)
{
if(!isupper(buffer[i]))
printf("%.2s",&buffer[i]); //问题所在,怎么才能输出两个字符的字符串
else
{
read(buffer,i,word);
i += strlen(word);
interprete(head,word);
strcpy(word,"");
}
}
printf("。\n");
return 0;
}
void read(char buffer[],int i,char word[])
{
int j = 0;
while(isupper(buffer[i]))
word[j++] = buffer[i++];
word[j] = '\0';
}
void interprete(dic *head,char word[])
{
while(head -> next != NULL)
{
if(strcmp(head -> next -> shortCut,word) == 0)
{
printf("%s",head -> next -> refer);
break;
}
else
head = head -> next;
}
}
//打印汉字,就是用输出字符串的方式一次打印两个字符
原题是要求输入文本内容,我是为了做题,测试的时候输入太过麻烦,于是就改成了从文件读入。
record.txt内容:
10
CEO 首席执行长官
CTO 首席技术总监
CFO 首席财务总监
PRO 升迁
BT 变态
BJ 杯具
PM 产品市场部
HR 人力资源部
PMD 产品推广部
MD 市场发展部
公司由CEO李三统领全局,并负责员工的PRO,由CTO张四负责技术,由CFO王五负责财务。公司包括PM、HR、PMD、MD等部门。CFO这人就是一BT,特别抠门,加班也不给员工发奖金,所以他在公司就是我们公司的BJ。