我需要将英语字母和阿拉伯数字转换为摩尔斯电码,直到按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,因此该函数仅产生一个循环。另外,在编译代码时还会出现一些额外的符号。
答案 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;
}