#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(如果是工作需要而限定了編譯器就算了,程式能
跑要緊)。

arrow
arrow
    全站熱搜

    gtchen 發表在 痞客邦 留言(0) 人氣()