0
点赞
收藏
分享

微信扫一扫

WERTYU


Problem 1343 WERTYU

Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

Input

Input consists of several lines of text. Each line may contain digits, spaces, upper case letters (except Q, A, Z), or punctuation shown above [except back-quote (`)].


Output


Input consists of several lines of text. Each line may contain digits, spaces, upper case letters (except Q, A, Z), or punctuation shown above [except back-quote (`)].


Sample Input

O S, GOMR YPFSU/


Sample Output

I AM FINE TODAY.



       把手放在键盘上时,稍不注意就会往右错一位。这样,输入Q会变成输入W,输入J会变成输入K等。
       输入一个错位后敲出的字符串(所有字母均大写),输出打字员本来想打出的句子。输入保证合法,即一定是错位之后的字符串。例如输入中不会出现大写字母A。
样例输入:
O S, GOMR YPFSU/
样例输出:
I AM FINE TODAY.
【分析】
       (C语言中)每输入一个字符,都可以直接输出一个字符,因此getchar是输入的理想方法。问题在于:如何进行这样输入输出变换呢?一种方法是使用if语句或者switch语句,如”if(c == 'W') putchar('Q')“。但很明显,这样做太麻烦。一个较好的方法是使用常量数组。
用C语言编写程序,代码如下:

#include<stdio.h>
char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main() {
int i, c;
while ((c = getchar()) != EOF) {
for (i = 1; s[i] && s[i] != c; i++);//找错位之后的字符在常量表中的位置
if (s[i]) putchar(s[i - 1]);//如果找到,则输出它的前一个字符
else putchar(c);
}
return 0;
}


运行程序,输入样例,结果如下:

WERTYU_java



       需要注意的两个地方,或者说有疑问的两个地方:

1、在常量数组c中为什么有  \\   这”两个“字符呢?

实际上我们应该想到转义字符这个概念。不只是在C语言中,在Java、C++中也同样,用 \\ 这个字符(没错,它是一个字符)来表示真正意义上的反斜线即 \ 。我们可以做一个小测试:

(用Java语言测试也好,用C语言测试也罢)

java版:

public class Test {
public static void main(String[] args) {
char test = '\\';
System.out.println(test);
}
}

输出结果如下:

WERTYU_java_02


C版:

#include<stdio.h>
int main() {
char test[] = "\\";
printf("%d\n", strlen(test));
return 0;
}

输出结果如下:

WERTYU_WERTYU_03


       从结果我们可以看出,\\ 表示反斜线 \。这是值得注意的一点。

2、为什么可以直接将 s[i] 作为循环的判断条件呢?

       因为当在char数组中,元素s[i]的ASCII码值大于0,条件为真,当循环到达数组最后时,由于char数组以'\0'结尾,所以s[i] == '\0',而空字符的ASCII码恰好为0,条件为假,据此可以用来判断循环是否到达数组末尾,同时可以作为下一个 if 语句的判断条件。

举报

相关推荐

0 条评论