几道简单ACM题的解答----3

题目:                                                 

         翻译问题

缩率语在公司的语言以及技术文档中都会大量运用。 为了让新员工可以更快地适应公司的文化,更好地阅读公司的文档以及交流,公司决定开发一套专用的翻译系统,把相关文档中的缩率语和专有名词翻译成日常语言。 


输入数据: 


输入数据包含三部分 


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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值