投稿
nobu divine-creator
「操作をする人が自由に文字を入力した結果、表示される文字は入力した文字とは別の文字になる」という処理が行われるようにするには、どのような方法が考えられますか? できれば、初心者向けの方法から熟練者向けの方法まで、お勧めの方法を教えてください!
1そうだね
プレイ済み
返信[1]
親投稿
まげ MAGE_LOVEMARINE
「別の文字になる」というのが、「別の文章になる」のか、「まったくデタラメな文字の集まりになる」のかで、やることが大きく異なりますね。「きょうはいいてんき」と入力して、「きょうはやなてんき」と出したいのか、「きょひもいなてんば」と出したいのか、です。デタラメでよければ、乱数で文字コードを決めるだけですけど、文章となると…文字解析やらデータベースやらで大変です(^^;)。 …まったく的外れだったらゴメンなさい。
0そうだね
プレイ済み
返信[2]
親投稿
Ryujin T-Kida
完全にポケコンBASICでの話になりますが、文字のASCIIコードに一定の数値を加算/減算して、別の文字に変換するようにしてますね。 所謂暗号化というやつですが。
0そうだね
未プレイ
返信[3]
親投稿
nobu divine-creator
質問の仕方に少々問題があったようで、済みませんでした…! 私が考えているのは文章ではなく、一文字ずつに変換の法則を付ける場合の方法です! 例えば、「A」と入力すると「あ」と表示されるような、入力した文字とは異なる文字が表示されるようにする方法を知りたいのです! そして、そういう法則を複数設定しておいて、操作する人が文字を自由に入力すると、変換された文字が表示されるという状態になれば、質問の処理が可能となります♪
0そうだね
プレイ済み
返信[4]
親投稿
まげ MAGE_LOVEMARINE
日本語入力における「ローマ字変換」的なこと、でしょうか? 「nobu」とキー入力すると、画面に「ノブ」と表示される、みたいな。 となると、使えそうな命令のひとつに、「INSTR」がありますね。 PRINT INSTR("ABCDE","B") 「B」という文字が、「ABCDE」の左から何番目にあるかを返してくれます(1と表示)。ちなみに「B」を「CD」と複数の文字にしても対応します(2と表示)し、「CE」などという含まれていない文字も検知します(-1と表示)。
1そうだね
プレイ済み
返信[5]
親投稿
nobu divine-creator
文字数が異なる変換は複雑過ぎて難しいですよね?(設定しなければならないパターンが多くなってしまうので…。) 私ができそうなのは、一文字ずつに対応する一文字を割り当てる方式だと思われます! 例.「ご」と入力→「た」と表示   「め」と入力→「す」と表示   「ん」と入力→「け」と表示   「ね」と入力→「て」と表示 以上のように、「ある一文字を入力したら、この一文字が表示される」という組み合わせを複数設定しておくプログラムを作りたいのです! なので、例のような設定であれば、「ごめんね」と入力すると「たすけて」と表示されることになりますよね?
0そうだね
プレイ済み
返信[6]
親投稿
ASA fusuian
大きな文字列の配列を作って、 DIC$[ASC("ご")]="た" DIC$[ASC("め")]="す" … という代入文をたくさん並べて変換テーブルを作る。 代入文たくさんはしんどいのでDATA文にするといいと思います。 そして入力された文字列を一つずつ、ASCかけてDIC$に食わすと変換できます。結果が空文字列の場合は元の文字をそのまま出せばOKです。
1そうだね
プレイ済み
返信[7]
親投稿
nobu divine-creator
代入文たくさんは確かに大変と言えますが、初心者向きであるとも言えますね♪ 変換式にDATA文を入力するという方式は、上級者向けですね!こちらのほうがより良いと思えますけど、その全体の入力文がイメージできません…。 どうも初心者は、一つ一つの命令文を理解できても、それらをどのように組み合わせてプログラムの塊を作れば良いのかが、なかなかイメージできるようになりません…!(←私だけかもしれませんが…。)
0そうだね
プレイ済み
返信[8]
親投稿
Godot orz_127
とりあえず乱数表のようなものを作って文字を1対1に変換するだけでよいなら… 入力文字として受け付ける文字を1字づつ並べた文字列を作ります。 A$とします。 もう一つ同じように、ただしA$とは違う順番で並べた文字列を作ります。 とりあえず、逆順でもよいかと。 これをB$とします。 入力された文字をINSTRでA$のどの位置に在るかを調べます。 Cとします。 B$のCの位置の文字を表示してやれば別な文字として表示されます。
2そうだね
プレイ済み
返信[9]
親投稿
ASA fusuian
ループとREAD〜DATAの組み合わせに慣れたら、初級者卒業ですね。 WHILE 1 READ M$,S$ IF M$=="" THEN BREAK DIC$[ASC(M$)]=S$ WEND DATA "ご","た" DATA "め","す" DATA "ん","け" DATA "ね","て" DATA "","" 最後の"",""はここまで来たら終了のマークです。
1そうだね
プレイ済み
返信[10]
親投稿
nobu divine-creator
ASAさんの見本を基に、DATAの文字の組み合わせだけを変更して入力してみましたら、Undefind variableというエラーになってしまいました…。 M$とS$の指定がされていないように思えるのですが、違いますでしょうか? 私がこの見本を組み込んだ方法が、何か間違えているのでしょうか?
0そうだね
プレイ済み
返信[11]
親投稿
nobu divine-creator
Godotさんの仰っる内容は大体理解できましたが、実際にどのようなプログラムを入力したら良いのかが分かりません…(>_<)。 イメージとして、A$とB$の二つの文字列を入力し、それぞれの位置を検索して、表示させるようにする…という流れになることは理解できても、具体的に入力するプログラムの形が命令表などを読んでも分かりません…(>_<)!
0そうだね
プレイ済み
返信[12]
親投稿
まげ MAGE_LOVEMARINE
INSTRを使った、文字変換プログラムです。INPUTで入力された文字を調べて、「ごめんね」を「たすけて」に、おまけで「おはよう」を「おやすみ」に変換します。それ以外は、そのまま表示です。
0そうだね
プレイ済み
返信[13]
親投稿
Godot orz_127
既に まげさんがサンプルを作ってくれてますね。
0そうだね
プレイ済み
返信[14]
親投稿
nobu divine-creator
まげさんのサンプルを基に、変換する文字の部分を独自の設定に変更して実行してみたら、変換自体はできるようになりました!ありがとうございました(^o^)♪ しかし、変換された文字が表示される場所を指定したいのですが、これまでに覚えたLOCATEを使用して指定しても、表示が正しく行われません…(?_?)。 変換された文字の表示場所を任意の場所に指定するには、このプログラムをどう変更したら良いのでしょうか? NEXTの後のPRINTが関係しているのでしょうか?それとも、NEXTの前のPRINTの所を変えられるのでしょうか? ちなみに、NEXTの前を変えようとしたら、エラーになりました…Σ(゚Д゚)!
0そうだね
プレイ済み
返信[15]
親投稿
ASA fusuian
DIM DIC$[ASC("ン")] で、文字配列DIC$を定義すれば動くと思います。
0そうだね
プレイ済み
返信[16]
親投稿
まげ MAGE_LOVEMARINE
FOR...の前の行に、LOCATEで座標指定すればできると思います。例えば座標12,15なら、 LOCATE 12,15 FOR I=0 TO L ですね。ちなみに、14行目のPRINTは、改行させるためだけに入れてあります。これがないと、例えば「ごめんね」と入力した場合の表示結果が、 たすけてOK となっちゃいます。11行目のPRINT M$;の「;(セミコロン)」は、「次に表示される文字を、この後ろにくっつけて表示しろ」っていう印なんですが、これが「OK」までくっつけちゃうんですね(^^;)。試しにセミコロンを消して実行すると、より意味がわかると思います。
1そうだね
プレイ済み
返信[17]
親投稿
Godot orz_127
前のまげさんのサンプルをベースに。 6行目に以下を入れて下さい。 M$="" 8行目を以下に変えて下さい。  M$=M$+MID$(Q$,I,1) 11行目を削除します。 13行目にLOCATE分を入れます。 14行目を以下の様に変更します。 PRINT M$ いかがでしょう?
0そうだね
プレイ済み
返信[18]
親投稿
nobu divine-creator
無事に修正できました!ありがとうございました(^▽^)♪ 今回の場合は、PRINTの直前でLOCATEを指定してもダメなのですね! まだ文字変換プログラムの作り方は理解できていませんが、今回教わったプログラムを使用することで、別の文字変換も可能となりました♪
1そうだね
プレイ済み
返信[19]
親投稿
nobu divine-creator
あと一つだけ改良したい部分があります! 文字を入力する際に長文になると、画面の右端から左端まで使ってしまい、見た目が悪く見辛い文になってしまいます…! 入力する文が表示される範囲を制限するには、どのようにしたら良いのでしょうか?
0そうだね
プレイ済み
返信[20]
親投稿
Godot orz_127
ある程度文字が長くなったら最初の方の文字が見えなくなって画面に見えている文字数は一定ということですか?
0そうだね
プレイ済み
返信[21]
親投稿
nobu divine-creator
確かに、「メチャクチャ長い文を入力されたらどうする?」と言われたら、そこまで長い文を入力されることを想定していなかったので困ってしまいます…。 しかし、あまりにも長い文を入力したい人は、二回以上に分けて入力してもらえば解決となるので、このプログラムの仕様としましては、一画面に収まる長さまでの文が綺麗に見えれば良いとします! なので、左右の端ギリギリまで使わずに、右に余白を開けて折り返し、左にも余白を開けて続きが表示されるようにしたいとお考えください!       例.このような感じで、変換された文字が       表示されるようにできれば、読みやすく       なると思われます!
0そうだね
プレイ済み
返信[22]
親投稿
Godot orz_127
INPUT文での入力は256文字迄のようです。 256 文字フル入力すると結構改行されてしまいます。 そこはどうしましょう? 変換結果だけ見た目が良くなれば良い?
0そうだね
プレイ済み
返信[23]
親投稿
nobu divine-creator
256文字迄ですかΣ(゚Д゚)!(かなり長い文の入力迄できるようになっているのですね!) 使う人がどのくらい長い文を変換しようとするのかは分かりませんけど、作る側としては「入力された文と変換された文」が上下に並んで表示できれば、最良の状態と考えております!       このように入力された文が表示されて、       数行下の同じ位置に変換された文が表示       されれば、一番見やすそうです♪
0そうだね
プレイ済み
返信[24]
親投稿
nobu divine-creator
現在の状態では、上のコメントで示したような位置に表示されるように設定しておりますが、長い文になると右端まで表示され、左端に続くという仕様になっております…。 それを、限定した範囲までで折り返し、左右に余白を開けて表示されるようにできれば…と希望しておりますが、その設定を指定する方法が分からないという状態です…(>_<)。
0そうだね
プレイ済み
返信[25]
親投稿
Godot orz_127
とりあえず、入力時のところを対応するのは、結構面倒なので今回は諦めるとして…。 入力が終わったら一旦画面をクリアして上に入力された文字列、下に変換した文字列という感じにするならできそうですね。 使うのはとりあえず、MID$( )で良い筈です。 挑戦してみて下さい。
0そうだね
プレイ済み
返信[26]
親投稿
まげ MAGE_LOVEMARINE
INKEY$を使って、最大入力字数を制限できるようにしました。見てのとおり、INPUTと比べて、グッと複雑になりますね。
0そうだね
プレイ済み
返信[27]
親投稿
Godot orz_127
一応処理概要として FOR文で回しながら以下の処理を。 MID$()を使って表示する桁数分だけ文字列から切り出します。 それをLOCATE でそれを表示して、 つぎの表示用文字列を切り出し、次の行に表示。 文字列をが終わるまで繰り返します。 これを元の文字列と変換後の文字列に対して処理すればOKです。 同様な処理なのでサブルーチン化、または、DEFコマンドで命令化するとよりベターです。
0そうだね
プレイ済み
返信[28]
親投稿
ASA fusuian
あと、一文字ずつの取り出しならMID$より配列的に[]で取った方が楽です。
0そうだね
プレイ済み
返信[29]
親投稿
ASA fusuian
一文字ごとに変換する都度PRINTしながら、文字数をカウントして、20くらいになったら改行入れてその行でLOCATEする感じですかね? あと、一文字出すごとにWAIT 3とか5とか入れるとRPG風でなお良いと思います。
0そうだね
プレイ済み
返信[30]
親投稿
Godot orz_127
まげさんそれ一文字削除は対応してます? プチコン3ではその処理作ったことがないのでよくわかりませんが INKEY$()はバックスペースひろえないんでしたっけ? そこら辺の処理も出来ると 良いかなと思ったり。
1そうだね
プレイ済み
返信[31]
親投稿
Godot orz_127
ASAさん 確かに一文字づつなら A$="あいう" FOR I=0 TO 2 ?A$[l] NEXT 見たいな事が出来て、便利ですがそれはマニュアルを見ても分からないし、上級者向けかなと^^; で出力時の文字の切りだしのことなら STEP 20を使ったりして表示する1行分単位の切りだしの想定でした。 1文字づつもそれはそれで解としてありですね^^
0そうだね
プレイ済み
返信[32]
親投稿
nobu divine-creator
Godotさんへ 入力を間違えたのでバックスペースを使ったら、×という表示が……Σ(゚Д゚)! 入力文は一文字ずつしか表示されないですし、最終的に変換された文しか残らないので、元の文が確認できない状態に…(>_<)!
0そうだね
プレイ済み
返信[33]
親投稿
まげ MAGE_LOVEMARINE
>Godotさん BSはCHR$(8)で認識できます。1文字消すという動作をさせるには、そういうプログラムが必要ですけどね。ちなみにDELは認識できませんでした。
0そうだね
プレイ済み
返信[34]
親投稿
nobu divine-creator
初心者が作るプログラムなのに、高度な処理を求め過ぎてしまったのでしょうか?(私が作りたいプログラムと私が作れるプログラムの間には、何年も掛けて習得しなければならない知識&技術の差がありますからね…。) 今回は、「長文を入力された場合には見た目が悪くなる」という問題を残したままのほうが都合が良いようです…。(短文であれば全く問題はないので、それで我慢しようかな…と思います!) 情報を教えてくださった方々には、大変感謝致しております♪ お陰様で文字を変換するプログラムの作り方の基本から応用までを知ることができました♪
0そうだね
プレイ済み
返信[35]
親投稿
Godot orz_127
プログラムが今どうなっているのかわからないので何処をどうしてよいか解りません^^; 多分まだそんなに長くはなっていないと思うので、まげさんの様にそのプログラムの部分の画面をアップして頂けませんか? 一回で入りきらないなら数回に分けて。
0そうだね
プレイ済み
返信[36]
親投稿
Godot orz_127
まげさん 情報ありがとうございます。 前に何処かでINKEY$では取得出来ない、と読んだきがしたので… BSはとれるんですね。 とりあえずめんどくさいけど1文字削除対応やろうと思えばできそうですね^^
0そうだね
プレイ済み
返信[37]
親投稿
nobu divine-creator
Godotさん、お気遣いありがとうございます♪ どうせなら完成したプログラムを操作していただき、改良すべき点があれば(←あるのは100%確実ですが…w)、それからアドバイスしていただくというほうが良さそうです。 近いうちに、完成させて公開する予定ですので、それまでお待ちください♪ もし万一、公開不可になってしまったら、こちらで不可になったとお知らせします!(もちろん大丈夫なはずですよw♪)
0そうだね
プレイ済み
返信[38]
親投稿
Godot orz_127
了解しました。 完成をまちます。 でもできあがつた物があまりにも怪しいものならスルーしますw
0そうだね
プレイ済み
返信[39]
親投稿
nobu divine-creator
人によって怪しいと感じる基準が変わりますので、公開時の情報を基にご判断をお願い致しますw!(予想外のコメントに吃驚いたしましたΣ(゚Д゚)!)
0そうだね
プレイ済み