C Übungsaufgaben

Beispiele mit Zahlen

  1. Gib die Summe aller ganzen Zahlen zwischen zwei eingegebenen Zahlen aus.
  2. Gib aus, ob eine eingegebene Zahl prim ist oder nicht.
  3. Gib eine aufsteigende Liste aller Primfaktoren einer eingegebenen Zahl aus.
  4. Gib eine aufsteigende Liste aller Teiler einer eingegebenen Zahl aus (das ist aus 2 Gründen nicht das gleiche wie im vorigen Beispiel!).
  5. Gib eine Tabelle von 1 bis 30 aus, die in jeder Zeile die kleinste Zahl mit der jeweiligen Anzahl von Teilern angibt: Die kleinste Zahl mit einem Teiler ist 1, mit zwei 2, mit drei 4, mit vier 6, mit fünf und zugleich sechs 12, usw..
  6. Verwandle eine angegebene Zahl "händisch" (ohne Verwendung von atoi oder scanf) von der Textdarstellung in einen int-Wert. Achte auf ein eventuell vorhandenes "-"!
  7. Gib eine zufällig erzeugte Zahl in Sperrschrift (d.h. mit je einem Zwischenraum zwischen zwei Ziffern) aus.
  8. Berechne die Quersumme und die Wechselquersumme (Ziffernwert abwechselnd addiert und subtrahiert) einer eingegebenen Zahl.
  9. Ermittle alle Zahlen zwischen 1 und 9999, deren Wert gleich der Summe der dritten Potenzen ihrer Einzelziffern ist.
  10. Gib eine Tabelle mit den ersten 30 Fibonacci-Zahlen aus: Die ersten beiden Fibonacci-Zahlen sind 0 und 1, jede folgende Fibonacci-Zahl ist die Summe der beiden vorherigen.
  11. Berechne das kleinste gemeinsame Vielfache zweier Zahlen nach folgender Methode: "Ich verwende zwei Zahlen x und y, die ich mit den gegebenen Zahlen a und b initialisiere. In jedem Durchgang zähle ich zur kleineren der beiden Zahlen die jeweilige Ausgangszahl dazu (a zu x oder b zu y). Wenn die beiden Zahlen gleich sind, habe ich mein kgV gefunden."
  12. Schreib ein Programm, das durch Probieren eine Zahl errät, die sich der Benutzer ausgedacht hat: Bei jedem Rate-Versuch gibt das Programm eine Zahl aus, und der Benutzer gibt ein, ob diese Zahl gleich, kleiner oder größer der gedachten Zahl ist.
    Wie mußt du deine Versuche berechnen, um mit maximal 21 Versuchen jede Zahl zwischen 1 und 1000000 zu erraten?
  13. Berechne eine Liste aller Primzahlen zwischen 1 und 1000000 nach der Methode "Sieb des Eratosthenes": Mach dir eine Liste mit Kreuzerln für die Zahlen 2 bis 999999. Such dir in jedem Durchgang die kleinste angekreuzte Zahl, gib sie aus (es ist eine Primzahl), und lösche das Kreuzerl bei allen ihren Vielfachen weg.
  14. Ermittle die Wurzel einer gegebenen Zahl nach folgendem schrittweisen Näherungsverfahren: Berechne in jedem Durchlauf einen neuen Näherungswert als Mittelwert des alten Näherungswertes und des Quotienten aus ursprünglicher Zahl und altem Näherungswert. Beginne mit der Zahl selbst als erstem Näherungswert und ende, wenn das Quadrat des Näherungswertes um weniger als ein Milliardstel falsch ist.
  15. Wiederhole folgende Berechnung beginnend mit der eingegebenen Zahl, bis du 1 als Ergebnis bekommst: "Wenn die Zahl gerade ist, halbiere sie, sonst nimm sie mal 3 und zähle 1 dazu."
    Gib die Anzahl der benötigten Durchläufe aus.
  16. Ein Seilring hat n Knoten in regelmäßigen Abständen. Er soll benutzt werden, um im Gelände rechte Winkel abzustecken, indem man ihn als rechtwinkeliges Dreieck mit ganzzahligen Seitenlängen spannt (in jeder Ecke einen Knoten). Bei einem Seil mit 12 Knoten gelingt das beispielsweise mit den Seitenlängen 3, 4 und 5.
    Berechne eine Tabelle, die für jede Knotenanzahl zwischen 10 und 100 alle Seitenlängen enthält, die rechtwinkelige Dreiecke ergeben.
  17. Berechne eine Pensionsversicherungstabelle: Angegeben sind die Laufzeit, der Verzinsungssatz (in Prozent) und die jährliche Einzahlungsrate. Auszugeben ist eine Tabelle, die für jedes Jahr das Gesamtkapital und den Gesamt-Ertrag (in Prozent, Gesamt-Einzahlung zu Gesamt-Auszahlung) angibt.
    Nimm der Einfachheit halber an, daß einmal im Jahr das alte Kapital verzinst und gleichzeitig die neue Jahresrate gutgeschrieben wird, du brauchst weder mit kontinuierlicher Zinsesrechnung noch mit monatlichen Einzahlungen rechnen. Achtung: Am Ende der Laufzeit (bei der Auszahlung) wird nur mehr verzinst, nicht mehr eingezahlt!
  18. Ermittle durch Prüfung aller Möglichkeiten, wie hoch die Wahrscheinlichkeit ist, daß bei einer Jokerziehung eine strikt aufsteigende Zahlenfolge gezogen wird (d.h. jede Ziffer einer sechsstelligen Zahl (ev. incl. führender Nullen) kleiner als die folgende ist).
  19. Ermittle durch Simulation mit Zufallszahlen, wie oft man im Schnitt würfeln muß, bis man einen Sechser würfelt. Würfle dazu 10000 mal so lange, bis du einen Sechser hast.
  20. Erstelle eine Tabelle für 2 bis 100 Personen, die angibt, wie groß die Wahrscheinlichkeit ist, daß alle Personen an verschiedenen Tagen im Jahr (ohne Betrachtung von Schaltjahren) Geburtstag haben. Die Tabelle soll sowohl die berechnete Wahrscheinlichkeit als auch die durch Simulation ermittelte Wahrscheinlichkeit enthalten (mach dazu für jede Anzahl von Personen 1000 Versuche).
  21. Gib zu einem angegebenen Cent-Betrag aus, wie er sich aus möglichst wenigen unserer Münzen zusammensetzen läßt, wenn von jeder Münze ausreichend viele zur Verfügung stehen.
  22. Schreib ein Programm, das mit Uhrzeiten rechnet: Es wird mit einem Zeitpunkt und einer Zeitspanne (möglicherweise negativ) aufgerufen und soll den Zeitpunkt ausgeben, der sich aus der Addition der beiden Eingaben ergibt. Zeiten werden als vierstellige Zahlen ein- und ausgegeben: Die vorderen beiden Ziffern sind die Stunden, die hinteren die Minuten. Ein eventuell entstehender Tagesübertrag ist zu ignorieren, das Ergebnis soll nur die Uhrzeit enthalten.
  23. Schreib ein Programm, das die Anzahl der Tage zwischen zwei Datumsangaben ausgibt. Jedes Datum ist dabei als achtstellige Zahl gegeben (ttmmjjjj). Verwandle dazu jedes Datum in die Anzahl der Tage seit dem 1. Jänner im (gedachten) Jahr 1. Für die Anzahl der Tage pro Monat nimmst du am besten eine fix vorbelegte Tabelle, die Anzahl der Tage pro Jahr solltest du unter Berücksichtigung der Schaltjahre rechnerisch ermitteln (durch 4 teilbare Jahre sind ein Schaltjahr, außer jene, die durch 100, aber nicht durch 400 teilbar sind).
  24. Schreib analog zum vorigen Problem ein Programm, das zu einem gegebenen Datum eine (möglicherweise negative) Anzahl von Tagen dazuzählt und den resultierenden Tag wieder als Datumsangabe ausgibt.
  25. Schreib ein Programm, das Mastermind spielt (mit vier Stiften in sechs möglichen Farben): Das Programm soll so lange eine Farbkombination vorschlagen, die der Benutzer bewertet (Anzahl der richtigen Farben am richtigen Platz und Anzahl der richtigen Farben am falschen Platz), bis es die vom Benutzer erdachte Kombination erraten hat. Speichere dazu alle möglichen Kombinationen, streiche nach jeder Bewertung all diejenigen, die nicht zum Vorschlag und der Bewertung passen, und wähle zufällig eine der verbleibenden Kombinationen als nächsten Vorschlag.

Beispiele mit Texten und Dateien

  1. Gib den kompletten Inhalt ein oder mehrerer angegebener Dateien der Reihe nach aus, schreib vor jede Zeile den Dateinamen und die Zeilennummer innerhalb der aktuellen Datei.
  2. Lies eine angegebene Datei zeilenweise und gib sie mit Seitenüberschriften (Dateiname und Seitennummer) aus. Die Seitenlänge wird ebenfalls beim Programmaufruf angegeben.
  3. Lies eine angegebene Datei zeilenweise und gib alle buchstabenweisen Rotationen jeder Zeile aus (d.h. verschiebe die Zeile immer wieder um ein Zeichen nach links und hänge das linkeste Zeichen hinten an, bis du wieder die ursprüngliche Zeile erhältst).
    Erweiterung:
    Kannst du dich auf die wortweisen Rotationen beschränken, d.h. jene Rotationen, bei denen der Zeilenanfang an einer Stelle ist, wo ursprünglich ein Zwischenraum war?
  4. Lies eine angegebene Datei zeilenweise, gib am Ende die längste Zeile, ihre Zeilennummer, und ihre Länge aus.
    Erweiterung:
    Schaffst du das auch für das längste Wort (aufeinanderfolgende Groß- und Kleinbuchstaben)?
  5. Lies eine angegebene Datei zeilenweise und gib ihre letzten drei Zeilen aus. Achte auf ganz kurze Dateien!
  6. Lies eine angegebene Datei zeilenweise und gib sie aus, aber gib dabei aufeinanderfolgende gleiche Zeilen nur einmal aus.
  7. Lies und vergleiche zwei angegebene Dateien zeilenweise. Dein Programm soll beim ersten Unterschied die Zeilennummer und die beiden betroffenen Zeilen ausgeben und enden.
  8. Gib aus, ob ein eingegebener Text (nur eine Zeile) ein Palindrom ist, d.h. ob er sich von hinten genauso liest wie von vorne.
    Erweiterung:
    Betrachte dabei nur die Buchstaben, ignoriere alle anderen Zeichen!
    Vergleiche die Buchstaben ohne Berücksichtigung der Groß- und Kleinschreibung!
  9. Lies eine angegebene Datei zeilenweise ein und gib jede Zeile mittig zentriert aus.
    Erweiterung:
    Schaffst du es, die Zeilen auch dann zentriert auszugeben, wenn sie vorne oder hinten Leerzeichen oder Tabulatoren enthalten?
  10. Lies eine angegebene Datei zeilenweise ein und gib sie zeilenweise in Spiegelschrift (d.h. jede Zeile von hinten nach vorne) aus.
    Erweiterung:
    Schaffst du es auch, die Zeilen (ohne Verwendung von printf!) 80 Spalten breit rechtsbündig auszugeben?
  11. Lies eine angegebene Datei zeichenweise ein und ermittle die längste Folge identer, unmittelbar aufeinanderfolgender Zeichen. Dabei zählen nur sichtbare Zeichen (isgraph).
    Ausgegeben werden soll die Länge der längsten Folge und das Zeichen, aus der sie besteht. Als Erweiterung kannst du auch ausgeben, in der wievielten Zeile und an der wievielten Spalte diese Folge beginnt.
  12. Lies eine Datei zeichenweise und gib sie aus, ersetze dabei alle Umlaute und ß durch die entsprechenden Zwei-Buchstaben-Kombinationen.
  13. Schreib ein Programm, das mit einem Dateinamen sowie zwei Zahlen m und n aufgerufen wird und von jeder Zeile der genannten Datei nur die Spalten m bis n ausgibt.
  14. Schreib ein Programm, das mit einem Dateinamen, einem einzelnen Zeichen c sowie zwei Zahlen m und n aufgerufen wird und von jeder Zeile der genannten Datei nur die Felder m bis n ausgibt, wobei c das Trennzeichen zwischen den Feldern ist (z.B. : oder |).
  15. Schreib ein Programm, das eine angegebene Datei auf mehrere Dateien aufteilt, und zwar immer bei leeren Zeilen: Die erste Ausgabedatei enthält alle Zeilen der Eingabedatei bis zur ersten Leerzeile, die zweite alle zwischen der ersten und zweiten Leerzeile usw.. Mehrere aufeinanderfolgende Leerzeilen gelten als eine einzige Leerzeile, Leerzeilen am Dateianfang und -ende werden ignoriert.
    Die Namen der Ausgabedateien entstehen durch Anhängen eines Punktes und einer fortlaufenden vierstelligen Nummer an den ursprünglichen Dateinamen.
  16. Die ersten Verschlüsselungs-Verfahren (lang, bevor es Computer gab) ersetzten den i-ten Buchstaben im Alphabet durch den (i+x)-ten Buchstaben; kam man dabei hinter das z, fing man wieder beim a an. Die Zahl x war dabei der geheime Schlüssel, den man zum Entschlüsseln brauchte.
    Schreib ein Programm, das eine angegebene Datei zeichenweise liest und auf diese Weise mit einer ebenfalls angegebenen Zahl verschlüsselt ausgibt. Wende die Verschlüsselung dabei auf jedes Zeichen mit einem Wert 32<=c<=126 an (das sind alle sichtbaren Zeichen plus Zwischenraum, aber ohne nationale Sonderzeichen), und achte darauf, daß die ausgegebenen Zeichen wieder in diesem Wertebereich liegen!
    Ruft man dein Programm mit der entsprechenden negativen Zahl auf, sollte es den Text wieder entschlüsseln!
  17. Lies eine angegebene Datei zeichenweise ein und ersetze alle Tabulatoren durch die richtige Anzahl von Leerzeichen, sodaß das nachfolgende Zeichen in der nächsten durch 8 teilbaren Spalte steht (die erste Spalte hat Nummer 0).
  18. Lies eine angegebene Datei zeichenweise ein und ersetze jeweils 8 führende Zwischenräume durch einen Tabulator.
  19. Lies eine angegebene Datei zeilenweise und gib all jene Zeilen der Datei aus, die ein ebenfalls angegebenes Wort enthalten. Versuche, ohne strstr auszukommen und das Wort ohne Rücksicht auf Groß- und Kleinschreibung zu finden!
  20. Lies eine angegebene Datei zeilenweise und gib sie aus, wobei jedes Vorkommen eines angegebenen Wortes durch ein anderes angegebenes Wort ersetzt wird.
  21. Lies eine angegebene Datei zeilenweise, verwende dazu eine maximale Zeilenbreite von 39 Zeichen (längere Zeilen sollen von fgets automatisch auf mehrere Zeilen aufgeteilt werden), und gib sie in zweispaltigen Seiten mit je 24 Zeilen aus (aufeinanderfolgende Eingabezeilen sollen dabei untereinander stehen). Gib die letzte Seite mit zwei möglichst gleichlangen Spalten aus.
  22. Lies eine angegebene Datei zeilenweise und gib sie zeilenweise aus, hänge dabei so viele aufeinanderfolgende Eingabezeilen wie möglich in eine Ausgabezeile zusammen (mit einem Zwischenraum dazwischen!), ohne die maximale Ausgabebreite von 80 Zeichen zu überschreiten. Mit Stringfunktionen (strlen, strcpy, strcat) geht es leichter, ohne ist es die bessere Übung!
  23. Lies eine angegebene Datei zeichenweise und gib sie mit einem Wort pro Zeile aus. Als Wort betrachten wir dabei jede zusammenhängende Folge sichtbarer Zeichen, d.h. alles, was durch ein oder mehrere Zwischenräume, Tabulatoren oder Zeilenvorschübe getrennt ist.
  24. Lies eine angegebene Datei zeichenweise und prüfe, ob die Klammern passen: Zu jeder öffnenden ([{ muß genau eine schließende )]} gehören, und die Schachtelung der Klammern muß ebenfalls stimmen (du wirst dir dazu alle geöffneten und noch nicht geschlossenen Klammern merken müssen).
    Dein Programm soll drei Fehler erkennen und (mit Zeilennummer) ausgeben:
  25. Gib am Terminal "Strickmuster" aus, z.B.
    \    /\    /\    /\    /
     \  /  \  /  \  /  \  /
      \/    \/    \/    \/
      /\    /\    /\    /\
     /  \  /  \  /  \  /  \
    /    \/    \/    \/    \
    
    oder
      *     *     *     *     *
     *+*   *+*   *+*   *+*   *+*
    *+#+* *+#+* *+#+* *+#+* *+#+*
     *+*   *+*   *+*   *+*   *+*
      *     *     *     *     *
    
    Du solltest dabei keine vorgespeicherten Texte verwenden, sondern den Output zeichenweise mit trickreichen Schleifen und Abfragen erzeugen!
 
Home