英语到摩尔斯电码转换器

时间:2018-08-09 16:03:55

标签: c++ converter helper alphabetical morse-code

我需要将英语字母和阿拉伯数字转换为摩尔斯电码,直到按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;
}

当我返回长度时,该长度始终为1,因此该函数仅产生一个循环。另外,在编译代码时还会出现一些额外的符号。

1 个答案:

答案 0 :(得分:2)

这里发生了一些事情,但是lenght始终为1的原因是,您只执行了一次while循环:

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

上面的do块仅执行一次,因为while (0)的计算结果为false。这意味着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

输出

  

$ ...---...

修改

正如下面的user4581301所指出的,可以通过删除a []和第二个循环来进一步简化:

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

    cout << "letter = ";

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

    return 0;
}