#include <cstdio> //<stdio.h> for C
#include <cstdlib> //<stdlib.h> for C
#include <cmath> //<math.h> for C
#include "const.h"
#define NP 10000
double fn (double A);
main(){
FILE *fr1=fopen("A.txt","r");
FILE *fp1=fopen("B.txt","w");
FILE *fr2=fopen("C.txt","r");
FILE *fp2=fopen("D.txt","w");
int i,N=100;
double A,B,test;
for(i=1;i<=N;i++){
fscanf(fr1,"%lf",&A);
test=fn(A);
fprintf(fp1,"%.16e\t %.16e\n",A,test);
}
//建立矩陣並初始化:
int j=0;
const int p=NP;
//建立1D靜態陣列, p項,每項為0.0
double AA[p]={0.0};
//動態建立1D陣列, p項; 0~(p-1);記得要delete
double *BB=new double[p];
//動態建立2D陣列, p*3項; [0~(p-1)]*[0~2];記得要delete
double (*CC)[3] = new double[p][3];
for(j=0;j<=(NP-1);j++){ //初始化
BB[j]=0.0;
CC[j][0]=0.0;
CC[j][1]=0.0;
CC[j][2]=0.0;
}
//
//矩陣運算
j=0;
for(j=0;j<=(NP-1);j++){
fscanf(fr2,"%lf %lf %lf",&CC[j][0],&CC[j][1],&CC[j][2]);
BB[j]=CC[j][0]+CC[j][1]+CC[j][2];
fprintf(fp2,"%.16e\n",BB[j]);
}
//
delete [] BB;
delete [] CC;
fclose(fr1);
fclose(fp1);
fclose(fr2);
fclose(fp2);
//system("PAUSE");
return 0;
}
double fn (double A)
{
double sin;
sin=sin(A);
return sin;
}
======================================
PS:
- ptt C_and_Cpp版精華區有關二維陣列的宣告:
作者 cppOrz (cppOrz) 看板 C_and_CPP
標題 [心得] C++ 建立動態 2D Array 的幾種方式
個人所知道的幾種常用方法:
一、當第二維度 n 是編譯期常量時:
T (*p)[n] = new T[m][n];
...
delete [] p;
優點:使用方便、語法也不複雜。
缺點:n 不能是執行期變量。
二、兩個維度 m, n 都是變量,基本方法:
T **p = new T*[m];
for (int i=0; i<m; ++i)
{
p[i] = new T[n];
}
...
for (int i=0; i<m; ++i)
{
delete [] p[i];
}
delete [] p;
優點:使用方便。
缺點:非連續儲存,語法繁瑣。
三、用一維陣列模擬
T *p = new T[m*n];
...
delete [] p;
優點:連續儲存。
缺點:使用極不方便。
四、另一種一維陣列模擬法(綜合二與三)
T **p = new T*[m];
p[0] = new T[m*n];
for (int i=1; i<m; ++i)
{
p[i] = p[i-1] + n;
}
...
delete [] p[0];
delete [] p;
優點:連續儲存,使用方便。
缺點:語法繁瑣。
五、使用 std::vector
using std::vector;
vector<vector<T> > p(m, vector<T>(n));
優點:使用方便,語法簡潔,自動管理記憶體,帶有 value 語意,彈
性、擴充性佳(例如可動態增長,選擇性邊界檢查、可自然搭
配標準演算法)。
缺點:非連續儲存,編譯速度下降,程式碼膨脹、執行速度略降,當
m, n 很小的時候,大量使用可能造成記憶體浪費(視實作版本
而定)。
六、使用 boost::multi_array
typedef boost::multi_array<T, 2> Array; // 2D Array
Array array(boost::extents[m][n]);
優點:專為 array 的特性而設計,簡潔高效、可延伸至 n 維,使用
方便,自動管理記憶體,帶有 value 語意,擴充性佳(例如它
支援 sub-view, shape 等觀念和用法)
缺點:某些舊的編譯器應該是編不過。另外用戶必須稍微學習並熟悉
一下它的用法以及 boost 的設計觀念。
◎短評:
就一般的應用場合,個人是最推薦第五種(vector),只有在有極嚴格
的效能需求(低階的核心程式碼,或大量使用小規模的 array)時,才
使用手動配置。另外如果編譯器支援的話,也是建議大家可以學習使用
boost::multi_array(如果是工作需要而限定了編譯器就算了,程式能
跑要緊)。