Rechtschreibprüfung



  • Hi, mein Name ist Pascal und ich bin neu im Forum 🙂
    In meiner Informatik Klasse haben wir diese Woche ein neues Assignment bekommen, was mir wirklich Schwierigkeiten macht.
    Wir müssen eine Art Rechtschreibprüfung implementieren. Google hat mir dabei leider nicht weiter geholfen..
    Also:
    Der Input String ist ein großer String auf der command line der eingelesen wird. Dieser sieht so aus z.B.
    XY BCDE BX; BCDE XY AB.

    Der erste Teil des Strings sind die Wörter, die ich bereits kenne und werden mit einem Semikolon vom zweiten Teil getrennt.
    Der zweite Teil sind die Wörter dich ich überprüfen muss. Kenne ich diese Wörter noch nicht aus dem ersten Teil soll ich sie mit einem Stern umrahmen, andernfalls einfach rausschreiben.
    Der output-String von oben würde dann so aussehen:
    BCDE XY *AB*.
    Ein Punkt markiert immer das Ende des Strings.

    Das Problem ist ich weiß nicht wirklich wie ich innerhalb des Arrays auf die einzelnen Wörter zugreifen soll bzw wie ich diese für Wörterbuch und Prüfwörter separiere...
    Zusätzlich ist es uns nicht erlaubt, die string Funktionen zu verwenden, also strtok fällt weg...

    Ich bin dankbar für jeden Tipp/Hinweis und Sonstiges 🙂

    Lg Pascal



  • pascal_77 schrieb:

    Google hat mir dabei leider nicht weiter geholfen..

    lol

    pascal_77 schrieb:

    Zusätzlich ist es uns nicht erlaubt, die string Funktionen zu verwenden

    Typischer Professoren-Unsinn.

    Dann musst du dir für die elementaren Funktionen eigene Funktionen schreiben,
    also für strstr z.B. mystrstr und strchr dann mystrchr.
    Beim Programmdesign solltest du trotzdem erstmal die str-Funktionen der Standardbibliothek benutzen, um diese dann zum Schluss mit dem Eigenbau zu ersetzen. (nennt man auch Top-Down Entwurf)

    strtok brauchst du nicht, das ist viel zu aufwändig für diese Aufgabenstellung, also meinetwegen

    char a[10000], s[100],*e;
    fgets(a,10000,stdin);
    e = strchr(a,';');
    *e++=0;           /* String in Vorder- und Hinterteil teilen, der vordere bleibt für die Suche konstant, der hintere wird durch sscanf wortweise durchlaufen */
    *strchr(e,'.')=0; /* Punkt am Ende entfernen */
    for(int i=0;1==sscanf(e+=i,"%99s%n", s,&i);)
      if( strstr(a,s) )
        printf("*%s* ",s);
      else
        printf("%s ",s);
    puts(".");
    

    Enthaltene Substrings werden hier erstmal ignoriert, du sollst auch selbst noch was machen.



  • Danke für die Hilfe.

    Das mit den Substrings klappt leider auch nicht so ganz.

    Ich habe die Funktionen ersetzen können(strchr und strstr) jedoch hab ich nun ein weiteres Problem. alle Funktionen müssen rein in die main Funktion.
    Das Programm darf lediglich aus einer einzigen Main Klasse bestehen...
    Die Funktion sscanf macht mir auch Probleme.
    Der Code soll danach in Assembler umgeschrieben werden, mit u.a. sscanf ist da keine option 😞

    Weitere Angaben sind nur getchar und puts als I/O.

    Sorry für mein Nichtwissen. Bin neu auf diesem Gebiet 😞
    Lg pascal



  • pascal_77 schrieb:

    Das mit den Substrings klappt leider auch nicht so ganz.

    Was genau klappt nicht so ganz? Was/wie hast du das denn jetzt implementiert? Kommt eine Fehlermeldung/Segfault/Access Violation/Alien auf Dreirad? Wenn ja, warum hast du die nicht gepostet?

    EDIT: Vor allem wäre ich an dem Alien interessiert. 🙂

    pascal_77 schrieb:

    Ich habe die Funktionen ersetzen können(strchr und strstr) jedoch hab ich nun ein weiteres Problem. alle Funktionen müssen rein in die main Funktion.
    Das Programm darf lediglich aus einer einzigen Main Klasse bestehen...

    Wie, wat?
    Funktion ist nicht gleich Klasse. Und Klassen haben wie so auch nicht in C. Schon gar nicht haben wir Methoden, die, wenn ich deinen Post richtig verstehe, dein Professor jetzt von dir implementiert sehen will. Oder sollen die Funktionsimplementierungen jetzt IN die Funktion - denn das ist ja auch möglich.

    Und wo ist jetzt da das Problem? Entweder machst du in Wirklichkeit C++ mit C-I/O-Funktionen (in der Regel eine eher schlechte Idee, aber kann man machen), dann packst du deine Funktionen halt in deine Main-Klasse, machst sie statisch, und rufst sie dann halt so auf - oder du packst deine Funktionskörper in deine main-Routine. Wo genau brauchst du womit nun Hilfe?

    pascal_77 schrieb:

    Die Funktion sscanf macht mir auch Probleme.

    Ja, welche denn? Lerne mal vernünftig deine Probleme zu kommunizieren.

    Ja, hören Sie, ich habe hier Probleme, da kommt 'ne Fehlermeldung. Bei welchem Programm? Weiß ich doch nicht, auf so was achte ich doch nicht. Was für 'ne Fehlermeldung? Sowas lese ich mir doch nicht durch. Auf welchem Betriebssystem? Ich verwende Windows 97! Wie, das ist kein Betriebssystem? Dann ... Kori Sieben. Kori Sieben! Auch nicht? Ähm ... äh, was ist ein Betriebssystem noch mal?

    pascal_77 schrieb:

    Der Code soll danach in Assembler umgeschrieben werden, mit u.a. sscanf ist da keine option 😞

    Dein Punkt. Weil diese ganzen neumodischen Compiler auch keinen Maschinencode mehr genieren, sondern nur irgendeine Zwischensprache, die un-mög-lich zu disassemblieren ist. Sonst hätte man sich mal den Code zur Inspiration anschauen können ...

    *lins* Ups, wir sind hier gar nicht die Java/C#-Ecke. :p

    pascal_77 schrieb:

    Weitere Angaben sind nur getchar und puts als I/O.

    Ich habe noch mehr: Reis und Nudeln als Beilage.

    pascal_77 schrieb:

    Sorry für mein Nichtwissen. Bin neu auf diesem Gebiet 😞
    Lg pascal

    Unwissen ist keine Entschuldigung für schlechte Kommunikation. Muss ich so hart auf den Punkt bringen.


  • Mod

    pascal_77 schrieb:

    Das mit den Substrings klappt leider auch nicht so ganz.

    Dann ist ja alles klar.

    Ich habe die Funktionen ersetzen können(strchr und strstr) jedoch hab ich nun ein weiteres Problem. alle Funktionen müssen rein in die main Funktion.

    Dann musst du eben jedes Vorkommen der Funktion mit dem Inhalt der Funktion ersetzen.

    Das Programm darf lediglich aus einer einzigen Main Klasse bestehen...

    Klasse?

    Die Funktion sscanf macht mir auch Probleme.
    Der Code soll danach in Assembler umgeschrieben werden, mit u.a. sscanf ist da keine option 😞

    Wieso? Was denkst du denn, was der Compiler macht, wenn er scanf sieht? Oder allgemein: Wieso keine Funktionen?

    Weitere Angaben sind nur getchar und puts als I/O.

    Dann musst du eben das printf und scanf durch entsprechende Funktionen ersetzen, die intern nur puts und getchar benutzen. Und wenn du unbedingt meinst, dass das nötig wäre, dann eben diese wieder von Hand in der main einfügen. Du meinst übrigens wahrscheinlich putc.

    Nenn solche Einschränkungen doch gleich!



  • Sorry für den "bescheidenen" Post vorhin. Ware in Eile und hab nicht wirklich nachgedacht.

    So, zu meinem Problem.

    Aufgabenstellung nochmal neu:
    das C-Programm darf nur 1 Main Funktion haben. keine string funktionen, am besten alles recht simpel halten.

    Mein Code sieht soweit so aus:

    Momentane helper:

    int MyStrStr(char * a,char * b)
    {
    int a_p = 0;
    int b_p = 0;
    int ret = -1;
    
          while(1)
          {
              if(a[a_p] == '\0')
                  break;
              if(a[a_p] == b[0])
              {
                  ret = a_p;
                  b_p = 0;
                  //start check
                  while(1)
                  {
                      if(b[b_p] == '\0')
                          break;
                      if(a[a_p+b_p] != b[b_p])
                      {
                          return -1;
                      }
                      b_p++;
                  }
            }
            a_p++;
        }
        return ret;
    }*/
    char *my_strchr(char *s, const char ch)
    {
    
        while(*s && *s != ch)
            ++s;
    
        return s;
    
    }
    

    Das eigentlich Programm

    int i;
    int main()
    {
    
    char a[10000];
    char s[100];
    char *e;
    char ch = ';';
    char c = '.';
    fgets(a,10000,stdin);
    char *test;
    test = a;
    
     while(*test && *test != ch)
            *++test;
    
    e = test;
    
    *e++=0;
    printf("%s\n", e);
             /* String in Vorder- und Hinterteil teilen, der vordere bleibt für die Suche konstant, der hintere wird durch sscanf wortweise durchlaufen */
    //*my_strchr(e,'.')=0; /* Punkt am Ende entfernen */
    
    test = *e++;
    
     while(*test && *test != c)
            *++test;
    test = 0;
    
    for(i=0; 1==sscanf(e+=i,"%99s%n", s,&i);)
    
    //strstr part
    //here i am stuck. i need a valid if condition?
    //how can i check it if i have no function?
           while(1)
          {
              if(a[a_p] == '\0')
                  break;
              if(a[a_p] == s[0])
              {
                  ret = a_p;
                  b_p = 0;
                  //start check
                  while(1)
                  {
                      if(s[b_p] == '\0')
                          break;
                      if(a[a_p+b_p] != s[b_p])
                      {
                          return -1;
                      }
                      b_p++;
                  }
            }
            a_p++;
        }
    
        printf("*%s* ",s);
    
        printf("%s ",s);
    puts(".");
     }
    

    Folgende Passagen würde ich nochmal gern hervorheben:

    *my_strchr(e,'.')=0;
    

    Die Funktion my_strchr ( funktioniert genau gleich wie strchr! )returnt den Punkt. Dieser soll weg. Ich hab das versucht in meinem Code
    selbst zu schreiben, jedoch endet dies in einer Endlosschleife.

    for(i=0; 1==sscanf(e+=i,"%99s%n", s,&i);)
    

    könnte mir genau erklären was die macht? Ich weiß dass diese formatierten Input liest. Aber was bedeutet der vergleich mit 1?

    Im If-statement prüf ich auf die Funktion mystrstr. Jedoch ohne diese habe ich nichts zu prüfen? ( siehe kommentar in code )

    [quote="SeppJ"]

    Das Programm darf lediglich aus einer einzigen Main Klasse bestehen...

    Klasse?[quote]

    Ich arbeite viel mit C++ und Java im Moment. Da hab ich das in der Eile wohl verwechselt. Es gibt eine Main-Funktion. mehr nicht.

    Wieso? Was denkst du denn, was der Compiler macht, wenn er scanf sieht? Oder allgemein: Wieso keine Funktionen?

    Funktionen sind laut Professor nicht erlaubt.

    Nenn solche Einschränkungen doch gleich!

    Sorry 😞

    Was genau klappt nicht so ganz? Was/wie hast du das denn jetzt implementiert? Kommt eine Fehlermeldung/Segfault/Access Violation/Alien auf Dreirad? Wenn ja, warum hast du die nicht gepostet?

    EDIT: Vor allem wäre ich an dem Alien interessiert. 🙂

    Leider kein Alien 🙂

    Wie, wat?
    Funktion ist nicht gleich Klasse. Und Klassen haben wie so auch nicht in C. Schon gar nicht haben wir Methoden, die, wenn ich deinen Post richtig verstehe, dein Professor jetzt von dir implementiert sehen will. Oder sollen die Funktionsimplementierungen jetzt IN die Funktion - denn das ist ja auch möglich.

    Und wo ist jetzt da das Problem? Entweder machst du in Wirklichkeit C++ mit C-I/O-Funktionen (in der Regel eine eher schlechte Idee, aber kann man machen), dann packst du deine Funktionen halt in deine Main-Klasse, machst sie statisch, und rufst sie dann halt so auf - oder du packst deine Funktionskörper in deine main-Routine. Wo genau brauchst du womit nun Hilfe?

    Wie bereits erwähnt eine Main-Funktion. Keine Klasse. Alles da reinstopfen wenn man so will 🙂

    Unwissen ist keine Entschuldigung für schlechte Kommunikation. Muss ich so hart auf den Punkt bringen.

    Ich hoffe ich konnte alles klar stellen. Wo ich doch der Fragende bin 🤡

    Danke für eure Mühe.
    Lg



  • Ich fürchte, so wirklich klarstellen konntest du den Sachverhalt nicht. Poste doch mal die Aufgabenstellung wörtlich. Die wird ja wohl nicht nur

    das C-Programm darf nur 1 Main Funktion haben. keine string funktionen, am besten alles recht simpel halten.

    lauten.

    Zum einen sagst du, es darf nur die main-funktion geben, zum anderen schreibst du dir aber selbst Funktionen. Das ergibt keinen Sinn.

    Du merkst: wir fragen hier nach Details, bis wir alle wissen. Es ist sehr mühsam, Neulingen klar zu machen, dass sie besser einfach eine klare Aufgabenstellung liefern. Es ist sehr frustierend, wenn man einige Posts geschrieben hat, um dann zu lesen: "Achja, sorry, vergessen. Funktionen sind nicht. Achja, und ich darf nur ints verwenden, und außerdem...".
    Versuch dich, in unsere Lage zu versetzen. Wir wissen nicht, was du kannst, wir wissen nicht, was du erreichen willst, wir wissen nicht, welche Mittel du einsetzen darfst. Daher ist es umso wichtiger, dass du klare Fragen stellst.

    Und ganz wichtig: rücke deinen Code vernünftig ein. Manchmal passt das, aber ab und an siehts nicht schön aus.



  • Ich dachte eigentlich ich hätte mich nun klar ausgedrückt 😞

    Hier die Angabe:

    Das Programm erwartet am Standard-Input einen Zeichen-String bestehend aus
    ASCII-Zeichen. Der Zeichen-String besteht aus den Buchstaben A‐Z,
    Leerzeichen, einem Strichpunkt und am Ende einem Punkt. Der Zeichenstring wird
    in zwei Teilen interpretiert: Zuerst wird „das Wörterbuch" eingelesen. Die
    Wörter des Wörterbuches sind durch Leerzeichen getrennt. Das Ende des
    Wörterbuches wird mit einem Strichpunkt gekennzeichnet. Nach dem Wörterbuch
    kommt er zu prüfende Text. Dieser Text besteht ebenfalls aus Wörtern. Die Wörter
    sind durch Leerzeichen getrennt. Der zu prüfende Text wird mit einem Punkt
    abgeschlossen. Das Programm durchsucht die Wörter des zu prüfenden Textes nach
    deren „Rechtschreibung“. Das Programm markiert alle Wörter, welche sich nicht im
    Wörterbuch befinden, mit einem Stern ("*") vor dem ersten Buchstaben und einem
    weiteren Stern nach dem letzten Buchstaben des Wortes. Der so markierte zu
    prüfende Text wird am Standard--‐Output ausgegeben. Nach dem letzten Wort
    soll ein Punkt ausgegeben werden. In der C--‐Version soll nach dem Punkt
    noch ein „Carriage Return“ („\n“) ausgegeben werden.

    Beispiel:
    Als Beispiel für eine Eingabe betrachten wir folgenden Text:
    XY BCDE BX CDE CDEF;BCDE XY UV ABC CDE BX X A CDEF.

    Das Wörterbuch besteht in diesem Beispiel aus den 5 Wörtern
    XY, BCDE, BX, CDE und CDEF.
    Der zu prüfende Text lautet BCDE XY UV ABC CDE BX X A CDEF.
    Der gewünschte Output des Programms sieht so aus:
    BCDE XY *UV* *ABC* CDE BX *X* *A* CDEF.

    Das C--‐Programm soll nur aus der Funktion main() bestehen. Alle
    verwendeten Variablen müssen global sein. Zum Einlesen von Zeichen vom
    Standard--‐Input soll die Funktion getchar() verwendet werden.
    Zum Ausgeben von Zeichen aus Standard--‐Output soll die Funktion
    putchar() verwendet werden.


  • Mod

    Schön für euch, dass ihr solch ein stilistisch schönes, modernes und praxisrelevantes C beigebracht bekommt 🙄 . Ihr Armen.

    Letztlich ist aber nichts zu dem hinzu zu fügen, was schon gesagt wurde: Mach es erst einmal so, dass es funktioniert, mit einem vernünftigen Stil. Dann übersetz es Schritt für Schritt.



  • Ok, danke jedenfalls. eine letzte Frage hätte ich nun noch.

    Das Programm müsste soweit funktionieren. Jedoch scheitere ich bei der letzten Überprüfung.
    Die Unterscheidung ob bereits bekannt oder nicht arbeitet nicht korrekt.
    Ich habe es mit der strstr() Funktion getestet, da funktioniert es. Nur komm ich einfach nicht auf die letzte Überprüfung, weil ich es einfach gewohnt bin die Funktion zu prüfen. Da hier aber alles in der main ist geht das nicht.

    soweit mein code:

    int main()
    {
    	int len= 0;
    	char a[10000];
    	char s[100];
    	char *e;
    	char ch = ';';
    	fgets(a,10000,stdin);
    	char *test;
    	test = a;
    	char *start;
    
    	while(*test && *test != ch)
    					*++test;
    
    	e = test;
    	*e++=0;        
    
    	int k = 0;
    	while (e[k] != c)
    	{
    		k++;
    	}
    	e[k] = 0;
    	int x;
    	int i, j, counter = 0;
    
    	for(x=0;1==sscanf(e+=x,"%99s%n", s,&x);)
    	{
    		counter = 0;		
    		char *t, *b;
    
    		b = s;
    
    		for ( ; *a != 0; *a += 1) 
    		{
    			if (*a != *b) 
    			{
    				continue;
    			}
    			counter++;	
    			t = a;
    
    			while (1) 
    			{
    
    				if (*b == 0) 
    				{
    					printf("%s ",s);
    				}
    				if (*t++ != *b++) 
    				{
    					break;
    				}
    			}
    			b = s;
    	    }
        if(counter == 0)
    			printf("*%s* ",s);
    		else
    			printf("%s ",s);
    }	
    
    	puts(".");
    }
    

    Lg pascal_77



  • int main()
    {
      char a[] = "XY BCDE BX CDE CDEF;BCDE XY UV ABC CDE BX X A CDEF."
        , s[100]
        , *e, *p = a;
      int x;
    
      while (*p && *p != ';')
        ++p;
      *p++ = 0;
    
      e = p;
    
      while (*p && *p != '.')
        ++p;
      *p = 0;
    
      for (x = 0; 1 == sscanf(e += x, "%99s%n", s, &x);)
      {
        const char *c = a;
    
        while (*c)
        {
          const char *b = s;
          while (*c == ' ') ++c;
          const char *d = c;
          while (*d && *d != ' ') ++d;
    
          while (*c && *c == *b) ++c, ++b;
    
          if (!*b && *c <= ' ') {
            c = 0; break;
          }
    
          c = *d ? d + 1 : d;
        }
    
        if (c)
          printf("*%s* ", s);
        else
          printf("%s ", s);
      }
    
      puts("\b.");
    }
    

Log in to reply