C Übungen



  • Hi Leute!

    Ich beschäftige mich momentan mit der Programmiersprache C und suche nach guten Übungen für Anfänger, mit denen ich mein Wissen kontrollieren kann. Habe mich meiner Meinung nach mit den Grundlagen vertraut gemacht, aber ich möchte lieber sichergehen. Die Suche hat leider nichts Interressantes hergegeben oder ich habs übersehen.
    Wäre wirklich nett wenn mir jemand Links zu guten Übungen(am Besten wenn auf den Seiten auch noch Lösungen stehen) schicken könnte.
    In dem C-Buch was ich momentan lese geht es nur um Konsolenanwendungen die ich unter Visual Studio als C-Dateien ausführe. Will mir praktisch erstmal einen Grundstein für den sicheren Übergang zu C++ schaffen und natürlich mein abstraktes Denken fördern 😃 .

    Freue mich auf eure Antworten bzw. Links.
    Gruß Lone123



  • Wie wärs mit:

    Schreiben Sie ein Programm, das Personendaten in einer verketteten Liste speichert.
    Ein Datensatz besteht aus:
    Vorname:
    Nachname:
    Alter:
    Körbchengröße/Falluslänge:

    Implementieren Sie folgende Operationen auf die Liste:
    -Einfügen
    -Löschen
    -Suchen
    -Liste ausgeben



  • Das werd ich mir auf alle Fälle später angucken. So wie ich das sehe wird das mit Strukturen gemacht, aber soweit bin ich noch nicht.
    Hab bis jetzt Entscheidungen treffen, Wiederholen von Programmteilen (Schleifen), Funktionen definieren, Felder und Zeichenketten, Variablen und Konstanten, Präprozessor (jetzt kommen die Sachen die ich noch fast garnicht beherrsche) Pointer, Kommandozeilenparameter ( weiss nicht ob man das wikrlich braucht) und fehlen tun mir noch Komplexe Datentypen (unter anderem Strukturen).
    Ich geh nicht davon aus das det Alles von C war aber möchte das halbwegs beherrschen und verstehen.

    Gruß Lone



  • Wenn du leichte Übungen suchst, dann würde ich dir folgende empfehlen (die haben mir persönlich Spaß gemacht und ich habe einiges dabei gelernt):
    -Primzahlen suchen (daran kann man immer weiterarbeiten - Geschwindigkeit optimieren, Primzahlen in Dateien ein-/ausgeben,...) - macht mir immer wieder Spaß 😉
    -Sortieralgorithmen erstellen (es gibt einige einschlägige, du findest garantiert irgendwo eine "Lösung", falls nötig - aber für den Anfang sollte das leicht sein)
    -eventuell Befehle, die du aus Paketen importierst, selbst erstellen - das dient dem Verständnis und du kannst das für beliebig viele Befehle tun (ich musste das mit einer ganzen Reihe von String-Operationen machen)
    z.B.: Wörter ordnen, Strings aneinanderkopieren, Länge ermitteln, ...
    -du kannst dir auch einfach selbst was einfallen lasse, das du gern umsetzen würdest - das funktioniert für mich immer ziemlich gut, weil es dann nicht an Motivation mangelt (für unlösbare Fragen ist ja dieses Forum da 😉 )

    PS: Ich habe das alles mit C gemacht, die String-Operationen könnten mit C++ übungsuntauglich sein (weiß ich aber nicht)



  • schreib ein programm, das eine textdatei einliest. die häufigkeit eines jeden buchstabens gespeichert werden. überleg dir dafür einen geegneten datentypen.
    alle buchstaben sind als großbuchstaben zu behandeln, die deutschen umlaute sollen ebenfalls berücksichtigt werden.
    am ende soll eine zusammenfassung angezeigt werden, wie oft jeder buchstabe in der datei vorkommt.

    mfg,
    _o_



  • Vielen Dank werd ich alles probieren. 😃

    MfG
    Lone



  • Hallo nochmal.
    Ich schau mir gerade das Thema Kommandozeilenparamter an und bin ein bisschen ratlos wie ich die in Programmen verwenden soll. Dateien öffnen und löschen kann ich auch mit der Maus unter MSV oder anderen IDE´s . Wann werden die denn wichtig bzw. mussman die doch öfter benutzen als man denkt ? xD
    Gruß
    Lone



  • die werden dann wichtig wenn:
    dein programm an der eingabeaufforderung mit irgendwelchen parametern gestartet werden soll, die den programmablauf steuern.



  • Hast du vielleicht ein Beispiel für mich?



  • <pseudocode>

    if argc > 1 && argv[1] then
    if argv[1] content == "do that" then
    do_that()
    

    </pseudocode>
    🙂

    wenn du damit nix anfangen kannst, schreib dir am besten ein kleines c-programm, das dir den inhalt des argv arrays ausgibt. das argv-array speichert
    die kommandozeilen-parameter.
    sind ja bloss ein paar zeilchen.



  • Werd ich mich nochmals genauer mit beschäftigen wenn ich es brauche. Das wäre dann auch besser fürs Verständis.
    Danke

    Gruß Lone



  • So ich hab mich wollte das mit den Kommandozeilenparamtern ma testen und hab unter Visual Studio folgendes Programm geschrieben:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>

    main(int argc, char argv[]) {
    double x,y,z;
    if(argc < 4) {
    printf("\nAufruf: %s zahl1 op zahl2",argv[0]);
    exit(1);
    }
    x=atof(argv[1]);
    y=atof(argv[3]);
    switch(argv[2][0]) {
    case '+':
    z=x+y;
    break;
    case '-':
    z=x-y;
    break;
    case 'x':
    z=x
    y;
    break;
    case '/':
    z=x/y;
    break;
    default:
    printf("\nFalsches Operationszeichen!");
    exit(2);
    }
    printf("%s %s %s = %f",argv[1],argv[2],argv[3],z);
    getch(0);
    }

    Das Programm hab ich als Bspl0067.c abgespeichert , aber ich kanns nicht mit der Eingabeaufforderung starten. Er sagt mir immer das er das Programm nicht finden kann. Normalerweise benutze ich die Eingabeaufforderung nicht um Programme zu starten, dafür habe ich mir doch ne IDE geholt...
    Was mache ich falsch?



  • Ich möchte mich ja nur auf die Umschulung zum Fachinformatiker -Anwendungstechnik vorbereiten...
    Genauso ist es auch mit der Fehlerkontrolle. Da gibt es wieder bestimmte Befehle um Fehler sichtbar zu machen falls ich mit der Eingabeaufforderung arbeite. Das wird aber auch von VS erledigt. Also bleibt nurnoch die Frage wann man solche Sachen wirklich braucht.



  • Dieses Programm soll Texte erfassen und speichern. Mit fprintf schreibe ich in die Datei. Okay nun starte ich das Programm und kann den Dateinamen eingeben und er schreibt die Datei wurde geoeffnet. Beim nächsten Tastendruck geht das Programm jedoch aus obwohl da noch nicht wirklich viel passiert ist. Irgendwas läuft schief...ob es nun an der Eingabeaufforderung liegt oder am Programm ich hab keine Ahnung.

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>

    main() {
    FILE *stream;
    char zeile[81],dateiname[67];
    int zeilen=0;

    printf("\n\t\tTextzeilen erfassen\n");
    printf("\nSpeichern unter >");
    gets(dateiname);

    if((stream = fopen(dateiname,"w")) == NULL) {
    printf("Fehler beim Oeffnen!");
    exit(1);
    }

    printf("\nLeerzeile beendet das Programm.");
    printf("\n--------------------------------\n");

    gets(zeile);
    while(strlen(zeile) > 0) {
    fprintf(stream,"%s\n",zeile);
    zeilen++;
    gets(zeile);
    }
    fclose(stream);

    printf("\n%i Zeilen wurden geschrieben.\n",zeilen);

    getch(0);
    }



  • 1. Benutze erstens cpp tags des Forums
    2. Mit

    $ seq 39 | awk '{ text=sprintf("%s%s", text, $1);} END { print text }' | ./deinprogramm
    

    habe ich bereits einen Buffer Overflow erzeugt, denk nach warum. Tipp: man: gets(3) wenn du das gelöst hast, wird wahrscheinlich dein Programm nachher auch gehen.



  • Das Programm stammt aus einem alten Lernbuch und das habe ich mehrmals kontrolliert. Das ist unwahrscheinlich das es am Programm liegt. Visual Studio zeigt auch keine Fehler an und springt in die Konsole rein. Bis jetzt kann ich die Konsole auch nur benutzen um Programme zu öffnen aber nicht zu starten. Da muss irgendwo der Fehler sein. Ich hab auch keine Ahnung wie ich ohne IDE kompiliere oder sontiges. Wenn dieses gets() ein Buffer Overflow verursacht dann müssten die vorherigen Programme alle nicht gehen.



  • gets kann einen Buffer Overflow erzeugen, muss aber nicht. Ich habe aber einen Fall konstruiert, wo das passiert. Siehe fgets(3)



  • Okay das mit der Datei einlesen hat funktioniert das war ein Fehler mit Visual Studio. Jetzt brauch ich nurnoch eine Lösung für das 1. Programm. Über die Eingabeaufforderung öffnet er nur das Programm mit Visual Studio aber er beachtet die Parameter nicht.


Anmelden zum Antworten