質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

1回答

729閲覧

freepascalのプログラム 文字型の扱い

ajmtld2635atw

総合スコア0

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

1クリップ

投稿2020/08/21 13:52

編集2020/08/21 16:14

大学の夏休みの課題で、自分一人で解決できなくなってしまいました。もし分かる方がいらっしゃれば教えて下さい。

freepascal データの挿入探索削除列挙のプログラム(実行文部)

freepascal

1 2begin 3 root:=nil; 4 mark:=' '; 5 while mark<>'q' do 6 begin 7 writeln('[r]:登録,[d]:削除,[s]:探索,[e]:データ列挙,[q]:終了'); 8 write('選択キー:'); read(mark); 9 if mark='r' then 10 begin write('登録データ入力:'); read(m); register(m,root) end 11 else if mark='d' then 12 begin write('削除データ入力:'); read(m); delete(m,root) end 13 else if mark='s' then 14 begin write('探索データ入力:'); read(m); search(m,root) end 15 else if mark='e' then 16 begin write('データ一覧:'); enumerate(root); writeln end; 17 writeln; 18 end; 19 writeln('終了'); 20end. 21

自分で文字型markを読みこみ、そのマークの値によって、条件分岐で整数値mの登録、削除、探索、データの列挙、もしくは終了を行う2分木構造プログラムです。
register,delete,search,enumerateは各操作を2分木に行う関数です。
これを実行した時に、
r:登録,[d]:削除,[s]:探索,[e]:データ列挙,[q]:終了
選択キー:r
登録データ入力:7 (①)

選択キー:
r:登録,[d]:削除,[s]:探索,[e]:データ列挙,[q]:終了
選択キー:r (②)
登録データ入力:8

選択キー:
r:登録,[d]:削除,[s]:探索,[e]:データ列挙,[q]:終了
選択キー:e
データ一覧:7,8,

選択キー:
r:登録,[d]:削除,[s]:探索,[e]:データ列挙,[q]:終了
選択キー:q

終了

このように、毎回のループで選択キーが登録されない?(空白になる)ループが一回起きてしまいます。上で言えば、①を打ち込んだあと、すぐに②の行に移るという感じです。

色々自分で試行錯誤したのですが、解決できなかったので、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/08/21 14:15

質問は編集できます。 追記修正しましょう
cateye

2020/08/21 15:39 編集

FreeBSDではなくfpcですね? 言語はPasclで、タグを変えて下さい。・・・出来れば環境(OS・・・FreeBSD?など)も分かると良いのですが・・・ レコードのコードが見えません、コンパイルできるソースを提示して下さい。 function? Procedure? ・・・しばらく触ってないからスペル違うかも^^; ・・・あと、コンパイルオプションは?・・・fpc -Misoとか・・・
cateye

2020/08/21 17:05 編集

read()が悪さしている?・・・様に思うのですがデバッグできませんか? ・・・read()の正確な仕様が不明・・・→私
guest

回答1

0

回答ではありません。
再現されました(1回スキップって、なんだか分からん?)・・・再現可能なコードだけ上げておきます。

pascal

1program test(input,output); 2var 3 c: char; 4 i: integer; 5begin 6 for i:=0 to 9 do begin 7 read(c); 8 writeln('No.', i ,c); 9 end 10 11end.

結果↓
usr ~/Project/pascal % ./tst
1
No. 01
2
No. 1
No. 22
3
No. 3
No. 43
4
No. 5
No. 64
5
No. 7
No. 85
6
No. 9

環境は
Linux mint 20.0
Free Pascal Compiler version 3.0.4+dfsg-23 [2019/11/25] for x86_64
[追記]
read(c);をreadln(c);にしたら治りましたが・・・・改行したくないなら、なにか方法を・・・
usr ~/Project/pascal % ./tst
1
No. 01
2
No. 12
3
No. 23
4
No. 34
5
No. 45
6
No. 56
7
No. 67
8
No. 78
9
No. 89
0
No. 90
usr ~/Project/pascal %

投稿2020/08/21 23:44

編集2020/08/22 02:01
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ajmtld2635atw

2020/08/22 00:43

ご返信ありがとうございます。 cateyeさんのプログラムで、なぜ2〜6の入力では、cの値が空欄?でループが一回回ってしまうのでしょうか。 自分のプログラムもおそらく同じです。
Zuishin

2020/08/22 00:57

改行を読んでいるのでは?
Zuishin

2020/08/22 01:08

https://wiki.freepascal.org/Read > Difference between read and readLn ReadLn will in contrast to read consume a trailing line feed. It is discarded and does not have any influence on how to save supplied data.
ajmtld2635atw

2020/08/22 01:39

2を入力したあと、 No. 12 という表示はなぜされないのでしょうか。
Zuishin

2020/08/22 01:44

c が改行コードなら No. 1<改行コード> と表示されると思います。 空行が出力されていないので他のホワイトスペースかもしれませんが、一度文字コードを表示させてみればわかるのではないでしょうか。 read の代わりに readLn を使うことで解決しそうな気がしますが。
cateye

2020/08/22 03:36 編集

ヒント有難うございましたm(_"_)m →Zuishinさん ・・・Pascalは、普段使わない(てか、read,writeの類)ので勉強に成りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問