Мне нужно конвертировать английские буквы и арабские цифры в азбуку Морзе до 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;
}
Когда я возвращаю длину, она всегда одна, поэтому функция делает только один цикл. Кроме того, при компиляции кода появляются некоторые дополнительные символы.
Здесь происходит несколько вещей, но причина в том, что 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;
}
Других решений пока нет …