gpt4 book ai didi

c++ - c++的数组和指针作业

转载 作者:行者123 更新时间:2023-11-30 05:39:54 25 4
gpt4 key购买 nike

这道题首先要写两个函数:

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();
    }

但是,我得到:

[error]: has stopped working ...

最佳答案

这是一段简单的代码,最好通过调试器逐步完成。 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);

两个 for 循环为超出范围的数组访问设置了 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;
}

我在没有编译器的情况下在平板电脑上运行,所以请原谅我。

关于c++ - c++的数组和指针作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32033060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com