Inhalt:

     Hinweise für alle Aufgaben
(01) Funktion word_count
(02) Funktion repeat_string
(03) Funktion merge_string
(04) Projekt  intsum
(05) Projekt  print_string
(06) Projekt  calc_isqr
(07) Funktion swap_elements
(08) Funktion sort_elements
(09) Funktion toggle_element
(10) Funktion count_agegroup
(11) Funktion init_persons
(12) Funktion check_persons
(13) Funktion count_1
(14) Funktion count_0
(15) Funktion count_1s

**************************************************

Hinweise für alle Aufgaben.
* Notieren sie bitte auf Papier sowie auf allen erstellten Dateien (als Kommentar im Quelltext):
Ihre Klasse, ihren Namen und die Nummern der bearbeiteten Aufgaben. 
* Speichern sie erstellte Dateien in einem Ordner, der mit Klasse und Name bezeichnet ist (z.B. 1ABC_Maier).
* Wenn die Erstellung von Funktionen ("Unterprogrammen") erwünscht ist, so muss zwar die Funktion, nicht jedoch das aufrufende Programm erstellt werden.
* Wenn die Erstellung eines Projekts erwünscht ist, so müssen alle Teile (Dateien) des Projekts erstellt werden.
* Die Funktionen sollen fehlerfrei funktionieren und eine kurze, aber eindeutige Dokumentation enthalten. 
* Die Kurz-Dokumentation (als Kommentar im Quelltext) enthält Angaben über die Verwendung (Funktionalität, Deklaration und Syntax), Angaben zu ihrer Person (Name, Klasse) und zur Version (VersNr, Datum).
* Einige Aufgaben sind in 2 Versionen gestellt: erstellen sie unbedingt zuerst die Grundversion (Minimal-Anforderung). Entscheiden sie dann nach eigenem Ermessen, welche Erweiterungen sie zusätzlich erstellen.
* Verwenden sie in der Test-Umgebung zur Eingabe von strings über die Konsole nicht die Funktion scanf() sondern besser die Funktion gets() aus der library  (Syntax: char string[...]; gets(string); ).
Falls sie zwischendurch andere Konsolen-Funktionen verwenden (z.B. scanf() für Zahlen) so, können sie den allenfalls "unsauberen" Eingabepuffer mit Funktion fflush() aus der library  löschen (Syntax: fflush(stdin); )

**************************************************

(01) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Ermittlung der Anzahl von Worten in einer Zeichenkette (string).
* Syntax:
   int wc;
   char mystring[...];      // keine Vorgaben über die Dimension notwendig
   ...
   wc=word_count(mystring);
* Grundversion: Die Funktion gibt die Anzahl gefundener Worte an das aufrufende Programm zurück. Ignorieren sie in dieser Version alle Sonderfälle, zählen sie nur durch Leerzeichen getrennte Worte.
* Erweiterte Version:
   + Berücksichtigen sie Sonderfälle, wie z.B. führende oder folgende Leerzeichen (leading or trailing blanks), Mehrfach-Blanks, strings ausschliesslich aus blanks.
   + Als Zeichen für Wort-Zwischenräume dienen alle Kontrollzeichen <'0' sowie alle Zeichen von '\x3A' bis '\x3F'.
   + Falls ein string kein Ende-Zeichen enthält, so wird die Funktion nach 100 Zeichen (einstellbar) abgebrochen.

**************************************************

(02) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Erstellen einer Zeichenkette (string) aus wiederholten Zeichenketten.
* Syntax:
   int n,sl;
   char mystring[...],rep[...];            // keine Vorgaben über die Dimension notwendig
   ...
   n=3;
   repeat_string(n,rep,mystring);          // Grundversion
   // sl=repeat_string(n,rep,mystring);    // Erweiterte Version
* Grundversion: Die Funktion ersetzt den Inhalt des strings (mystring) durch eine beliebige Anzahl gleicher strings (rep).
   Beispiel: Im oben angeführten Syntax-Beispiel (wenn n=3 und repstring="az") gibt die Funktion den string "azazaz" zurück. Berücksichtigen sie keine Sonderfälle, bearbeiten sie nur einfache nicht-leere rep-strings und n>0.
* Erweiterte Version:
   + Wenn das Argument n<=0 ist, wird ein leerer string erzeugt.
   + Wenn das Argument n>100 ist, wird n=100 gesetzt (einstellbar).
   + Falls der repeat-string kein Ende enthält, so wird die Funktion nach 100 Zeichen (einstellbar) abgebrochen.
   + Falls die string-Länge (mystring) 100 Zeichen (einstellbar) überschreitet, so wird der string nur bis zu dieser Länge erzeugt.
   + Die Funktion gibt die Gesamtlänge des erzeugten strings an das aufrufende Programm zurück.

**************************************************

(03) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Zusammenführung (concatenate) von 2 Zeichenketten (strings).
* Syntax:
   int dl;
   char src1[...],src2[...],dst[...];    // keine Vorgaben über die Dimension notwendig
   ...
   merge_string(src1,src2,dst);          // Grundfunktion
   // dl=merge_string(src1,src2,dst)     // Erweiterte Funktion
* Grundversion: Die Funktion ersetzt den Inhalt von dst durch den Inhalt von src1+src2. Ignorieren sie alle Sonderfälle, z.B. leere strings. Verwenden sie keine library-Funktionen (z.B. strcpy() oder strcat() ), sondern programmieren sie selbst. 
* Erweiterte Version: 
   + Die Funktion gibt zusätzlich die Länge des (neuen) strings dst an das aufrufende Programm zurück.
   + Falls ein source-string kein Ende-Zeichen enthält, so wird die Funktion nach 100 Zeichen (einstellbar) abgebrochen.
   + Die Größe des erzeugten string (dst) wird mit 100 Zeichen (einstellbar) begrenzt.
   + Optional werden Sonderzeichen <'\x20' ignoriert.

**************************************************

(04) Erstellen sie ein Bibliotheks-Projekt:
* Das Projekt enthält folgende Teile: Header, Programm (main...), Funktionen-Bibliothek.
* Funktionalität: Im Hauptprogramm werden 2 ganze Zahlen definiert (Minimal-Aufwand !), die von einem Unterprogramm in der Bibliothek addiert werden. 
* Syntax:
   int a,b,s;
   ...
   s=intsum(a,b);		// Ergebnis s=a+b
* Grundversion: Die geforderte Funktionalität (inkl. Dokumentation) mit minimalem Aufwand erstellen.
* Erweiterte Version:
   + Einfache Eingabe und Ausgabe (Konsole) der Zahlen im Hauptprogramm (main);

**************************************************

(05) Erstellen sie ein Bibliotheks-Projekt:
* Das Projekt enthält folgende Teile: Header, Programm (main...), Funktionen-Bibliothek.
* Funktionalität: Im Hauptprogramm wird eine Zeichenkette (string) definiert (Minimal-Aufwand !), die von einem Unterprogramm in der Bibliothek auf der Konsole ausgegeben wird. 
* Syntax:
   char mystring[...];
   ...
   print_string(mystring);		// Ausgabe von mystring
* Grundversion: Die geforderte Funktionalität (inkl. Dokumentation) mit minimalem Aufwand erstellen.
* Erweiterte Version:
   + Einfache Eingabe des strings im Hauptprogramm (main);

**************************************************

(06) Erstellen sie ein Bibliotheks-Projekt:
* Das Projekt enthält folgende Teile: Header, Programm (main...), Funktionen-Bibliothek.
* Funktionalität: Im Hauptprogramm wird eine ganze Zahl (int) definiert (Minimal-Aufwand !). Von einem Unterprogramm in der Bibliothek wird das Quadrat dieser Zahl berechnet und an das aufrufende Programm zurückgegeben.. 
* Syntax:
   int i,q;
   ...
   q=calc_isqr(i);		// Berechnung des Zahlen-Quadrats (q=i*i)
* Grundversion: Die geforderte Funktionalität (inkl. Dokumentation) mit minimalem Aufwand erstellen.
* Erweiterte Version:
   + Einfache Eingabe und Ausgabe der Zahlen im Hauptprogramm (main);

**************************************************

(07) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Vertauschung von 2 Elementen eines Feldes (array).
* Syntax: 
   int myarray[...];                   // keine Vorgaben über die Dimension notwendig
   int i,j,ok;
   ...
   swap_elements(i,j,myarray);         // Grundversion
   // ok=swap_elements(i,j,myarray);   // Erweiterte Version
* Grundversion: Die Funktion vertauscht die gewünschten Elemente des Feldes. Dimension: 10 Elemente
   Beispiel: wenn das Feld vor dem Aufruf von swap_elements den Inhalt {33,18,97,5...} hat und swap_elements(1,2,myarray) aufgerufen wird, so soll das Feld anschliessend den Inhalt {33,97,18,5...} haben.
* Erweiterte Version: 
   + Die Funktion ignoriert die Verwendung fehlerhafter Indices (i,j<0 oder >Feldlänge). An das aufrufende Programm wird ein fehlercode zurückgegeben (0=Fehler, 1=ok).
* Hinweis: Initialisieren sie das Feld vor Gebrauch sinnvoll. Es wäre praktisch, zusätzlich eine kleine Funktion "print_array" zu erstellen...

**************************************************

(08) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Ordnen von 2 Elementen eines Feldes (array).
* Syntax: 
   int myarray[...];                   // keine Vorgaben über die Dimension notwendig
   int i,j,ok;
   ...
   sort_elements(i,j,myarray);         // Grundversion
   // ok=sort_elements(i,j,myarray);   // Erweiterte Version
* Grundversion: Die Funktion sortiert die gewünschten Elemente des Feldes aufsteigend. Dimension: 10 Elemente
   Beispiel: wenn das Feld vor dem Aufruf von sort_elements() den Inhalt {23,78,17,55...} hat und sort_elements(1,2,myarray) aufgerufen wird, so soll das Feld anschliessend den Inhalt {23,17,78,55...} haben.
* Erweiterte Version: 
   + Die Funktion ignoriert die Verwendung fehlerhafter Indices (i,j<0 oder >Feldlänge). An das aufrufende Programm wird ein Return-Code zurückgegeben (0=Fehler, 1=ok).
   + Erweiterung des return-Codes: 1=keine Änderung, 2=Elemente wurden getauscht.
* Hinweis: Initialisieren sie das Feld vor Gebrauch sinnvoll. Es wäre praktisch, zusätzlich eine kleine Funktion "print_array" zu erstellen...

**************************************************

(09) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Umkehrung eines Elementes eines Feldes (array).
* Syntax: 
   int myarray[...];       // keine Vorgaben über die Dimension notwendig
   int i;
   ...
   toggle_element(i,myarray);
* Grundversion: Die Funktion "invertiert" das gewünschte Elemente des Feldes, d.h. setzt myarray[i]=-myarray[i].
   Dimension: 10 Elemente.
   Beispiel: wenn das Feld vor dem Aufruf von toggle_element() den Inhalt {11,22,53,97...} hat und toggle_element(2,myarray) aufgerufen wird, so soll das Feld anschliessend den Inhalt {11,22,-53,97...} haben.
* Erweiterte Version: 
   + Die Funktion ignoriert die Verwendung fehlerhafter Indices (i,j<0 oder >Feldlänge). An das aufrufende Programm wird ein Return-Code zurückgegeben (0=Fehler, 1=ok).

**************************************************

(10) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Zählung einer Altersgruppe in einem Feld (array) von Strukturen.
* Erstellen sie eine geeignete Struktur (person) mit folgenden Eigenschaften (members): Pers-Nr, Vorname, Zuname, Alter
* Syntax:
   person mypers[...];       // keine Vorgaben über die Dimension notwendig
   int found,a,z;
   ...
   found=count_agegroup(mypers,a,z);
* Grundversion: Die Funktion zählt, wie oft die gesuchte Altersgruppe im Feld (mypers) vorkommt. (a<=alter<=z). 
* Erweiterte Version:
   + Die Dimension des arrays ist einfach einstellbar (z.B. #define)

**************************************************

(11) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Initialisierung eines Feldes (array) von Strukturen.
* Erstellen sie eine geeignete Struktur (person) mit folgenden Eigenschaften (members): Vorname, Zuname, Alter, Pers-Nr
* Syntax:
   person mypers[...];       // keine Vorgaben über die Dimension notwendig
   int i,j;
   ...
   init_persons(i,j,mypers);
* Grundversion: Die Funktion initialisiert (ersetzt den momentanen Inhalt) folgender Eigenschaften in den Personen i...j (i bis j) (Dimension 10) Alle anderen Elemente bleiben unverändert.
   + Vorname: leerer string
   + Zuname: "Unbekannt"
   + Alter: 0
   + Pers-Nr: Index (Beispiel: persnr von mypers[27] wird auf 27 gesetzt.
* Erweiterte Version: 
   + Kontrolle der Indices (i,j) auf Zulässigkeit. Keine Ausführung mit illegalen Indices.
   + Rückgabecode an das aufrufende Programm: 0=Fehler, 1=ok

**************************************************

(12) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Korrektur fehlerhafter Werte in einem Feld (array) von Strukturen.
* Erstellen sie eine geeignete Struktur (person) mit folgenden Eigenschaften (members): Vorname, Zuname, Alter, Pers-Nr
* Syntax:
   person mypers[...];         // keine Vorgaben über die Dimension notwendig
   int i;
   ...
   check_persons(mypers);      // Grundversion
   //i=check_persons(mypers);  // Erweiterte Version
* Grundversion: Die Funktion ersetzt alle unzulässigen Alters-Angaben (einstellbare Unter- und Obergrenzen, z.B. 0...150) durch 0. Die Funktion ersetzt alle unzulässigen Pers-Nr-Angaben (Pers-Nr != Index) durch den Index. Beispiel: persnr von person[73] wird auf 73 gesetzt.
* Erweiterte Version: 
   + Die Anzahl ausgeführter Fehler-Korrekturen wird an das aufrufende Programm zurückgegeben.

**************************************************

(13) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Zählung aller gesetzten bits (bit=1) in einer ganzen Zahl (int)
* Syntax:
   int n1,i;
   ...
   n1=count_1(i);
* Hinweis: Die Funktion sizeof() liefert die Größe von Elementen in byte. (Syntax: int s; s=sizeof(i); )

**************************************************

(14) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Zählung aller gelöschten bits (bit=0) in einer ganzen Zahl (int)
* Syntax:
   int i,n0;
   ...
   n0=count_0(i);
* Hinweis: Die Funktion sizeof() liefert die Größe von Elementen in byte. (Syntax: int s; s=sizeof(i); )
**************************************************

(15) Erstellen sie eine Funktion, die folgende Arbeiten ausführt:
* Zählung aller gesetzten bits (bit=1) in einer Zeichenkette (string)
* Syntax:
   char mystring[...]         // keine Vorgaben über die Dimension notwendig
   int n1;
   ...
   n1=count_1(mystring);

**************************************************

    Source: geocities.com/pstrainer/entwicklung/c/aufgaben

               ( geocities.com/pstrainer/entwicklung/c)                   ( geocities.com/pstrainer/entwicklung)                   ( geocities.com/pstrainer)