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
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 } |
Comments - Make a comment |
The comments are owned by the poster. We are not responsible for its content. |
AdministrativeTexts
updated by freddiemac1993, 2013-06-14
wiki
Re: adventures
created by brittdavis10, 2012-02-23 (1 rply, 3 views)
thread
Re: how to run phpwebsite...
created by alexander, 2011-08-25 (2 rpls, 3607 views)
thread
Re: Forum tags
created by HaroldFaragher, 2011-08-22 (3 rpls, 8488 views)
thread