PAT 乙级 1033

Posted moujun1001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 乙级 1033相关的知识,希望对你有一定的参考价值。

题目

题目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805288530460672

 

题解

    本题一直有一分的样例点过不了,原因在于用了cin接收输入的字符……

    问题在于:如果用cin输入,无法接收无坏键的情况的输入,需要getline作为输入;这就涉及到cin和getline的不同,这一部分我看到一篇博文写得很好,就直接粘过来,先贴出原博文的地址:https://www.cnblogs.com/YTYMblog/p/5930692.html

 

cin>>这个表达式应该分为两部分来看:cin 和>>

其中cin仅仅是一个istream对象!!!它的值反映的是当前输入流的状态:即cin对象接下来能否进行输入操作(能否从cin对象中读取数据)

cin对象实际上面向两方面的功能:

    1.外部设备与cin之间:这部分对于程序员来说是透明的

      设备(键盘)对它的修改,即通过设备直接修改cin对象,通过这个可以直接修改cin对象的状态(能否从cin对象中读取数据)

    2.cin和内存(各种对象,变量)之间:

      将cin中的数据读取出来,并赋予各种对象,变量

    而这两方面的功能都不由cin对象完成,cin对象实际上只是一个状态数据量,1功能有外设(键盘)完成,2功能由<<和getline等等运算符完成

................................................

有了上面的对cin对象全方面的了解,接下来对>>运算符的分析就手到擒来了

    >>运算符的作用实际上就是从cin对象中读取数据,并将数据赋予给右侧的各种对象或者变量,也就是上述的第2部分的功能了

     那么>>运算符有哪些特性呢?毕竟输入输出总得控制开始和结束吧

      1.>>运算符是由右侧的数据类型定义的,右侧的数据类型不同,重载的>>也不同

      2.>>运算符是向左结合的

      3.>>运算符从cin对象中读取数据时:如果遇到空格或者换行符号,那么这次读取数据结束,将空格之前的数据赋给右侧的运算对象,相应的,读取的第一个符号,也是空格或者换行符之后的第一个有效数据

      4.一个>>运算符一次只能读取一次(一个)数据,要想读取多个数据,只能再加>>运算符

......................................................................


好吧,以上4个,就是>>的性质了,那么有些人又要问了,那么Ctrl+Z(~Z)文件结束符号又是怎么一回事呢?

其实这个文件结束符和>>完全就是风马牛不相干,有些人总是将Ctrl+z和>>联系在一起

      文件结束符号:就是cin对象功能一中的一个性质!也就是说,你可以把文件结束符看成是外设的功能:

      一旦从外设中遇到文件结束符(或者是无效的输入),cin对象的状态就会变为假!!,也就是说外设多不能向cin对象写值了!!!

      自然<<运算符号就无效了

......................................................................

getline

    1.它是String对象定义的,只能string对象用(当然<<也是String对象重载的)

    2.getline遇到空格不结束!!!也就是说它可以从cin对象中读取空格!!当然,遇到换行仍然结束,但是他也会读取换行符,但是读取换行符之后后停止读取,然后将读取的数据(此时包括换行符)赋给右侧的运算对象(x,见下),赋值的时候,丢弃换行符!!!,也就是说换行符不存到x中

getline的返回值是流参数和cin>>表达式一样,返回cin>>

    3.getline是一个函数的形式:

    调用如下:

  string x;

  getline(cin ,x);返回值为cin的状态

 

代码

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 int vis_loc(char c) {
 6     int loc = 0;
 7     if (c >= a && c <= z)
 8         loc = c - 97;
 9     else if (c >= A && c <= Z)
10         loc = c - 39;
11     else if (c >= 0 && c <= 9)
12         loc = c + 4;
13     else if (c == _)
14         loc = 62;
15     else if (c == ,)
16         loc = 63;
17     else if (c == .)
18         loc = 64;
19     else if (c == -)
20         loc = 65;
21     else if (c == +)
22         loc = 66;
23     return loc;
24 }
25 
26 int vis_word(char c) {
27     int loc = 0;
28     if (c >= a && c <= z)
29         loc = c - 97 + 26;
30     else if (c >= A && c <= Z)
31         loc = c - 39 - 26;
32     return loc;
33 }
34 
35 int main() {
36     bool vis[67] = { false };
37     string injure;
38     string instr;
39     getline(cin, injure);
40     getline(cin, instr);
41     for (int i = 0; i < injure.size(); i++) {
42         if (injure[i] == +) {
43             vis[66] = true;
44             for (int j = 26; j < 52; j++)
45                 vis[j] = true;
46         }
47         else {
48             if (injure[i] >= a && injure[i] <= z)
49                 vis[vis_word(injure[i])] = true;
50             else if (injure[i] >= A && injure[i] <= Z)
51                 vis[vis_word(injure[i])] = true;
52             vis[vis_loc(injure[i])] = true;
53         }
54     }
55     for (int i = 0; i < instr.size(); i++) {
56         if (!vis[vis_loc(instr[i])])
57             cout << instr[i];
58     }
59     cout << endl;
60 
61     return 0;
62 }

 


以上是关于PAT 乙级 1033的主要内容,如果未能解决你的问题,请参考以下文章

PAT乙级1033 旧键盘打字 (20 分)

[PAT乙级]1033 旧键盘打字(getline()读入)

PAT乙级 (1033 旧键盘打字 (20分)(字母大小写转换判断是否为大小写字母数字))

PAT-乙级-1049 数列的片段和

PAT乙级1049 数列的片段和 (20 分)

PAT 乙级 1049 数列的片段和