HILFE



  • bei den folgenden Programm ist der Fehler dass es ein fehler kommt :Datei.exe funktioniert nicht mehr

    Aufgabenstellung:

    Ein gegebener Text (wird z.B. in eine Stringtabelle eingelesen) soll in Blöcke gleicher Länge zerhackt werden

    Beispiel: INDE RFRU EHES INDD IETA NNEN KUPF ERNX

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<conio.h>
    void ZerhackeText (char * str, char* strneu);

    void main()
    {
    int i;
    char str[50],strneu[50];

    fgets(str,50,stdin);

    ZerhackeText(str,strneu);
    printf("%s",strneu);
    getch();
    }
    void ZerhackeText (char * str, char* strneu)
    {
    int anz ,i,i2,i3=0,i4=0;
    anz=strlen(str);
    scanf("%d",&i2);

    for(;i3<anz;i3++){
    i=i3;
    if(i%i2==0){
    strneu[i3+i4]=' ';
    i4++;
    i3--;

    }
    else
    strneu[i3+i4]=str[i3];
    }
    anz=strlen(strneu);
    strneu[anz+1]='\0';
    }


  • Mod

    Hallo hiho,

    bitte benutze für zukünftige Beiträge die Codetags:
    http://www.c-plusplus.net/forum/310201
    Und ganz wichtig: Eine brauchbare Überschrift! "HILFE" ist nichtssagend und sieht aus als ob du schreist. Viele Leser ignorieren solche Beiträge aus Prinzip.

    Dein Algorithmus ist eine Endlosschleife. Wenn das if in Zeile 27 anspricht, so wird in Zeile 30 --i3 durchgeführt und vor dem nächsten Durchlauf wieder i3++ (Zeile 25). Daher hat i3 seinen Wert nicht verändert und das if in Zeile 27 spricht wieder an, unendlich oft. Oder eben nicht ganz unendlich, denn i4 wird immer noch jedes Mal um 1 erhöht und so kommt es bald dazu, dass strneu[i3+i4] weit hinter die Grenzen des Arrays zugreift. ➡ Segfault (oder in deutschem Windows: Dieses Programm funktioniert nicht mehr).

    Ich würde als Algorithmus vorschlagen, dass du einen Lese"zeiger" hast, der in jedem Durchlauf um 1 erhöht wird und einen Schreib"zeiger", der bei jedem Schreiben, sowohl Buchstabe als auch Leerzeichen, erhöht wird. "Zeiger" setze ich in Anführungszeichen, weil es egal ist, ob du echte Zeigerarithmetik benutzt oder so wie derzeit mit Indizes arbeitest. Mach das, was dir lieber ist.

    Deine Variablennamen solltest du aussagekräftiger wählen. i, i2, i3, i4, wer blickt da noch durch? Dann würdest du auch sehen, dass dein i vollkommen sinnlos ist (sowohl in main als auch in ZerhackeText).

    Ich würde Eingabe und Hack-Funktionalität trennen. Deine ZerhackeText-Funktion hat Text zu zerhacken, nicht nach Benutzereingaben zu fragen. Mach das außerhalb der Funktion und übergib dies als Parameter. Klare Abgrenzung der aufgaben von Funktionen hilft dir später enorm, wenn du komplexere Programme schreibst. Gewöhn dir das deshalb möglichst früh an.

    main muss in int zurück geben, wenn dein Programm portabel sein soll. Ein Compiler darf zwar auch void unterstützen, braucht er aber nicht.

    Achte auch auf const-correctness, wenn du dir selber einen Gefallen tun möchtest. Das worauf str zeigt wird nicht verändert, das sollte die Funktionssignatur widerspiegeln.



  • SeppJ schrieb:

    Dein Algorithmus ist eine Endlosschleife.

    Seltsam, ich dachte, ein Algorithmus kann per Definition nie in einer Endlosschleife enden.



  • Al-Chwarizmi schrieb:

    SeppJ schrieb:

    Dein Algorithmus ist eine Endlosschleife.

    Seltsam, ich dachte, ein Algorithmus kann per Definition nie in einer Endlosschleife enden.

    so ist das mit dem denken man irrt sich oft


  • Mod

    Al-Chwarizmi schrieb:

    SeppJ schrieb:

    Dein Algorithmus ist eine Endlosschleife.

    Seltsam, ich dachte, ein Algorithmus kann per Definition nie in einer Endlosschleife enden.

    Während die Formulierung zugegeben ungünstig ist, klär doch mal den Nicht-Informatiker auf, wieso ein Algorithmus nicht endlos laufen kann? Ich sehe darin keinen Widerspruch zur informellen und formellen Definition eines Algorithmus, die ich gerade auf Wikipedia nachgeschlagen habe. Eines der wenigen theoretischen Informatikthemen, die ich kenne, das Halteproblem, dreht sich sogar genau darum, ob ein Programm (also ein Algorithmus formuliert in einer Computersprache) endlich oder unendlich lange läuft.

    (Für alle die jetzt überrascht sind: Ja, ich habe nie formell Informatik studiert.)



  • Wikipedia schrieb:

    Ein Algorithmus ist eine aus endlich vielen Schritten bestehende, eindeutige und ausführbare Handlungsvorschrift zur Lösung eines Problems oder einer Klasse von Problemen.

    Da stehts doch drin in der Definition.



  • SeppJ schrieb:

    Eines der wenigen theoretischen Informatikthemen, die ich kenne, das Halteproblem, dreht sich sogar genau darum, ob ein Programm (also ein Algorithmus formuliert in einer Computersprache) endlich oder unendlich lange läuft.

    Ein Programm kann zwar ein Algorithmus formuliert in einer Computersprache sein, aber aus einem Programm muss man nicht einen Algorithmus ableiten können (eben wenn es nicht terminiert).

    Es ist einfach, ein Programm zu schreiben, das das Halteproblem löst und das auch die korrekte Ausgabe liefert, sofern es terminiert. Allerdings kann sich auch das in eine Endlosschleife verfangen und ist damit kein Algorithmus mehr.

    Deshalb sagt steht in allen formellen und informellen Definitionen, die ich auf Wikipedia finden konnte etwas in der Art von

    Knuth schrieb:

    Finiteness: "An algorithm must always terminate after a finite number of steps"

    (Für alle die jetzt überrascht sind: Ja, ich habe noch gar nicht mit dem Studium angefangen.)



  • Al-Chwarizmi schrieb:

    (Für alle die jetzt überrascht sind: Ja, ich habe noch gar nicht mit dem Studium angefangen.)

    👍 +1


  • Mod

    Nathan schrieb:

    Wikipedia schrieb:

    Ein Algorithmus ist eine aus endlich vielen Schritten bestehende, eindeutige und ausführbare Handlungsvorschrift zur Lösung eines Problems oder einer Klasse von Problemen.

    Da stehts doch drin in der Definition.

    Ein Schritt kann aber auch "gehe zum Anfang" sein.



  • ...



  • powned by korinthenkack0rs. allenfalls.
    was ist mit algorithmen die z.b. die nachkommastellen von pi berechnen?
    bin gerade zu faul, um über ähnliche beispiele nachzudenken.



  • Weniger ist manchmal mehr...


Anmelden zum Antworten