こんにちは。現在、英文、もしくは英単語、英字を国際符号(モールス信号)に訳すプログラムを書いているのですが、もしユーザーが二つの英単語を入力し、その単語がスペースで離れている場合(例として、SOS SOSもしくはsos sos)、翻訳された単語のモールス信号の間にスペースを三つ、文字の間に一つづつスペースを入れたいのですが(sos sosであれば、... --- ... ... --- ...)コツがつかめなくて困っています(文字の間に一つスペースを入れる事に成功はしたのですが...)
C++言語で経験者の方、いらっしゃいましたら是非アドバイスを御願い致します。
これが自分が今まで書き上げたコードなのですが、
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
string engtomol (string, string[]);
int main ()
{
char alpha[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
string morse[81] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
string text, morsecode;
char choice;
char repeat='y';
cout << "Select 1 to decode Morse code to English text. Select 2 to decode English text to Morse code" << endl;
cin >> choice;
if (choice=='1')
{
cout << "NOTE. DO NOT INPUT A NON ENGLISH CHARACTER. THIS TRANSLATOR EXCLUSIVELY ONLY TRANSLATES ENGLISH ALPHABETS (CAPITALIZED AND NON CAPITALIZED) ONLY.\n";
cout << "Enter a text to translate, each word seperated by spaces if you want to translate more than one word:";
cin.get();
getline(cin,text);
cout << "TEXT: " << text << endl;
cout << "MORSE CODE: " << engtomol(text, morse) << endl;
}
else if (choice=='2')
{
cout << "lol";
}
return 0;
}
string engtomol (string text, string morse[])
{
int textlength = text.length();
string morsevalue;
string spacesbtwletters= " ";
string spacesbtwwords = " ";
for (int k=0; k<textlength; k++)
{
if (text[k]!= ' ') //if the word(s) did not encounter a space
{ text[k]=toupper(text[k]); //upper case letters and lower case letters are the same hence have the same appropriate morse code.
morsevalue=spacesbtwletters+=morse[text[k]-'A']+" ";//A is the first value of the array. by subtracting its finding the appropriate morse code for each letters
}
if (text[k]==' ')
{
morsevalue+spacesbtwwords;
}
}
return morsevalue;
}
プログラムをコンパイルすると、(また例としてsos sosを入力したとします)。--- ... --- --- ... ---と、単語の間にスペースが一つしか表れません。どの様に変えたら、希望通りの結果が出ますか?
よろしく御願い致します。
No.3ベストアンサー
- 回答日時:
ああ失礼、修正後の方のコードの変更点を演算子しか見てませんでした。
確かに修正後の方は "CQ DE SHIN" を正しく変換してくれますね。
じゃあ、" SOS" や "SOS "はどう変換されるべきとお考えで、それはその通りになりますか?
また、spacesbtwletters はその名の通り「文字の間の空白」という役目を果たしていますか?
No.2
- 回答日時:
> 何とか、希望通りにできましたが
へぁ、じゃあ "CQ DE SHIN" って入力したらどうなります?
修正のヒント : engtomol() の中で変化しないはずの変数の宣言に const を追加してみましょう。
No.1
- 回答日時:
んーと、自分なら std::map か文字と符号のペアクラスの配列を使って空白を特別扱いしないけど、とりあえず
if (text[k]==' ')
{
morsevalue+spacesbtwwords;
}
では morsevalue は何も変わらない。
まあ、これを直しても本当にこのコードの通りなら他の問題があるんだけど、それは上を直してのお楽しみという事で。
この回答への補足
hitomuraさん、
ご回答ありがとうございます。
何とか、希望通りにできましたが、今度はモールスを逆に英文(または英字、英単語)に変換したいのですが、自分の書いたコードだと"AAA"しか出てきません。どの様にコードを書き換えたらよいでしょうか?
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
string engtomol (string, string[]);
string moltoeng (string, char[]);
int main ()
{
char alpha[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
string morse[81] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
string text, morsecode;
char choice;
char repeat='y';
while (repeat=='y')
{
cout << "Select 1 to decode Morse code to English text.\nSelect 2 to decode English text to Morse code" << endl;
cin >> choice;
if (choice=='1')
{
cout << "NOTE. DO NOT INPUT A NON ENGLISH CHARACTER. THIS TRANSLATOR EXCLUSIVELY TRANSLATES ENGLISH TEXTS (CAPITALIZED AND NON CAPITALIZED).\n";
cout << "Enter a text to translate, each word seperated by a space if you want to translate more than one word: ";
cin.get();
getline(cin,text);
cout << "TEXT: " << text << endl;
cout << "MORSE CODE: " << engtomol(text, morse) << endl;
}
else if (choice=='2')
{
cout << "Enter a morsecode to translate, each letter code seperated by a space. If you want to translate more than one word, have 3 spaces between each word (for example, ... --- ... ... --- ...): ";
cin.get();
getline(cin,morsecode);
cout << "MORSECODE: " << morsecode << endl;
cout << "TEXT: " << moltoeng (morsecode, alpha) << endl;
}
cout << "Would you like to continue? Press y to repeat. Press any other key to exit. ";
cin >> repeat;
}
return 0;
}
string engtomol (string text, string morse[])
{
int textlength = text.length();
string morsevalue;
string spacesbtwletters= " ";
string spacesbtwwords = " ";//2 spaces because im going to add it with spacesbtwletters so that it will = 3
for (int k=0; k<textlength; k++)
{
if (text[k]!= ' ') //if the word(s) did not encounter a space
{ text[k]=toupper(text[k]); //upper case letters and lower case letters are the same hence have the same appropriate morse code.
morsevalue=spacesbtwletters+=morse[text[k]-'A']+" ";//A is the first value of the array. by subtracting its finding the appropriate morse code for each letters
}
if (text[k]==' ')
{
spacesbtwletters+=spacesbtwwords;//adds 3 spaces when there is a space between words
}
}
return morsevalue;
}
string moltoeng (string morsecode, char alpha[])
{
int morselength = morsecode.length();
string tran;
string spacesbtwletters= " ";
string spacesbtwwords = " ";
for (int k=0; morsecode[k]; k++)
{
if (morsecode[k]!= ' ') //if the word(s) did not encounter a space
{
tran=spacesbtwletters+=alpha[morsecode[k]-morsecode[1]];//A is the first value of the array. by subtracting its finding the appropriate morse code for each letters
}
}
return tran;
}
現在あるコードです。逆の場合はモールス信号を入力した場合、文字同士の間には1スペースを、単語同士の間には3スペース、入力し、変換した英文は、英単語同士の間だけに1スペース開ける様に出力したいのですが(... --- ... ... --- ...を SOS(もしくはsos) SOS等)
長文で申し訳ありませんが、どうかアドバイスをよろしく御願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- VPN 何これ 1 2022/04/19 01:32
- C言語・C++・C# [至急]Project Euler:#17Number letter countsコード入力出力解説 2 2022/09/24 02:46
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- 英語 英語の質問です。 When I taught in high school, I wanted to 4 2023/08/19 16:10
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パイソン、機械学習。エラー。
-
C#でTreeViewのCheckBoxのサイ...
-
大量のデータを読み込んで表示...
-
どうして+3
-
逆コンパイルと逆アセンブルの...
-
C#でゲームのチートを作ること...
-
プログラミング 2つの整数を読...
-
あんまり考えたくないけど
-
C#でログファイルにファイルパ...
-
ArduinoでMouse関数を使用して...
-
MACで動く実行ファイルをWindow...
-
C++でデスクトップGUIアプリ開...
-
写真のプログラムは、1からnま...
-
【C言語】全角文字の配列を、全...
-
プログラミングc++を全く分か...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
-
C# で 数式文字列処理を処理す...
-
C言語のことです。写真(見にく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスかラベル上の...
-
ExcelのVBAで文章にある複数の...
-
【VBS】クリップボード操作につ...
-
Visual Basicについてお聞きし...
-
vba 日本語以外を抽出について
-
XMLファイルのattribute値がう...
-
[VB6] SQLの作成について
-
文字列を配列に…。
-
RichTextBoxで指定行の色を自動...
-
VB2010 シリアル通信の文字列...
-
HTMLのデータ読み取り
-
DTPicker テキストクリアの方法
-
フォーム、サブフォーム間のデ...
-
C++言語、国際符号翻訳プログラ...
-
WORd VBA 文章を単語に分解する
-
表の文字の均等割りについて
-
C#で複数のTextboxから検索して...
-
VBスクリプトでファイルのコピ...
-
文字列を日付型情報として計算...
-
VBAの文字列で「"」を識別したい。
おすすめ情報