1. 程式人生 > >演算法入門經典:WERTYU

演算法入門經典:WERTYU

WERTYU(WERTYU, UVa 10082) 前言:好好努力! 問題: 把手放在鍵盤上時,稍不注意就會往右錯一位。這樣,輸入Q會變成輸入W,輸入J會變成輸入K等。
       輸入一個錯位後敲出的字串(所有字母均大寫),輸出打字員本來想打出的句子。輸入保證合法,即一定是錯位之後的字串。例如輸入中不會出現大寫字母A。
樣例輸入:
O S, GOMR YPFSU/
樣例輸出: I AM FINE TODAY.
【分析】
       (C語言中)每輸入一個字元,都可以直接輸出一個字元,因此getchar是輸入的理想方法。問題在於:如何進行這樣輸入輸出變換呢?一種方法是使用if語句或者switch語句,如”if(c == 'W') putchar('Q')“。但很明顯,這樣做太麻煩。一個較好的方法是使用常量陣列。

用C語言編寫程式,程式碼如下:
//2017.8.4
#include <stdio.h>

char s[ ] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";

int main()
{
	int i, c;
	//int b = 0;
	while((c = getchar()) != EOF){
		for (i = 1; s[i] && s[i] != c; i++);   //找錯位之後的字元在常量表中的位置
		if (s[i])
			putchar(s[i-1]);
		else
			putchar(c);
		//++b;
	}
	//printf("%d",b);
	return 0;
}

總結: 1、在常量陣列c中為什麼有  \\   這”兩個“字元呢?
實際上我們應該想到轉義字元這個概念。不只是在C語言中,在Java、C++中也同樣,用 \\ 這個字元(沒錯,它是一個字元)來表示真正意義上的反斜線即 \ 。
2、關於
while((c = getchar()) != EOF)
這段程式碼,實際上是每輸入一個字母或數字,迴圈就會執行一次,有興趣的同學可以把上面的註釋去掉,看看迴圈的次數。 3、關於
for (i = 1; s[i] && s[i] != c; i++); 
這個迴圈的在程式碼中作用,用來找到輸入當前字母的位置,找到得到 i, 用於下面的操作。
此迴圈在操作意義上,相當於:
for (i = 1; s[i] && s[i] != c; i++){
      ;
} 
即單純做迴圈,不做具體操作。