C++ 反轉和動態陣列

參考許多圖書館書籍以及講義

甚至爬文過後還是不解

請各位大師幫幫忙 謝謝 !!!

不可使用全域變數

並附上演算法、程式、輸入資料、及執行結果

同時請依程序抽象化原則設計函式

因此必須列出函式的前置條件與後置條件。

(1)

請設計一個完整的C++ 程式來輸入一個 C-string 到一個文字陣列中,再將存放於文字陣列中的 C-string反轉,最後請輸出這個反轉後的C-string,例如:輸入一個 C-string 為 abc,則反轉後的C-string為 cba;在將C-string反轉過程中,必需使用兩個 pointer 變數 front 及 rear 來指向 C-string 的前端與尾端,再藉由對調這兩個 pointer 變數所指的陣列元素內之文字來進行,顯然在對調文字之後,pointer 變數 front 要往 ”前” 移到下一個文字,而pointer 變數要往 “後” 移到下一個文字,這個過程重覆進行,直到整個C-string被反轉之後才停止。

(2)

由於在 C++ 中的整數變數所能容納的整數範圍有限,大約是十個位數,所以必需使用動態陣列(dynamic array)來存放任意位數的整數,例如:整數1234可用陣列 a 來存放,其中個位數4 放在 a[0],十位數 3放在 a[1],百位數 2放在 a[2],依此類推;請設計程式來進行兩個任意位數的整數相加工作,在此程式中,顯然整數必需以文字(character)的方式輸入,請用手算的加法程序來進行整數相加,最後請輸出這兩個整數及其整數相加的結果。

1 Answer

Rating
  • 1 decade ago
    Favorite Answer

    (1)

    這一題是很典型的指標操作題目,如果對指標熟悉的話應該不難。

    字串有奇數個字:

    □□□□□□□

    ↑     ↑

    F     R

    □□□□□□□

     ↑   ↑

     F   R

    □□□□□□□

      ↑ ↑

      F R  <-終止

    □□□□□□□

       ↑

       F

       R   <-終止

    字串有偶數個字:

    □□□□□□□□

    ↑      ↑

    F      R

    □□□□□□□□

     ↑    ↑

     F    R

    □□□□□□□□

      ↑  ↑

      F  R

    □□□□□□□□

       ↑↑

       FR   <-終止

    根據題目敘述,若有奇數個字則終止條件是front和rear指到同一個字,或是指到正中間的左右兩個字(正中間的字可保留不必操作);若有偶數個字則終止條件為front和rear相鄰。故可推論需要操作的次數為字數的一半。

    (code)

    #include <cstdlib>

    #include <iostream>

    using namespace std;

    void reverse(char *ch);

    int main(int argc, char *argv[])

    {

    char input[100];

    cout << "Please input a string : \n";

    gets(input); //讀入一整行文字(空格也算一個字元)

    reverse(input); //將字串反轉

    cout << input << "\n"; //秀出字串

    system("PAUSE");

    return EXIT_SUCCESS;

    }

    void reverse(char *ch)

    {

    char *front, *rear, tmp[1];

    int i;

    front = &ch[0]; //將front指到第一個字的位置

    rear = &ch[strlen(ch)-1]; //將rear指到最後一個字的位置

    for ( i = 0 ; i < (strlen(ch)/2) ; i++ ) //(可參考上面推論的終止條件)

    {

    tmp[0] = *front; //交換front和rear指到的文字

    *front = *rear;

    *rear = tmp[0];

    front = front + 1; //front前進一格

    rear = rear - 1; //rear後退一格

    }

    }

    2009-04-03 01:27:55 補充:

    (2)

    如果直接將數字當成字串讀進陣列a的話,1234的千位數會放在a[0]而個位數會放在a[3],所以根據題目的意思,我們讀進字串後要先做字串反轉的動作(可直接用上一題寫好的的函數來做)。

    2009-04-03 01:31:05 補充:

    #include

    #include

    using namespace std;

    void reverse(char *ch);

    int main(int argc, char *argv[])

    {

    char int1[100], int2[100], tmp[100];

    int int1_tmp, int2_tmp, carry;

    int i, n;

    cout << "Please input an integer : "; //輸入第一個數字

    cin >> int1;

    2009-04-03 01:32:04 補充:

    while(1) //判斷所輸入的數字是否正確

    {

    n=0;

    for ( i=0 ; i < strlen(int1) ; i++)//若包含非數字的字元則錯誤

    if ((int1[i] < '0') || (int1[i] > '9'))

    n = 1;

    if (int1[0] == '0')//若最高位數為'0' 則錯誤

    n = 1;

    if (n != 0)

    {

    cout << "Please input a correct integer : ";

    cin >> int1; //若輸入錯誤則重新輸入

    }

    else

    break;

    }

    2009-04-03 01:33:05 補充:

    cout << "Please input another integer : "; //輸入第二個數字

    cin >> int2;

    2009-04-03 01:33:52 補充:

    while(1) //判斷所輸入的數字是否正確

    {

    n=0;

    for ( i=0 ; i < strlen(int2) ; i++)

    if ((int2[i] < '0') || (int2[i] > '9'))//若包含非數字的字元則錯誤

    n = 1;

    if (int2[0] == '0') //若最高位數為'0' 則錯誤

    n = 1;

    if (n != 0)

    {

    cout << "Please input a correct integer : ";

    cin >> int2; //若輸入錯誤則重新輸入

    }

    else

    break;

    }

    2009-04-03 01:34:16 補充:

    if (strlen(int1) < strlen(int2)) //保持第一個數字大於第二個數字

    {

    strcpy(tmp, int1);

    strcpy(int1, int2);

    strcpy(int2, tmp);

    }

    reverse(int1); //依題意將兩字串反轉

    reverse(int2);

    2009-04-03 01:34:27 補充:

    int1[strlen(int1)+1] = '\0'; //在最高位前再補個零,如果有進位會用到

    int1[strlen(int1)] = '0';

    2009-04-03 01:35:37 補充:

    carry = 0;

    for ( i=0 ; i < strlen(int1) ; i++ ) //開始進行加法

    {

    int1_tmp = (int) int1[i] - '0';

    int2_tmp = (int) int2[i] - '0';

    if(i >= strlen(int2))

    int2_tmp = 0;

    2009-04-03 01:35:42 補充:

    if ((int1_tmp + int2_tmp + carry) > 9) //若有進位

    {

    sprintf(tmp, "%d", (int1_tmp + int2_tmp + carry)%10);

    int1[i] = tmp[0];

    carry = (int1_tmp + int2_tmp + carry)/10;

    }

    else //無進位

    {

    sprintf(tmp, "%d", int1_tmp + int2_tmp + carry);

    int1[i] = tmp[0];

    carry = 0;

    }

    }

    2009-04-03 01:36:16 補充:

    if (int1[strlen(int1)-1] == '0') //若最高位無進位,則把自己補的零去掉

    int1[strlen(int1)-1] = '\0';

    reverse(int1); //最後將字串反轉

    2009-04-03 01:36:37 補充:

    cout << "The sum of the two integers is " << int1 << "\n"; //秀出答案

    system("PAUSE");

    return EXIT_SUCCESS;

    }

    2009-04-03 01:37:11 補充:

    void reverse(char *ch) //上題寫的函數

    {

    char *front, *rear, tmp[1];

    int i;

    front = &ch[0];

    rear = &ch[strlen(ch)-1];

    for ( i = 0 ; i < (strlen(ch)/2) ; i++ )

    {

    tmp[0] = *front;

    *front = *rear;

    *rear = tmp[0];

    front = front + 1;

    rear = rear - 1;

    }

    }

    2009-04-03 01:43:48 補充:

    我把code換個地方放

    第一題

    http://nopaste.info/2242735726.html

    第二題

    http://nopaste.info/38045d45b8.html

    有問題再問吧

    Source(s): me, me
Still have questions? Get your answers by asking now.