Zum Inhalt springen
Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Benutzer Diskussion:Mario: Unterschied zwischen den Versionen

Aus FreitagsrundenWiki
Mario (Diskussion | Beiträge)
KKeine Bearbeitungszusammenfassung
Mario (Diskussion | Beiträge)
K Weiterer Text
Zeile 1: Zeile 1:
= CKurs - Ein und Ausgabe =
= CKurs - Ein und Ausgabe =


-DRAFT-
- DRAFT -
 
 
 
= Wiederholung =
= Wiederholung =
 
'''Durch Studis zu ergänzen'''
''HelloWorld''-Programm an die Tafel (Kommentare=Infos zum Erzählen) Durch Studis zu ergänzen
''HelloWorld''-Programm an die Tafel (Kommentare=Infos zum Erzählen)  


  #include <stdio.h> // Einbinden des Headers der IO-Lib<br>
  #include <stdio.h> // Einbinden des Headers der IO-Lib<br>
Zeile 14: Zeile 17:
  }  
  }  


= Ausgabe von Variablen =
* ''\n'' für eine Zeilenende
* ''\"'' für ein ''"''-Symbol
* ''\\'' für ein ''\''-Symbol (Windows-Pfadtrenner)


''printf'' benutzt besondere Zeichen, um zu Markieren, dass der folgende Text ersetzt werden muss. Zeichen: ''%''. Dannach steht ein ''Typbezeichner'', der für die Umwandlung des Argumentes sorgt. Bspw. ''%d'' gibt eine ganze Zahl ('''d'''igit) aus. Anwendung im Beispiel (Beibehalten des bereits geschriebenen codes an Tafel/Laptop:
 
 
= dynamische Ausgabe =
 
(Ausgabe an Tafel/Laptop)


  #include <stdio.h><br>
  #include <stdio.h><br>
  int main(int argc, char **argv)   
  int main(int argc, char **argv)   
  { <br>
  { <br>
   printf("Hello World!''' %d times again!'''\n"''', 42'''); // Wichtig: Komma erwähnen!
   printf("Hello World!''' Some Number: %d'''\n"''', 42'''); // Wichtig: Komma erwähnen!
   return 0;
   return 0;
  }
  }


Nutzbar auch für Variablen:
* ''printf'' benutzt das '''%'''-Zeichen zur Markierung welcher Teil des Textes ersetzt werden muss.
* nach dem '''%'''-Zeichen steht der ''Typbezeichner'': '''%d''' steht für '''d'''igit (ganzzahlige Formatierung).
** ''%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>
  #include <stdio.h><br>
  int main(int argc, char **argv)   
  int main(int argc, char **argv)   
  {  
  {  
   int iSumOfDigits = 1 + 9 + 8 + 5;
   '''int iSumOfSquares = 1 + 9 + 8 + 5;'''
   printf('''"Quersumme: %d\n, iSumOfDigits'''); // Oder ähnliches
   printf("Hello World! Some Number: %d\n", '''iSumOfSquares''');
   return 0;
   return 0;
  }
  }


==Weitere Typen==
* '''''Frage:'' Was ist das Ergebnis? Warum?'''
*''%s'' für Zeichenketten
 
*''%f'' für Fließkommazahlen
* 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, genau 2 Nachkommastellen
 
'''''Beispiel (An Tafel/Laptop)'''''
char pcName[255];
strcpy(pcName,"Mario");// #include <string.h><br>
unsigned uiAge = 26u;
float fHeight=1.83f;
float fPi = 3.1459f;<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: '' Was ist das Ergebnis? Warum?'''
Mario ist    2m hoch und 00026 Jahre alt
Mario ist 1.8  m hoch und 26    Jahre alt
 
 
= Eingabe =
 
* scanf wie printf
* liest stets von der Kommandozeile


Beispiel
  #include <stdio.h><br>
  #include <stdio.h><br>
  int main(int argc, char **argv)   
  int main(int argc, char **argv)   
  {  
  {  
   char* pcName = "Mario";
   char pcName[255]; // Verschiebung der Eklärung auf späteres Tutorium.
   unsigned int uiAge = 26;
  unsigned int uiAge;
   printf("%s ist %d Jahre alt\n", pcName, uiAge);
  '''printf("Name: ");'''
  '''scanf("%s", &pcName);''' // '''&''': Adressoperator, kommt später, immer mitnehmen!
   '''printf("Alter: ");'''
  '''scanf("%d", &uiAge);'''
   printf("%s ist %d Jahre alt.\n", pcName, uiAge);
   return 0;
   return 0;
  }
  }


= Eingabe =


scanf wie printf
 
= Fehlerfälle =
 
'''''Frage:'' Was passiert, wenn ''"A"'' als Alter angegeben wird?'''<br>
'''Antwort:''' Nix! Keine Fehlermeldung, etc. Stets selber überprüfen!
* Rückgabewert von ''scanf'' gibt Anzahl der erfolgreich gelesenen '''%?'''-Zeichenketten zurück
* ''0'' bedeutet, keine erfolgreiche Konvertierung möglich ...


  #include <stdio.h><br>
  #include <stdio.h><br>
  int main(int argc, char **argv)   
  int main(int argc, char **argv)   
  {  
  {
   char* pcName;
   char pcName[255];
   unsigned int uiAge;
   unsigned int uiAge;
   '''printf("Name: ");'''
   printf("Name: ");
   '''scanf("%s", &pcName);'''
   scanf("%s", &pcName);<br>
   '''printf("Alter: ");'''
   printf("Alter: ");
   '''scanf("%d", &uiAge);'''
   if( 1 != scanf("%d", &uiAge) )
  {
    printf("Konnte das Alter nicht lesen!\n");
    return -1;
  }<br>
   printf("%s ist %d Jahre alt\n", pcName, uiAge);
   printf("%s ist %d Jahre alt\n", pcName, uiAge);
   return 0;
   return 0;
  }
  }


= Dateien =
= ENDE =
 
Empfohlene Aufgabe: ''Taschenrechner'' + ''Kassenbon?''


TBD


fopen, fprintf, fscanf, fclose
(fread, fseek, fwrite)


= Fehlerfälle =
= Dateien =


TBD
Ein und Ausgabe in Dateien: Schrittfolge zum Dateibearbeiten:
# Datei öffnen '''FILE fOpenedFile = fopen( ''FILE_PATH'', ''MODE'');'''
#* ''FILE_PATH'' = "/usr/share/.."
#* ''MODE'' = '''r'''ead, '''w'''rite oder
#**'''w+''' (write+read) lesen und schreiben, Dateiinhalt wird dabei auf gelöscht
#**'''r+''' (read+write) lesen und schreiben, Dateiinhalt bleibt erhalten
#* '''fOpenedFile''' muss ungleich NULL sein, wenn Datei geöffnet werden konnte
# Datei bearbeiten
#* Schreiben:
#** '''f'''printf( fOpenedFile, ''FORMAT_STRING''[, ''TYPES'']*);
#** ''FORMAT_STRING'' und ''TYPES'', wie bei printf!
#* Lesen:
#** '''f'''scanf( fOpenedFile,  ''FORMAT_STRING''[, &''TYPES'']*);
#** ''FORMAT_STRING'' und ''TYPES'', wie bei scanf!
# Datei schließen (Sonst kann Windows die Datei nicht in anderen Programmen lesen ...)
#* '''fclose( fOpenedFile );'''


Rückgabewert überprüfen, Code testen.
'''''Frage:'' Wie lese ich die existierende ''/tmp/sample.txt'' ein?'''
#include <stdio.h><br>
int main(int argc, char **argv) 
{
  // Schritt 1: Öffnen
  FILE* pOpenendFile = fopen("/tmp/sample.txt", "r+");
  if( NULL == pOpenendFile )
  {
        printf("Konnte Datei nicht öffnen!\n");
        return -1;
  }<br>
  // Schritt 2: Bearbeiten (lesen)
  char pcFileEntry[255];
  if( 0 >= fscanf(pOpenendFile, "%s", &pcFileEntry) )
  {
        printf("Konnte Datei nicht lesen!\n");
  }
  else
  {
        printf("Inhalt gelesen: \"%s\"\n", pcFileEntry);
  }<br>
  // Schritt 2: Bearbeiten (schreiben)
  if( 0 == fprintf(pOpenendFile, "FileRead!\n") )
  {
        printf("Inhalt der Datei konnte nicht verändert werden\n");
  }
  else
  {
        printf("Datei wurde erfolgreich beschrieben!\n");
  }<br>
  // Schritt 3: Datei Schließen
  fclose(pOpenendFile);
}

Version vom 30. August 2011, 20:55 Uhr

CKurs - Ein und Ausgabe

- DRAFT -


Wiederholung

Durch Studis zu ergänzen HelloWorld-Programm an die Tafel (Kommentare=Infos zum Erzählen)

#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 digit (ganzzahlige Formatierung).
    • %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 iSumOfSquares = 1 + 9 + 8 + 5; printf("Hello World! Some Number: %d\n", iSumOfSquares); return 0; }
  • Frage: Was ist das Ergebnis? Warum?
  • 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, genau 2 Nachkommastellen

Beispiel (An Tafel/Laptop)

char pcName[255];
strcpy(pcName,"Mario");// #include <string.h>
unsigned uiAge = 26u; float fHeight=1.83f; float fPi = 3.1459f;
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: Was ist das Ergebnis? Warum?

Mario ist     2m hoch und 00026 Jahre alt
Mario ist 1.8  m hoch und 26    Jahre alt


Eingabe

  • scanf wie printf
  • liest stets von der Kommandozeile
#include <stdio.h>
int main(int argc, char **argv) { char pcName[255]; // Verschiebung der Eklärung auf späteres Tutorium. unsigned int uiAge; printf("Name: "); scanf("%s", &pcName); // &: Adressoperator, kommt später, immer mitnehmen! printf("Alter: "); scanf("%d", &uiAge); printf("%s ist %d Jahre alt.\n", pcName, uiAge); return 0; }


Fehlerfälle

Frage: Was passiert, wenn "A" als Alter angegeben wird?
Antwort: Nix! Keine Fehlermeldung, etc. Stets selber überprüfen!

  • 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) { char pcName[255]; unsigned int uiAge; printf("Name: "); scanf("%s", &pcName);
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; }

ENDE

Empfohlene Aufgabe: Taschenrechner + Kassenbon?


Dateien

Ein und Ausgabe in Dateien: Schrittfolge zum Dateibearbeiten:

  1. Datei öffnen FILE fOpenedFile = fopen( FILE_PATH, MODE);
    • FILE_PATH = "/usr/share/.."
    • MODE = read, write oder
      • w+ (write+read) lesen und schreiben, Dateiinhalt wird dabei auf gelöscht
      • r+ (read+write) lesen und schreiben, Dateiinhalt bleibt erhalten
    • fOpenedFile muss ungleich NULL sein, wenn Datei geöffnet werden konnte
  2. Datei bearbeiten
    • Schreiben:
      • fprintf( fOpenedFile, FORMAT_STRING[, TYPES]*);
      • FORMAT_STRING und TYPES, wie bei printf!
    • Lesen:
      • fscanf( fOpenedFile, FORMAT_STRING[, &TYPES]*);
      • FORMAT_STRING und TYPES, wie bei scanf!
  3. Datei schließen (Sonst kann Windows die Datei nicht in anderen Programmen lesen ...)
    • fclose( fOpenedFile );

Frage: Wie lese ich die existierende /tmp/sample.txt ein?

#include <stdio.h>
int main(int argc, char **argv) { // Schritt 1: Öffnen FILE* pOpenendFile = fopen("/tmp/sample.txt", "r+"); if( NULL == pOpenendFile ) { printf("Konnte Datei nicht öffnen!\n"); return -1; }
// Schritt 2: Bearbeiten (lesen) char pcFileEntry[255]; if( 0 >= fscanf(pOpenendFile, "%s", &pcFileEntry) ) { printf("Konnte Datei nicht lesen!\n"); } else { printf("Inhalt gelesen: \"%s\"\n", pcFileEntry); }
// Schritt 2: Bearbeiten (schreiben) if( 0 == fprintf(pOpenendFile, "FileRead!\n") ) { printf("Inhalt der Datei konnte nicht verändert werden\n"); } else { printf("Datei wurde erfolgreich beschrieben!\n"); }
// Schritt 3: Datei Schließen fclose(pOpenendFile); }