2015-08-16 75 views
1

的指針,在這個問題上,首先,你必須寫兩個功能:功課陣列和C++

new_array (char** a, int n, int m): create a two-dimension matrix of characters whose size is m*n. 
del_array (char** a, int n, int m): delete a two-dimension matrix of characters whose size is m*n. 

之後,您使用兩個以上的函數來執行以下任務: 給你一個大尺寸爲M*N的大圖像以及尺寸爲m*n的一些小圖像。每幅圖像都由大小的字符矩陣表示。您的任務是查找每個小圖像在該大圖像中出現的位置數量。

輸入文件:image.inp

輸入文件的第一行包含兩個正整數M和N,它們分別是大圖像的高度和寬度。 每行2 ... M+1N個字符(a ... z,A ... Z)組成,其中描述了大圖像的一行。

隨後,有一些小圖像,你必須找到大圖像。每張小圖像都是以大圖形式寫成的。特別是,有一條線m = 0和n = 0,您必須結束您的查找過程。

輸出文件:image.out

對於輸入文件中的每個小圖像,您必須編寫一個數字,表示該小圖像在大圖像中出現的位置數量。

image.inp   image.out 
4 4     3 
Aaaa     1 
Aaaa 
Aaab 
Aaaa 
2 2 
Aa 
Aa 
2 2 
aa 
ab 
0 0 

我這樣做:

  • 文件頭:image.h

    #ifndef _IMAGE_H_ 
    #define _IMAGE_H_ 
    
    using namespace std; 
    void new_array (char** , int , int); 
    void del_array (char** , int , ); 
    bool small_image(char**,char**,int,int,int,int) 
    int  count_small_image(char** , char** , int ,int ,int ,int); 
    #endif 
    
  • 文件image.cpp

    #include<iostream> 
    #include "image.h" 
    #include <fstream> 
    using namespace std; 
    
    void new_array(char** a, int n,int m) 
    

    { ifstream inStream; inStream.open(「image.inp」);

    a=new char* [m] ; 
        for(int i=0; i<m; i++) 
        { 
         a[i]=new char[n]; 
    
         for(int j=0;j<n; j++) 
          inStream>>a[i][j]; 
        } 
    } 
    
    void del_array(char** a,int m) 
    { 
    
    for(int i=0;i<m ;i++) 
        { 
        delete [] a[i]; 
        } 
        delete [] a; 
    } 
    
    bool small_image(char** a,char** b, int i,int j,int p,int q) 
    { 
    
         for(int u=i;u<i+p;u++) 
         { 
    
          for(int v=j;v<j+q;v++) 
           { 
            if(a[u][v]!=b[u-i][v-j]) return false; 
    
           } 
         } 
    
         return true; 
    
    } 
    int count_small_image(char** a,char** b,int m,int n,int p, int q) 
    { 
    
        int COUNT=0; 
        for(int i=0;i<m;i++) 
         for(int j=0;j<n;j++) 
         { 
    
          if(a[i][j]==b[0][0]) 
          { 
          if((m-i+1)>=p && (n-j+1)>=q) 
          { 
           if(small_image(a,b,i,j,p,q)==false) break; 
           else COUNT++; 
          } 
         } 
        } 
    
    
    return COUNT; 
    } 
    
  • 文件main_count_small_image.cpp

    #include <iostream> 
    #include "image.h" 
    #include <fstream> 
    using namespace std; 
    
    int main() 
    { 
        ifstream inStream; 
        inStream.open("image.inp"); 
        ofstream outStream; 
        outStream.open("image.out"); 
    
        int m,n,p,q; 
        char** a; 
        char** b; 
    
        inStream>>n>>m; 
    
        new_array(a,n,m); 
        inStream>>q>>p; 
    
        new_array(b,q,p); 
    
        int c; 
        c=count_small_image(a,b,m,n,p,q); 
    
        outStream<<c; 
    
        del_array(a,m); 
        del_array(b,p); 
    
        return 0; 
        getchar(); 
    } 
    

但是,我得到:

[錯誤]:已停止工作......

+2

我認爲沒有人可以爲你的代碼指責你......這個問題本身強迫人寫出難看的代碼。誰給你這麼糟糕的問題? –

+0

使用調試器。提示:改變局部變量只會產生局部效應。 –

+0

你能多說一點嗎? Karoly Horvath – Jack

回答

0

你」被告知w榮(或者你誤解了你被告知的)。重寫代碼一樣

這等

你應該讀了函數如何返回值(包括指針)。並且還要了解如何使用指針來實現數組。

+0

好的,非常感謝你 – Jack

1

這是一段簡單的代碼,最好通過調試器逐步完成。 OP將會學到更多的跟蹤執行低於他們將被傳遞給罐頭的答案。

蠻力的作品,但以前的問題有一個答案,提出更好的方法。見How to detect occurrencies of a small image in a larger image?

新的數組方法實現不正確。它無法返回已建立的陣列已被覆蓋,所以我正在跳過它。在規範中沒有任何地方說new_array應該讀取文件中的數據。此外,重新打開文件將需要新的流開始並在重新讀取m和n之前獲取圖像數據。這不被考慮在內。

由於缺乏描述性變量名稱,使得該程序難以閱讀,並且對協助OP非常不利。同樣缺乏合理的縮進和大括號使用。該程序的外觀似乎要求讀者不要提供幫助。

在count_small_image給出的呼叫

count_small_image(a,b,m,n,p,q); 

兩個用於設立外的範圍數組訪問small_image環路。我相信這是爲了防止。

if((m-i+1)>=p && (n-j+1)>=q) 

也許這樣做,但它是一個複雜和笨拙的方式來做到這一點。記住:代碼沒有寫沒有錯誤。相反,嘗試沿着

for(int m = 0; m < largeMaxM - smallMaxM; m++) 
{ 
    for(int n = 0; n < largeMaxM - smallMaxN; n++) 

線在哪裏smallMaxM和smallMaxN是m和n的小圖像和邊界的東西largeMaxM和largeMaxN是m和n的大圖像的邊界。

小計數也過於複雜。對它進行排序,以便通過遍歷小圖像來消除垃圾。描述性變量名稱也使得該函數更具可讀性。

bool small_image(char** a,char** b, int offsetM,int offsetN,int maxM,int maxN) 
{ 
    for(int m = 0; m < maxM; m++) 
    { 
     for(int n = 0; n < maxN; n++) 
     { 
      if(a[m+offsetM][n+offsetN]!=b[m][n]) return false; 
     } 
    } 
    return true; 
} 

我在沒有編譯器的平板電腦上操作,所以請原諒我,如果我關了一個。

+0

非常感謝你! – Jack