作者new052 (洞伍兩)
看板C_and_CPP
標題Re: [問題] 二維陣列的動態配置
時間Sun Jan 13 19:46:53 2013
int (*pstr)[MAX] 的宣告,在概念上像是「 (int[MAX]) *ptr 」
也就是一般的 int *haha; 後,若有執行 haha = haha + 1; 的敘述後,
haha 內記錄的位址會是原本的 haha 加上 sizeof(int)。
而 「 (int[MAX]) *ptr 」這樣的概念(註:語法上不能這樣宣告)
就是在 ptr = ptr + 1; 之後,
ptr 內記錄的位址會是原本的 ptr 加上 sizeof(int[MAX])
而指標這種「記錄位址的變數」
在位址的計算上,有一個等效的公式
&(位址[整數]) ===== 位址+整數
因為指標是記錄位址的變數,所以「位址」的部份可以寫指標的名字。
(看到變數的名字,實際上代換成其值)
而陣列的名字可以代表「陣列起始的位址」
所以「位址」的部份也可以寫成陣列的名字。
以上的位址等效公式兩邊同做間接參考運算後,代表相同位址起始的空間
*(&(位址[整數])) ===== *(位址+整數)
而 *& 這樣先做取址運算再做間接參考運算後的效果,和完全不做效果一樣。
位址[整數] ===== *(位址+整數)
以上所說的等效公式是指實質上等效,
但指標和陣列是不一樣的概念,請勿混為一談。
※ 引述《o07608 (無良記者)》之銘言:
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++2010
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
iostream, iomanip
問題(Question):
大家好,我是一個剛開始自學 C++的程式新手
今天學到參考書的第四章:陣列、字串和指標,開始寫後面的習題
其中有一題,我覺得要用到二維陣列的動態配置
但參考書裡對於多維陣列的動態配置這邊並沒有講的很清楚(也有可能是我還沒看懂)
因此我照著參考書及網路上查到的(符合我現在知識的)資料硬寫下去
寫出來執行之後,理所當然的出問題了......
個人覺得跟動態二維陣列關係比較大,但不知道到底哪裡出問題
也還沒查到適合我現在程度的解決辦法,因此只好把整份code都貼上來
並盡量詳細的解釋每行的想法,希望大家能幫我看看哪裡的觀念錯誤及如何修正
感謝
餵入的資料(Input):
隨便,這裡假設 y, 1, y, 2, y, 3, y, 4, y, 5, y, 6, n
預期的正確結果(Expected Output):
Enter a number('y' to continue or 'n' to exit): y
1
Enter a number('y' to continue or 'n' to exit): y
2
Enter a number('y' to continue or 'n' to exit): y
3
Enter a number('y' to continue or 'n' to exit): y
4
Enter a number('y' to continue or 'n' to exit): y
5
Enter a number('y' to continue or 'n' to exit): y
6
Enter a number('y' to continue or 'n' to exit): n
1 2 3 4 5 3
3.5
錯誤結果(Wrong Output):
輸入的值似乎沒存到陣列裡 + 無窮迴圈
程式碼(Code):(請善用置底文網頁, 記得排版)
#include <iostream>
#include <iomanip>
using std::cin;
using std::cout;
using std::endl;
using std::setw;
int main()
{
const int MAX = 5;
//固定陣列第二維大小為5
int (*pstr)[MAX] = new int[1][MAX]; //宣告一個動態二維陣列
char letter = 'y';
//判斷是否要繼續輸入數字的變數
int count = 0;
//計算輸入的所有字數
double value = 0.0, total = 0.0;
//計算每五個的和及總和
cout << endl
<< "Enter a number('y' to continue or 'n' to exit): ";
cin >> letter;
cout << endl;
//輸入 'y'以接著輸入數字,輸入 'n'停止並作計算
/**************這裡的while迴圈是要把輸入的數字都存到動態二維陣列裡***********/
/***************************並計算一共輸入幾個數字***************************/
while(letter == 'y')
{
cin >> *pstr[MAX]; //把數字輸入到陣列裡
(*pstr)[MAX]++; //陣列指標移到下一個位置
count ++;
//每輸入一個數字,總數就加1
cout << endl
<< "Enter a number('y' to continue or 'n' to exit): ";
cin >> letter;
cout << endl;
}
//這邊預想的結果是,陣列裡每列都會存到我輸入的數字
//一列存5個,存滿換下一列,結果自己做測試時,卻發現
//似乎只有存到最後一個輸入的數字,其他都是亂數
/************這裡的for迴圈是要把陣列裡的數字一列(5個)一列印出來************/
/****************每印一列就算這列的總和及平均,並把平均印出來****************/
for(int i = 0; i < count/5; i++)
//這理想用陣列的列數做控制
{
for(int j = 0; j < 5; j++)
//這是為了把每列的數字都拿出來
{
cout << setw(5) <<
(*pstr + i)[j];
value +=
(*pstr + i)[j];
//這是我自己想的動態二維指標表示法.....
//每次印出來之後,就會加到value上
}
cout << setw(5) << value / 5 << endl;
//印出該列的平均值
total += value;
//加到總和上
value = 0.0;
//歸零
}
//到這裡就會進入無窮迴圈了......
/***這裡的if判斷式是要把陣列最後一列印出來(因為最後一列不一定5個元素全滿)***/
if((count % 5) != 0)
//如果總數不是五的倍數才要進去
{
value = 0.0;
int n = (count % 5);
//算出最後一列有幾個數字
int i = (count / 5);
//算出這是第幾列
for(int j = 1; j <= n; n++)
//把該列數字印出來並加總
{
cout << setw(5) << (*pstr + i)[j];
value += (*pstr + i)[j];
}
cout << setw(5) << value / n << endl;
total += value;
}
/************************最後算出所有數字的平均*************************/
cout << endl << total / count << endl;
return 0;
}
補充說明(Supplement):
因為怕被誤解說只想來版上求習題的答案,因此沒有把題目PO上來
如果看不懂需要題目的話,我可以把題目打上來0.0
--
我是.漫吐版版眾.歐.零.七.六.零.八!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.27.23.168
※ 編輯: o07608 來自: 114.27.23.168 (01/13 18:00)
→ o07608:這樣問果然不行嗎......T_T 01/13 19:18
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.200.176
推 o07608:隔了一個晚上繼續研究...... 01/14 07:58