关于soundex code的C编程习题 紧急!!!!!
要求用标准C语言写,题目如下:每个SOUNDEXcode由一个字母和三个数字组成.例如Bender就是B536.字母是每个名字的首字母,不作改变.三个数字就按下表选择,注...
要求用标准C语言写,题目如下:
每个SOUNDEX code由一个字母和三个数字组成.例如 Bender 就是 B536. 字母是每个名字的首字母,不作改变.
三个数字就按下表选择,注意忽略A, E, I, O, U, H, W, Y. 如果首字母之后不足三个数字则用0补足3位,例如: Lee 就是 L000, Cook 就是 C200. 超出三位以后的数字则忽略.
1: B, P, F, V
2: C, S, K, G, J, Q, X, Z
3: D, T
4: L
5: M, N
6: R
忽略:A, E, I, O, U, H, W, Y,(如果是首字母则不作更改)
另外, 如果名字中含有连续2个相同的字母, 则只处理其中一个.
例如:
名字 需要转换的字母 Code
Allricht A, l, r, c A462
Hanselmann H, n, s, l H524
Henzelmann H, n, z, l H524
注意, 无论输入大写还是小写字母, soundex code中的首字母一定要输出成大写, 而且后面的三位数字应该是不变的. (是否先把输入的字母都转成大写来处理会比较方便?) 而输入的名字由scanf命令输入!.
题目最后的一些建议:
程序最好由4部分组成,包括:
一个function用于输入名字和去除连续2个相同的字母.
一个function忽略除首字母外所有的A,E,I,O,U,H,W,Y.
一个function将除了首字母以外的字母转成数字.
一个main program用来给使用者输入名字(scanf),然后调用上面的function,最后输出答案.
附加: (做出的追加80分)
在原程序的基础上修改, 令程序可以处理一些由几部分组成的名字. 像: "Bred Groningen" 或者
"Lee-Young" 之类. 比如"Lee-Young"应该输出 L520. (取L,n,g,补个0).
有什么不清楚的速度问我. 非常赶时间!!! 谢谢.! 展开
每个SOUNDEX code由一个字母和三个数字组成.例如 Bender 就是 B536. 字母是每个名字的首字母,不作改变.
三个数字就按下表选择,注意忽略A, E, I, O, U, H, W, Y. 如果首字母之后不足三个数字则用0补足3位,例如: Lee 就是 L000, Cook 就是 C200. 超出三位以后的数字则忽略.
1: B, P, F, V
2: C, S, K, G, J, Q, X, Z
3: D, T
4: L
5: M, N
6: R
忽略:A, E, I, O, U, H, W, Y,(如果是首字母则不作更改)
另外, 如果名字中含有连续2个相同的字母, 则只处理其中一个.
例如:
名字 需要转换的字母 Code
Allricht A, l, r, c A462
Hanselmann H, n, s, l H524
Henzelmann H, n, z, l H524
注意, 无论输入大写还是小写字母, soundex code中的首字母一定要输出成大写, 而且后面的三位数字应该是不变的. (是否先把输入的字母都转成大写来处理会比较方便?) 而输入的名字由scanf命令输入!.
题目最后的一些建议:
程序最好由4部分组成,包括:
一个function用于输入名字和去除连续2个相同的字母.
一个function忽略除首字母外所有的A,E,I,O,U,H,W,Y.
一个function将除了首字母以外的字母转成数字.
一个main program用来给使用者输入名字(scanf),然后调用上面的function,最后输出答案.
附加: (做出的追加80分)
在原程序的基础上修改, 令程序可以处理一些由几部分组成的名字. 像: "Bred Groningen" 或者
"Lee-Young" 之类. 比如"Lee-Young"应该输出 L520. (取L,n,g,补个0).
有什么不清楚的速度问我. 非常赶时间!!! 谢谢.! 展开
4个回答
展开全部
这是我做的,为了让你方便理解,每一步都有相应的输出。
程序如下:
/* uni函数将所有字母转换成大写,方便进一步处理
del1函数删除相同的字母
del2函数删除a,e,i ,o...
conv函数将剩下的字母做如题要求的转换,并取4位*/
#include<stdio.h>
#include<conio.h>
int main()
{
char name[20]={0};
clrscr();
printf("Please input a name:\n");
scanf("%s",name);
printf("\n---------------------------------\n");
printf("the original: %s\n\n",name);
uni(name);
printf("after unify: %s\n\n",name);
del1(name);
printf("after delete same numbers: %s\n\n",name);
del2(name);
printf("after delete a,e,i...: %s\n\n",name);
conv(name);
printf("after convert: %s\n\n",name);
return 0;
}
del1(char *x)
{
char *temp;
while (*(x+1))
{
temp=x;
if (*x==*(x+1))
{
while (*temp)
{
*temp=*(temp+1);
temp++;
}
}
else
x++;
}
}
del2(char *x)
{
char *temp;
char *p=x+1;
while (*p)
{
temp=p;
if ((*temp=='A')||(*temp=='E')||(*temp=='I')||(*temp=='O')||(*temp=='U')||(*temp=='H')||(*temp=='W')||(*temp=='Y'))
{
while (*temp)
{
*temp=*(temp+1);
temp++;
}
}
else
p++;
}
}
uni(char *x)
{
while (*x)
{
if ((*x>='a')&&(*x<='z'))
{
*x=(*x-32);
}
x++;
}
}
conv(char *x)
{
char *p=(x+1);
int i=0;
while (*p)
{
switch(*p)
{
case 'B': case 'P': case 'F': case 'V':
*p='1';
break;
case 'C': case 'S': case 'K': case 'G': case 'J':
case 'Q': case 'X': case 'Z':
*p='2';
break;
case 'D': case 'T':
*p='3';
break;
case 'L':
*p='4';
break;
case 'M': case 'N':
*p='5';
break;
case 'R':
*p='6';
break;
}
p++;
}
for (i=1,p=x+1; i<4; i++,p++)
{
if (*p=='\0')
{
*p='0';
}
}
*p='\0';
}
程序如下:
/* uni函数将所有字母转换成大写,方便进一步处理
del1函数删除相同的字母
del2函数删除a,e,i ,o...
conv函数将剩下的字母做如题要求的转换,并取4位*/
#include<stdio.h>
#include<conio.h>
int main()
{
char name[20]={0};
clrscr();
printf("Please input a name:\n");
scanf("%s",name);
printf("\n---------------------------------\n");
printf("the original: %s\n\n",name);
uni(name);
printf("after unify: %s\n\n",name);
del1(name);
printf("after delete same numbers: %s\n\n",name);
del2(name);
printf("after delete a,e,i...: %s\n\n",name);
conv(name);
printf("after convert: %s\n\n",name);
return 0;
}
del1(char *x)
{
char *temp;
while (*(x+1))
{
temp=x;
if (*x==*(x+1))
{
while (*temp)
{
*temp=*(temp+1);
temp++;
}
}
else
x++;
}
}
del2(char *x)
{
char *temp;
char *p=x+1;
while (*p)
{
temp=p;
if ((*temp=='A')||(*temp=='E')||(*temp=='I')||(*temp=='O')||(*temp=='U')||(*temp=='H')||(*temp=='W')||(*temp=='Y'))
{
while (*temp)
{
*temp=*(temp+1);
temp++;
}
}
else
p++;
}
}
uni(char *x)
{
while (*x)
{
if ((*x>='a')&&(*x<='z'))
{
*x=(*x-32);
}
x++;
}
}
conv(char *x)
{
char *p=(x+1);
int i=0;
while (*p)
{
switch(*p)
{
case 'B': case 'P': case 'F': case 'V':
*p='1';
break;
case 'C': case 'S': case 'K': case 'G': case 'J':
case 'Q': case 'X': case 'Z':
*p='2';
break;
case 'D': case 'T':
*p='3';
break;
case 'L':
*p='4';
break;
case 'M': case 'N':
*p='5';
break;
case 'R':
*p='6';
break;
}
p++;
}
for (i=1,p=x+1; i<4; i++,p++)
{
if (*p=='\0')
{
*p='0';
}
}
*p='\0';
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你提的建议说:“一个function用于输入名字”,又说“一个main program用来给使用者输入名字”,到底是在哪输啊,我代码是在main中输的。
#include <string.h>
#include <stdio.h>
#include <ctype.h>
void del(char *name){
int i, len = strlen(name);
for(i = 2; i < len; i++){
if(name[i]==name[i-1]){
strcpy(name+i-1, name+i);
i--;len--;
}
}
}
void ignore(char *name){
int i, len = strlen(name);
for(i = 1; i < len; i++){
switch(name[i]){
case 'A':case 'E':case 'I':case 'O':case 'U':case 'H':case 'W':case 'Y':
strcpy(name+i, name+i+1);
i--;
}
}
}
void change(char *name){
int i, len = strlen(name);
for(i = 1; i < len && i < 4; i++){
switch(name[i]){
case 'B':case 'P':case 'F':case 'V':
name[i]='1';
break;
case 'C':case 'S':case 'K':case 'G':
case 'J':case 'Q':case 'X':case 'Z':
name[i]='2';
break;
case 'D':case 'T':
name[i]='3';
break;
case 'L':
name[i]='4';
break;
case 'M':case 'N':
name[i]='5';
break;
case 'R':
name[i]='6';
break;
}
}
for(; i < 4; i++)name[i]='0';
name[i]=0;
}
void main(){
int i, len;
char name[20], c;
while(1){
scanf("%s", name);
len = strlen(name);
if(getchar()==' ' && (c=getchar())!='\n'){
name[len]=c;
scanf("%s", name+len+1);
len = strlen(name);
}
for(i=0; i<len;i++){
name[i]=toupper(name[i]);
if(name[i]<'A' || name[i]>'z' || (name[i]>'Z' && name[i]<'a')){
strcpy(name+i, name+i+1);
i--;len--;
}
}
del(name);
ignore(name);
change(name);
printf("%s\n", name);
}
}
附加也实现了。
#include <string.h>
#include <stdio.h>
#include <ctype.h>
void del(char *name){
int i, len = strlen(name);
for(i = 2; i < len; i++){
if(name[i]==name[i-1]){
strcpy(name+i-1, name+i);
i--;len--;
}
}
}
void ignore(char *name){
int i, len = strlen(name);
for(i = 1; i < len; i++){
switch(name[i]){
case 'A':case 'E':case 'I':case 'O':case 'U':case 'H':case 'W':case 'Y':
strcpy(name+i, name+i+1);
i--;
}
}
}
void change(char *name){
int i, len = strlen(name);
for(i = 1; i < len && i < 4; i++){
switch(name[i]){
case 'B':case 'P':case 'F':case 'V':
name[i]='1';
break;
case 'C':case 'S':case 'K':case 'G':
case 'J':case 'Q':case 'X':case 'Z':
name[i]='2';
break;
case 'D':case 'T':
name[i]='3';
break;
case 'L':
name[i]='4';
break;
case 'M':case 'N':
name[i]='5';
break;
case 'R':
name[i]='6';
break;
}
}
for(; i < 4; i++)name[i]='0';
name[i]=0;
}
void main(){
int i, len;
char name[20], c;
while(1){
scanf("%s", name);
len = strlen(name);
if(getchar()==' ' && (c=getchar())!='\n'){
name[len]=c;
scanf("%s", name+len+1);
len = strlen(name);
}
for(i=0; i<len;i++){
name[i]=toupper(name[i]);
if(name[i]<'A' || name[i]>'z' || (name[i]>'Z' && name[i]<'a')){
strcpy(name+i, name+i+1);
i--;len--;
}
}
del(name);
ignore(name);
change(name);
printf("%s\n", name);
}
}
附加也实现了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
留个名,先。
如果没有满意的答案,我再做。
如果没有满意的答案,我再做。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
意思就是让你将输入的字母都转成相应的数字而已..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询