[C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Code:
if (counter >= 0 && counter <= 25) {
     counter++;
}
na das hier is doch genau der knackpunkt (meines erachtens nach) ^^ einmal schaust du mit counter, ob der aktuelle buchstabe ein a-z is um es kurz drauf mit der anzahl zu überschreiben. und diese anzahl überschreibst du dann im nächsten durchgang wieder mit dem ascii/index wert >< das kann doch nix werden ^^ der letzte "echte" buchstabe is das d, ascii wert von 100. die 97 abgezogen um auf den index zu kommen biste bei 3 und im anschluss setzte noch 1 druff -> 4. is jetz natürlich die frage, wieso er da ne 5 ausgibt *grübel*
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Ok, jetzt verstehe ich zumindest, was du meinst, nur was genau soll ich ändern? Bei dieser Variante käme ich wieder auf 130 ...
Code:
void count(char *s) {
    int i=0, [COLOR=royalblue]j=0, counter=0, length=checkLength(s);

    while (i != length) {
        if (*(s+i) >= 'A' && *(s+i) <= 'Z') {
            counter=((int)*(s+i))-65;
        } 
        if (*(s+i) >= 'a' && *(s+i) <= 'z') {
            counter=((int)*(s+i))-97;
        }
        if (counter >= 0 && counter <= 25) {
            [COLOR=royalblue]j++;        }
        i++;
    }

    printf("Character count: %d (100 %%)\n", [COLOR=royalblue]j);
}
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

baus mal wie ich mit der if-elseif-else schleife. im moment fragst du, ob es großbuchstaben sind oder kleinbuchstaben. in einem der beiden fälle gibst du counter dann den index des buchstabens - das funzt ja dann scheinbar gut jetz :)

das problem is aber eben: wenn jetzt ein sonderzeichen auftaucht, behält counter einfach den wert vom vorangegangenen zeichen - und wird einfach mitgezählt. sollte es also weder ein groß- noch ein kleinbuchstabe sein, musst du einen wert für counter erzeugen, der ausserhalb von 0-25 liegt. also -1 oder 26 - oder 100 ^^ hautsache nix von 0-25. dann fällt das ganze in der nachfolgenden prüfung von counter nämlich durch und j wird nicht inkrementiert.

btw: du solltest j vllt in ascii oder irgendwas sinvolles umbenennen und dann diesen variablennamen dort verwenden, wo du grad counter nutzt und counter anstelle von j nutzen ^^ also der lesbarkeit wegen, für die funktionalität isses natürlich latte :D
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

So funktioniert es jetzt:
Code:
void count(char *s) {
    int i=0, counter=0, ascii=0, length=checkLength(s);

    while (i != length) {
        if (*(s+i) >= 'A' && *(s+i) <= 'Z') {
            ascii=((int)*(s+i))-65;
        } else if (*(s+i) >= 'a' && *(s+i) <= 'z') {
            ascii=((int)*(s+i))-97;
        } else {
            ascii=((int)*(s+i)); /* Sonderzeichen */
        }
        if (ascii >= 0 && ascii <= 25) {
            counter++;
        }
        i++;
    }

    printf("Character count: %d (100 %%)\n", counter);
}
Many thanks!!! :daumen:

Jetzt überlege ich mir den Rest (und melde mich gegebenenfalls noch einmal) ...
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

So, der Code wäre nahezu fertig, nur wie die Ausgabe zeigt, hat offensichtlich meine Berechnung der Vorkommnisse jedes Buchstaben noch einen Logikfehler ...
Code:
void analyzeString(char *s) {
    int i=0, j=0, counterOne=0, counterTwo=1, ascii=0, length=checkLength(s);
    double percentage=0.0;

    /* Anzahl der Buchstaben des Satzes ermitteln */
    while (i != length) {
        if (*(s+i) >= 'A' && *(s+i) <= 'Z') {
            ascii=((int)*(s+i))-65;
        } else if (*(s+i) >= 'a' && *(s+i) <= 'z') {
            ascii=((int)*(s+i))-97;
        } else {
            ascii=((int)*(s+i)); /* Sonderzeichen bekommen Werte außerhalb des Bereichs 0 - 25 */
        }
        if (ascii >= 0 && ascii <= 25) {
            counterOne++;
        }
        i++;
    }

    /* Anzahl der Vorkommnisse jedes Buchstaben ermitteln */
  [COLOR=royalblue]  for (i; i<length; i++) {
        for (j=1; j<length; j+=i) {
            if (*(s+i)==*(s+j)) {
                counterTwo++;
            } 
        }
    }
    printf("Character count: %d (100 %%)\n", counterOne);
    printf("\nDetailled Frequence Analysis:\n");
    printf("\n  : count : percentage\n======================\n");
    for (j='a'; j<='z'; j++) {
        percentage=(double)((counterTwo*100)/counterOne);
        printf("%c :     %d :       %.2lf\n", j, counterTwo, percentage);
    }
    putchar('\n');
}
Hier der gesamte Code:
Code:
#include <stdio.h>

int checkLength(char *s) {
    int length=0;

    while (*(s+length) != '\0') {
        length++;
    }
    return length;
}

void analyzeString(char *s) {
    int i=0, j=0, counterOne=0, counterTwo=1, ascii=0, length=checkLength(s);
    double percentage=0.0;

    /* Anzahl der Buchstaben des Satzes ermitteln */
    while (i != length) {
        if (*(s+i) >= 'A' && *(s+i) <= 'Z') {
            ascii=((int)*(s+i))-65;
        } else if (*(s+i) >= 'a' && *(s+i) <= 'z') {
            ascii=((int)*(s+i))-97;
        } else {
            ascii=((int)*(s+i)); /* Sonderzeichen bekommen Werte außerhalb des Bereichs 0 - 25 */
        }
        if (ascii >= 0 && ascii <= 25) {
            counterOne++;
        }
        i++;
    }

    /* Anzahl der Vorkommnisse jedes Buchstaben ermitteln */
    for (i; i<length; i++) {
        for (j=1; j<length; j+=i) {
            if (*(s+i)==*(s+j)) {
                counterTwo++;
            } 
        }
    }

    printf("Character count: %d (100 %%)\n", counterOne);
    printf("\nDetailled Frequence Analysis:\n");
    printf("\n  : count : percentage\n======================\n");
    for (j='a'; j<='z'; j++) {
        percentage=(double)((counterTwo*100)/counterOne);
        printf("%c :     %d :       %.2lf\n", j, counterTwo, percentage);
    }
    putchar('\n');
}

/*int main(int argc, char *argv[]) {*/
int main(void) {
    /*char *s = argv[1];*/

    /*if (argc > 2) {
        printf("Invalid input!\n");
    }*/

    char *s = "Mal sehen was die Haeufigkeitsanalyse dieses Textes ergibt!? Ich denke, dass 'e' wohl wirklich der haeufigste Buchstabe sein wird!";
    analyzeString(s);

    return 0;
}
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

erste frage: wieso beginnst du bei i=1 und nich 0? besonderer grund dazu? und bei der inneren for schleife haste for(j; ...) stehn ^^ da fehlt wohl auch was :P

aso, ich glaube, ich verstehe, was du vorhast. du gehst jeden buchstaben durch und zählst dann, wieviele weitere davon vorkommen. an und für sich ok, nur hast du hier auch wieder einen counter (counterTwo) für alle möglichen buchstaben. zudem müsstest du alle vorkommen des aktuell betrachteten zeichens löschen und dann den length-wert anpassen und aufpassen, das dir das ned die forschleife irgendwie killt. ich finds etwas umständlich. warum machst dus nich einfach mit dem vorgeschlagenen array? einfach für jeden buchstaben ein array element + eines für sonderzeichen. dann kannste im ersten durchgang mit counterOne schon immer das array-element[ascii] inkrementieren un gut is. am ende haste dann ein volles array mit allen anzahlen und kannst das bequem auswerten (siehe mein erstes bsp).
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Anscheinend hast du gepostet, während ich noch editiert habe. Die derzeitig finale Version ist jetzt oben drinnen mit j=1. j sollte eigentlich größer sein als i, aber dass das so nicht funktionieren wird, ist mir jetzt klar. Für den ersten Buchstaben (a = 8 Vorkommnisse), würd's allerdings sogar funktionieren (mit counterTwo=0 und i=1). Nur müsste ich dem Konstrukt dann irgendwie sagen, dass es mit dem nächsten weitermachen soll ...

Werde mich jetzt mal in die Feld-Variante, die du vorgeschlagen hast, reindenken. Noch verstehe ich das nicht so ganz.
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Also jetzt mal ehrlich... überlegst du dir vorher was du da hinschreibst? Klingt jetzt vielleicht nen bisschen hart, aber die ersten Versionen deines Codes die du hier postest ergeben fast nie einen Sinn. Geh doch einfach mal logisch durch was da steht. Zeile für Zeile. Toll das DarkMo sich hier die Mühe macht und dir hilft und dir die Lösung präsentiert, aber das kann doch nicht Sinn und Zweck der Aufgabe sein.

Dennoch eine Anmerkungen: Warum ne neue for Schleife? Du gehst doch bereits alle Buchstaben des Strings vorher durch. Nutz das doch und verwende wie von DarkMo vorgeschlagen ein Array.

EDIT:
Bsp. Array[ascii] = Array[ascii]+1; Danach haste eine Array der für jeden Ascii Wert anzeigt wie viele da drin waren.
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

ich kanns ja versuchen zu erklären. sollta n sich nich sooo schwer sein *denk*

das array hat 27 elemente, also von 0 bis 26. der erste buchstabe hat also den index 0 -> array[0]. dieses element hat einen wert - hier sinnvollerweise nen integer zum zählen. anfangs sollte das natürlich auch 0 sein. also array[0] = 0; heisst soviel wie, dass vom ersten buchstaben 0 gezählt wurden. so, jetz gehst du ja den string da durch und reduzierst die gefundenen zeichen auf einen wert zwischen 0 und 25. 0-a, 1-b, 2-c... 25-z. und das kannst du ja perfekt für das array nutzen. den index jedes buchstabens hast du ja in der variable ascii gespeichert/rausgefunden. wenn du also ein a (oder A) findest, ist ascii immer 0 und in dem falle, kannst du array[<ascii von a>] -> ergo array[0] um eins erhöhen => array[0]++. hast also beim ersten fund aus dem wert dieses elements ne 1 gemacht (war ja mit 0 initialisiert). jeder weitere fund erhöht den entsprechenden wert.

kannste dann eben ganz einfach so lösen, dass du bei a/A-z/Z wie gehabt den ascii wert zurecht rechnest (wie bisher) und im letzten else teil (wo du grad einfach den unveränderten ascii wert speicherst) dann den ascii-wert auf 26 setzt. dann im anschluss erhöhst du einfach array[ascii] um eins und fertig. wie gesagt: ist was ein b, ist der ascii-wert 1 und somit wird array[ascii] - also array[1] um eins erhöht. ist es ein sonderzeichen, hat ascii den wert 26 und eben das letzte element wird um eins erhöht (z is die 25, danach is das einfache alphabet zuende). jo, un dann gehste das ganze array nochma durch und gibst alles aus. ob du da jetzt wie ich im bsp nur vorhandene zeichen ausgibst oder alle is ja dir überlassen. kannst das ganze auch, wie bei dir im letzten code, direkt in der count funktion machen. spart das zurück geben vom length wert und is sogar bissl eleganter *find* ^^

ich hoffe, das war einigermaßen verständlich erklärt ^^
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Also jetzt mal ehrlich... überlegst du dir vorher was du da hinschreibst? Klingt jetzt vielleicht nen bisschen hart, aber die ersten Versionen deines Codes die du hier postest ergeben fast nie einen Sinn. Geh doch einfach mal logisch durch was da steht. Zeile für Zeile. Toll das DarkMo sich hier die Mühe macht und dir hilft und dir die Lösung präsentiert, aber das kann doch nicht Sinn und Zweck der Aufgabe sein.
Wie dir vielleicht aufgefallen ist, übernehme ich fast nichts von den Codes, die andere Leute hier posten, sondern versuche, aus deren Erklärungen das rauszuholen, was ich brauche, um eine eigene Version zu schreiben. Im Übrigen verstehe ich fast ein Drittel von dem, was DarkMo in seinem Code macht, nicht. Meinen eigenen hingegen kann ich zu 100 % nachvollziehen. Und einen funktionierenden Code zu schreiben, den man versteht, dürfte wohl der Sinn der Aufgabe sein ... ;-)

Im Übrigen zählt Programmieren nun mal leider nicht zu meinen Stärken und ich würd's wohl freiwillig auch nicht machen, wenn ich es nicht für's Studium bräuchte. Reden wir mal über was, das ich gut kann und du nicht (da gibt's sicher genug). Mal sehen, wer dann mit solchen Sprüchen, wie dem deinigen oben kommt.
Dennoch eine Anmerkungen: Warum ne neue for Schleife? Du gehst doch bereits alle Buchstaben des Strings vorher durch. Nutz das doch [...]
Ich splitte am liebsten alles auf, das sich irgendwie trennen lässt, weil ich bei mehreren kleinen Konstrukten wesentlich leichter den Überblick behalte, aber ist natürlich eine Frage des persönlichen Programmierstils.
EDIT:
Bsp. Array[ascii] = Array[ascii]+1; Danach haste eine Array der für jeden Ascii Wert anzeigt wie viele da drin waren.
Daran arbeite ich gerade ...

@ DarkMo
Danke für die Erklärung.
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Okay, wenn ich eure Variante mit dem Feld auch nur ansatzweise kapiert habe, sollte ich zumindest auf dem richtigen Weg sein ...
Code:
#include <stdio.h>

int checkLength(char *s) {
    int length=0;

    while (*(s+length) != '\0') {
        length++;
    }
    return length;
}

[COLOR=royalblue]void analyzeString(char *s) {
    int number[26], i=0, j=0, k=0, counter=0, ascii=0, length=checkLength(s);
    double percentage=0.0;

    /* Feld mit 0er initialisieren */
    for (i; i<=26; i++) {
        number[i]=0;
    }

    /* Anzahl der Buchstaben des Satzes ermitteln */
    while (i != length) {
        if (*(s+i) >= 'A' && *(s+i) <= 'Z') {
            ascii=((int)*(s+i))-65;
        } else if (*(s+i) >= 'a' && *(s+i) <= 'z') {
            ascii=((int)*(s+i))-97;
        } else {
            ascii=((int)*(s+i)); /* Sonderzeichen bekommen Werte außerhalb des Bereichs 0 - 25 */
            number[26]=ascii;
        }
        if (ascii >= 0 && ascii <= 25) {
            counter++;
            number[ascii]++;
        }
        i++;
    }

    printf("Character count: %d (100 %%)\n", counter);
    printf("\nDetailled Frequence Analysis:\n");
    printf("\n  : count : percentage\n======================\n");
    for (j='a', k; j<='z', k<=26; j++, k++) {
        percentage=(((double)number[k]*100)/(double)counter);
        printf("%c :     %d :       %.2lf\n", j, number[k], percentage);
    }
    putchar('\n');
}/*int main(int argc, char *argv[]) {*/
int main(void) {
    /*char *s = argv[1];*/

    /*if (argc > 2) {
        printf("Invalid input!\n");
    }*/

    char *s = "Mal sehen was die Haeufigkeitsanalyse dieses Textes ergibt!? Ich denke, dass 'e' wohl wirklich der haeufigste Buchstabe sein wird!";
    analyzeString(s);

    return 0;
}
Leider stimmen die Werte (noch) nicht und ich bekomme nach der Ausführung die Meldung: "Stack around the variable 'number' was corrupted!"
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

hmm, du musst 27 elemente bauen. das ist wie bei der länge von so zeichenketten. abc ist 3 lang, der index geht aber nur bis 2, da das erste element den index 0 hat (0 1 2 <- 3 elemente). für dein zähle array brauchst du also 26 elemente (für jeden buchstaben eins) und eines als "sammelbecken" für alle sonderzeichen - macht 27. und dann gibts zu beachten, dass bei number[27] das letzte element die 26 ist (wieder das bsp mit der länge von eben im kleinen: 3 länge, letzter index aber 2). du hast bei deinem number[26] in der for schleife bis <=26 gezählt - also die 26 inbegriffen (kleiner und gleich). also entweder brauchst du <=25 oder <26. mit den 27 elementen würde dein <=26 dann aber wieder anstandslos funktionieren.

und der zugriff auf das nicht vorhandene 27. element mit dem index 26 verursacht deinen fehler da ^^
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Ah, ok. Habe bei der Deklaration des Feldes den Index mit der Anzahl der Feldelementen verwechselt. Die Fehlermeldung ist jetzt weg, aber dafür stimmen in der Ausgabe gar keine Werte mehr; nicht einmal der Gesamtbuchstaben-Count ... :(

^^ Genau deswegen will ich immer alles aufsplitten. Hast du nämlich ein großes Konstrukt und baust einen Fehler ein, ist alles im A****, auch das, was schon funktioniert hat.

Capture.JPG Capture2.JPG

Und was soll das eigentlich für eine komische Zeile nach der z-Zeile sein? Die habe ich nicht programmiert?! Die macht der selber.
Code:
#include <stdio.h>

int checkLength(char *s) {
    int length=0;

    while (*(s+length) != '\0') {
        length++;
    }
    return length;
}

[COLOR=royalblue]void analyzeString(char *s) {
    int charCount[27], i=0, j=0, k=0, counter=0, ascii=0, length=checkLength(s);
    float percentage=0.0;

    /* Feld mit 0er initialisieren */
    for (i; i<=26; i++) {
        charCount[i]=0;
    }

    /* Anzahl der Buchstaben des Satzes und deren Häufigkeit ermitteln */
    while (i != length) {
        if (*(s+i) >= 'A' && *(s+i) <= 'Z') {
            ascii=((int)*(s+i))-65;
        } else if (*(s+i) >= 'a' && *(s+i) <= 'z') {
            ascii=((int)*(s+i))-97;
        } else {
            ascii=((int)*(s+i)); /* Sonderzeichen bekommen Werte außerhalb des Bereichs 0 - 25 */
            charCount[26]=ascii;
        }
        if (ascii >= 0 && ascii <= 25) {
            counter++;
            charCount[ascii]++;
        }
        i++;
    }

    printf("Character count: %d (100 %%)\n", counter);
    printf("\nDetailled Frequence Analysis:\n");
    printf("\n  : count : percentage\n======================\n");
    for (j='a', k; j<='z', k<=26; j++, k++) {
        percentage=(((float)charCount[k]*100)/(float)counter);
        printf("%c :%6d :%11.2f\n", j, charCount[k], percentage);
    }
    putchar('\n');
}
/*int main(int argc, char *argv[]) {*/
int main(void) {
    /*char *s = argv[1];*/

    /*if (argc > 2) {
        printf("Invalid input!\n");
    }*/

    char *s = "Mal sehen was die Haeufigkeitsanalyse dieses Textes ergibt!? Ich denke, dass 'e' wohl wirklich der haeufigste Buchstabe sein wird!";
    analyzeString(s);

    return 0;
}
[Edit]
Ändert zwar eh nichts an der Ausgabe, aber müsste es im zweiten else nicht heißen: charCount[26]++; statt charCount[26]=ascii; ?
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Das Zeichen dahinter ist ein {, das nächste ascii Zeichen nach dem kleinen z. Und doch, das hast du so programmiert. ;) Denn k geht ja von 0 bis 26 bei dir, also umfasst 27 Zeichen anstatt der 26 notwendigen Zeichen. Änder mal auf k<=25...

EDIT:
Nach dem initialisieren des countChar-Arrays nicht vergessen i wieder auf 0 zu setzen...
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Aha, danke!

Das Problem ist jetzt nur noch, dass irgendwelche Buchstaben, die eigentlich vorhanden sind, entweder gar nicht mitgezählt werden, oder nur manchmal mitgezählt werden. Die Häufigkeiten sind jedenfalls überwiegend noch zu niedrig.

[Edit]
Ok, nach der Berücksichtigung deines Edits läuft's jetzt! Muchas gracias @ DarkMo & JimSim!!! :daumen:
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

hehe, freut mich, wenn was klappt. hab mich eben auch tapfer "blind" durch mein ogl krams gebastelt. kA ob das funzt, seit 3 tagen hier un da bissl gewerkelt, ab un an mit nem bierchen drinne und dann hoffen, das alle rädchen ineinander greifen xD wenn man da dann das erste mal ausführen drückt, rechnet man schon mit 100 fehlern :ugly:

aber wegen aufsplitten usw: zum verständnis/debuggen is das ja kein problem. bei so kleinen programmen auch generell nich. aber prinzipiell hat jimsim da schon recht. du musst ja bedenken, dass die ausführungszeit dadurch prozentual ganz gut ansteigt. wenn du statt einer forschleife 2e vom selben format hast, dann verdoppelt sich ja die ausführungszeit - und 50% performanceverlust klingen schon nich mehr so toll :P (also natürlich nur, wenn das ganze programm nur aus der einen oder 2 forschleifen besteht ^^). und auch wenns bei solchen programmen keinen unterschied macht, ob er nur10ms oder 20 brauch - so is ein grundsätzliches dran gewöhnen sicher nich verkehrt. wenn man später mal größeres zeugs baut, dann kann die erfahrung mit sowas im kleinen sicher auch helfen.

also: wenn man ein laufendes programm studiert und verbesserungspotential findet - einfach mal ausprobieren, ob mans nich noch nen bissl performanter "tunen" kann ^^


hmm, siehste, da kommt mir direkt nen bsp von meinem aktuellen projekt: ich lese nen mesh-file ein (also polygondaten usw von nem objekt) und versuche dann beim erstellen (also einma zum start) zu jedem polygon die nachbarn zu bestimmen. bei 1000en polygonen verschlingt das schon gut zeit. mein erster versuch hatte bei (lass mich lügen) ~1600 polygonen um die 30 sekunden gebraucht, mein zweiter ansatz ist jetzt bei 10-15 secs rum. aber selbst da hoffe ich, das noch verbessern zu können. weil ne halbe minute IST nerviger wie paar milisekunden ^^
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Und noch nen Tipp: Variablen die du in For-Schleifen verwendest immer in der Schleifenbedingung initialisieren... und nicht immer nur i nehmen. Das verwirrt. Es gibt auch noch andere Buchstaben im Alphabet, wie wir gerade durch zählen herausgefunden haben. ;)

Namen von Variablen/Klassen/überhaupt allem im Quellcode (was jetzt vielleicht nicht ein einfacher hochzähler in ner Schleife ist) sollten eindeutig sein. Das macht den Code zwar länger, aber wenn man nochmal drüber ließt, oder nen Fehler sucht, weiß man wenigstens was damit gemeint ist.
So wird dann aus counter bei dir bspw. ein "alleBuchstabenCounter" etc. dann vermeidest du auch leichter Fehler bei den du eine Variable für 2 unterschiedliche Dinge verwendest. Ich gebe zu, ich mach es auch nicht immer, aber es hat seine Vorteile, besonders wenn man nen Fehler sucht, und nicht weiß wo er steckt.

(Außer du programmierst Viren, dann sind Namen wie a, b, c, ... großartig ;) )

Wie dir vielleicht aufgefallen ist, übernehme ich fast nichts von den Codes, die andere Leute hier posten, sondern versuche, aus deren Erklärungen das rauszuholen, was ich brauche, um eine eigene Version zu schreiben. Im Übrigen verstehe ich fast ein Drittel von dem, was DarkMo in seinem Code macht, nicht. Meinen eigenen hingegen kann ich zu 100 % nachvollziehen. Und einen funktionierenden Code zu schreiben, den man versteht, dürfte wohl der Sinn der Aufgabe sein ...

Durchaus löblich, ich will ja auch nur, das du verstehst was du machst, bevor du hier um Hilfe fragst. Das waren einfach Code-Stücke, die null Sinn gemacht haben. Das hättest du bemerken müssen wenn du einmal Zeile für Zeile deinen Code durchgegangen wärst und du dich gefragt hättest, was da nun genau passiert. Du hast doch schon einige Aufgaben gelöst und verstehst doch auch, was wir dir hier erklären. Da traue ich dir einfach zu, zu verstehen, was du selbst schreibst. Einfach ein wenig mehr Einsatz zeigen bevor du hier um Hilfe fragst. Ich helfe ja gerne, aber ich will wenigstens den Eindruck haben, das du dich vorher auch selbst ausgiebig damit beschäftigt hast.

Im Übrigen zählt Programmieren nun mal leider nicht zu meinen Stärken und ich würd's wohl freiwillig auch nicht machen, wenn ich es nicht für's Studium bräuchte. Reden wir mal über was, das ich gut kann und du nicht (da gibt's sicher genug). Mal sehen, wer dann mit solchen Sprüchen, wie dem deinigen oben kommt.

Oh, ich bin mir sicher das es Dinge gibt, die du besser kannst als ich. Aber ich bitte hier auch nicht um Hilfe. Wie gesagt, ist das ja kein Problem und man hilft ja gerne. Aber ich glaub du kannst das mittlerweile einfach besser, als alle paar Zeilen deine eigenen Variablen zu überschreiben oder die Position im String mit ASCII-Werten zu vergleichen und sich dann zu wundern warum das nicht funktioniert. Da erwarte ich einfach mehr von dir, nach den Aufgaben, die du schon gelöst hast und ja auch verstehst.
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Eine kleine Anmerkung zu meiner Verteidigung: Uns ist im Unterricht immer eingetrichtert worden, möglichst speichersparend zu programmieren und mehrere (Zähl-)Variablen (für Schleifen) brauchen nun einmal mehr Platz, als eine, die immer wieder verwendet wird. Außerdem wollen die im Code selbst außnahmslos alles in Englisch haben (was mich ja nicht stört); nur Benutzeraufforderungen per printf dürfen auch in Deutsch sein. ;)

Jetzt im Nachhinein finde ich übrigens auch, dass das Beispiel leichter war, als gewisse andere, die wir hier schon behandelt haben. Und es gehört bereits zu den "schwersten" C-Beispielen, die ich für's Studium können muss. Zum Glück muss ich in meiner Richtung kein Top-Programmierer werden, aber ein allgemeines Verständnis in C und Java muss vorhanden sein ...

Bezüglich der Variablen-Namen: Im finalen Code habe ich das, denke ich, schon ganz gut gemacht mit den Benennungen?! Die für mich am schwersten verständlichen Passagen habe ich noch dazu kommentiert, falls ich mir den Code in ein paar Wochen wieder anschaue.
Code:
#include <stdio.h>

int [COLOR=royalblue]checkLength(char *s) {
    int length=0;

    while (*(s+[COLOR=royalblue]length) != '\0') {
        [COLOR=royalblue]length++;
    }
    return [COLOR=royalblue]length;
}

void [COLOR=royalblue]analyzeString(char *s) {
    int [COLOR=royalblue]charCount[27], i=0, j=0, k=0, [COLOR=royalblue]counter=0, [COLOR=royalblue]ascii=0, [COLOR=royalblue]length=[COLOR=royalblue]checkLength(s);
    float [COLOR=royalblue]percentage=0.0;

    /* Feld mit 0er initialisieren */
    for (i; i<=26; i++) {
        [COLOR=royalblue]charCount[i]=0;
    }

    i=0;

    /* Anzahl der Buchstaben des Satzes und deren Häufigkeit ermitteln */
    while (i != [COLOR=royalblue]length) {
        if (*(s+i) >= 'A' && *(s+i) <= 'Z') {
           [COLOR=royalblue] ascii=((int)*(s+i))-65;
        } else if (*(s+i) >= 'a' && *(s+i) <= 'z') {
           [COLOR=royalblue] ascii=((int)*(s+i))-97;
        } else {
            [COLOR=royalblue]ascii=((int)*(s+i)); /* Sonderzeichen haben Werte außerhalb des Bereichs 0 - 25 */
            [COLOR=royalblue]charCount[26]++; /* für jedes Sonderzeichen wird Wert im letzten Feldelement inkrementiert */
        }
        if ([COLOR=royalblue]ascii >= 0 && [COLOR=royalblue]ascii <= 25) {
           [COLOR=royalblue] counter++;
            [COLOR=royalblue]charCount[[COLOR=royalblue]ascii]++; /* Wert an der Stelle des Feldindex des jeweiligen Buchstaben wird bei Vorkommen inkrementiert */
        }
        i++;
    }

    printf("Character count: %d (100 %%)\n", [COLOR=royalblue]counter);
    printf("\nDetailled Frequence Analysis:\n");
    printf("\n  : count : percentage\n======================\n");
    for (j='a', k; j<='z', k<=25; j++, k++) {
        [COLOR=royalblue]percentage=(((float)[COLOR=royalblue]charCount[k]*100)/(float)[COLOR=royalblue]counter);
        printf("%c :%6d :%11.2f\n", j, [COLOR=royalblue]charCount[k], [COLOR=royalblue]percentage);
    }
    putchar('\n');
}

int main(int argc, char *argv[]) {
    char *s = argv[1];

    if (argc = 1) {
        printf("Invalid input! Missing parameter.\n");
    } else if (argc > 2) {
        printf("Invalid input! Too many parameters.\n");
    }

    [COLOR=royalblue]analyzeString(s);

    return 0;
}
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Dein Lehrer ist schon etwas älteres Semester, oder? ;)
Naja, ganz unrecht hat er ja nicht. Du kannst dich durchaus darauf festlegen, das Zähler für Schleifen immer gleich heißen. So oder so solltest du sie aber auch erst in der Schleife initialisieren. (oder sogar definieren, dann kann nach Ablauf der Schleife der Garbage-Collector aufräumen). D.h. nicht for (i, i<...) sondern for (i=0, i<...)

Aber ehrlich gesagt, ist jetzt der Platz, den so ne Variable einnimmt, nicht wild. (Kommt natürlich drauf an worauf du programmierst, auf Maschinen bzw. Automaten mag das noch anders sein) Es gibt halt beim programmieren unterschiedliche Philosophien. "State of the Art" ist es momentan eigentlich, wenn man praktisch keine Kommentare mehr benötigt, sondern sich alles durch die Benennung der Variablen, Klassen und Methoden erklärt. Das ist manchmal allerdings auch ******* kompliziert und aufwendig. Wirklich treffende Namen zu finden, ist nicht immer leicht. Und bei sehr technischen Angelegenheiten, kommt man um Kommentare leider manchmal nicht rum. Welche Sprache das ganze ist... Naja, wenn man das ganze OpenSource macht, ist es natürlich unter dem oben genannten Ansatz löblich wenn alles in Englisch ist, damits auch jeder versteht. Ansonsten aber auch einfach persönliche Präferenz.

Was die Benennung in deinem Beispiel betrifft... Naja, man kann natürlich immer noch präziser werden. In nem größeren Projekt, würde mir das nicht ausreichen. Aber das passt hier für schon. Man muss ja nicht päpstlicher sein, als der Papst. ;) Ist ja jetzt erstmal nur für dich, und so lange du weißt was was ist, ist ja alles okay.
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Naja, in C gibt es keinen Garbage Collector ;-) Außerdem je nach verwendetem C-Standard muss man die Variablen im voraus deklarieren. Ich meine, für for (int i = 0; ...) benötigt man mindestens den C99 Standard.
 
Zurück