[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > C/C++ > 正文
標準C程式庫--問題例--類型 String
http://home.pchome.com.tw/computer/cpp2000/ (2001-06-01 16:10:00)
Q1:撰寫下列函式,其引數為 string 類別

islower - 引數的內容為小寫字母,刪傳回true
isdigit  - 引數的內容為數字,則傳回 true
isalphabetic - 引數的內容為大小寫字母,則傳回 true
isaplhanumeric  - 引數的內容為大小寫字母或數字時 ,則傳回 true 

A1:須引入 

bool islower(string &text)
{
        for (unsigned int i=0;i        {
                if((text[i] < 'a') || (text[i] >'z')) return false;
        }
        return true;
}

bool isdigit(string &text)
{
        for (unsigned int i=0;i        {
                if((text[i] < '0') || (text[i] > '9')) return false;
        }
        return true;
}

bool isaplhabetic(string &text)
{
        for (unsigned int i=0;i        {
                if(
                    ((text[i] < 'A') || (text[i] >'Z')) &&
                    ((text[i] < 'a') || (text[i] >'z'))
                  ) return false;
        }
        return true;
}

bool isalphanumeric(string &text)
{
        for (unsigned int i=0;i        {
                if(
                    ((text[i] < 'a') || (text[i] >'z')) &&
                    ((text[i] < 'A') || (text[i] >'Z')) &&
                    ((text[i] < '0') || (text[i] >'9'))
                  ) return false;
        }
        return true;
}


--------------------------------------------
Q2:撰寫一函式可以判斷兩字串是否為異位字 ( 長度和字母相同,但順序不同 )。

A2:須引入 

bool anagram(string s1,string s2)
{
        sort(s1.begin(),s1.end());      //將兩字串排序,並比較是否相同
        sort(s2.begin(),s2.end());
        if (s1 == s2) return true;
        return false;
}

--------------------------------------------
Q3:從輸入流讀入一文字檔案,並計算單字個數和平均每個字的長度。

A3:須引入 
void main()
{

        string filename,buffer,word;     //宣告變數
        fstream file;                    //buffer 為資料緩區
        int words=0,allchar=0;           //word 為允許的英文字母
        int start,end;

        //以下為檔案讀取程序,此程式沒有錯誤處理
        cout << "請輸入檔案名稱:";
        cin >> filename;

        file.open(filename.c_str());
        while (!file.eof())              //讀取資料圈
        {
                char ch;
                file.get(ch);
                buffer += ch;
        }
        file.close();

        //合法字母填入
        for (int i=0;i<26;i++)
        {
                word += ('a'+i);
                word += ('A'+i);
        }

        //以下為字母分析
        int len = buffer.length();
        start = buffer.find_first_of(word,0);   //取得第一合法字母位置
        while (start >=0 && start < len)     //檢查取得值是否正確
        {
                end = buffer.find_first_not_of(word,start); //取得第一不合法字母位置
                if (end < 0 && end > len) end = len;        //檢查取得值是否正確
                allchar += (end-start);                     //加總字數
                words++;                                    //單字數加一
                start = buffer.find_first_of(word,end++);   //在取得下一個合法字母位置
        }                                                   //從 end 後的位置開始
        double average = double(allchar) / words;   //型別轉換
        cout << "words = " << words << endl ;       //印出
        cout << "average = " << average << endl;
}
--------------------------------------------
Q4:以繼承的方法,重載 " * " 運算子,使它的功能為--將字串重 n 次。例如 " this" * 3 為 "thisthisthis" 。

A4:須引入 

class NString : public string
{
        public:

                NString operator * (unsigned int);
};

NString NString::operator * (unsigned int n)
{
        NString temp;
        while (n!=0)
        {
                temp += c_str();
                n--;
        }
        return temp;
}
--------------------------------------------
Q5:以繼承的方法,重載 "- " 運算子,使它的功能為--刪除特定字串。如果有重的字串,請刪除最前的字串。

A5:須引入 
class NString : public string
{
        public:
                NString operator - (NString);
};

NString NString::operator - (NString str)
{
        NString temp;
        unsigned int pos1 = string::find(str);
        unsigned int len1 = str.length();
        temp.assign(c_str());
        if (pos1 > 0 && pos1 <= length()) temp.erase(pos1,len1);
        return temp;
}
--------------------------------------------
Q6:以繼承的方法,重載 " int " 型別轉換運算擬,使它能轉換字串中的第一個數字。

A6:須引入 
class NString : public string
{
        public:
                operator int();
};

NString::operator int()
{
        string num("0123456789"),temp;  //所有合法的數字
        int val=0;

        //取得第一個數字的位置
        unsigned int start = find_first_of(num,0);
        unsigned int end = find_first_not_of(num,start);
        temp = substr(start,(end-start));

        //轉換字串成整數
        for (unsigned int i=0;i        {
              val += (temp[i] - '0');    //利用圈來取得每一個字元的數字
              val *= 10;                    //取得後進位,但個位數會移到十位數
        }                                        //除 10 把個位數拉回
        if ( at(start-1) == '-' ) return -val/10;      //數字前一個位置是否為負號
        return val/10;
}
--------------------------------------------

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
標準C程式庫--問題例--類型 String (2001-06-01 16:10:00)
標準C程式庫--標準樣版庫-集合樣版 (2001-06-01 15:00:01)
標準C程式庫--標準樣版庫-雙頭佇列樣版 (2001-06-01 14:08:00)
標準C程式庫--標準樣版庫-串列樣版 (2001-06-01 13:04:00)
標準C程式庫--標準樣版庫-向量樣版 (2001-06-01 12:10:01)
標準C程式庫--標準樣版庫-字串樣版 (2001-06-01 11:00:00)
 

★  樊強制作 歡迎分享  ★