iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
自我挑戰組

C++30日挑戰之旅系列 第 12

DAY12 比對檔案的技巧(上)

  • 分享至 

  • xImage
  •  

題目:

in:裡面有兩行英文(兩行英文都有跳行、中間都沒有空白、兩行長度都不會超過9487個字母)。
找出兩行英文中,同時存在的英文字母,不管大小寫,'a'視為與'A'相同,輸出結果到out檔。
輸出要求:要都是大寫、要照字母順序、中間不用空白、重複的字母輸出一次就好。

舉例in內容為:

DfHSag
hsCdvz

在out檔輸出:

DHS

備註:若是輸出:HSD\n(沒有按照順序,算錯喔!)


解法

#include<cstring>
#include<fstream>
#include<iostream>

using namespace std;

int main()
{
    ifstream inStream;
    ofstream outStream;
    inStream.open("in");
    outStream.open("out");

    char str1[10000], str2[10000];
    char str[10000], end[10000];

    inStream >> str1;//第一行文字
    for (int i = 0; i < strlen(str1); i++)//in檔第一行儲存到str1陣列中
    {
        if(str1[i]<='z'&& str1[i]>='a')//小寫的情況
        {
            str1[i] = str1[i] - 'a' + 'A';//轉為大寫
        }
    }
    inStream >> str2;//第二行文字
    for (int j = 0; j < strlen(str2);j++)//in檔第二行儲存到str2陣列中
    {
        if(str2[j]<='z'&& str2[j]>='a')//小寫的情況
        {
            str2[j] = str2[j] - 'a' + 'A';//轉為大寫
        }
    }

    int a = 0, b = 0;
    for (int k = 0; k < strlen(str1); k++)//第一行長度
    {
        for (int l = 0; l < strlen(str2);l++)//第二行長度
        {
            start:
                if(str1[k]==str2[l])//字相同的情況
                {
                    str[a] = str1[k];
                    if(a==0)
                    {
                        end[b] = str[a];
                        b++;
                    }

                    for (int t = 0; t < a;t++)
                    {
                        if(str[a]!=str[t])
                        {
                            if(t==a-1)
                            {
                                end[b] = str[a];
                                b++;
                            }
                            else
                            {
                                continue;
                            }
                        }
                        else if(str[a]==str[t])
                        {
                            l++;
                            goto start;
                        }
                    }
                    a++;
                }
        }
    }

    char order;
    for (int z = 0; z < strlen(end) - 1;z++)
    {
        for (int s = z+1; s < strlen(end);s++)
        {
            if(end[z]>end[s])
            {
                order = end[z];
                end[z] = end[s];
                end[s] = order;
            }
        }
    }
        for (int c = 0; c < strlen(end); c++)
        {
            outStream << end[c];
        }
    outStream << '\n';

    inStream.close();
    outStream.close();
}

解釋與詳細介紹

第一部分:字串陣列與ASCII Code

在這題中我們會運用到一點ASCII Code的概念。就像我們知道的,電腦只會讀取二位元的數值(0和1),那電腦要怎麼顯示為我們常見的數字或是文字系統呢?這裡介紹一個ASCII Code(美國標準資訊交換碼),他會把二進位的值一一對應為符號,舉例而言英文中大寫"A"就是由二進為"0100 0001"也就是十進位的"65"所代表;小寫"a"則是由"0110 0001",十進位的"97"所表示。這題的轉為大寫觀念便是由ASCII Code中每個小寫英文字母均比大寫英文字母多32的差距(主功能解析部分會介紹更詳細的寫法)來達成。

想知道更多它的對應方式與由來可以參見下列網址
https://zh.wikipedia.org/zh-tw/ASCII

第二部分:主功能解析

這部分就由明天再深入講解!大家可以先多查詢一些ASCII Code的知識~那我們明天見!


參考資料:

  1. https://zh.wikipedia.org/zh-tw/ASCII

上一篇
DAY11 用c++來讀取/寫入檔案
下一篇
DAY13 比對檔案的技巧(下)
系列文
C++30日挑戰之旅43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言