Конвертер английского в азбуку Морзе

Мне нужно конвертировать английские буквы и арабские цифры в азбуку Морзе до enter нажата. Я использовал do while цикл для чтения писем до enter нажата.

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

int j = 0;
char a[100];
const char *latin = "**ETIANMSURWDKGOHVF?L?PJBHCYZQ??54?3??2?????6????7??890";

void dash(){cout<<"-";}
void dot(){cout<<".";}

void conv(int decimal)
{
if(decimal){
conv(decimal/2);
if(decimal!=1) decimal%2 ? dash() : dot();
}
}

void morse(char a[], int lenght)
{
for(int i = 0; i <= lenght; i++)
{
if(a[i] >= 'a' && a[i] <= 'z') a[i] -= 32;
if(a[i] < 'A' && a[i] > 'Z') return;
while(latin[++j] != a[i]);
conv(j);

}
}

int main()
{
int lenght = 0;

cout<<"letter=";

do{
cin>>a[lenght];
lenght++;
} while(0);morse(a, lenght);

return 0;
}

Когда я возвращаю длину, она всегда одна, поэтому функция делает только один цикл. Кроме того, при компиляции кода появляются некоторые дополнительные символы.

0

Решение

Здесь происходит несколько вещей, но причина в том, что lenght всегда 1 потому что вы проходите цикл while только один раз:

do {
cin>>a[lenght];
lenght++;
} while (0); // this will always evaluate to false

do Блок выше выполняется только один раз, потому что while (0) оценивается как ложное. Это означает, что lenght увеличивается только один раз, что объясняет, почему его значение 1,

Вот (потенциально) лучший способ:

while (cin.peek() != '\n') {
cin >> a[lenght++];
}

И вы можете получить результат, который вы ищете, изменив main():

int main()
{
int length = 0;

cout << "letter = ";

while (cin.peek() != '\n') {
cin >> a[length++];
}

int i = 0;
while (i < length) {
morse(a[i]);
i++;
}
cout << endl;

return 0;
}

Код

Здесь все собрано (вместе с небольшими изменениями conv() а также morse()):

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

int j = 0;
char a[100];
const char *latin = "**ETIANMSURWDKGOHVF?L?PJBHCYZQ??54?3??2?????6????7??890";

void dash(){cout<<"-";}
void dot(){cout<<".";}

void conv(int decimal) {
if (decimal) {
conv(decimal/2);
if (decimal != 1) decimal%2 ? dash() : dot();
}
}

void morse(char c) {
if (c >= 'a' && c <= 'z') c -= 32;
if (c < 'A' || c > 'Z') return;
int i = 0;
while (latin[++i] != c);
conv(i);
}

int main()
{
int length = 0;

cout << "letter = ";

while (cin.peek() != '\n') {
cin >> a[length++];
}

int i = 0;
while (i < length) {
morse(a[i]);
i++;
}
cout << endl;

return 0;
}

вход

$ letter = sos

Выход

$ … — …

редактировать

Как указано пользователем 4581301 ниже, это можно еще больше упростить, удалив [] и второй цикл:

int main()
{
int length = 0;
char c;

cout << "letter = ";

while (cin.peek() != '\n') {
char c;
cin >> c;
morse(c);
}
cout << endl;

return 0;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]