20230325

上週作業檢討

盧冠綸 @ Sprout 2023

維吉尼亞的統計學

維吉尼亞的統計學

可參考的思路:  

用 int 陣列來存要輸出的 26 個數字。  

維吉尼亞的統計學

我要怎麼處理那個二維表格:  

ㄧ、用 if else 處理所有組合。

                慢,有 26 * 26 = 676 種組合

二、用 ASCII code 的運算。

                快,也許很快就能寫好。

維吉尼亞的統計學

用 ASCII code 的運算要怎麼做?

=> 先來找規律:

      'a' 和 'a' 得到 'a'

      'a' 和 'b' 得到 'b'

      'a' 和 'z' 得到 'z'

 

      'b' 和 'a' 得到 'b'

      'b' 和 'b' 得到 'c'

      'b' 和 'z' 得到 'a'

感覺很像加法?

'a' 是 0,'b' 是 1,...

維吉尼亞的統計學

我要怎麼讓 'a' 是 0,'b' 是 1,...?

=> 把它減 'a'!

這樣子,我們就知道,

兩個字母,letter1 和 letter2,會合成什麼新字母了。

=>  (letter1 - 'a') + (letter2 - 'a')              (X

=> ((letter1 - 'a') + (letter2 - 'a')) % 26   (O

%26 是為了避免超出陣列範圍

#include <iostream>
#include <cstring>

int main(){
    // a和b是輸入的兩個字串
    char a[1005], b[1005];
    std::cin >> a >> b;
    unsigned long len = strlen(a);
    // answer是要輸出的陣列,記得初始化!!
    int answer[26] = {0};
    for (unsigned long i=0 ; i<len ; i++){
        int temp = (a[i] - 'a') + (b[i] - 'a');
        answer[temp%26] += 1;
    }
    // 處理輸出 (最後不用空白&換行)
    for (int i=0 ; i<25 ; i++){
        std::cout << answer[i] << " ";
    }
    std::cout << answer[25];
}

答案:  

維吉尼亞的統計學

高強度密碼

高強度密碼

以下是大致的架構:

#include <iostream>
#include <cstring>

int main(){
    cin 密碼
    cin 確認密碼
    確認題目中的各個條件
    if (條件全部達成){
    	std::cout << "Succeeded!" << std::endl;
    }else{
    	std::cout << "Failed!" << std::endl;
    }
}

高強度密碼

要輸出 Succeeded!,有那些條件?

密碼長度至少為 8          ->      用 strlen 處理

確認密碼和密碼一樣     ->      用 strcmp 處理

至少包含一個大寫字母   ->

至少包含一個小寫字母   ->    用迴圈手動找

至少包含一個數字           ->

高強度密碼

密碼長度至少為 8

確認密碼和密碼一樣

if (strlen(password) >= 8)
if (strcmp(password, password2) == 0)

一種思路:把題目的五個條件都用 bool 來存,

                   如果這五個條件都是 true 則註冊成功。

高強度密碼

int length = strlen(password);
for (int i=0 ; i<length ; i++){
    if ((password[i] >= 'A') and (password[i] <= 'Z')){
        // do something
    }else if ((password[i] >= 'a') and (password[i] <= 'z')){
        // do something
    }else if ((password[i] >= '0') and (password[i] <= '9')){
        // do something
    }
}

至少包含一個大寫字母

至少包含一個小寫字母

至少包含一個數字

高強度密碼

以下是這一題的參考做法:(可下拉)

#include <iostream>
#include <cstring>

int main(){
    // 輸入密碼和確認密碼
    char password[1000005], examine[1000005];
    std::cin >> password >> examine;
    
    // 用五個 bool 存五個條件:長度、大寫、小寫、數字、確認密碼
    bool len = false, A = false, a = false, one = false, same = false;
    int length = strlen(password);
    if (length >= 8){
        len = true;
    }
    for (int i=0 ; i<length ; i++){
        if ((password[i] >= 'A') and (password[i] <= 'Z')){
            A = true;
        }
        if ((password[i] >= 'a') and (password[i] <= 'z')){
            a = true;
        }
        if ((password[i] >= '0') and (password[i] <= '9')){
            one = true;
        }
    }
    if (strcmp(password, examine) == 0){
        same = true;
    }
    
    // 如果五個條件都達成,就註冊成功,反之則失敗
    if (len && A && a && one && same){
        std::cout << "Succeeded!" << std::endl;
    }else{
        std::cout << "Failed!" << std::endl;
    }
}

高強度密碼

大家比較常遇到的問題:

沒有給 '\0' 留位置:(testcase 9)

用 for 迴圈看驗證密碼,但未考量到長度問題:

    (testcase 3 : 密碼 Sprout2023,

                             驗證密碼 Sprout20230318)

漏看了一些條件

把一些 && 跟 || 誤用

謝謝大家

20230325 上週作業檢討

By allen522019

20230325 上週作業檢討

  • 230