close
題目:產生檢查碼(字元應用)
 
要講這題前,大家要知道每一個字元都代表一個整數,我們都稱他們叫做.......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"就好
 
程式碼:
  1. #include <iostream>    
  2. #include <string>    
  3.  
  4. using namespace std;  
  5.  
  6. int main()  
  7.  
  8. {  
  9.     int a;  
  10.     cin >> a;  
  11.     for (int c = 0; c<a; c++)  
  12.     {  
  13.         string s;  
  14.         cin >> s;  
  15.         int sum = 0;  
  16.         for (int d = 0; d <= 10; d += 2)  
  17.         {  
  18.             sum += s[d] - 48;  
  19.         }  
  20.         for (int d = 1; d <= 11; d += 2)  
  21.         {  
  22.             sum += 3 * (s[d] - 48);  
  23.         }  
  24.         sum = 26 - sum % 26;  
  25.         cout << (char)(sum + 64) << endl;  
  26.     }  
  27.     return 0;  
  28. }
 
end
arrow
arrow
    全站熱搜

    佑佑 發表在 痞客邦 留言(0) 人氣()