代码之家  ›  专栏  ›  技术社区  ›  ZoranSRB17

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

  •  -2
  • ZoranSRB17  · 技术社区  · 6 年前

    有人能帮我解决这个问题吗。所以,我需要构造一个矩阵,列数和行数也在矩阵的第一行,我将制作和示例,以便更清楚。

    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 回复  |  直到 6 年前
        1
  •  1
  •   MartynA    6 年前

    使现代化

    现在你已经更新了你的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. 如何声明 dynamic array 在FPC中

    2. 如何在运行时设置阵列的维度,一旦您选择了它们 从矩阵定义文件(提示: SetLength 是这样做的,但是 问题是,如何将其用于多维数组?)

    3. FPC 动态数组 是基于零的

    1的答案(&A);2可以通过google找到,有一个答案是SO answer google 应该找到显示如何同时执行这两项操作的方法。

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

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

    所以,试着自己写代码,看看你是怎么做的。如果你被卡住了,一定要贴一张 问题显示您迄今为止所编写的代码,并准确解释其错误。