注意:你可以认为所有中文字符由两个字节组成,首字节的ASCII值都大于127(也可以理解为signed char型小于0)
题目:
请看下面两段文字:
Kenny喊道:"我来了!"
Kenny喊道:“我来了!”
前面一段文字中由于在中文中使用了英文标点,显得不太美观。本题中你的任务是让任意一段文字美观化。美观化具体要求为将以下字符(串)转换为对应的中文字符:
Kenny喊道:"我来了!"
Kenny喊道:“我来了!”
前面一段文字中由于在中文中使用了英文标点,显得不太美观。本题中你的任务是让任意一段文字美观化。美观化具体要求为将以下字符(串)转换为对应的中文字符:
英文 中文
, ,
. 。
! !
" “或”
<< 《
>> 》
? ?
Input输入文字只有一段。文字中可能含有中英文、符号以及控制符(换行、空格、制表符等)。Output按照要求输出美化后的文字段。 你不用翻译以上指定的符号之外的所有字符。Sample Input
Kenny喊道:"我来了!"
Sample Output
Kenny喊道:“我来了!” 分析:
1.输入一换行符结束。
2.对双引号的处理分两种情况:1)英文的双引号,2)汉字符中也有双引号对后面和前面的干扰。
3.怎样判断汉字符
4.怎样在字符串中切割汉字符
代码如下:
#include<iostream>
#include<string.h>
using namespace std;
#define Max 10000
char source[Max];
char ch1[] = ",";
char ch2[] = "。";
char ch3[] = "!";
char ch4[] = "《";
char ch5[] = "》";
char ch6[] = "?";
char ch7[] = "“";
char ch8[] = "”";
int main()
{
int n = 1;
while (cin.getline(source, Max))
{
int pow = 0;
int len = strlen(source);
char chol[3];
for (int i = 0; i < len; i++)
{
if (source[i] == ','){ printf("%s", ch1); }
else if (source[i] == '.'){ printf("%s", ch2); }
else if (source[i] == '!'){ printf("%s", ch3); }
else if (source[i] == '?'){ printf("%s", ch6); }
else if (source[i] == '<'&&source[i + 1] == '<')
{
i++;
printf("%s", ch4);
}
else if (source[i] == '>'&&source[i + 1] == '>')
{
i++;
printf("%s", ch5);
}
else if (source[i] == '"')
{
if (n%2)
{
printf("%s", ch7);
n++;
}
else
{
printf("%s", ch8);
n++;
}
}
else if (source[i] < 0)
{
chol[pow++] = source[i];
if (pow == 2)
{
chol[pow] = '\0';
printf("%s", chol);
if (strcmp(chol, ch7) == 0){ n++; }
if (strcmp(chol, ch8) == 0){ n++; }
pow = 0;
}
}
else
{
printf("%c", source[i]);
}
}
printf("%c", '\n');
}
return 0;
}
算法分析:由于汉字符占两个字节而英语字符占一个,如果选择将英文字符换成汉字符的思想是不可行的。
因为每次交换都要向后移动部分数组或者将一段段的放到另一个数组中这样就会有遍历出现导致时间变长。
而在oj平台只是测试输出文件的内容是否正确就行。所以所采取的算法就是,遇到要转换的字符直接输出
需要转化的字符就行对字符串本身不做过多操作。
对双引号的处理有两种方法:1.使用奇数偶数,2.使用bool数(其实只要有两面性的表示都可以)
对汉字符的处理,判断char类型是否<0,若为汉字就每次存储两个字节在数组中就行。
数据结构:
对”“,《》因为是两个字节,所以必须以字符串的形式存储。