演算法入門經典:WERTYU
阿新 • • 發佈:2019-02-01
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語言編寫程式,程式碼如下:
總結: 1、在常量陣列c中為什麼有 \\ 這”兩個“字元呢?
實際上我們應該想到轉義字元這個概念。不只是在C語言中,在Java、C++中也同樣,用 \\ 這個字元(沒錯,它是一個字元)來表示真正意義上的反斜線即 \ 。 2、關於
此迴圈在操作意義上,相當於:
輸入一個錯位後敲出的字串(所有字母均大寫),輸出打字員本來想打出的句子。輸入保證合法,即一定是錯位之後的字串。例如輸入中不會出現大寫字母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++){
;
}
即單純做迴圈,不做具體操作。