- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
因此,我拥有将英语翻译成 Pig Latin 的程序的全部功能。我有大约 80% 的反向翻译功能。
我有两个问题:
首先,当从 Pig Latin 翻译回英语时,它会在它遇到的第一个超过 7 个字符的输入单词的末尾添加一些乱码。它不会对短语中的任何其他词再次执行此操作,并且仅在从 Pig Latin 转换为英语时执行此操作。
第二个更像是一个逻辑问题。我想不出如何检查英语单词以 T 开头并以元音结尾的情况。例如:time
翻译成 P.L. 将是 imetay
。但是,eim
虽然不是一个实际单词,但在 P.L 中也会翻译成 imetay
。如果不检查原始英语短语,如何判断 imetay
应该是 time
还是 eim
?
那里留下了一些调试行来显示反向翻译中的乱码发生了什么。
//Matthew Gerton
//Project 3 - Pig latin translator
//11/26/14
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
//structures for Node and Queue
typedef struct node
{
char word[20];
struct node * link;
}node;
typedef struct queue
{
node * front;
node * rear;
} queue;
queue *input = NULL, *trans = NULL;
//method prototypes
void break_and_translate(char * phrase, int z);
queue * buildPhrase(queue * abcd, char data[20]);
node * translate(node * data);
node * translateBack(node * nextWord);
void displayP(node * abcd);
int isWordSep(char a);
int isVowel(char a);
//main function drives switch statement method for entering, translating, displaying and clearing the queues
int main()
{
int ch, ch2;
char dummy;
char * phrase;
do
{
printf("\n\n1.\tInput phrase\n2.\tTranslate phrase\n3.\tDisplay phrase\n4.\tDisplay Translation\n5.\tClear current phrase and translation\n6.\tExit\n");
printf("\nEnter your choice: ");
scanf("%d", &ch);
scanf("%c", &dummy);
switch(ch)
{
//mallocs memory for the input phrase and scans the input phrase. breaks the phrase into a queue and translates it.
//then frees the memory for the phrase.
case 1:
phrase = (char *)malloc(1024 * sizeof(char));
printf("Input the phrase to be translated.\n");
gets(phrase);
if(phrase==NULL)
printf("Sorry, cant read the phrase. Try again.");
else
printf("Phrase recieved!!!!\n");
break;
//calls the method to translate the input stored in phrase
case 2:
printf("Are you tanslating from:\n1. English into pig latin\n2. Pig latin to english\n");
scanf("%d", &ch2);
scanf("%c", &dummy);
break_and_translate(phrase, ch2);
if(input ==NULL || trans ==NULL)
{
printf("Translation uncessful. Rerun the program and try again!\n");
exit(0);
}
else
printf("Translation sucessfull!!!!\n");
break;
//Display the input phrase.
case 3:
if(phrase==NULL)
printf("No phrase entered. Please enter a phrase to translate\n");
else
printf("%s\n", phrase);
break;
//Display the translated phrase
case 4:
if(input==NULL)
printf("Translation has not been prepared yet.\nPlease either enter a phrase to translate, or translate the current phrase.\n");
else
displayP(trans->front);
break;
//sets the queues back to null and frees the memory allocated to the phrase.
case 5:
if(input ==NULL && trans ==NULL)
{
if(phrase == NULL)
printf("\nNothing to reset yet! Enter and translate a phrase!\n");
else
printf("No tanslation yet, clearing the input phrase.\n");
}
input = trans = NULL;
free(phrase);
phrase = NULL;
printf("Reset sucessfull!!!!\n");
break;
//exit
case 6:
printf("Goodbye!!!!\n");
exit(0);
default:
printf("\n\nInvalid choice. Please try again...\n");
}
} while(1);
return (ch);
}
//initializes memory for a new queue
queue * new_queue()
{
queue *s = (queue *)malloc(sizeof(queue));
s->front = NULL;
s->rear = NULL;
return s;
}
//takes a queue input and string and adds a node the rear of the queue containing that string
//returns a pointer to the queue;
queue * buildPhrase(queue * abcd, char data[20])
{
if(abcd==NULL)
{
abcd=new_queue();
}
if(abcd->rear == NULL)
{
abcd ->rear = (node *)malloc(sizeof(node));
strcpy(abcd->rear->word, data);
abcd -> rear->link = NULL;
abcd ->front = abcd ->rear;
}
else
{
abcd ->rear->link = (node *)malloc(sizeof(node));
abcd ->rear = abcd ->rear->link;
strcpy(abcd->rear->word, data);
abcd ->rear->link = NULL;
}
return abcd;
}
//Takes a node as an input. Allocates memory for a new node for the latin word
//Takes the first letter from the input nodes word, moves shifts everyting left one char into the latin word
//Checks to see if the first letter was a capital letter. If so, adds the lowecase char to the end and capitalizes the first
//Then checks to see if the first char was a vowel or capital vowel. if so, adds t to the end of the latin word. then adds 'a' and 'y' regardless
//then returns the node for the latin translation.
node * translate(node * nextWord)
{
char a; int b, c=0;
a=nextWord ->word[0];
node * latin = (node *)malloc(sizeof(node));
if(isWordSep(a)==0)
{
for(b=1; b<strlen(nextWord->word); b++)
{
latin->word[b-1] = nextWord->word[b];
c=b;
}
if((a>=65) && (a<= 91))
{
latin->word[0] = (latin->word[0]-32);
latin->word[c++] = (a+32);
}
else
latin->word[c++] = a;
if(isVowel(a)==1)
{
latin->word[c++]='t';
}
latin->word[c++]='a';
latin->word[c++]='y';
}
return latin;
}
//takes the input phrase as a parameter. goes through the phrase until a "whitespace char" is found
//when one is found allocates memory for 2 node pointers, coppies the word up until that point to one pointer
//passes that pointer to the trsanslate method, translates it an returns it as the second pointer. It then adds the punctuation
//to the end of each word then passes each node to the build queue method. Then frees the memory for the nodes and resets the word array
void break_and_translate(char * phrase, int z)
{
int space =0, b=0, c=0;
char end, word[20];
memset(word, '\0', strlen(word));
end = phrase[0];
while(end != '\0')
{
end = phrase[b];
printf("END: %c\n", end);
if(isWordSep(end)==0)
{
word[space]= end;
space++;
printf("WORD: %s\nstrlen WORD: %d\n", word, strlen(word));
}
else
{
node * temp = (node *)malloc(sizeof(node));
node * temp2 = (node *)malloc(sizeof(node));
strcpy(temp->word, word);
if(z==1)
temp2 = translate(temp);
else
temp2 = translateBack(temp);
c = strlen(temp2->word);
temp2->word[c]= word[space] = end;
strcpy(temp->word, word);
// printf("\n%s temp word\n%s temp2 word\n", temp->word, temp2->word);
input = buildPhrase(input, temp->word);
trans = buildPhrase(trans, temp2->word);
memset(word, '\0', strlen(word));
free(temp);
free(temp2);
space=0;
printf("WORD: %s\n", word);
}
b++;
}
}
//takes a pointer to the head of a queue and prints each word of each node.
void displayP(node * abcd)
{
int a = 0;
node *ptr = (node *) malloc(sizeof(node));
ptr = abcd;
printf("\n");
while(ptr != NULL)
{
printf("%s",ptr->word);
a++;
ptr = ptr->link;
}
free(ptr);
}
node * translateBack(node * nextWord)
{
char a, x, y, z; int b, c=0, d;
node * latinBack = (node *)malloc(sizeof(node));
strcpy(latinBack->word, nextWord->word);
z = latinBack->word[0];
d = strlen(latinBack ->word);
if(isWordSep(z)==0)
{
a=latinBack ->word[d-3];
if((isVowel(a)==0)&&(a!='t'))
{
latinBack->word[d-2] = latinBack->word[d];
}
else if(a=='t')
{
x = nextWord ->word[d-4];
y = nextWord ->word[d-5];
if((isVowel(x)==1)&&(isVowel(y)==1))
{
latinBack->word[d-3] = latinBack->word[d];
latinBack->word[d-2] = '\0';
a=x;
}
else
latinBack->word[d-2] = latinBack->word[d];
}
latinBack->word[d-1] = '\0';
latinBack->word[d] = '\0';
for(b=strlen(latinBack->word); b>0; b--)
latinBack->word[b] = latinBack->word[b-1];
latinBack->word[0] = a;
latinBack->word[strlen(latinBack->word)-1]='\0';
z=latinBack->word[1];
if((z>=65) && (z<= 91))
{
latinBack->word[0]= (latinBack->word[0]-32);
latinBack->word[1]= (latinBack->word[1]+32);
}
}
return latinBack;
}
int isWordSep(char a)
{
if ((a==' ')||(a=='.')||(a==',')||(a=='!')||(a==';')||(a=='?')||(a=='\n')||(a=='\0'))
return 1;
else
return 0;
}
int isVowel(char a)
{
if((a == 'a')||(a=='e')||(a=='i')||(a=='o')||(a=='u')||(a == 'A')||(a=='E')||(a=='I')||(a=='O')||(a=='U'))
return 1;
else
return 0;
}
最佳答案
在我学习 Pig Latin 时,“eim”不会被翻译为 imetay,而是 imeway。这好像反射(reflect)了here ,但我当然不会在这里断言教学优势,所以我不确定这是否有帮助。
其他一些可能有用的东西:
我相信latest release的 cld2检测 Pig Latin——也许你会在那里找到一些有用的代码。
对于此类非技术方面的事情,我强烈推荐 wordreference.com 论坛。不知道他们是否有专门针对 Pig Latin 的看板,所以不妨试试“仅限英语”的看板。
很棒的项目!
关于c - Pig Latin 翻译器-逆向翻译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27261004/
Google Web字体上的某些字体支持多个“字符集”。关键是,如果我使用的Web字体仅提供“拉丁”字形,那么将页面翻译成不支持该字形的语言的用户将清楚地注意到困惑的文本。 我希望我的网络字体能够支持
我有(我相信)一个独特的情况;有点困惑。这是交易。 情况:我有一个单一语言的网站,其中所有内容(内容、链接)都使用非拉丁字符。 (西里尔文)(utf-8) 该网站旨在将全局读/说俄语的人联系起来。 问
我在数据库中有 10 个表。其中 9 个只存储 Latin-1 支持的标准 ascii 1 字节字符的数据。其中 1 个要求我存储仅受 UTF8 支持的特殊字符。我想使用相同的 MySQL 连接对象(
我想在 Windows 中从 eclipse 执行 Pig 脚本。我已关注this link 。但它不起作用。是否需要任何插件才能做到这一点?或者只有 pig.jar 就可以了? 最佳答案 试试这个,
题目地址:https://leetcode.com/problems/goat-latin/description/ 题目描述 Asentence S is given, composed of
我正在开发一个将普通单词转换为 pig 拉丁语的函数,但我无法将所有内容组合在一起;它必须适用于加州、手套和八。什么地方不正常? function translate(word) {
我正在尝试编写一个 pig 拉丁语翻译器,但我的网页一直显示未定义,并且无法从文本区域读取。 html 看起来不错,但最终用户需要输入的文本区域中的文本未正确显示。我尝试使用 .textContent
我写这封信是因为今天我遇到了一个问题,尽管到处搜索并尝试了许多不同的语句,但我无法以任何方式解决。 我有这个输入文件: 3 {(car pen house glass)} 5 {(battery ph
我有一个以前用 Latin-1 编码的文件。现在,当我打开这个文件时,我只得到原始编码。即状态行中的 -t:。文件中可能有一些非 Latin-1 字符,至少可以打开其他 Latin-1 文件。 我只想
我正在编写一个程序,它接受一个字符串,将其拆分为单词,将单词转换为 pig 拉丁语,然后返回结果字符串。我已经让它工作到一定程度了。 例如,如果我在程序中输入这些不以元音开头的单词,我会得到: pig
#include #include #include #define isvowel(v) (v=='a' || v=='e' || v=='i' || v=='o' || v=='u') in
所以我是编码的新手,我遇到了一些问题...我的程序应该要求用户输入,并且需要假设所有输入都是小写...并且需要假设没有额外的空格,并且需要假设它以句点结尾。然后该程序会将文本翻译成 pig latin
希望您一切顺利。 我对 Java 和这个网站都很陌生。虽然这可能看起来很长,但我只需要两件事的帮助,所以请帮忙,就像我说的,我对这一切都很陌生,所以越彻底越好。我必须做一个项目,我们必须将常规英语单词
我刚刚收到一个 SQL 插入脚本,但它在重复键输入时失败了: 我正在尝试插入: 1)蒙大拿 2)蒙大拿 我的表都是utf8_spanish2_ci, 谁能解释为什么会这样? 最佳答案 utf8_spa
我想编写一个函数,它将接受一个字符串并将单词转换为 Pyg 拉丁语。这意味着: 如果单词以元音开头,则在末尾添加“-way”。示例:“ant”变成“ant-way”。 如果单词以辅音簇开头,则将该辅音
所以我应该使用 stringConvertToPigLatin(string word) 函数将英语单词转换为 Pig Latin。我在网上能找到的所有答案都是使用 char[],我不允许这样做。如果
这看起来像是家庭作业,但请放心,这不是家庭作业。只是我们在 c++ 类(class)中使用的书中的一个练习,我正在尝试提前阅读指针。 书上的练习告诉我将一个句子拆分成标记,然后将它们中的每一个转换成
所以,我尝试并尝试制作这个 c++ pig 拉丁语程序,但它就是行不通。这是我的代码: int main() { string tmp = ""; char a; cout << "String: "
我最近在工作中遇到了这个问题,是关于pig flatten的。我用一个简单的例子来表达它 两个文件 ===文件1=== 1_a 2_b 4_d ===file2(制表符分隔)=== 1个 2乙 3c
在 Pig 中执行多级过滤后,我得到以下结果 - (2343433,Argentina,2015,Sci-Fi) (2343433,France,2015,Sci-Fi) (2343433,Germa
我是一名优秀的程序员,十分优秀!