パスワードを忘れた? アカウント作成
14510797 journal
日記

yumeの日記: C#学習 20 2

日記 by yume

友人がatcoderのC++入門APG4bの最終課題においついたので、自分も一緒に改めてこの課題をC#で解いてみる。

まず、C#の場合C++と違って入力も出力も勝手が違う。
入力は、この課題の場合
4
int x = 1 ;
int y = x - 5 ;
print_int x + 3 ;
vec a = [ 1 , 2 , x ] ;
print_vec a + [ 4 , 5 , 6 ] ;
というような形で入るようだ。ここで、最初の行は整数で、これから入力する命令文の行数を示す。
命令行数はintで、すべての命令行はstringで受け取ろう。
Main関数はStaticで実行しなきゃならんようなので、
Applicationクラスを作り、そこに必要な処理をすべて書く。
ProgramクラスのMain関数はStaticにしておき、そこでApplicationクラスのインスタンスを生成し、Run関数を実行する。

今見てもかなり複雑な問題だ。まずは問題を切り分けよう。

パッと見、必要なメソッドは:
・命令行のinput(int x = 1 + 2 ;)
・命令の解釈(int宣言、print_int出力宣言、vec配列宣言、print_vec配列出力宣言)
・各種変数の宣言と保持(int x =)
・計算(1 + 2)
・出力(print_int x + 3;)

課題内の変数という概念は、連想配列で保持すればよさそう(keyをstringで、valueをintで保持)
C#の連想配列はDictionaryのようだ。

(これ以降必死すぎて日記残せなかった)

結果はこうなった。

一度解いた問題だし、簡単だろうと思ったが大苦戦だった。
どっかでハマったときのリカバリー力みたいなのが欲しい。

主なハマりどころはvecのあたり。
・うまく動かないとき、スタックしたりエラー吐いたりしたところを軽く行き当たりばったりで治してみたり、refで参照渡しを無駄に使った結果「もうあかん」という感じになり、vec関連のメソッドを全部書き直した。
・Listが参照型だということをちゃんと理解していなかった。ここは「参照型とかあったな……」ってなんとなくの記憶があったのでまだ復帰できたものの。
この2点で大幅に時間を使ってしまった。vec関連だけで3時間は使ったみたい。
それでできあがったコードも「こんなにメソッド必要だっけ?」というような感じ。
前回は課題のヒントをすべて読んでようやく解けたという具合だったので、ヒントを読まずに解けた分、成長している気はする(うろ覚えがヒントになっていたかもしれないけど)。
しかし改めてこの課題を解いて、連想配列やwhileループ、引数のoutとかref、そして値型と参照型について少し復習できたと思う……思いたい。ちょっと明日もう一度読み返しておこう。

  • by Anonymous Coward on 2020年09月29日 13時58分 (#3897073)

    これぐらいの課題になると C/C++ なら yacc & lex あたりを使って
    パーサを自動生成した方が楽ですね

    もちろん自力でコードを書いてもいいですし、私も昔は書いてましたが
    正直自己満足でしかないw

    時間を掛けて試行錯誤すれば誰でもいつかは完成するし、仮にバグがあってもそのバグは中々見つからない

    ここに返信
    • by Anonymous Coward

      まあ既製品が使えるなら言語に関わらずありものを使う方が楽ですね。

typodupeerror

「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常

読み込み中...