Übungen / Aufgaben zu C

0 Lösungen
Programmiere ein kleines Banksystem
Anfänger - C von Allocortex - 17.02.2017 um 11:01 Uhr
Programmiere ein kleines Banksystem!

GUI nicht notwendig. Aber:

Biete mehrere Auswahlmöglichkeiten bezüglich der Erstellung eines neuen Kontos, dem bearbeiten eines existierenden Kontos, dem Löschens eines bestehenden Kontos und dem Ausgeben aller Konten in sortierter Reihenfolge (nach Realgeld, siehe weiter unten)

Konten sollen einen Inhaber samt Namen (ggf. Alter) , einen Kontostand, einen Möglichen Kreditrahmen, eine laufende Kreditsumme und das Realgeld besitzen (Realgeld entspricht Kontostand abzüglich des durch Kredit vorhandenen Geldes).
Verwende Private Variablen, Getter und Setter

Nicht alle Konten dürfen einen Kredit besitzen (erst ab 18!)

Bezüglich der Auswahlmöglichkeiten: Diese sollen per Texteingabe oder Button auswählbar sein, und bei Auswahl vertiefende Fragen stellen (vertierendere Auswahlmöglichkeiten bieten) .. z.B. bei bearbeiten eines Kontos "Welches Konto", dann noch tiefer "Welche Eigenschaft", "Welcher Wert".

Das ganze soll dann wieder zum Ursprung springen und die selben Möglichkeiten bieten --> Solange, bis der Benutzer das Programm durch einen bestimmten Text, ein Zeichen, oder einen Button im GUI beendet.
0 Lösungen
Google Calendar API - Events auslesen - Event löschen - Event hinzufügen
Fortgeschrittener - C von Gustl - 08.02.2017 um 11:52 Uhr
Erstelle ein Programm welches als CronJob nutzbar ist, einen GoogleKalender ausliest und den Eventnamen mit Beginn des Termins ausgibt.
Danach soll das 1. Event gelöscht werden, ein neues Event hinzugefügt werden und der Google Kalender über die API aktualisiert werden.
0 Lösungen
Spielerei mit der Zahl 2017
Anfänger - C von hollst - 01.02.2017 um 10:26 Uhr
Die Zahl 2017 wird uns in diesem Jahr sicherlich besonders häufig begegnen.
Eine Besonderheit von ihr: sie ist eine Primzahl, was sicherlich die Zahlenmystiker wachrütteln wird.

Nun gut, was kann man mit 2017 noch so anfangen? Z. B. könnte man ihre vier Digits (2, 0, 1, 7)
untereinander vertauschen und so neue Zahlen erzeugen (z. B. 217, 7102 usw.).

Man könnte auch folgendermaßen neue Zahlen erzeugen: Zwischen jeweils zwei Digits
wird einer der folgenden Operatoren geschrieben: '+', '-', '*', '/' oder 'join'.
Die ersten vier Operatoren stehen für Addition, Subtraktion, Multiplikation und Division.
Der Operator 'join' steht für "Zahlenverbinder" , z. B.

2 + 0 + 1 join 7 = 2 + 0 + 17 = 19 oder
1 + 7 join 0 * 2 = 1 + 70 * 2 = 141

und hat die höchste Priorität (gefolgt von '*', '/' und '+', '-', wie üblich).

Möglich ist auch das:

7 / 2 + 0 * 1 = 3.5 oder
2 / 0 + 1 * 7 = unendlich
etc.

Folgende Aufgabenstellung:

Auf Basis der vier Digits (2, 0, 1, 7)
und der fünf Operatoren ('+', '-', '*', '/', ' ') [das Leerzeichen ' ' stehe für 'join']

sind alle möglichen Natürliche Zahlen (inc. Null) entsprechend obiger Beispiele zu erzeugen,
wobei die vier Digits jeweils einmal vorkommen müssen.
Die Operatoren können mehrfach verwendet werden (z. B. 1 + 0 * 2 + 7 = 8).
Eine Klammersetzung (z. B. (1 + 0) * 2 + 7 = 9) ist nicht erlaubt (bzw. optional, wer es weiter verkomplizieren möchte).

Beispiele:

0 = 0 * 217 = 72 * 1 * 0 = ...
...
3 = 2 + 1 + 0 * 7 = 1 + 2 + 0 * 7 = 1 + 7 * 0 + 2 etc.

Frage:
Welches ist die kleinste Natürliche Zahl, die auf diese Weise nicht dargestellt werden kann?

Anmerkung:
Bei den Zahlen zwischen 0 und 100 gibt es immerhin 58, die laut Aufgabenstellung mittels 2017 nicht darstellbar sind.
Dagegen lässt sich z. B. die 9 auf 126 verschiedene Arten berechnen (bei Umgehung des Kommutativgesetzes).
0 Lösungen
Überprüfen von Email Adressen
Anfänger - C von ZRX88 - 08.01.2017 um 12:38 Uhr
Hintergrund:
Angenommen du hast eine Internetadresse und sammelst dort Emails über ein Newsletter anmelden Formular ein.
Dadurch generierst eine Zahl x an Email Adressen aller Art.
Das Ziel ist nun zu bestimmen, Eigenschaften deiner Adressen auszuwerten. Typische Fragen sind hier beispielsweise Verteilung der Geschlechter, Alter?


Daher soll ein Programm geschrieben werden, welches eine Liste mit Email-Adressen entgegen nimmt und dann folgende Eigenschaften ausgibt:

* Valide Email? ( Ist es überhaupt eine Email...)
* Domain
* Land der Domain
* Email enthält Zahlen?
* Geburtsjahr?
* ... ( Gibt sicher noch einige spannende Eigenschaften.. Up to you!)

Optional:
* Geschlecht?

Anmerkung: Der Prozess muss nicht perfekt sein.
0 Lösungen
Berechnung und Ausgabe einer Zahlen-Schnecke
Anfänger - C von pocki - 06.01.2017 um 16:36 Uhr
Das Programm soll eine Ganzzahl (int) entgegen nehmen und berechnen ob eine Zahlen-Schnecke (wie auf einem Brettspiel) mit dieser Anzahl an Feldern bzw. höchsten Zahl möglich ist und gegebenfalls in einer einfachen Form (z.B. in Konsole oder Textdatei) ausgeben.

Die Zeilen- und Spaltenanzahl muss nicht gleich groß sein.
Option: Die Zahl 0 soll je nachdem ob sie für eine Durchführung benötigt wird, eingefügt oder weggelassen werden.
Erweiterung: Lass den Benutzer auswählen, ob die Schnecke sich im oder gegen den Uhrzeigersinn dreht.

Beispielausgabe:

Konsolenausgabe:

Höchste Zahl der Zahlenschnecke: 19
0 1 2 3 4
13 14 15 16 5
12 19 18 17 6
11 10 9 8 7

Höchste Zahl der Zahlenschnecke: 2
Fehler: Die Zahl 2 ist zu klein für eine Zahlenschnecke

PS: Hat diese Art einer Schnecke eine andere Bezeichnung?
1 Lösung Lösung öffentlich
Standort einer beliebigen Ip-Adresse
Anfänger - C von ZRX88 - 30.12.2016 um 13:04 Uhr
In Python Aufgabe 101 ( https://trainyourprogrammer.de/python-101-ermitteln-der-ip-klasse.html)
war die Aufgabenstellung für die eingegebene IP die Klasse zu bestimmen.

Viel spannender ist ( aus meiner Sicht) der Standort des Servers:

Nutzt die API https://freegeoip.net/ um den Standort der eingebenen Ip-Adresse ausgeben wird.

Beispiel:
Eingabe = 66.249.66.1
Ausgabe = Die Ip 66.249.66.1 befindet sich in dem Land US in der Stadt Mountain View, die Geo Koordinaten sind 37.4192,-122.0574


p.s. Die Beispiel Ip ist die Ip des Google Bots ;)

1 Lösung Lösung öffentlich
Wörterzählen in Textdateien
Anfänger - C von hollst - 23.12.2016 um 09:50 Uhr
Man schreibe ein Programm, das bei einer beliebigen Textdatei (ASCII)

a) alle Wörter und
b) alle unterschiedlichen Wörter der Längen 1, 2, 3 ... zählt, wobei zwischen Groß- und Kleinbuchstaben nicht zu unterscheiden sei.

Als Wörter-Trennzeichen sind zu verwenden:

a) alle Sonderzeichen (' ', '.', ',', tab ...) sowie Zahlen (0, 1 ... 9) und
b) alle Chars, die nicht zum Aphabet (abc...xyzäöü) gehören (damit wäre a) bereits automatisch erfüllt).

Anmerkungen:
a) Es gibt auch im Deutschen Wörter der Länge 1, z. B. in "a tempo" oder " a priori" oder bei Abkürzungen ("z. B.").
b) Als Beispieltext kann von hier die komplette Bibelausgabe nach Martin Luther 1912 als ASCII-Datei heruntergeladen und verwendet werden (ist mit 4 MB zu lang als Anhang hier, selbst als *.rar noch ca. 1.2 MB).

Viel Spaß und schöne Weihnachten sowie einen guten Rutsch und Start in 2017.
0 Lösungen
Spice Netlist, rationale Zahlen
Fortgeschrittener - C von zefcat - 15.12.2016 um 16:26 Uhr
Einleitung:

Bei dieser Aufgabe wird eine vereinfachte SPICE netlist verwendet um ein elektrisches Netz zu berechnen.
Um die Aufgabe einfach und übersichtlich zu halten beschränken sich die Netzwerke auf Serienschaltungen und passive Bauteile (R, L, C).
Es wird besonderer Wert auf eine korrekte Fehlerbehandlung gelegt.
Programmaufruf
Das Programm wird mit folgenden Parametern aufgerufen (wobei die Argumente inklusive der Klammern mit entsprechenden Werten zu ersetzen sind):

./ass [netlist_filename] [omega]


netlist_filename: Pfad zur netlist-Datei welche geparsed und verarbeitet werden soll. (Inputdatei)
omega: Ganzzahlige Angabe der Berechnung '2*PI*f' bei welcher die Impedanz berechnet werden soll.

Ein korrekter Programmaufruf könnte so aussehen:
./ass test.netlist 314

Rationale Zahlen
Um die Berechnungen durchführbar zu machen ist es wichtig Rationale Zahlen darstellen zu können. In dieser Übung soll die Darstellung
(ZÄHLER/NENNER) verwendet werden.

Bei der Rechnung mit diesen Bruchzahlen oder einer Ausgabe gilt es diese so weit wie möglich zu kürzen.
Auch alle Zwischenergebnisse von Berechnungen sind so weit wie möglich zu kürzen.

Eine 0 soll als (0/1) dargestellt werden.

Berechnung:
Um unsere Impedanz zu berechnen brauchen wir die Blindwiderstände von Spulen und Kondensatoren.

Spule:
j*(<omega>*L/1)

Kondensator:
-j*(1/(<omega>*C))

SPICE Netlist
Wir verwenden eine stark vereinfachte Version von netlist. Wie bereits in der Einleitung erwähnt sollen nur in Serie geschaltete RLC-Elemete möglich sein.

Die Zeilen in der Netlist haben folgendes Format:

BAUTEILNAME KNOTEN_A KNOTEN_B WERT

Zwischen den Bereichen (also zum Beispiel zwischen KNOTEN_A und KNOTEN_B) in der Zeile steht mindestens ein Leerzeichen. Wobei der BAUTEILNAME nur mit R,L,C beginnen darf und eine nachfolgende Nummer (ganzzahlig max. 5 Stellen) enthält. Zusätzlich darf es der Einfachheit halber zwischen zwei Knoten nur ein Bauteil geben (Serienschaltung). Der WERT besteht immer aus einer Bruchzahl.

Die Knoten sind immer als ganze Zahlen angegeben, der erste Knoten hat immer die Nummer 0. Die Knoten existieren immer aufeinander folgend, d.h. es kann kein Bauteil geben welches zwischen z.B. Knoten 2 und 4 liegt. Zur Einfachheit müssen nur maximal 20 aufeinander folgende Knoten unterstützt werden, d.h es kann nur Knoten Nummern von 0 bis 19 geben.

Es soll auch möglich sein Kommentare zu verarbeiten:

*Dies ist ein Kommentar

Kommentare dürfen nur alleine in einer Zeile stehen, das erste Zeichen ist ein *.

Leere Zeilen in der Netlist sollen ebenso wie Kommentare von der Verarbeitung übersprungen werden.

Beispiel einer Netlist:

* Simple netlist test for EP
R1 0 1 (100/1)
C0 1 2 (1/1000000)
L1 2 3 (47/1000)


Bei diesem Beispiel ist der Widerstand R1 mit dem Kondensator C0 und der Induktivität L1 in dieser Reihenfolge in Serie geschaltet. Die Elemente müssen eine durchgehende Verbindung bilden. Die Zeilen in der netlist-Datei müssen nicht zwingend in dieser Reihenfolge sein, daher muss vom Programm eine entsprechende Sortierung durchgeführt werden.

Leerzeichen vor Kommentarzeilen und vor und am Ende von Bauteilzeilen können beliebig behandelt werden. Als Zeilenumbruch soll sowohl \n als auch \r\n möglich sein.

Die Brüche in der netlist können auch noch zu kürzen sein.
Eine leere Netzliste ist zwar gültig der Nutzer wird jedoch keine Berechnungen durchführen können.
Es ist ungültig einen Wert mit dem Nenner von 0 anzugeben.
Bauteilnamen dürfen nur einmalig vergeben werden. Dies ist vom Programm zu überprüfen.
Der maximale Wert der in der Netzliste angegeben werden darf ist (UINT_MAX/UINT_MAX).
Bauteile dürfen auch mit 0 bewertet werden, jedoch nicht negativ.
Eine Zeile in der Netlist ist maximal 128 Zeichen lang.

Ausgabe:

Um das Programm leichter überprüfen zu können soll nach dem Ausführen die Netzliste sortiert und gekürzt ausgegeben werden.
zum Beispiel (mit oben beschriebener netlist):

0 - R1(100/1) - 1
1 - C0(1/1000000) - 2
2 - L1(47/1000) - 3


Eine Zeile hat hier die Form:
<Linker Knoten> - <Bauteilname>(<Wert>) - <Rechter Knoten>\n

Nach dieser Ausgabe soll eine Eingabe für den Nutzer bereitgestellt werden. Diese beginnt mit ep>
Hierbei ist das Leerzeichen nach 'ep>' zu beachten.

Eingabe:
Der Nutzer soll nun die Möglichkeit haben sich die Impedanz zwischen 2 Knoten anzeigen zu lassen.
ep> 0 1

Die Reihenfolge der Angabe spielt hierbei keine Rolle.
Mit der oben Angegeben Netzliste und dieser Ausgabe soll nun

(100/1) + j(0/1)\n

ausgegeben werden. Die Ausgabe soll immer Real- und Imaginärteil beinhalten auch wenn einer von diesen 0 ist.

Sollte eine Fehlerhafte Eingabe erfolgen soll

[ERR] This is not possible\n

ausgegeben werden. Als Fehler zu sehen wären zum Beispiel: falsche Anzahl oder Typ von Parameter, Knoten welche es in der Netzliste nicht gibt.

Sollte bei den Berechnungen ein Unsigned Integer Overflow stattfinden soll

[ERR] An overflow happened.\n


ausgegeben werden.

Sollte der Nutzer den selben existenten Knoten 2 mal eingeben ist die Impedanz mit 0 anzugeben.

Sollte der Imaginärteil negativ ausfallen ist das '+' vor dem 'j' durch ein '-' zu ersetzen.

Nach der Eingabe und Berechnung/Fehlerbehandlung soll wieder die Eingabeaufforderung erscheinen.

Zum Beenden des Programms kann der Nutzer 'q' eingeben oder ein End Of File senden.

ep> q

Darauf soll das Programm

BYE!\n

ausgeben und beendet werden.
Beispiele

Berechnung der Impedanzen mit dem Netzlistenbeispiel('basic_netlist') von oben:

$ ./ass.exe basic_netlist 300
0 - R1(100/1) - 1
1 - C0(1/1000000) - 2
2 - L1(47/1000) - 3
ep> 0 1
(100/1) + j(0/1)
ep> 0 2
(100/1) - j(10000/3)
ep> 0 3
(100/1) - j(99577/30)
ep> 1 3
(0/1) - j(99577/30)
ep> 0 0
(0/1) + j(0/1)
ep> q
BYE!


Rückgabewerte und Fehlermeldungen

Bei falschen Aufrufen des Programms:
[ERR] usage: ./ass netlist omega\n

Rückgabewert: 1

Sollte während der Laufzeit der Speicher ausgehen:
[ERR] out of memory\n

Rückgabewert: 2

Sollte das <netlist> File nicht gefunden werden:
[ERR] <netlist> not found\n

Rückgabewert: 3

Sollte die gegebene netlist fehlerhaft sein:
[ERR] Error in netlist\n

Rückgabewert: 4

Sollte omega keine Zahl, > UINT_MAX oder <= 0 sein:
[ERR] Invalid omega\n

Rückgabewert: 5

Sollte der Nenner einer Rationale Zahl 0 werden:
[ERR] Division by zero\n

Rückgabewert: 6
Bonusaufgaben

Beliebig viele Knoten in der Netzliste (+1 Punkt)

Hier soll gezeigt werden dass man auch mit dynamischen Speicher arbeiten kann. Dies wird nicht automatisiert getestet und soll beim Abgabegespräch vorgezeigt werden.

einfache Parallelschaltungen (+1 Punkte)

Parallelschaltungen von mehreren Bauteilen zwischen 2 aneinander liegenden Knoten. Auch dies soll beim Abgabegespräch vorgezeigt werden.

beliebige Schaltungen (+2 Punkte)

Es soll möglich sein jegliche Kombination von gültigen Netzlisten zu unterstützen und auch die Impedanz zwischen beliebigen Knoten zu berechnen.
1 Lösung Lösung öffentlich
Fibonacci-Zahlen bis 100 ausgeben
Anfänger - C von Y0uLyric - 14.12.2016 um 21:42 Uhr
Schreibe Code, der die Fibonacci-Zahlen bis 100 ausgibt. Die Fibonacci-Zahlen kommen dadurch zustande, dass 2 aufeinanderfolgende Zahlen addiert werden, zb.: 0 + 1 = 2 --> 1 + 2 = 3 --> 2 + 3 = 5 --> 3 + 5 = 8.....

Viel Erfolg!!!
0 Lösungen
Bearbeiten & Speichern von CSV Dateien
Fortgeschrittener - C von ZRX88 - 11.12.2016 um 21:29 Uhr
Das Ziel ist die automatische Verarbeitung von CSV Dateien.

Eine typische Anwendung ist die Anbindung an eine externe API, die eine CSV bei jeden Aufruf zurückgibt. Diese CSV wird in der Regel noch verarbeitet bevor sie in eine Datenbank geladen wird.

The programm should have following functions:
* generate a random csv with a given lenght ( number of rows and columns)
* read and write csv files from a directory
* remove columns
* add the new column "hash" which should be the MD5 hash of all given columns. Note the column is different for all rows.
* add the new column "request_tstamp" which should be the current time, the value should be the same for all rows.
* transform all values of given column in the way that '.' is replaced by ',' or '€' by an empty string
3 Lösungen Lösungen öffentlich
Regelmäßiges Runterladen und Abspeichern von Dateien
Anfänger - C von ZRX88 - 04.12.2016 um 12:06 Uhr
Eine Firma X stellt euch einen FTP Zugang (ggf. mit Zugang + PW ) zur Verfügung, wo sie jeden Tag eine Datei xyz.txt updaten und mit den aktuellsten Datensätzen befüllen.

Im ersten Schritt sollen diese Dateien heruntergeladen werden und dann auch in einem Ordner auf der Festplatte abgelegt werden.
Zum Wiedererkennen soll sowohl die Quelle als auch der Zeitpunkt des Downloads abgespeichert werden:
mögliche Beispiele:
* Zielorder > File 'FTP_x_xzy_2016_12_24.txt'
* Zielorder > Ordername '2016-12-24' > File 'xyz.txt'

Wichtig: Die Ablage muss sauber strukturiert sein.

Anmerkung: Da ich euch keinen FTP zur Verfügung stelle und wenn ihr keinen eigenen zum Testen habt:
Stattdessen ladet doch einfach den Inhalt von https://trainyourprogrammer.de/python herunter.

Optional:
* Erweitert das Programm so, dass es alle Dateien auf dem FTP herunterlädt.
* Alternativ: Speichert den Inhalt von alle verfügbaren Python Aufgaben Seiten herunter?


1 Lösung Lösung öffentlich
Mehrdimensionale Arrays
Anfänger - C von zefcat - 27.11.2016 um 10:46 Uhr
Sie sollen ein C Programm schreiben, welches eine 4x4 Matrix um 90° nach rechts dreht. Eine Drehung soll somit folgendermaßen aussehen:

a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a43 a44

wird zu

a41 a31 a21 a11
a42 a32 a22 a12
a43 a33 a23 a13
a44 a34 a24 a14

Folgende Matrizen sollen Sie insgesamt 4 mal drehen:


- - - - - - - - - - - - - - o -
- o - - - o o - - o - - - - o -
o o o - o o - - - o - - - - o -
- - - - - - - - - o o - - - o -


Die Matrizen sollen insgesamt 5 mal ausgegeben werden, einmal bevor eine Drehung durchgeführt wurde und anschließend nach jeder Drehung (die letzte Ausgabe entspricht also der ersten Ausgabe).

Als Trennzeichen dienen ein Leerzeichen zwischen den einzelnen Symbolen innerhalb einer Matrix, zwei Leerzeichen zwischen zwei horizontal angeordnete Matrizen und eine Leerzeile zwischen den einzelnen Versionen. Beachten Sie das Fehlen von abschließenden Leerzeichen nach der letzten Matrize. Siehe dazu auch die Beispielausgabe.