读取文本文件并从中构建矩阵,Pascal

时间:2018-01-28 03:18:36

标签: pascal freepascal

有人可以帮我解决这个问题。所以,我需要构造一个矩阵,列数和行数也在矩阵的第一行,我做了例子,所以它更清晰。

4 3  
1 2 3 
5 6 7 
9 10 8 
1 11 13

其中m = 4(行数)且n = 3(列数) 这是文本文件的示例。这样的事情甚至可能吗?

编辑:

 Program Feb;

 const
   max=100;

 type
   Matrix=array[1..max,1..max] of integer;

var datoteka:text;
  m,n:integer;
  counter:integer;

begin
  assign(datoteka,'datoteka.txt');
  reset(datoteka);
  while not eoln(datoteka) do
  begin
    read(datoteka, m);
    read(datoteka, n);
  end;
  repeat
    read eoln(n)
  until eof(datoteka) 
  write (m,n);
end.

我的代码不是很大的帮助,因为我不知道怎么写它。我了解所有基本知识,但只是没有想法如何将它们全部组合在一起。

1 个答案:

答案 0 :(得分:1)

<强>更新

现在你已经更新了你的q,很明显你没有以正确的方式去做,imo。

看看我写的代码来完成任务,然后再看下面的原始答案。

program Matrixtest;

uses
  sysutils;

var
  NoOfCols,
  NoOfRows : Integer;
  Source : TextFile;
  Matrix : array of array of integer;
  FileName : String;
  Row,
  Col   : Integer; // for-loop iterators to access a single cell of the matrix
  Value : Integer;
begin
  //  First, construct the name of the file defining the matrix
  //  This assumes that the file is in the same folder as this app
  FileName := ExtractFilePath(ParamStr(0)) + 'MatrixDef.Txt';
  writeln(FileName);  // echo it back to the screen so we can see it

  //  Next, open the file
  Assign(Source, FileName);
  Reset(Source);

  read(Source, NoOfRows, NoOfCols);
  writeln('Cols: ', NoOfCols, 'Rows: ', NoOfRows);
  SetLength(Matrix, NoOfCols, NoOfRows);

  readln(source);  // move to next line in file

  //  Next, read the array data
  for Row := 1 to NoOfRows do begin
    for Col := 1 to NoOfCols do begin
      read(Source, Value);
      Matrix[Col - 1, Row - 1] := Value;
    end;
  end;

  //  Display the array contents
  for Row := 1 to NoOfRows do begin
    for Col := 1 to NoOfCols do begin
      writeln('Row: ', Row, ' contents', Matrix[Col - 1, Row - 1]);
    end;
  end;

  Close(Source);  //  We're done with the file, so close it to release OS resources

  readln;  // this waits until you press a key, so you can read what's been displayed
end.

原始回答

  

这样的事情是否可能?

当然有可能,否则谁设计了这个任务 - 我认为这是课程 某种 - 不会打扰。

正如@Ken White指出的那样,SO不是代码编写服务,因此我不打算向您展示执行您指定的代码(我花了大约10分钟来编写和测试它),但是以下内容应告诉您自己编写需要了解的内容。

在您的程序中,您可以使用二维array来表示矩阵。快点 谷歌将确认FPC支持多维数组,如果您还不知道,请参阅http://wiki.lazarus.freepascal.org/Multidimensional_arrays

即便如此,你所描述的任务确实很难成为“我的第一个程序”,所以 我将假设程序员对FPC有足够的了解 执行更简单的任务来读取编译时已知的数组 来自文本文件。

任务中的皱纹是你应该读取尺寸(数字 运行时矩阵的行和列,来自包含矩阵内容的文件。

当然,一种(非常浪费的)方式是宣布 具有巨大尺寸的矩阵阵列,比您在实践中所期望的任何尺寸都大 使用上面链接的文章中的数组声明类型。 我想这将得到零分作为任务的答案。

有用解决方案的关键是FPC支持dynamic arrays,其中。{1}} 您可以在运行时设置的尺寸。所以,要使用它,你需要知道

  1. 如何在FPC中声明dynamic array

  2. 如何在运行时设置数组的尺寸,一旦拾取它们 来自你的矩阵定义文件(提示:SetLength是这样做的方法,但是 问题是,你如何将它用于多维数组?)

  3. FPC dynamic array从零开始的事实

  4. 1&amp;的答案2可以通过谷歌搜索找到,并有一个SO答案谷歌 应该找到哪个显示如何做到这两点。

    最简单的应对方式 第3点是编写代码(根据RowColumn变量),就好像 矩阵被声明为array[1..NoOfRows, 1..NoOfColumns]并减去 实际访问数组时,数组中的一个索引,如

    Row := 3;
    Column := 4;
    Value := Matrix[Row - 1, Column - 1];
    

    因此,尝试自己编写代码,看看你是如何进行的。如果您遇到困难,请务必发布一个问题,其中显示您到目前为止所编写的代码,并准确解释它的错误。