• UVA 10082 WERTYU


    Problem C: WERTYU

    A common typing error is to place the hands on the keyboard one row to the right of the correct position. So "Q" is typed as "W" and "J" is typed as "K" and so on. You are to decode a message typed in this manner.

    Input consists of several lines of text. Each line may contain digits, spaces, upper case letters (except Q, A, Z), or punctuation shown above [except back-quote (`)]. Keys labelled with words [Tab, BackSp, Control, etc.] are not represented in the input. You are to replace each letter or punction symbol by the one immediately to its left on the QWERTY keyboard shown above. Spaces in the input should be echoed in the output.

    Sample Input

    O S, GOMR YPFSU/
    

    Output for Sample Input

    I AM FINE TODAY.

    题意:输入一窜字符,然后输出每个字符在键盘上对应位置的前一位的字符,如输入W则输出Q,注意全部是大小写!其实就是破解密码类的问题。
    分析:将题目中要求输入的键盘上是字符及其前面的字符存放在一个数组str2中,然后将输入的字符(在数组str1中)与数组str2中的字符相比较,找到相同的字符后输出这个字符在str2数组中前一位的字符。注意:特殊字符要用转义字符形式表示!细节见程序注释!
    AC源代码(C语言):
    #include<stdio.h>
    int main()
    {
      int i,j,a,b,m;
      char str1[1000];
      char str2[]={'`','1','2','3','4','5','6','7','8','9','0','-','=','Q','W','E','R','T','Y','U','I','O','P','[',']','\\','A','S','D','F','G','H','J','K','L',';','\'','Z','X','C','V','B','N','M',',','.','/'};
      b=sizeof(str2);
      while(scanf("%c",&str1[0])==1)
       {
         for(i=1;str1[i-1]!='\n';i++)
            scanf("%c",&str1[i]);
         a=i-1;//不要写成a=sizeof(str1)的形式,否则后面会有乱码
         for(i=0;i<a;i++)
           {
             for(j=0;j<b;j++)
               {
                 if(str1[i]==str2[j])
                   str1[i]=str2[j-1];
               }
           }
         for(i=0;i<a;i++)
            printf("%c",str1[i]);//用printf("%s",str1);是自动输出空行,因为这样写就是把str1当成了字符串而不是字符,即在原来字符的最后加上了'\0'!所以不用再单独输出一个空行!!!!!但是输出的时候为什么会有乱码 ???????? 
         printf("\n");   //位置放对!!不是return上面!
       }
      return 0;
    }

    另外附上我一开始写的代码(错误的!%>_<%),主要是上面的注释。一个假期没写,手生了许多,好多浅显的问题也犯错,别笑话哈!

     1 #include<stdio.h>
     2 int main()
     3 {
     4   int i,j,a,b,m;
     5   char str1[1000];
     6   char str2[]={'`','1','2','3','4','5','6','7','8','9','0','-','=','Q','W','E','R','T','Y','U','I','O','P','[',']','\','A','S','D','F','G','H','J','K','L',';',''','Z','X','C','V','B','N','M',',','.','/'};
     7   b=sizeof(str2);  //str2中的特殊字符:' 和\要用转义字符表示!!!!!!!!!! 
     8   while(scanf("%s",&str1)==1) //这样输入的时候字符数组不接受空格!!!!!!!!!!!!
     9    { 
    10      a=sizeof(str1);         //不要写成a=sizeof(str1)的形式,否则后面会有乱码,因为sizeof计算的是内存中为str1分配的空间,而不是str1中实际用到的字节的长度!!!!!!!!!!!!!!!!! 
    11      for(i=0;i<a;i++)
    12        {
    13          if(str1[i]==' ') continue;        //可以省略。    
    14          for(j=0;j<b;j++)
    15            {
    16              if(str1[i]==str2[j])
    17                str1[i]=str2[j-1];
    18            }
    19        }
    20      printf("%s",str1); //用printf("%s",str1);是自动输出空行,因为这样写就是把str1当成了字符串而不是字符,即在原来字符的最后加上了'\0'!所以不用再单独输出一个空行!!!!!但是输出的时候会有乱码,因为它输出的是str1[1000],而不是实际的str1!    
    21    }
    22   printf("\n");   //位置不对,放这个位置表示在程序通过出口之前输出一个空格!而实际要求的效果是没输入一个回车就要输出一个空行,即每一个案例都要带有一个空行!!!!!!!!! 
    23   return 0;
    24 }  
    25 // 为什么有的程序在DEV-C++和codeblocks上运行的时候正确,而在uva上用ANSI C提交的时候显示    “Compilation error“,但是用C++提交的时候就ACl了!!!!!WHY???答案很简单,因为C语言中的注释只支持“/*”的格式,不支持“//”双杠是格式!坑啊....... 

    2013-03-14

  • 相关阅读:
    工作计划
    bzoj3626:[LNOI2014]LCA
    bzoj3631:[JLOI2014]松鼠的新家
    bzoj3573: [Hnoi2014]米特运输
    bzoj4027,[HEOI2015]兔子与樱花
    bzoj3624,[Apio2008]免费道路
    bzoj2208连通数
    tyvj1153/洛谷P1262间谍网络
    Application server libraries not found && IntelliJ IDEA && tomcat
    debian9安装java8
  • 原文地址:https://www.cnblogs.com/fjutacm/p/2960472.html
Copyright © 2020-2023  润新知