題目:產生檢查碼(字元應用)
要講這題前,大家要知道每一個字元都代表一個整數,我們都稱他們叫做.......ASCII
我會用C++的觀點來看~~
這學號有13個字元,由左至右,分別從C1~C13標示之。C1~C12是數字,C13是大寫英文字母,也是我們的檢查碼,以下是算式
C13 = 26-(((C1+C3+C7+C5+C9+C11)+3*(C2+C4+C6+C8+C10+C12))%26)
ㄟ,等等,C13不是字母嗎0A0?
麻~~等一下啦~我還沒講完題目
然後那公式的結果是餘數,餘1就是'A';餘2就是'B'.....
也就是說那結果要等於C13字元的字母順序
輸入:
2
123456789012L
098765432100A
輸出:
答對:"yes"
錯誤:"no"
剛開始看要輸入幾筆資料,假設2筆
我們把觀念集中在第1筆
問完使用者要幾筆哩?
先一個輸入值紀錄幾筆,假設much=2
在迴圈裏頭跑兩次輸入學號的輸入
重點來了,假設學號為str
你們會用char str[12]或string str來宣告呢?
最好是用後者,因為char對於你按下Enter會有意見,很多種況會跑掉
string則不會,他就直接看成字串,不會有'\0'出現
找到後來用迴圈一一拿出來丟公式咯>0<
九都媽蝶(*' ^ ')=3
他可是字元喔,怎模做加減
所以其他程式語言是有轉的方式,但是在C++裏頭哩,你可用這招
(int)str[i]-48
i是學號第幾的數字的位置,(int)這就好用啦,直接把字元轉整數
那幹嘛減掉48阿?
你可以不減試試看阿,答案會是他原來的樣子,我們稱它為.......ASCII(這梗用過啦@@)
你們看完後就發現,例如:1好了,他的ASCII就是49,48是0,減掉0的48才是我們要的
那終於把公式裏頭的答案找到ㄖ,再來對學號啦
哦,我知道啦,用同一招(int)把C13轉整數就好啦
是的,但樣減對喔,找一下大小字母的ASCII ,減掉'A'的就好
在這我在補充一下,背ASCII很麻煩對吧,其實你也可以直接打(int)C13-'A'+1
這也是鱷魚(台語)的喔~~
之後答案對了後,想把它印出來,發現無法一次的輸入,在一次的輸出
那是你把結果都在迴圈裡頭阿
解決方法有很多,新手來說就是把結果單讀話,也就是輸出結果越是簡單(像是YES,NO),就可以用記錄值紀錄喔
我們設answer[much]陣列紀錄
對,answer=1;
錯,answer=0;
之後再回圈外埔個判斷迴圈,if=0和=0的狀況
相對印出"YES"和"NO"就好
程式碼:
- #include <iostream>
- #include <string>
-
- using namespace std;
-
- int main()
-
- {
- int a;
- cin >> a;
- for (int c = 0; c<a; c++)
- {
- string s;
- cin >> s;
- int sum = 0;
- for (int d = 0; d <= 10; d += 2)
- {
- sum += s[d] - 48;
- }
- for (int d = 1; d <= 11; d += 2)
- {
- sum += 3 * (s[d] - 48);
- }
- sum = 26 - sum % 26;
- cout << (char)(sum + 64) << endl;
- }
- return 0;
- }
end
留言列表