WERTYU

Problem 1343 WERTYU

Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

A common typing error is to place the hands on the keyboard one row to the right of the correct position. So "Q" is typed as "W" and "J" is typed as "K" and so on. You are to decode a message typed in this manner.

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;
}

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


       需要注意的两个地方,或者说有疑问的两个地方:
1、在常量数组c中为什么有  \\   这”两个“字符呢?
实际上我们应该想到转义字符这个概念。不只是在C语言中,在Java、C++中也同样,用 \\ 这个字符(没错,它是一个字符)来表示真正意义上的反斜线即 \ 。我们可以做一个小测试:
(用Java语言测试也好,用C语言测试也罢)
java版:
public class Test {
	public static void main(String[] args) {
		char test = '\\';
		System.out.println(test);
	}
}
输出结果如下:

C版:
#include<stdio.h>
int main() {
	char test[] = "\\";
	printf("%d\n", strlen(test));
	return 0;
}
输出结果如下:

       从结果我们可以看出,\\ 表示反斜线 \。这是值得注意的一点。
2、为什么可以直接将 s[i] 作为循环的判断条件呢?
       因为当在char数组中,元素s[i]的ASCII码值大于0,条件为真,当循环到达数组最后时,由于char数组以'\0'结尾,所以s[i] == '\0',而空字符的ASCII码恰好为0,条件为假,据此可以用来判断循环是否到达数组末尾,同时可以作为下一个 if 语句的判断条件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值