skip to main content

kiesler.at

Anführungszeichen zusammenfassen
updated by rck, 2004-10-03

Diesmal habe ich mich an einem in mehrerer Hinsicht ungewöhlichen Programm versucht: die Aufgabenstellung ist tw. unklar und schlichtweg falsch; das Programm ergibt keinen Sinn; es gibt bereits Lösungen dazu. Die Beispielnummer lautet diesmal 1025

1 | 2 | 3 | 4 | 5 | 6

hochk.java

1 /*      hochk.java
2  *
3  *      gibt alles aus, was innerhalb " steht.
4  *      Angabe: http://eprog.sourceforge.net/eprog/1025/hochk.html
5  *
6  *      (c) 2004-09-12 http://www.kiesler.at/
7  */
8 
9 
10 import java.io.*;
11 import java.util.StringTokenizer;
12 
13 import eprog.*;
14 
15 
16 public class hochk {
17 
18 
19         /* isValidChar liefert true, wenn es sich um
20          * ein gültiges Zeichen handelt [a-zA-Z\"],
21          * false, wenn nicht.
22          */
23 
24         public static boolean isValidChar(char c) {
25 
26                 return( ( (c >= 'a') && (c <= 'z') ) ||
27                         ( (c >= 'A') && (c <= 'Z') ) ||
28                         (  c == '"'  ));
29         }
30 
31 
32         /* hasRealEndingQuote liefert true zurück, wenn
33          * der String tatsächlich mit " und nicht ""
34          * aufhört. Der Trick funktioniert natürlich nur,
35          * wenn ein etwaiges führendes Anführungszeichen
36          * bereits entfernt wurde (Stichwort "")
37          */
38 
39         public static boolean hasRealEndingQuote(String s) {
40 
41                 while(s.endsWith("\"\""))
42                         s=s.substring(0,s.length()-2);
43 
44                 return(s.endsWith("\""));
45         }
46 
47 
48         /* checkWoerter wirft eine Exception, wenn mehr
49          * Wörter als in der Spezifikation gefordert
50          * übergeben wurden.
51          */
52 
53         public static void checkWoerter(int n)
54                 throws Exception
55         {
56                 n--;    /* abschließender . zählt nicht */
57 
58                 if(n<1)
59                         throw new Exception("zu wenig Wörter!");
60 
61                 if(n>12)
62                         throw new Exception("zuviele Wörter!");
63         }
64 
65 
66         /* checkWortLength wirft eine Exception, wenn das
67          * Eingabewort länger als 15 Buchstaben lang ist. Ich
68          * zähle hier die Buchstaben des rohen Eingabewortes,
69          * in dem auch noch sämtliche doppelten "", führende
70          * und abschließende " drinnen sind.
71          *
72          * Grund: Ist nicht ganz eindeutig, die Länge steht
73          * allerdings bei den Eingabedaten. Also wirds wohl
74          * so sein...
75          */
76 
77         public static void checkWordLength(String s)
78                 throws Exception
79         {
80 
81                 if(s.length()>15)
82                         throw new Exception("Wort für Spezifikation "+
83                                         "zu lang (max. 15 Zeichen)!");
84 
85         }
86 
87 
88         /* checkValidChar wirft eine Exception, wenn ein
89          * ungültiges Zeichen im String vorkommt (siehe isValidChar)
90          */
91 
92         public static void checkValidChar(char c)
93                 throws Exception
94         {
95                 if(!isValidChar(c))
96                         throw new Exception("'"+c+"' ist ein "+
97                                 "ungültiges Zeichen!");
98         }
99 
100 
101         /* extractWord liefert ein Wort zurück, bei dem alle
102          * doppelten "" in " umgewandelt wurden. Um gesonderte
103          * Behandlung von " am Anfang bzw. Ende kümmert sich extractWord
104          * nicht, das muß der Aufrufer tun!
105          */
106         
107         public static String extractWord(String s)
108                 throws Exception
109         {
110                 String n="";
111                 s += " ";       // damit der s.charAt(++i)-Trick funktioniert
112 
113                 for(int i=0; i<s.length()-1; i++) {
114                         if(s.charAt(i) == '"')
115                                 if(s.charAt(++i) != '"')
116                                         throw new Exception("Alleinestehendes "+
117                                                 "Anführungszeichen!");
118 
119                         checkValidChar(s.charAt(i));
120 
121                         n += s.charAt(i);
122                 }
123 
124                 return(n);
125         }
126 
127 
128         /* concat führt Wörter zusammen. An Wort result wird
129          * Wort wort angehängt, gegebenenfalls mit einem ' ' dazwischen,
130          * falls in result schon was stand.
131          */
132 
133         public static String concat(String result,
134                         String wort)
135                 throws Exception
136         {
137                 if(wort.length()<1) {
138                         return(result);
139                 } else {
140                         if(result.length()<1)
141                                 return(wort);
142                         else
143                                 return(result+" "+wort);
144                 }
145         }
146 
147 
148         /* unquote nimmt einen der Spezifikation
149          * entsprechenden String entgegen, prüft ihn
150          * auf Korrektheit und liefert die gewünschte
151          * Ausgabe zurück.
152          *
153          * Im Fehlerfall gibt's eine Exception.
154          */
155 
156         public static String unquote(String s) 
157                 throws Exception
158         {
159                 StringTokenizer st=new StringTokenizer(s);
160                 checkWoerter(st.countTokens());
161 
162                 boolean print=false, nprint=print;
163                 String wort=st.nextToken(), result="";
164 
165                 while(! wort.equals(".")) {
166 
167                         checkWordLength(wort);
168 
169                         if(wort.startsWith("\"")) {
170                                 print=!print;
171                                 wort=wort.substring(1);
172                         }
173 
174                         if(hasRealEndingQuote(wort)) {
175                                 nprint=!print;
176                                 wort=wort.substring(0, wort.length()-1);
177                         } else {
178                                 nprint=print;
179                         }
180 
181                         if(print)
182                                 result=concat(result, extractWord(wort));
183 
184                         print=nprint;
185 
186                         wort=st.nextToken();
187                 }
188 
189                 return(result);
190         }
191 
192 
193         /* process nimmt einen der Spezifikation entsprechenden
194          * String entgegen. Enthält er keine brauchbare
195          * Markierung, wird "KEINE MARKIERUNG" geliefert. Anderenfalls
196          * die Markierung.
197          */
198 
199         public static String process(String s)
200                 throws Exception
201         {
202                 s=unquote(s);
203 
204                 if(s.length()<1)
205                         return("KEINE MARKIERUNG");
206                 else
207                         return(s);
208         }
209 
210 
211         public static void main(String args[]) {
212                 InputStreamReader ins=new InputStreamReader(System.in);
213                 BufferedReader reader=new BufferedReader(ins);
214 
215                 try {
216 
217                         EprogIO.println(process(reader.readLine()));
218 
219                 } catch(Exception e) {
220 
221                         EprogIO.println("FALSCHE EINGABE");
222 
223                 }
224         }
225 }
1 | 2 | 3 | 4 | 5 | 6



RSSComments - Make a comment
The comments are owned by the poster. We are not responsible for its content.
RSSAll Articles
2008, 2007, 2006, 2005, 2004