Benutzer Diskussion:Mario: Unterschied zwischen den Versionen
(→LiveCD - ArtWork) |
Mario (Diskussion | Beiträge) K (Links angepasst ...) |
||
| (13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| − | = | + | = CKurs - Ein und Ausgabe = |
| + | - DRAFT - | ||
| − | + | *Kommentare im Code sind Infos zum Erzählen. | |
| − | + | *Fett: Fragen an Publikum/Im Code: Ergänzung zum letzten Listings ... | |
| − | + | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | = Wiederholung = | ||
| + | '''Durch Studis zu ergänzen''' | ||
| + | ''HelloWorld''-Programm an die Tafel | ||
| + | #include <stdio.h> // Einbinden des Headers der IO-Lib<br> | ||
| + | int main(int argc, char **argv) // Haupteinsprungspunkt | ||
| + | { // Scope erwähnen? | ||
| + | // Platz für Variablen lassen | ||
| + | printf("Hello World!\n"); // Kurz: \n => newline, folgende Ausgabe in der nächsten Zeile | ||
| + | return 0; | ||
| + | } | ||
| − | + | * ''\n'' für eine Zeilenende | |
| − | + | * ''\"'' für ein ''"''-Symbol | |
| − | + | * ''\\'' für ein ''\''-Symbol (Windows-Pfadtrenner) | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | == | + | = dynamische Ausgabe = |
| − | |||
| − | |||
| − | |||
| + | (Ausgabe an Tafel/Laptop) | ||
| + | #include <stdio.h><br> | ||
| + | int main(int argc, char **argv) | ||
| + | { <br> | ||
| + | printf("Hello World!''' Some Number: %d'''\n"''', 42'''); // Wichtig: Komma erwähnen! | ||
| + | return 0; | ||
| + | } | ||
| − | == | + | * ''printf'' benutzt das '''%'''-Zeichen zur Markierung welcher Teil des Textes ersetzt werden muss. |
| − | # | + | * nach dem '''%'''-Zeichen steht der ''Typbezeichner'': '''%d''' steht für '''d'''ecimal (ganzzahlige Ausgabe). |
| + | ** ''%s'' für Zeichenketten | ||
| + | ** ''%f'' für Fließkommazahlen | ||
| + | ** ''%%'' für ''%'' | ||
| + | |||
| + | |||
| + | == Variablen== | ||
| + | * bisher: keine Verbesserung, da '''%d''' auch einfach direkt '''42''' sein könnte ... | ||
| + | * Nutzbar auch für Variablen: ('''''Frage'': Was ist eine Variable?''') | ||
| + | |||
| + | #include <stdio.h><br> | ||
| + | int main(int argc, char **argv) | ||
| + | { | ||
| + | '''int iSumOfDigits = 1 + 9 + 8 + 5;''' | ||
| + | printf("Hello World! Some Number: %d\n", '''iSumOfDigits'''); | ||
| + | return 0; | ||
| + | } | ||
| + | |||
| + | * '''''Frage:'' Was ist das Ergebnis? Warum?''' | ||
| + | * '''''Antwort:'' Hello World! Some Number: 23''' | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | == Formatierung == | ||
| + | * ''%5d'' für 5 Zahlen mindestens | ||
| + | * ''%05d'' für 5 Zahlen mindestens, aufgefüllt mit Nullen | ||
| + | * ''%-5d'' für 5 Zahlen mindestens, linksbündig | ||
| + | * ''%-5.2f'' für 5 Zahlen mindestens, linksbündig, auf zwei Nachkommastellen gerundet | ||
| + | |||
| + | |||
| + | '''''Beispiel (An Tafel/Laptop)''''' | ||
| + | char pcName[255]; | ||
| + | strcpy(pcName,"Mario");// #include <string.h> + ''richtige'' Art der Zuweisung für konstanten Inhalt<br> | ||
| + | unsigned uiAge = 26u; | ||
| + | float fHeight=1.83f;<br> | ||
| + | printf("%s ist %5.0fm hoch und %05d Jahre alt\n", pcName, fHeight, uiAge); | ||
| + | printf("%s ist %-5.1fm hoch und %-05d Jahre alt\n", pcName, fHeight, uiAge);<br> | ||
| + | |||
| + | '''''Frage: '' Wie sieht die Ausgabe aus? Warum?'''<br> | ||
| + | '''''Antwort: ''''' | ||
| + | Mario ist 2m hoch und 00026 Jahre alt | ||
| + | Mario ist 1.8 m hoch und 26 Jahre alt | ||
| + | |||
| + | |||
| + | |||
| + | = Eingabe = | ||
| + | |||
| + | * ''scanf'' ähnlich zu ''printf'' | ||
| + | * liest stets von der Kommandozeile | ||
| + | |||
| + | #include <stdio.h><br> | ||
| + | int main(int argc, char **argv) | ||
| + | { | ||
| + | unsigned int uiAge; | ||
| + | '''printf("Alter: ");''' // Ausgabe vor der Eingabe ... | ||
| + | '''scanf("%d", &uiAge);''' // '''&''': Adressoperator, kommt später, immer mitnehmen! | ||
| + | printf("Du bist %d Jahre alt.\n", uiAge); | ||
| + | return 0; | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | == Fehlerhafte Eingabe == | ||
| + | |||
| + | '''''Frage:'' Welchen Wert hat ''uiAge'' wenn ''A'' eingegeben wurde?'''<br> | ||
| + | '''Antwort:''' ''0'' und keine Fehlermeldung. Daher: Stets prüfen, ob Konvertierung möglich war. | ||
| + | |||
| + | * Rückgabewert von ''scanf'' gibt Anzahl der erfolgreich gelesenen '''%'''-Zeichenketten zurück | ||
| + | * '''0''' bedeutet, keine erfolgreiche Konvertierung möglich ... | ||
| + | |||
| + | #include <stdio.h><br> | ||
| + | int main(int argc, char **argv) | ||
| + | { | ||
| + | unsigned int uiAge; | ||
| + | printf("Alter: "); | ||
| + | if( 1 != scanf("%d", &uiAge) ) | ||
| + | { | ||
| + | printf("Konnte das Alter nicht lesen!\n"); | ||
| + | return -1; | ||
| + | }<br> | ||
| + | printf("%s ist %d Jahre alt\n", pcName, uiAge); | ||
| + | return 0; | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | = Dateien = | ||
| + | |||
| + | Ein und Ausgabe in Dateien: Schrittfolge zum Dateibearbeiten: | ||
| + | # Datei öffnen '''FILE *pOpenedFile = fopen( ''FILE_PATH'', ''MODE'');''' | ||
| + | #* ''FILE_PATH'' = "/usr/share/.." | ||
| + | #* ''MODE'' | ||
| + | #** '''r'''ead (nur lesend, bricht ab bei nicht existenter Datei) | ||
| + | #** '''w'''rite (nur schreibend, erzeugt Datei, schreibt von Anfang) | ||
| + | #** '''a'''ppend (nur schreibend, schreibt ans Ende) | ||
| + | #** '''r+''' (read+write) lesen und schreiben, Dateiinhalt bleibt erhalten | ||
| + | #** '''w+''' (write+read) lesen und schreiben, Dateiinhalt wird gelöscht | ||
| + | #** '''a+''' (append+read) vom Dateianfang lesen und ans Ende schreiben, funktioniert nicht unter MAC, lieber mit r+ arbeiten ... :-) | ||
| + | #* '''pOpenedFile''' muss ungleich '''NULL''' sein, wenn Datei geöffnet werden konnte | ||
| + | # Datei bearbeiten | ||
| + | #* Schreiben: | ||
| + | #** '''f'''printf( pOpenedFile, ''FORMAT_STRING''[, ''TYPES'']*); | ||
| + | #** ''FORMAT_STRING'' und ''TYPES'', wie bei printf! | ||
| + | #* Lesen: | ||
| + | #** '''f'''scanf( pOpenedFile, ''FORMAT_STRING''[, &''TYPES'']*); | ||
| + | #** ''FORMAT_STRING'' und ''TYPES'', wie bei scanf! | ||
| + | #** Testen ob Dateiende: '''feof(pOpenedFile)''' | ||
| + | #*** Wenn Rückgabe != 0 wurde Dateiende erreicht | ||
| + | # Datei schließen (Sonst kann die Datei nicht erneut geöffnet werden) | ||
| + | #* '''fclose( pOpenedFile );''' | ||
| + | |||
| + | = Komplexe Aufgabe = | ||
| + | '''''Aufgabe:'' Lese eine Datei mit folgendem Inhalt ein und füge am Ende der Datei die Summe aller Elemente hinzu.'''<br> | ||
| + | <pre> | ||
| + | 1 2 3 | ||
| + | 4 5 6 | ||
| + | 7 8 9 | ||
| + | </pre> | ||
| + | (Summe = 45) | ||
| + | |||
| + | '''''Antwort:''''' | ||
| + | <pre> | ||
| + | #include <stdio.h> | ||
| + | int main(int argc, char **argv) | ||
| + | { | ||
| + | // Schritt 1: Öffnen | ||
| + | FILE *pOpenFile = fopen("/tmp/sample.txt", "a+"); | ||
| + | if( NULL == pOpenFile ) | ||
| + | { | ||
| + | printf("Konnte Datei nicht öffnen!\n"); | ||
| + | return -1; | ||
| + | } | ||
| + | |||
| + | // Schritt 2a: Bearbeiten (lesen) | ||
| + | int iSum = 0; | ||
| + | while( feof( pOpenFile ) == 0 ) | ||
| + | { | ||
| + | int iReadDecimal = 0; | ||
| + | if( 1 == fscanf(pOpenFile, "%d", &iReadDecimal) ) | ||
| + | { | ||
| + | iSum+=iReadDecimal; | ||
| + | printf("Wert gelesen: \"%d\"\nAktuelle Summe: %d\n\n", iReadDecimal, iSum); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | printf("Wert konnte nicht gelesen werden ...\n"); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Schritt 2b: Bearbeiten (schreiben) | ||
| + | printf("Hänge Ergebnis %d ans Ende der Datei an.\n", iSum); | ||
| + | if( 0 == fprintf(pOpenFile, "%d\n", iSum) ) | ||
| + | { | ||
| + | printf("Inhalt der Datei konnte nicht verändert werden\n"); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | printf("Datei wurde erfolgreich beschrieben!\n"); | ||
| + | } | ||
| + | |||
| + | // Schritt 3: Schließen | ||
| + | fclose(pOpenFile); | ||
| + | return 0; | ||
| + | } | ||
| + | |||
| + | </pre> | ||
| + | |||
| + | = ENDE = | ||
| + | |||
| + | Empfohlene Aufgabe: [http://wiki.freitagsrunde.org/Ckurs2009/EingabeAusgabe Ein und Ausgabe] & [http://wiki.freitagsrunde.org/Ckurs2009/Taschenrechner Taschenrechner] | ||
Aktuelle Version vom 12. September 2011, 17:21 Uhr
Inhaltsverzeichnis
CKurs - Ein und Ausgabe
- DRAFT -
- Kommentare im Code sind Infos zum Erzählen.
- Fett: Fragen an Publikum/Im Code: Ergänzung zum letzten Listings ...
Wiederholung
Durch Studis zu ergänzen HelloWorld-Programm an die Tafel
#include <stdio.h> // Einbinden des Headers der IO-Lib
int main(int argc, char **argv) // Haupteinsprungspunkt { // Scope erwähnen? // Platz für Variablen lassen printf("Hello World!\n"); // Kurz: \n => newline, folgende Ausgabe in der nächsten Zeile return 0; }
- \n für eine Zeilenende
- \" für ein "-Symbol
- \\ für ein \-Symbol (Windows-Pfadtrenner)
dynamische Ausgabe
(Ausgabe an Tafel/Laptop)
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello World! Some Number: %d\n", 42); // Wichtig: Komma erwähnen! return 0; }
- printf benutzt das %-Zeichen zur Markierung welcher Teil des Textes ersetzt werden muss.
- nach dem %-Zeichen steht der Typbezeichner: %d steht für decimal (ganzzahlige Ausgabe).
- %s für Zeichenketten
- %f für Fließkommazahlen
- %% für %
Variablen
- bisher: keine Verbesserung, da %d auch einfach direkt 42 sein könnte ...
- Nutzbar auch für Variablen: (Frage: Was ist eine Variable?)
#include <stdio.h>
int main(int argc, char **argv) { int iSumOfDigits = 1 + 9 + 8 + 5; printf("Hello World! Some Number: %d\n", iSumOfDigits); return 0; }
- Frage: Was ist das Ergebnis? Warum?
- Antwort: Hello World! Some Number: 23
Formatierung
- %5d für 5 Zahlen mindestens
- %05d für 5 Zahlen mindestens, aufgefüllt mit Nullen
- %-5d für 5 Zahlen mindestens, linksbündig
- %-5.2f für 5 Zahlen mindestens, linksbündig, auf zwei Nachkommastellen gerundet
Beispiel (An Tafel/Laptop)
char pcName[255]; strcpy(pcName,"Mario");// #include <string.h> + richtige Art der Zuweisung für konstanten Inhalt
unsigned uiAge = 26u; float fHeight=1.83f;
printf("%s ist %5.0fm hoch und %05d Jahre alt\n", pcName, fHeight, uiAge); printf("%s ist %-5.1fm hoch und %-05d Jahre alt\n", pcName, fHeight, uiAge);
Frage: Wie sieht die Ausgabe aus? Warum?
Antwort:
Mario ist 2m hoch und 00026 Jahre alt Mario ist 1.8 m hoch und 26 Jahre alt
Eingabe
- scanf ähnlich zu printf
- liest stets von der Kommandozeile
#include <stdio.h>
int main(int argc, char **argv) { unsigned int uiAge; printf("Alter: "); // Ausgabe vor der Eingabe ... scanf("%d", &uiAge); // &: Adressoperator, kommt später, immer mitnehmen! printf("Du bist %d Jahre alt.\n", uiAge); return 0; }
Fehlerhafte Eingabe
Frage: Welchen Wert hat uiAge wenn A eingegeben wurde?
Antwort: 0 und keine Fehlermeldung. Daher: Stets prüfen, ob Konvertierung möglich war.
- Rückgabewert von scanf gibt Anzahl der erfolgreich gelesenen %-Zeichenketten zurück
- 0 bedeutet, keine erfolgreiche Konvertierung möglich ...
#include <stdio.h>
int main(int argc, char **argv) { unsigned int uiAge; printf("Alter: "); if( 1 != scanf("%d", &uiAge) ) { printf("Konnte das Alter nicht lesen!\n"); return -1; }
printf("%s ist %d Jahre alt\n", pcName, uiAge); return 0; }
Dateien
Ein und Ausgabe in Dateien: Schrittfolge zum Dateibearbeiten:
- Datei öffnen FILE *pOpenedFile = fopen( FILE_PATH, MODE);
- FILE_PATH = "/usr/share/.."
- MODE
- read (nur lesend, bricht ab bei nicht existenter Datei)
- write (nur schreibend, erzeugt Datei, schreibt von Anfang)
- append (nur schreibend, schreibt ans Ende)
- r+ (read+write) lesen und schreiben, Dateiinhalt bleibt erhalten
- w+ (write+read) lesen und schreiben, Dateiinhalt wird gelöscht
- a+ (append+read) vom Dateianfang lesen und ans Ende schreiben, funktioniert nicht unter MAC, lieber mit r+ arbeiten ... :-)
- pOpenedFile muss ungleich NULL sein, wenn Datei geöffnet werden konnte
- Datei bearbeiten
- Schreiben:
- fprintf( pOpenedFile, FORMAT_STRING[, TYPES]*);
- FORMAT_STRING und TYPES, wie bei printf!
- Lesen:
- fscanf( pOpenedFile, FORMAT_STRING[, &TYPES]*);
- FORMAT_STRING und TYPES, wie bei scanf!
- Testen ob Dateiende: feof(pOpenedFile)
- Wenn Rückgabe != 0 wurde Dateiende erreicht
- Schreiben:
- Datei schließen (Sonst kann die Datei nicht erneut geöffnet werden)
- fclose( pOpenedFile );
Komplexe Aufgabe
Aufgabe: Lese eine Datei mit folgendem Inhalt ein und füge am Ende der Datei die Summe aller Elemente hinzu.
1 2 3 4 5 6 7 8 9
(Summe = 45)
Antwort:
#include <stdio.h>
int main(int argc, char **argv)
{
// Schritt 1: Öffnen
FILE *pOpenFile = fopen("/tmp/sample.txt", "a+");
if( NULL == pOpenFile )
{
printf("Konnte Datei nicht öffnen!\n");
return -1;
}
// Schritt 2a: Bearbeiten (lesen)
int iSum = 0;
while( feof( pOpenFile ) == 0 )
{
int iReadDecimal = 0;
if( 1 == fscanf(pOpenFile, "%d", &iReadDecimal) )
{
iSum+=iReadDecimal;
printf("Wert gelesen: \"%d\"\nAktuelle Summe: %d\n\n", iReadDecimal, iSum);
}
else
{
printf("Wert konnte nicht gelesen werden ...\n");
}
}
// Schritt 2b: Bearbeiten (schreiben)
printf("Hänge Ergebnis %d ans Ende der Datei an.\n", iSum);
if( 0 == fprintf(pOpenFile, "%d\n", iSum) )
{
printf("Inhalt der Datei konnte nicht verändert werden\n");
}
else
{
printf("Datei wurde erfolgreich beschrieben!\n");
}
// Schritt 3: Schließen
fclose(pOpenFile);
return 0;
}
ENDE
Empfohlene Aufgabe: Ein und Ausgabe & Taschenrechner