您的位置:首页 > 其它

算法竞赛入门经典:第五章 基础题目选解 5.1WERTYU

2015-08-11 11:03 183 查看
/*
把手放在键盘上时,稍不注意就会往右错移一位。这样的话,Q会变成W,
J会变成K等。电脑键盘如下图所示:
`  1234567890-=BackSP
TabQWERTYIOP[]\
A  SDFGHJKL;'Enter
Z  XCVBNM,./
Control Alt      Alt Control
输入一个错位后敲出的字符串,输出打字员本来想打出的句子。
输入:O S,GOMR YPSFU
输出:I AM FINE TODAY.

思路:
设置一个int 数组映射
char iArr[(int)'W'] = 'Q';
char iArr[(int)'1'] = '`';
这个太烦,将两个字符串放在一起,采用一前一后对称方式:
还原的字符串:`1234567890-QWERTYUIOP[]ASDFGHJKL;ZXCVBNM,. 
敲错的字符串:1234567890-=WERTYUIOP[]\SDFGHJKL;'XCVBNM,./
*/

/*
关键:
1 在输入 O S,GOMR YPSFU时,因为空格,scanf会当成多个字符串,这里可以采用gets来做,gets默认不会以空格来切分字符串
2 此题除了设置两个一一对应数组外,还可以采用前移一位来打印字符串。while((ch = getchar()) != EOF)  putchar(priStr[i-1]);
3 注意,转移字符'\'需要用 '\\'表示
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 1024

char* findCorStr(char* str,char* rStr)
{
	char priStr[MAXSIZE] = " 1234567890-=WERTYUIOP[]SDFGHJKL;'XCVBNM,./\\";
	char resStr[MAXSIZE] = " `1234567890-QWERTYUIOP[ASDFGHJKL;ZXCVBNM,.]";
	int iLen = strlen(priStr);
	int iStrLen = strlen(str);
	int i,j;
	for(i = 0 ; str[i] != '\0'; i++)
	//for(i = 0 ; i < iStrLen ; i++)
	{
		for(j = 0; j <= iLen ; j++)
		{
			if(str[i] == priStr[j])
			{
				rStr[i] = resStr[j];
				break;
			}
		}
	}
	rStr[i] = '\0';
	return rStr;
}

void priStr(char* str)
{
	char priStr[MAXSIZE] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
	char ch;
	while((ch = getchar()) != EOF)
	{
		for(int j = 0 ; str[j] != '\0' ;j++)
		{
			for(int i = 1 ; priStr[i] != '\0' ; i++)
			{
				if(str[j] == priStr[i])
				{
					putchar(priStr[i-1]);
					break;
				}
			}
		}
	}
}

int main(int argc,char* argv[])
{
	char rStr[MAXSIZE];
	char str[MAXSIZE];
	gets(str);
	printf("%s\n",findCorStr(str,rStr));
	/*
	while(EOF != scanf("%s",str));//关键:若输入空格,则会当成若干个字符串进行切割
	{
		char rStr[MAXSIZE];
		printf("%s\n",findCorStr(str,rStr));
	}
	*/
	system("pause");
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: