[爆卦]動態二維陣列 function是什麼?優點缺點精華區懶人包

為什麼這篇動態二維陣列 function鄉民發文收入到精華區:因為在動態二維陣列 function這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者o07608 (無良記者)看板C_and_CPP標題[問題] 二維陣列的動態配置時間Sun Ja...


開發平台(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:這樣問果然不行嗎......T_T 01/13 19:18
linotwo:new int[1][MAX] 只會 new 出 1 * MAX 個 int 的空間, 01/13 21:47
linotwo:注意 overflow 01/13 21:48
linotwo:pstr 用完以後沒有 delete [] pstr; 01/13 21:48
linotwo:pstr++ 會指向下個 row,如果要指向下一個 int, 01/13 21:48
linotwo:可以先宣告 int *ptr = &pstr[0][0]; 01/13 21:49
linotwo:讀入就用 cin >> *ptr; 要指向下一個就 ptr++ 01/13 21:49
linotwo:要取出陣列的值可以用 pstr[i][j] 01/13 21:50
linotwo:或 (*(pstr + i))[j] 以及 *(*(pstr + i) + j) 01/13 21:50
linotwo:印最後一列的迴圈應該是 for(int j = 0; j < n; j++) 01/13 21:51
descent:請問一下原題目是什麼, 為什麼要用到二維陣列 01/13 21:54

題目:

請撰寫一個原生 C++程式,讓他可以接受沒有限制個數的數值,並且這些數值會儲存在

配置於 free store中的一個陣列。這個程式接著會以5個一行的方式,輸出這些數值,

並且後面再加上所輸入之數值的平均值。初始的陣列大小應該具有5個元素。在有需要

的時候,程式會建立一個具有額外5個元素空間的新陣列,並且將原陣列內的數值複製

到新的陣列之中。


恩我承認我原本的程式碼也沒有完全按照題目的意思......像是倒數第二行 O_O

Feis:題目看起來是一維的阿? 我搞錯甚麼了嗎. 01/14 11:05
Feis:不過這題目看起來真饒口. 01/14 11:06

我也覺得沒必要用到二維,可是一維的想不出來要怎麼弄,囧a

EdisonX:照題意,int*arr 先配 5 個,超過時,int *new 配 +5 個, 01/14 14:41
EdisonX:把 arr 全都 copy 到 _new,再釋放 arr, 再配置 arr, 01/14 14:42
EdisonX:再把 _new 複製到 arr... 01/14 14:42

原來題目是這個意思 ._.
※ 編輯: o07608 來自: 114.27.23.168 (01/14 16:26)

你可能也想看看

搜尋相關網站