C-Programmierung: Unterschied zwischen den Versionen
Flinh1 (Diskussion | Beiträge) (→Troubleshooting) |
Flinh1 (Diskussion | Beiträge) |
||
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | + | <div align="right"><big>'''[https://flinkwiki.de/index.php?title=Kategorie:Alle_Seiten Seitenübersicht]'''</big></div> | |
− | <div align="right">'''[ | ||
<div align="right">'''[[C-Sharp-Programmierung|Zur Seite "C-Sharp-Programmierung"]]'''</div> | <div align="right">'''[[C-Sharp-Programmierung|Zur Seite "C-Sharp-Programmierung"]]'''</div> | ||
<div align="right">'''[[Programmierung|Zur Seite "Programmierung"]]'''</div> | <div align="right">'''[[Programmierung|Zur Seite "Programmierung"]]'''</div> | ||
Zeile 1.605: | Zeile 1.604: | ||
− | [[Kategorie: Alle Seiten]] | [[Kategorie: Programmierung | + | [[Kategorie: Alle Seiten]] | [[Kategorie: Programmierung]] |
Aktuelle Version vom 15. August 2020, 20:51 Uhr
Inhaltsverzeichnis
- 1 Compiler
- 2 Ausdrücke und Operatoren
- 3 Kontrollstrukturen
- 4 Beispiele
- 5 Arrays
- 6 Zeiger / Pointer
- 7 Strukturen
- 8 Schreiben/Lesen in Dateien
- 9 Syntax
- 10 MinGW
- 11 Troubleshooting
- 12 Quellen
Compiler
Unter Visual Studio sollte man folgendes Grundgerüst für C-Quelltexte verwenden:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main(void) { setlocale(LC_ALL, "german"); ... system("PAUSE"); }
Ausdrücke und Operatoren
https://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren
Programm mit arithmetischen Operatoren:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> void dez2bin_positiv(int zahl, char* array36) { //Abschluss der Zeichenkette = '\0' array36[35] = '\0'; for (int i = 34; i >= 0; i--) { if (i == 8 || i == 17 || i == 26) { array36[i] = ' '; } else { array36[i] = (zahl % 2) ? '1' : '0'; zahl = zahl / 2; } } } void zweierkomplemen(char* array36) { int pos = 0; for (int i = 34; i >= 0; i--) { if (i == 8 || i == 17 || i == 26) { array36[i] = ' '; } else { if (array36[i] == '0' && pos == 0) continue; if (array36[i] == '1' && pos == 0) { pos = 1; continue; } array36[i] = (array36[i] == '1') ? '0' : '1'; } } } void dez2bin(int zahl) { //Array für 32-Bit-Zahl //mit Leerzeichen nach 8 Bit und '\0' am Ende char d2b[36]; int AZahl = zahl; //Zahl retten //Zahl binär darstellen if (zahl >= 0) { dez2bin_positiv(zahl, d2b); } else { //Zahl in positive Zahl umwandeln binär darstellen dez2bin_positiv(-zahl, d2b); //In negatibe Zahl binär umwandeln zweierkomplemen(d2b); } // Ausgabe der Zeichenkette printf("Zahl = %11i d = %s b\n", AZahl, d2b); } void und(void) { int zahl1, zahl2, erg; printf("Zahl_1 = "); scanf("%i",&zahl1); printf("Zahl_2 = "); scanf("%i", &zahl2); erg = zahl1 & zahl2; dez2bin(zahl1); printf(" AND\n"); dez2bin(zahl2); printf("--------------------------------------------------------------\n"); dez2bin(erg); } void oder(void) { int zahl1, zahl2, erg; printf("Zahl_1 = "); scanf("%i",&zahl1); printf("Zahl_2 = "); scanf("%i", &zahl2); erg = zahl1 | zahl2; dez2bin(zahl1); printf(" OR\n"); dez2bin(zahl2); printf("--------------------------------------------------------------\n"); dez2bin(erg); } void x_oder(void) { int zahl1, zahl2, erg; printf("Zahl_1 = "); scanf("%i",&zahl1); printf("Zahl_2 = "); scanf("%i", &zahl2); erg = zahl1 ^ zahl2; dez2bin(zahl1); printf(" XOR\n"); dez2bin(zahl2); printf("--------------------------------------------------------------\n"); dez2bin(erg); } void nicht(void) { int zahl1, erg; printf("Zahl_1 = "); scanf("%i",&zahl1); //printf("Zahl_2 = "); //scanf("%i", &zahl2); erg = ~zahl1; dez2bin(zahl1); printf(" NOT\n"); //dez2bin(zahl2); printf("--------------------------------------------------------------\n"); dez2bin(erg); } int main(void) { setlocale(LC_ALL, "german"); char oper; do { printf("Welcher Operator soll verwendet werden?\n"); printf("a = AND\no = OR\nx = XOR\nn = NOT\n"); printf("Ihre Auswahl: "); rewind(stdin); scanf("%c", &oper); } while (oper != 'a' && oper != 'o' && oper != 'x' && oper != 'n'); switch (oper) { case 'a': und(); break; case 'o': oder(); break; case 'x': x_oder(); break; case 'n': nicht(); break; default: printf("Operation nicht möglich\n"); break; } }
Kontrollstrukturen
for-Schleife versus while-Schleife
Jede for-Schleife lässt sich durch eine while-Schleife formulieren und umgekehrt:
for-Schleife | entsprechende while-Schleife |
for (ausdruck1; ausdruck2; ausdruck3) Schleifenanweisung |
ausdruck1; while(ausdruck2) { Schleifenanweisung; ausdruck3; } |
Folgende Anweisungen sind also gleichbedeutend:
#include <stdio.h> #include <stdlib.h> int main(void){ int ival = 0; int sum = 0; while(ival <= 5){ if(ival % 2) sum += ival; ival++;} printf("sum = %d\n", sum); return 0; }
und
#include <stdio.h> #include <stdlib.h> int main(void){ int ival = 0; int sum = 0; for(ival= 0;ival <= 5;ival++){ if(ival % 2) sum += ival; } printf("sum = %d\n", sum); return 0; }
while-Schleife (kopfgesteuerte Schleife
#include <stdio.h> #include <stdlib.h> int main(void){ long c = 2; printf("N \tN^2 \tN^3 \n"); while (c <= 1024) { printf("%ld", c); printf("%c", '\t'); printf("%ld", (c*c)); printf("%c", '\t'); printf("%ld", c*c*c); printf("\n"); c *= 2; } printf("\n"); return 0; }
for-Schleife (Zählschleife)
Hier wird die gleiche Ausgabe produziert wie mit obiger while-Schleife:
#include <stdio.h> #include <stdlib.h> int main(void) { long c; printf("N \tN^2 \tN^3 \n"); for(c = 2; c <= 1024; c *= 2) { printf("%ld", c); printf("%c", '\t'); printf("%ld", (c*c)); printf("%c", '\t'); printf("%ld", c*c*c); printf("\n"); } printf("\n"); return 0; }
for-Schleife mit Komma-Operator
#include <stdio.h> #include <stdlib.h> int main(void){ for (int i = 0, j = 10; i < j; i++, j--) { printf("i = %i, j= %i\n", i, j); } //printf("\n"); return 0; }
Geschachtelte for-Schleife
#include <stdio.h> #include <stdlib.h> int main(void){ for (int i = 1; i < 5; i++) for (int j = 1; j < 5; j++) printf("%d * %d = %d\n", i, j, i * j); } //printf("\n"); return 0; }
Beispiele
Beispiel 01: printf
/* Datei: hello.c */ /*Dies ist ein Kommentar*/ /* Das Programm liegt in der Quelldatei hello.c*/ #include <stdio.h> int main(void) { printf ("Hello, world!\n"); return 0; /*Bitte jetzt überlesen!*/ }
Übergabe der Argumente argc, arg[v]:
#include<stdio.h> int main(int argc, char* argv[]) { int i; printf("argc: %d\n", argc); for(i=0; i < argc; i++) { printf("argv[%d]: %s\n", i, argv[i]); } return 0; }
Das erzeugte Programm produziert (unter Linux) folgende Ausgabe:
argc: 3 argv[0]: ./a.out argv[1]: string1 argv[2]: string2
Beispiel 02: puts, scanf, if
/* Jedes Programm sollte mit einem Kommentar beginnen */ #include <stdio.h> int main () { int stapel; puts("Geben Sie die Anzahl an Spielen ein:"); scanf("%i", &stapel); if (stapel < 1) { puts ("Keine gültige Anzahl an Spielen!"); return 1; } printf("Es gibt %i Karten\n", (stapel * 52)); return 0; }
getchar - putchar
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> int main() { setlocale(LC_ALL, "german"); //DEKLARATION char c; //while ((c = getchar()) != '.') //{ // putchar(c); //} // CR = 10 //int CR_LF = 10; //while ((c = getchar()) != CR_LF) //{ // putchar(c); //} //char str_1[10] = "Adam"; char vorname[20]; int CR_LF = 10; printf("Vorname: "); //if (scanf("%19s", vorname) != 1){ // printf("Eingabefehler\n"); // return 1; //} //printf("Vorname: %s\n",vorname); //int i; //while ((c = getchar()) != CR_LF) //{ // vorname[i] = c; // putchar(c); // i++; //} //vorname[i] = '\0'; int i; for (i = 0; (c = getchar()) != CR_LF; i++) { vorname[i] = c; putchar(c); } vorname[i] = '\0'; printf("\n"); for (i = 0; vorname[i] != '\0'; i++) { printf("%c", vorname[i]); } printf("\n"); system("PAUSE"); }
Rückgabewert von scanf checken
/* scanf6.c */ #include <stdio.h> int main(void) { char a; int b, check; printf("Bitte Eingabe machen (Zeichen/Zahl): "); check = scanf("%c %d",&a, &b); printf("check = %d \n",check); return 0; }
Vokale tauschen
Version mit switch - case
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main(void) { setlocale(LC_ALL, "german"); char Vokale[] = "aeiouäöü"; char Text[] = "Drei Chinesen mit dem Kontrabass."; int l_v = strlen(Vokale); int l_t = strlen(Text); for (int j = 0; j < l_v; j++) { for (int i = 0; i < l_t; i++) { switch (Text[i]){ case 'a': Text[i] = Vokale[j]; case 'e': Text[i] = Vokale[j]; case 'i': Text[i] = Vokale[j]; case 'o': Text[i] = Vokale[j]; case 'u': Text[i] = Vokale[j]; case 'ä': Text[i] = Vokale[j]; case 'ö': Text[i] = Vokale[j]; case 'ü': Text[i] = Vokale[j]; } } printf("%s\n", Text); } // system("PAUSE"); }
Version mit if
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <string.h> void main(void) { setlocale(LC_ALL, "german"); char Vokale[] = "aeiou"; int l_v = strlen(Vokale); char Text[] = "Drei Chinesen mit dem Kontrabass."; int l_t = strlen(Text); //int j = 0; for (int i = 0; i < l_v; i++){ for (int j = 0; j < l_t; j++) { if (Text[j] == 'a' || Text[j] == 'e' || Text[j] == 'i' || Text[j] == 'o' || Text[j] == 'u') { Text[j] = Vokale[i]; } } printf("%s\n", Text); } system("PAUSE"); }
Rechenbeispiele
Fakultät
Fußgesteuerte Schleife do - while mit Dekrementierung:
//stdio.h - Bibliothek mit Funktionen für Ein- und Ausgabe #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //Garantiert die Ausgabe der deutschen Zeichen #include <locale.h> // Start des Programms mit main() //void - kein Eingabe oder Rückgabewert für BS void main(void) { setlocale(LC_ALL,"German"); //Garantiert die Ausgabe der deutschen Zeichen //DEKLARATION und INITIALISIERUNG int F; //Fakultät-Zahl int Ergebnis = 1; int rf; //Rettungsvariable //Auffoderung zur Eingabe printf("Geben Sie die positive Integer-Zahl ein: "); //Eingabe der Zahl mit scanf() //%i integer-Wert als Eingabe erwartet //&F - Adresse der Variable F scanf("%i",&F); rf = F; //Eigabe retten //Jetzt folgt die Fußgestuerte Schleife do { //Teilberechnung des Ergebnises Ergebnis = Ergebnis * F; F--; //F = F - 1 heßt F dekrementieren } while ( F > 0 ); // Ausgabe des Ergebnises printf("Fakultät von %i beträgt %i.\n\n",rf,Ergebnis); }
Funktion "Fakultät" in einem Programm für Lottozahlen mit for-Schleife und Inkrementierung:
/* bspl0034.c */ #include <stdio.h> double fakultaet(int zahl) { int i; double ergebnis=1.0; for(i=1; i <= zahl; i++) ergebnis*=i; return(ergebnis); } main() { double ergebnis; ergebnis=fakultaet(49)/(fakultaet(43)*fakultaet(6)); printf("\nDie Anzahl der moeglichen Kombinationen "); printf("im Lotto 6 aus 49 ist %.0f \n",ergebnis); }
Taschenrechner
// kap010/listing010.c #include <stdio.h> #include <stdlib.h> double addition( double x, double y ) { return (x + y); } double subtraktion( double x, double y ) { return (x - y); } double multiplikation( double x, double y ) { return (x * y); } double division( double x, double y ) { return (x / y); } double (*fptr[4])(double d1, double d2) = { addition, subtraktion, multiplikation, division }; int main(void) { double v1=0.0, v2=0.0; int operator=-1; printf("Zahl1 :-> "); if( scanf("%lf", &v1) != 1 ) { printf("Fehler bei der Eingabe\n"); return EXIT_FAILURE; } printf("Zahl2 :-> "); if( scanf("%lf", &v2) != 1 ) { printf("Fehler bei der Eingabe\n"); return EXIT_FAILURE; } printf("Welcher Operator soll verwendet werden?\n"); printf("0 = +\n1 = -\n2 = *\n3 = /\n"); printf("Ihre Auswahl: "); if( scanf("%d", &operator) != 1 ) { printf("Fehler bei der Eingabe\n"); return EXIT_FAILURE; } if( ! (operator >= 0 && operator <= 3) ) { printf("Fehler beim Operator\n"); return EXIT_FAILURE; } printf("Ergebnis: %lf\n", fptr[operator](v1, v2)); return EXIT_SUCCESS; }
Euklid'scher Algorithmus (while-Schleife)
#include <stdio.h> int main (void) { int x = 24; int y = 9; while (x != y) { if (x < y) y = y - x; else x = x - y; } printf ("Der größte gemeinsame Teiler ist: %d\n", x); return 0; }
... mit Abfrage von Zähler und Nenner:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <locale.h> #include <stdlib.h> int main(void) { setlocale(LC_ALL, "German"); //Initialisierung setlocale(LC_ALL, "German"); //DEKLARATION: int Zaehler, Z, Nenner, N; //AUSGABE: printf("Geben Sie Zähler ein: "); do { //EINGABE: scanf("%i", &Zaehler); } while (Zaehler == 0); printf("Geben Sie Nenner ein: "); do { scanf("%i", &Nenner); } while (Nenner == 0); //Zaehler und Nenner retten Z = Zaehler; N = Nenner; //Betrag von Z und N Z = Z >= 0 ? Z : -Z; N = N >= 0 ? N : -N; while (Z != N) { if (Z > N) Z = Z - N; else N = N - Z; } // AUSGABE: printf("ggT von %i und %i ist %i.\n\n", Zaehler, Nenner, Z); system("PAUSE"); return 0; }
Zufallszahlen
Zufallszahl würfeln:
#include <stdio.h> #include <stdlib.h> #include <time.h> void main(void) { int i; time_t t; time(&t); srand((unsigned int)t); /* Zufallsgenerator initialisieren */ for ( i=0; i<20; i++ ) printf("%d ", rand() % 6 + 1); /* Wuerfeln */ printf("\n"); }
Die Verwendung von Datum/Uhrzeit zur Initialisierung des Generators führt dazu, dass die erzeugte Zahlenfolge "zufällig" wird.[1]
Primzahlen
#include <stdio.h> main() { int n, c; printf("Enter a number\n"); scanf("%d", &n); if ( n == 2 ) printf("Prime number.\n"); else { for ( c = 2 ; c <= n - 1 ; c++ ) { if ( n % c == 0 ) break; } if ( c != n ) printf("Not prime.\n"); else printf("Prime number.\n"); } return 0; }
Sieb des Eratosthenes
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define max_prim 999 bool pr_feld[(max_prim + 1)]; //Array der zu überprüfenden Zahlen int main(void) { for (int i = 0; i <= max_prim; i++) { pr_feld[i] = false; } //Sieb des Eratosthenes for (int i = 2; i <= max_prim; i++) { if (!pr_feld[i]) { printf("%4d\t", i); for (int j = 1; (j*i) <= max_prim; ++j) { if ((j*i) <= max_prim) pr_feld[(j*i)] = true; } } } printf("beliebige Taste zum Beenden druecken..."); getchar(); return EXIT_SUCCESS; }
Binärzahlen
Ausgabe mit for
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main(void) { setlocale(LC_ALL, "german"); //Array für 32-Bit-Zahl char Arr32Bit[33]; Arr32Bit[32] = '\0'; int Zahl = 17; int AZahl = Zahl; //Zahl retten //Schleife erstellt einzelne Bits(0,1) und //wandelt die in ASCII-Zeichen ('0','1') durch //Addition von 48 (ASCII-Wert für '0') for (int i = 31; i >= 0; i--) { Arr32Bit[i] = (Zahl % 2) + '0'; Zahl = Zahl / 2; } // Ausgabe der Zeichenkette printf("Zahl = %i d = %s b\n", AZahl, Arr32Bit); printf("-----------------------------\n"); Zahl = AZahl; //Zahl neu setzen int i_Arr32Bit[32]; // Diese Schleife berechnet nur Bits (0,1) for (int i = 31; i >= 0; i--) { i_Arr32Bit[i] = Zahl % 2; Zahl = Zahl / 2; } printf("Zahl = %i d = ", AZahl); //Ausgabe von 0 oder 1 (Integer) erfolgt über Schleife for (int i = 0; i < 32; i++) { printf("%i",i_Arr32Bit[i]); //nach jede 8 Bits wird ein Leerzeichen ausgegeben if (i % 8 == 7) { printf(" "); } } printf(" b\n"); system("PAUSE"); }
Version mit Eingabe der Zahl und Bit-Gruppierung
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main(void) { setlocale(LC_ALL, "german"); printf("Geben Sie die Dezimalzahl ein: "); int Zahl; scanf("%i", &Zahl); //Array für 32-Bit-Zahl //mit Leerzeichen nach 8 Bit und '\0' am Ende char d2b[36]; int AZahl = Zahl; //Zahl retten d2b[35] = '\0'; for (int i = 34; i >= 0; i--) { if (i == 8 || i == 17 || i == 26) { d2b[i] = ' '; } else { d2b[i] = (Zahl % 2) ? '1' : '0'; Zahl = Zahl / 2; } } // Ausgabe der Zeichenkette printf("Zahl = %i d = %s b\n", AZahl, d2b); system("PAUSE"); }
Arrays
Länge des Arrays
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> void main() { setlocale(LC_ALL, "german"); //DEKLARATION int TAB[] = {2,4,3,6,5,7,8,2,7,2,3,4,5,6,8,9,9,0,1}; int laenge; laenge = sizeof(TAB)/sizeof(int); printf("Länge der Tabelle TAB %d\n", laenge); system("PAUSE"); }
Strings verändern
Hier werden deutsche Sonderzeichen umschrieben (Umlaute, ß):
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <time.h> #include <string.h> int main() { setlocale(LC_ALL, "german"); //DEKLARATION char quelle[] = "Die süße Hündin aus Österreich läuft in die Höhle des Bären."; char ziel[1000]; //length - Länge der Zeichenkette incl. '\0' int length = sizeof(quelle) / sizeof(char); for (int i = 0, j = 0; i < length; i++, j++) { switch (quelle[i]) { case 'Ü': ziel[j++] = 'U'; ziel[j] = 'e'; break; case 'ü': ziel[j++] = 'u'; ziel[j] = 'e'; break; case 'Ö': ziel[j++] = 'O'; ziel[j] = 'e'; break; case 'ö': ziel[j++] = 'o'; ziel[j] = 'e'; break; case 'Ä': ziel[j++] = 'A'; ziel[j] = 'e'; break; case 'ä': ziel[j++] = 'a'; ziel[j] = 'e'; break; case 'ß': ziel[j++] = 's'; ziel[j] = 's'; break; default: ziel[j] = quelle[i]; break; } } printf("%s\n", ziel); printf("\n"); }
Bubble Sort
https://de.wikipedia.org/wiki/Bubblesort
Bubblesort mit for
1. Variante:
#include <stdio.h> #define SIZE 6 int main() { int bubble[] = { 95, 60, 6, 87, 50, 24 }; int inner,outer,temp,x; /* Stellt Original-Array dar */ puts("Original Array:"); for(x=0;x<SIZE;x++) printf("%d\t",bubble[x]); putchar('\n'); /* Bubblesort */ for(outer=0;outer<SIZE-1;outer++) { for(inner=outer+1;inner<SIZE;inner++) { if(bubble[outer] > bubble[inner]) { temp=bubble[outer]; bubble[outer] = bubble[inner]; bubble[inner] = temp; } } } /* Stellt sortiertes Array dar */ puts("Sorted Array:"); for(x=0;x<SIZE;x++) printf("%d\t",bubble[x]); putchar('\n'); return(0); }
2. Variante:
/**************************************************** * "Eine praktische Einfüehrung in C" * * von Doina Logofatu, entwickler-press, 2008 * * Copyright Doina Logofatu & entwickler-press.de * * www.algorithmen-und-problemloesungen.de * *****************************************************/ #include <stdio.h> int main(){ int i, j, n, a[100], aux; printf("Wie viele Zahlen? "); scanf("%d", &n); printf("Die Zahlen:\n"); for(i=0; i<n; i++) scanf("%d", &a[i]); for(i=0; i<n-1; i++) for(j=i+1; j<n; j++) if(a[i]>a[j]) {aux=a[i]; a[i]=a[j]; a[j]=aux;} printf("\nAusgabe:\n"); for(i=0; i<n; i++) printf(" %d ", a[i]); return 0; }
Bubblesort mit while
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> void tausche(int *a,int *b) { int hilfe; hilfe = *a; *a = *b; *b = hilfe; } int main() { setlocale(LC_ALL, "german"); //DEKLARATION und INITIALISIERUNG: int Tabelle[10] = {2, 3, -6, 1, 8, -7, 9, 3, 1, 0}; int laenge = 10; int tauschenJaNein = 1; int j = 1; //Ausgabe:Tabelle unsortiert for (int i = 0; i < laenge; i++) { printf("%i ", Tabelle[i]); } printf("\n"); while (tauschenJaNein == 1) { tauschenJaNein = 0; for (int i = 0; i < laenge - j; i++) { if (Tabelle[i] > Tabelle[i + 1]) { tausche(&Tabelle[i], &Tabelle[i + 1]); tauschenJaNein = 1; } } j++; } for (int i = 0; i < laenge; i++) { printf("%i ", Tabelle[i]); } printf("\n"); system("PAUSE"); }
Mehrdimensionale Arrays
Zweidimensionale Arrays an Funktionen übergeben
// kap009/listing006-md.c #include <stdio.h> #include <stdlib.h> #define WOCHE 2 #define TAGE 7 void durchschnitt( int arr[][TAGE] ) { int durchs=0; for( int i=0; i < WOCHE; i++) { for( int j=0; j < TAGE; j++) { durchs+=arr[i][j]; } } printf("Besucher in %d Tagen\n", WOCHE*TAGE); printf("Gesamt : %d\n", durchs); printf("Tagesschnitt: %d\n", durchs /(WOCHE*TAGE)); } int main(void) { int besucher[WOCHE][TAGE]; printf("Besucherzahlen eingeben\n\n"); for(int i=0; i < WOCHE; i++) { for(int j=0; j < TAGE; j++) { printf("Woche %d, Tag %d: ", i+1, j+1); if( scanf("%d", &besucher[i][j]) != 1 ) { printf("Fehler bei der Eingabe\n"); return EXIT_FAILURE; } } } durchschnitt( besucher ); return EXIT_SUCCESS; }
Zeiger / Pointer
Zeiger als Rückgabewert
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <locale.h> int* ifget(void) { static int puffer[5]; for (int i = 0; i<5; i++) { printf("Wert %d : ", i + 1); if (scanf("%d", &puffer[i]) != 1) { printf("Fehler bei der Eingabe\n"); return EXIT_SUCCESS; } } return puffer; } void main() { setlocale(LC_ALL, "german"); //DEKLARATION int Index; int* iptr = ifget(); printf("Folgende Werte wurden eingelesen\n"); for (int i = 0; i < 5; i++) { printf("%d : %d\n", i + 1, *(iptr + i)); } printf("-----------------\n"); printf("Welche Position (0 bis 4) möchten Sie ändern? "); scanf("%d",&Index); printf("Geben Sie den Wert ein: "); scanf("%d", &iptr[Index]); for (int i = 0; i < 5; i++) { printf("%d : %d\n", i + 1, *(iptr + i)); } system("PAUSE"); }
Zugriff auf Arrayelemente über Zeiger
// kap010/listing006.c #include <stdio.h> #include <stdlib.h> #define MAX 5 int main(void) { int iarr[MAX] = { 12, 34, 56, 78, 90 }; int *iptr = NULL; // iptr zeigt auf das erste Element von iarr iptr = iarr; printf("iarr[0] = %d\n", *iptr); printf("iarr[2] = %d\n", *(iptr+2)); *(iptr+4) = 66; // iarr[4] = 66 *iptr = 99; // iarr[0] = 99 // Alle auf einmal durchlaufen (2 Möglichkeiten) int *iptr2 = iarr; // iptr2 auf den Anfang von iarr for(int i=0; i < MAX; i++, iptr2++) { printf("iarr[%d] = %d /", i, *(iptr+i)); printf(" %d\n", *iptr2); // so geht es auch } return EXIT_SUCCESS; }
Array und Zeiger als Funktionsparameter
// kap010/listing007.c #include <stdio.h> #include <stdlib.h> void modArr(int *arr, size_t s) { for(size_t i=0; i<s; ++i) { arr[i]*=2; } } void printArr(const int *arr, size_t s) { for(size_t i=0; i<s; ++i) { printf("%d \n", arr[i]); } printf("\n"); } int main(void) { int iarr[] = { 11, 22, 33, 44, 55 }; modArr(iarr, sizeof(iarr)/sizeof(int)); printArr(iarr, sizeof(iarr)/sizeof(int)); return EXIT_SUCCESS; }
Strukturen
//Übersetzt mit C++-Compiler #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> //typedef struct Person typedef struct Person { char Nachname[50]; char Vorname[30]; double Groesse; double Gehalt; int Kinder_Anzahl; } Per; //Globale Strukturvariablen - //werden mit default Werten initialisiert void Gross(Per per) { printf("%s \t%1.2lf\n",per.Nachname,per.Groesse); } void NameGehaltKinder(Per per) { Per *per_ptr = &per; printf("%s \t%.2lf \t%i\n", per_ptr->Nachname, per_ptr->Gehalt, per_ptr->Kinder_Anzahl); } int main(void) { setlocale(LC_ALL, "german"); Per Maier = { //Lokale Strukturvariable - //wird mit default Werten nicht initialisiert "Maier", "Max", 1.82, 3050.30, 2 }; Person Glocke = { "Glocke", "Jens",1.77,2500.40,3 }; Gross(Glocke); Gross(Maier); NameGehaltKinder(Glocke); NameGehaltKinder(Maier); system("PAUSE"); }
Schreiben/Lesen in Dateien
fopen, fprintf, fclose
#include <stdio.h> int main() { /* Deklaration eines Dateizeigers */ FILE *fp; double preisFeld[3] = {1.25, 10.7, 1.15}; int index; /* Datei öffnen zum Schreiben, mit Prüfung */ fp = fopen("datei.txt", "w"); if(fp == NULL) { printf("Dateifehler\n"); return 1; } /* double-Werte in Datei schreiben */ for(index = 0; index < 3; index++) fprintf(fp, "%.2f ", preisFeld[index]); /* Datei schließen */ fclose(fp); return 0; }
Modus für »fopen()«
Syntax
Kurzformen für Zuweisungsoperatoren
- Zahl += 2; == == > Zahl = Zahl + 2;
- Zahl -= 2; == == > Zahl = Zahl - 2;
- Zahl *= 2; == == > Zahl = Zahl * 2;
- Zahl /= 2; == == > Zahl = Zahl / 2;
- Zahl %= 2; == == > Zahl = Zahl % 2;
Tauschen
temp = op1; op1 = op2; op2 = temp;
bzw. als Funktion:
void tausche(int *a,int *b) { int hilfe; hilfe = *a; *a = *b; *b = hilfe;
reverse
int main() { int n, reverse = 0; printf("Enter a number to reverse\n"); scanf("%d", &n); while (n != 0) { reverse = reverse * 10; reverse = reverse + n%10; n = n/10; } printf("Reverse of entered number is = %d\n", reverse); return 0; }
MinGW
Minimalist GNU for Windows
Damit der gcc-Compiler in allen Verzeichnissen ausgeführt werden kann, muss der Pfad mit den ausführbaren Dateien von MinGW (z. B. C:\MinGW\bin) der Umgebungsvariablen path hinzugefügt werden:
- Strg-x > System > Computerschutz > Reiter "Erweitert" > Umgebungsvariablen
Beim Compilieren werden die temporären Dateien wieder gelöscht. Wenn diese bestehen bleiben sollen, verwendet man die Option -save-temps
: gcc hello.c -save-temps -o hello.
Troubleshooting
Beim Compilieren mit
gcc test.c -o test
erscheint die Meldung
Nicht definierter Verweis auf `sqrt'
obwohl #include <math.h>
im Kopf der Quelle steht.
Die Verlinkung zu math.h wird mit der Option -lm
hergestellt.
gcc test.c -lm -o test