2017-11-23 12 views
-1

私は形式の入力ファイルを持っている:、
Pascalの入力からリンクリストを作成するには?

()、(n-1)の...(0)

私はパスカル

に以下のようなリストを形成することができますどのように

例えば

type 
    tt = ^t; 
    t = record 
     a: Integer; 
     n: Integer; 
     next: tt 
    end; 


(5 10)、(5~9)、(5~8)、(5~7)、(5,6)、(5)、(5 4)、(5 3) 、(5 2)、(5 1)、(5 0)
画像上にあるはずです:
enter image description here

新しいコード(期待通りに動作します):

program ex4_19; 

type 
    tt = ^t; 
    t = record 
     a: Integer; 
     n: Integer; 
     next: tt 
    end; 

var 
    ukzv, ukrs: tt; 
    inp: text; 
    raDone: boolean; 
    i: integer; 
    str: string; 
begin 
    assign(inp, 'f1.txt'); reset(inp); 
    assign(output, 'out.txt'); rewrite(output); 

    new(ukzv); 
    ukrs:=ukzv; 

    read(inp, str); 
    writeln(str); 

    for i:=1 to length(str) do 
    begin 
    case str[i] of 
     '(': 
     begin 
     raDone:=false; 
     new(ukzv^.next); 
     ukzv:=ukzv^.next; 
     ukzv^.a:=0; 
     ukzv^.n:=0; 
     end; 
     '0' .. '9': 
     begin 
     if raDone = false then 
      ukzv^.a:=ukzv^.a * 10 + (ord(str[i]) - ord('0')) 
     else 
      ukzv^.n:=ukzv^.n * 10 + (ord(str[i]) - ord('0')); 
     end; 
     ' ': 
     begin 
     if raDone = false then 
     begin 
      raDone:=true; 
     end; 
     end; 
     ')': 
     begin 
     ukzv^.next:=nil; 
     end; 
    end; 
    end; 

    ukzv:=ukrs; 

    while ukzv^.next <> nil do 
    begin 
    writeln(ukzv^.next^.a, ' ', ukzv^.next^.n); 
    ukzv:=ukzv^.next; 
    end; 
end. 

秒数後に我々が持っているので、私はエラー「無効な数値形式」を持っています「)」。私は数字が(1〜1000)異なる可能性があるので、 ')'までの数字の読み取り方法はわかりません。

+0

何を試しましたか?どのように失敗しましたか? [so]はコード作成サービスではありません。特定の問題の[mcve]を提供し、それを解決するためのあなたの努力と、どのように不十分であるかを説明する必要があります。 [質問]良い質問を参照してください。 –

+0

@JeffZeitlin申し訳ありません。私はそのタスクをどのように実装するのか分かりません。私は上のコードが誰かを助けるとは思わない。ちょっとだから。 –

+0

開始ヒント:あなたの入力を純粋に文字列として読み取ってから、数字を得るために解析する必要があります。 –

答えて

1

さまざまな方法がありますが、次のようなものがあります。ファイルを文字列変数に読み込むことから始めます。そして

'(5 10), (5 9), (5 8), (5 7), (5 6), (5 5), (5 4), (5 3), (5 2), (5 1), (5 0)' 

文字を通して一度に一つのステップにループ(for..dorepeat..until又はwhile..do)を使用します。 case文を使用してアクションを決定します。

ここでは、1文字あたりの処理はcaseステートメントとして実装するのが簡単です。

レコードの新しい数字がaまたはnになるかどうかを示すブール値(たとえば、raDone: boolean)が必要です。

Get next char, '(', you know it's time to link in a new record (`r` in the following). 
Get next char, '5', it's a digit and `not raDone`, so you accumulate `r.a` with it. See below! 
Get next char, ' ', it's a space and `not raDone`, you know that entry for `r.a` has ended, set `raDone` to indicate next digits belong to `r.n`. 
Get next char, '1', it's a digit and `raDone`, so you accumulate `r.n` with it. 
Get next char, '0', it's a digit and `raDone`, so you accumulate `r.n` with it. 
Get next char, ')', you know the entry for the current record is ready. 
Get next char, comma, nothing to do, just skip it 
Get next char, ' ', space, nothing to do, just skip it 

(文字から変換)小数点以下の桁のバイナリ値(r.n言う)に蓄積する:

r.n := r.n * 10 + (ord(decimal character) - ord('0'); 

をあなたはおそらく、入力文字列内の誤った内容のエラーチェックを追加します。

+0

これは一般に「積算」と呼ばれています(または単に積算されます) –

+0

ありがとう@ルディは、この文脈で適切な感じを蓄積します。 –

+0

@TomBrunberg私はあなたに感謝して言うことを忘れています。ありがとう –

関連する問題