Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Buchstabenmanipulationen (Zeichenketten)

Schreiben Sie die folgenden kleinen Programme. Alle erwarten einen String, bestehend aus einigen Sätzen. Schreiben Sie zunächst also ein Hauptprogramm, das einen längeren Text mit Leerschlägen und Sonderzeichen als String oder char[]-array enthält oder vom Anwender erfragt (scan).

  • auspressen(): Schreiben Sie eine Methode, die aus dem Text alle Buchstaben 'e' entfernt. Dabei werden die 'e' nicht etwa durch einen Leerschlag ersetzt, sondern die Zeichenkette wird bei jedem 'e' um ein Zeichen kürzer.
  • nurBuchstaben(): Schreiben Sie eine Methode, die alle Zeichen, die weder Buchstaben, Ziffern noch Leerschläge sind, eliminiert. Der ausgegebene Text (Rückgabewert) enthält also insbesondere keine Sonderzeichen mehr. Aus "Hallo-oh! Welt!" wird "Hallooh Welt".
  • miniKompression(): Schreiben Sie eine Methode, die im Text alle Vorkommen der Zeichenkette "en" durch 'x' ersetzt und umgekehrt ('en' → 'x' und 'x' → 'en'). Daneben sollen auch alle Vorkommen von "er" mit 'q' vertauscht werden. Zu guter Letzt soll noch jedes 'y' durch ein "ch" ersetzt werden, dafür bei jedem "ch" nur noch ein 'y' stehen. Haben Sie bemerkt worauf es hinausläuft? Wir haben soeben selbst eine kleine Kompressionsroutine geschrieben. Suchen Sie weitere reversible Ersetzungen und implementieren Sie diese.

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

4 Lösung(en)

import string
allowed_chars=string.ascii_letters + string.digits + u' \näöüÄÖÜ'
allowed_set = set(allowed_chars)

def auspressen(s):
   a = list(s)
   for i in range (a.count('e')):
      a.remove('e')
   return ''.join(a)


def nurBuchstaben(s):
   a = list(s)
   for c in a:
      if c not in allowed_set:
         a.remove(c)
   return ''.join(a)

def kleinbuchstaben(s):
   a =s.lower()
   return a

def miniKompression_falsch(s):
   s1=s.replace('en','x')
   s2=s1.replace('er','q')
   s3=s2.replace('ch','y')
   return s3

def miniKompression(s):
    out = u''
    w_list = s.split(' ')
    jump = False
    # in Worte zerlegen
    for wort in w_list:
        # in Buchstaben Zerlegen
        for i in range(len(wort)):
            # Buchstaben in c1 und c2 abspeichern
            c1 = wort[i]
            if i < len(wort)-1:
                c2=wort[i+1]
            else:
                c2=''

            # Ersetzungsregeln:  en -> x , x --> en , er --> q , q --> er,
            # ch --> y , y --> ch
            

            if jump:
                # Falls zwei Zeichen in ein Zeichen konvertiert wurde,
                # kann das nächste übersprungen werden.
                jump = False
                continue
            
            elif c1 ==u'e' and c2 == u'n':
                out = out + u'x'
                jump = True
            elif c1 ==u'x':
                out = out + u'en'
            elif c1 ==u'e' and c2 == u'r':
                out = out + u'q'
                jump = True
            elif c1 ==u'q':
                out = out + u'er'
            elif c1 ==u'c' and c2 == u'h':
                out = out + u'y'
                jump = True
            elif c1 ==u'y':
                out = out + u'ch'
            else:
                out = out + c1
        out = out + u' '
    return out

s=u"""Die hinter Wikipedia stehende Organisation Wikimedia hat
von einer US-Stiftung eine Spende über 500'000 Dollar erhalten.
Mit dem Geld sollten weiter freie Informationen zu den Menschen auf
der ganzen Welt gebracht werden, erklärte die William and Flora Hewlett
Foundation. Wikipedia spiele eine wichtige Rolle dabei, Informationen
allgemein zugänglich zu machen. Wikimedia kündigte an, die Software
noch benutzerfreundlicher zu machen und Materialien für neue Mitarbeiter
zu erstellen. (AP)"""

print auspressen(s)
print ''
print nurBuchstaben(s)
print ''
print kleinbuchstaben(s)
print ''
print miniKompression(s)
print ''
print 'Anzahl Buchstaben: '+str(len(miniKompression(s)))
print ''
print miniKompression(miniKompression(s))
print ''
print 'Anzahl Buchstaben: '+str(len(miniKompression(miniKompression(s))))
                
*process langlvl(saa2);
*process limits(fixeddec(31));
*process aggregate, attributes;
*process flag(W), source, insource, options, xref, nest, number, offset;
*process gonumber, snap;
*process or('!');

 /*******************************************************************/
 /* Autor : ph. gressly freimann (@ http://www.sanits-training.ch)  */
 /* Datum : 17. Nov. 2011                                           */
 /* Aufgabe 7.2 (Programmieraufgaben.ch: Buchstabenmanipulation)    */
 /*******************************************************************/

 Strings : proc options(main noexecops);
  dcl TRUE   bit(1) value('1'b);
  dcl FALSE  bit(1) value('0'b);

  /* Line Buffer size. */
  dcl BUFSIZE  dec fixed(31) value(1024)                          ;
  dcl FILENAME char(128)                 varying init("text.txt") ;

  /* Aktuelle (temporaere) Zeile */
  dcl Zeile  char(BUFSIZE)               varying                  ;

  dcl InFile       file record input external;
  /* simpel   : */
   open file(InFile)  title("/" !! FILENAME);
  /* komplexer: */
  /*open file(InFile) title ('/' !! FILENAME !! ','
             !! 'type(text),recsize(' !! BUFSIZE
             !! '),append(n)'); */

  if (endfile(InFile)) then do;
    put skip list("EOF before the occurence of the first line?");
  end;

  dcl lesend     bit(1) init (TRUE);

  on endfile(InFile) lesend = FALSE;

  read file(InFile) into(Zeile);
  do while(lesend);
    put skip list("Gelesen:       "  !! Zeile);
    put skip list("");

    put skip list("Ausgepresst:   "  !! auspressen(Zeile));
    put skip list("");

    put skip list("Nur Buchstaben: " !! nurBuchstaben(Zeile));
    put skip list("");

    put skip list("Komperss:       " !! miniKompression(Zeile));

    /* read next line */
    read file(InFile) into(Zeile);
  end; /* do while */
  put skip list("ende.");

  close file(InFile);
  /* END */


  /** Subroutinen **/
  miniKompression: proc(Zeile) returns (char(BUFSIZE));
    dcl Zeile      char(BUFSIZE) varying              ;
    dcl InPos      bin fixed(15)              init(1) ;
    dcl InCharAct  char(1)                            ;
    dcl IncharNext char(1)                            ;
    dcl Resultat   char(BUFSIZE + 2) varying  init("");
    dcl Ersetzt    bit(1)                             ;

    do InPos = 1 to length(Zeile) ;
      Ersetzt = FALSE;
      InCharNext = '';
      InCharAct  = substr(Zeile, InPos, 1);
      if(InPos < length(Zeile)) then do;
        InCharNext = substr(zeile, InPos + 1, 1);
      end; /* if */

      call reversibel((InCharAct), (InCharNext), Resultat,
                       Ersetzt, InPos,
                      'e', 'n', 'x');

      call reversibel((InCharAct), (InCharNext), Resultat,
                       Ersetzt, InPos,
                      'e', 'r', 'q');
      call reversibel((InCharAct), (InCharNext), Resultat,
                       Ersetzt, InPos,
                      'c', 'h', 'y');
      if (^ Ersetzt) then do;
        Resultat = Resultat !! InCharAct;
      end;
    end; /* do  Zeile */
    return(Resultat);
  end miniKompression;

  /**
   *  Reversible Ersetzung
   *  "ab" wird durch "x" ersetzt und umgekehrt. */
  reversibel    : proc(InCharAct, InCharNext, Resultat,
                       Ersetzt, InPos,
                       a, b, x);
    dcl (InCharAct, InCharNext, a, b, x) char(1)      ;
    dcl Resultat   varying               char(*)      ;
    dcl Ersetzt                          bit(1)       ;
    dcl InPos                            bin fixed(15);

    if((a = InCharAct) & (b = InCharNext)) then do;
      Resultat = Resultat !! x;
      Ersetzt  = TRUE;
      InPos    = InPos + 1;
    end;
    if(x = IncharAct) then do;
      Resultat = Resultat !! a !! b;
      Ersetzt  = TRUE;
    end;
  end reversibel;


  nurBuchstaben : proc(Zeile) returns (char(BUFSIZE));
    dcl Zeile    char (BUFSIZE)     varying          ;
    dcl Resultat char (BUFSIZE + 1) varying init("") ;
    dcl InPos    bin fixed(15)              init (1) ;
    dcl InChar   char(1)                             ;

    do InPos = 1 to length(Zeile);
      InChar = substr(Zeile, InPos, 1);
      if(istAlphaNum(InChar)) then do;
        Resultat = Resultat !! InChar;
      end; /* if */
    end; /* do */
    return(Resultat);
  end nurBuchstaben;

  istAlphaNum: proc(ch) returns (bit(1));
    dcl ch char(1);
    if(('a' <= ch) & (ch <= 'z')) then do;
      return(TRUE);
    end; /* if */
    if(('A' <= ch) & (ch <= 'Z')) then do;
       return(TRUE);
    end; /* if */
    if(' ' = ch) then do;
      return(TRUE);
    end; /* if */
    if (('0' <= ch)  & (ch <= '9')) then do;
      return(TRUE);
    end; /* if */
    return(FALSE);
  end istAlphaNum;

  auspressen: proc (Zeile) returns(char(BUFSIZE));
    dcl Zeile    char(BUFSIZE)     varying          ;
    dcl Resultat char(BUFSIZE + 1) varying init("") ;
    dcl InPos    bin fixed(15)             init(1)  ;
    dcl InChar   char(1)                            ;

    do InPos = 1 to length(Zeile);
      InChar = substr(Zeile, InPos, 1);
      if('e' ^= InChar) then do;
        Resultat = Resultat !! InChar;
      end;
    end; /* do */
    return (Resultat);
  end auspressen;

 end Strings;
                

Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

function pressOutEs(txt) {
  txt = txt.split('');
  let i;
  function remove() {
    txt.splice(i, 1);
    i--;
  }
  for (i = 0; i < txt.length; i++) {
    if (txt[i] == 'e') { remove(); }
    if (txt[i] == 'E') {
      txt[i+1] = txt[i+1].toUpperCase();
      remove();
    }
  }
  return txt.join('');
}

function lettersOnly(txt) {
  return txt.replace(/[^A-z ]/g, '');
}

function miniCompress(txt) {
  let copy = '';
  for (let i = 0; i < txt.length; i++) {
    switch (txt[i]) {
      case ('X'): copy += 'En'; break;
      case ('x'): copy += 'en'; break;
      case ('Q'): copy += 'Er'; break;
      case ('q'): copy += 'er'; break;
      case ('Y'): copy += 'Ch'; break;
      case ('y'): copy += 'ch'; break;
      case ('E'):
        if (txt[i+1] == 'n') { copy += 'X'; i++; }
        else if (txt[i+1] == 'r') { copy += 'Q'; i++; }
        else copy += 'E';
        break;
      case ('e'):
        if (txt[i+1] == 'n') { copy += 'x'; i++; }
        else if (txt[i+1] == 'r') { copy += 'q'; i++; }
        else copy += 'e';
        break;
      case ('C'):
        if (txt[i+1] == 'h') { copy += 'Y'; i++; }
        else copy += 'C';
        break;
      case ('c'):
        if (txt[i+1] == 'h') { copy += 'y'; i++; }
        else copy += 'c';
        break;
      default: copy += txt[i];
    }
  }
  return copy;
}

// eingabemaske
document.write(`
  <p><textarea id="text"></textarea></p>
  <p><button onclick="answer('po')">Auspressen</button>
  <button onclick="answer('lo')">Nur Buchstaben</button>
  <button onclick="answer('mc')">Mini-Kompression</button></p>
  <p><button onclick="answer('bt')">Beispieltext</button>
  <button onclick="answer('xx')">Löschen</button></p>
`);

function answer(what) {
  let t = document.getElementById('text');
  switch (what) {
    case ('po'): t.value = pressOutEs(t.value); break;
    case ('lo'): t.value = lettersOnly(t.value); break;
    case ('mc'): t.value = miniCompress(t.value); break;
    case ('xx'): t.value = ''; break;
    case ('bt'): t.value =
    `Schreiben Sie die folgenden kleinen Programme. Alle erwarten einen String, bestehend aus einigen Sätzen. Schreiben Sie zunächst also ein Hauptprogramm, das einen längeren Text mit Leerschlägen und Sonderzeichen als String oder char[]-array enthält oder vom Anwender erfragt (scan).
    auspressen(): Schreiben Sie eine Methode, die aus dem Text alle Buchstaben 'e' entfernt. Dabei werden die 'e' nicht etwa durch einen Leerschlag ersetzt, sondern die Zeichenkette wird bei jedem 'e' um ein Zeichen kürzer.
    nurBuchstaben(): Schreiben Sie eine Methode, die alle Zeichen, die weder Buchstaben, Ziffern noch Leerschläge sind, eliminiert. Der ausgegebene Text (Rückgabewert) enthält also insbesondere keine Sonderzeichen mehr. Aus "Hallo-oh! Welt!" wird "Hallooh Welt".
    miniKompression(): Schreiben Sie eine Methode, die im Text alle Vorkommen der Zeichenkette "en" durch 'x' ersetzt und umgekehrt ('en' ? 'x' und 'x' ? 'en'). Daneben sollen auch alle Vorkommen von "er" mit 'q' vertauscht werden. Zu guter Letzt soll noch jedes 'y' durch ein "ch" ersetzt werden, dafür bei jedem "ch" nur noch ein 'y' stehen. Haben Sie bemerkt worauf es hinausläuft? Wir haben soeben selbst eine kleine Kompressionsroutine geschrieben. Suchen Sie weitere reversible Ersetzungen und implementieren Sie diese.`;
  }
}                                                            // lissalanda@gmx.at

                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

// NET 6.x | C# 10.x | VS-2022

var txt = "Suchen Sie weitere 'reversible Ersetzungen' und implementieren Sie diese.";
Console.WriteLine(Auspressen(txt));
Console.WriteLine(NurBuchstaben(txt));
Console.WriteLine(MiniKompression(txt));

string Auspressen(string s) => new System.Text.RegularExpressions.Regex(@"[e]").Replace(s, "");
string NurBuchstaben(string s) => new System.Text.RegularExpressions.Regex(@"[^a-zA-Z0-9äöüÄÖÜß ]").Replace(s, "");
string MiniKompression(string s) {
    var sb = new System.Text.StringBuilder();
    for (int i = 0; i < s.Length; i++) {
        if (s[i] is 'X' or 'x') sb.Append(char.IsUpper(s[i]) ? "En" : "en");
        else if (s[i] is 'Q' or 'q') sb.Append(char.IsUpper(s[i]) ? "Er" : "er");
        else if (s[i] is 'Y' or 'y') sb.Append(char.IsUpper(s[i]) ? "Ch" : "ch");
        else if (s[i] is 'E' or 'e') {
            if (s[i + 1] is 'n') { sb.Append(char.IsUpper(s[i]) ? "X" : "x"); i++; }
            else if (s[i + 1] is 'r') { sb.Append(char.IsUpper(s[i]) ? "Q" : "q"); i++; }
            else sb.Append(char.IsUpper(s[i]) ? "E" : "e");
        }
        else if (s[i] is 'C' or 'c') {
            if (s[i + 1] is 'h') { sb.Append(char.IsUpper(s[i]) ? "Y" : "y"); i++; }
            else sb.Append(char.IsUpper(s[i]) ? "C" : "c");
        }
        else sb.Append(s[i]);
    }
    return sb.ToString();
}
                

Lösung von: Jens Kelm (@JKooP)

Verifikation/Checksumme:

miniKompression()

Suchen Sie weitere reversible Ersetzungen und implementieren Sie diese.

wird zu

Suyx Sie weitqe revqsible Ersetzungx und implemxtiqx Sie diese.

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 2
Schwierigkeit: Schwer
Webcode: 2ogd-g4gf
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen