1

テキスト ファイルをレコード配列に読み込んでいます。テキスト ファイル内のデータの一部は、プログラムの成績とテストの成績です。プログラムまたはテスト値をレコード内のフィールドとして折りたたむために、整数の配列を宣言できますか? その場合、フィールド内の個々のプログラム値にアクセスするにはどうすればよいですか? たとえば、このようにレコードを宣言できますか? もしそうなら、たとえばtest[3]からデータを入力またはアクセスするにはどうすればよいですか?

nametype = record
  first : string[10];
  mi : string[3];
  last : string[30];
end;
stype = record
  id : integer;
  name : nametype;
  prog : array[1..10] of integer;
  test : array[1..3] of integer;
  progave, quizave : real;
  average : double;
  grade : char;
end;
sarraytype = array[1..100] of stype;
var
  student : sarraytype;

だから、私が立ち往生しているのは、これらの配列を読み取っていると思います。これまでのところ、私の読書のために私は持っています:

procedure TstudentData.openButtonClick(Sender: TObject);
   begin
     var i : integer;
     if open.execute then
     begin
      assignfile(inf,open.FileName);
      reset(inf);
      i := 1;
      while not eof(inf) do with student[i] do
      begin
         readln(inf, id, name.first, name.mi, name.last);
         i := i + 1;
      end;
   end;
   i:=1;
end;

私は他のデータを読み取っていますが、prog および test 配列を読み取る方法について完全に途方に暮れています。

4

1 に答える 1

6

あなたはできる。例によって...

var
  a: sarraytype;
  i, j: integer;
begin
  for i := low(a) to High(a) do
    for j := low(a[i].test) to High(a[i].test) do
      a[i].test[j] := i * 100 + j;
  for i := low(a) to High(a) do
    for j := low(a[i].test) to High(a[i].test) do
      Memo1.Lines.Add(IntToStr(a[i].test[j]));

end;

あなたのコメントへの応答として

var
  a,b: sarraytype;
  i, j: integer;
  fs:TFileStream;
begin
  for i := low(a) to High(a) do
    begin
    for j := low(a[i].test) to High(a[i].test) do
      a[i].test[j] := i * 100 + j;
    a[i].name.first := 'Test' + IntToStr(i);
    end;

  fs := TFileStream.Create('C:\temp\test.bin',fmCreate);
  try
  fs.Write(a,sizeOf(a));
  finally
    fs.Free;
  end;

  fs := TFileStream.Create('C:\temp\test.bin',fmopenRead);
  try
  fs.Read(b,sizeOf(b));
  finally
    fs.Free;
  end;

  for i := low(b) to High(b) do
    begin
    memo1.Lines.Add(b[i].name.first);
    for j := low(b[i].test) to High(b[i].test) do
      Memo1.Lines.Add(IntToStr(b[i].test[j]));

    end;

end;

ところで:

通常のネーミングは

Tnametype = record
  first : string[10];
  mi : string[3];
  last : string[30];
end;
Tstype = record
  id : integer;
  name : nametype;
  prog : array[1..10] of integer;
  test : array[1..3] of integer;
  progave, quizave : real;
  average : double;
  grade : char;
end;

Tsarraytype = array[1..100] of stype;
于 2013-02-07T21:17:37.477 に答える