Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
C Grundlagen
von Plapperkatze am 3.März 2006 um 23:03
zurück zur Kategorie "Tutorials"

Hallo Freunde,
ich kann leider nur sehr wenig von dem, was wichtig ist, hier erklären. Für manche wird es banal sein, für andere unverständlich, und ein paar leute werden auch meckern, dass etwas falsch formuliert ist. Das macht nichts. Das alles ist für eine Freundin, die C lernen möchte, und ich möchte ihr helfen.

Ich werde hier nur Konsolenanwendungen behandeln mit dem Einsprungspunkt main. Ich habe immer am besten aus Beispielen gelernt, deshalb werde ich lieber Code posten, als jeden Befehl zu erklären. Wenn ihr Fehler findet oder etwas unklar ist, kommentiert bitte unten.

Ich kompiliere mir bcb32 und renegade. Näheres dazu in folgenden Tutorials:
http://katze.dead-men.de/index.php?tutorial=2
http://katze.dead-men.de/index.php?tutorial=11

Ein/Ausgabe mit scanf und printf (Addition zweier Gleitkommazahlen)

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch

// einsprungspunkt
int main()
{
 // 2 Gleitkommazahlen als Variablen (64 bit)
 double d1,d2;
 // Ausgabe
 printf("Wert 1:");
 // Eingabe - Lesen eines double-Wertes (%lf) an die
 // Addresse von d1
 scanf("%lf",&d1);
 // Eingabepuffer löschen
 fflush(stdin);
 // Ausgabe
 printf("Wert 2:");
 // Eingabe - Lesen eines double-Wertes (%lf) an die
 // Addresse von d2
 scanf("%lf",&d2);
 // Eingabepuffer löschen
 fflush(stdin);
 // Addition und Ausgabe des Ergebnisses
 printf("%lf + %lf = %lf\n",d1,d2,d1+d2);
 // warten auf beliebige Taste
 getch();
 // Ende
 return 0;
}

for-Schleife

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch

int main()
{
 int i,zahl;

 // Ausgabe
 printf("Anzahl der Wiederholungen?\n");
 scanf("%d",&zahl); // von der tastatur einen integer lesen
 // Eingabepuffer löschen
 fflush(stdin);
 // Schleife von 1 bis zahl
 for(i=1;i<=zahl;i++)
 {
   printf("%2d. Schleifendurchlauf von %d, %d*%d=%d\n",i,zahl,i,i,i*i);
 }
 getch();
 return 0;
}

Es gibt mit for(;;) auch eine Endlosversion, die nur durch break; (oder return) verlassen werden kann. Hier noch ein Beispiel:
float f; // ein 32 bit Gleitkommawert
for(f=0;f<1;f+=0.01) // schleife mit schrittweite (step) 0.01
{
 printf("f ist jetzt %f\n",f);
}

while-Schleife

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch

int main()
{
 // 2 integer-vars
 int i=1,zahl;
 // Ausgabe
 printf("Anzahl der Wiederholungen?\n");
 scanf("%d",&zahl); // von der tastatur einen integer lesen
 // Eingabepuffer löschen
 fflush(stdin);
 while(i<=zahl) // Bedingung
 {
   printf("%2d. Schleifendurchlauf von %d, %d*%d=%d\n",i,zahl,i,i,i*i);
   i++; // entspricht i=i+1;
 }
 getch();
 return 0;
}

Zahlenraten mit if/else

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch
#include <stdlib.h>  // für rand (Zufallszahlen)

int main()
{
 // 2 integer-vars
 int loesung,zahl;
 do
 {
   int versuche=1;
   loesung=rand()%100+1;
   printf("Zahlenraten, ich habe ein Zahl zwischen 1 und 100\n");
   for(;;)
   {
     // Ausgabe
     printf("%dter Versuch?",versuche);
     scanf("%d",&zahl); // von der tastatur einen integer lesen
     // Eingabepuffer löschen
     fflush(stdin);
     if(zahl<loesung)printf("Meine Zahl ist groesser!\n");
     else if(zahl>loesung)printf("Meine Zahl ist kleiner!\n");
     else if(zahl==loesung)
     {
       printf("Richtig geraten mit %d Versuchen!\n",versuche);
       break;
     }

     versuche++;
   }
   printf("Noch einmal spielen? (j fuer ja)\n");
 }
 while(getch()=='j');
 return 0;
}

switch/case

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch

int main()
{
 char c; // ein ASCII "character", 1 byte gross
 printf("1,2 oder andere Taste.. (Ende mit Escape)\n");
 do
 {
   // Zeichen von Tastatur lesen
   c=getch();
   switch(c)
   {
     case '1':
       printf("Es wurde die 1 betätigt, ASCII-Wert: %d\n",c);
     break;
     case '2':
       printf("Es wurde die 2 betätigt, ASCII-Wert: %d\n",c);
     break;
     default:
       printf("Es wurde eine andere Taste betätigt, Zeichen: %c ASCII-Wert: %d\n",c,c);
     break;
   }
 }
 while(c!=27); // Abbruch bei Escape
 return 0;
}

Funktionen mit Rückgabewert (hier double)

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch

double division(double z,double n)
{
 // div durch 0 abfangen
 if(n==0)return 0;
 // ergebnis zurückgeben
 return z/n;
}

int main()
{
 double a=23,b=13;
 printf("%lf/%lf=%lf\n",a,b,division(a,b));
 getch();
 return 0;
}

Funktionen mit Zeigern (hier char *)

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch

void fill(char *c,int l)
{
 int i;
 for(i=0;i<l;i++)
 {
   c[i]='X';
 }
 return;
}

int main()
{
 char text[16]="plapperkatze";
 char *zeiger=text;
 printf("text ist jetzt: %s\n",text);
 fill(zeiger,7);
 printf("text ist jetzt: %s\n",text);
 getch();
 return 0;
}

Verschiedene Variablen lassen sich in structs zusammenfassen:

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch

struct Datensatz
{
 int ID;
 char *vorname;
 char *nachname;
};

void output(struct Datensatz ds)
{
 printf("%04d\t%s\t%s\n",ds.ID,ds.vorname,ds.nachname);
 return;
}

int main()
{
 struct Datensatz dat1 = {0,"Gundula","Tausendschoen"};
 struct Datensatz dat2 = {1,"Misan","Thropie"};
 struct Datensatz dat3;

 dat3.ID=2;
 dat3.vorname="Akira";
 dat3.nachname="Chromosomski";

 output(dat1);
 output(dat2);
 output(dat3);

 getch();
 return 0;
}

Zeiger und Adressen

char c = 'a' ;
char* p = &c ;  // p enthält die Adresse von c
char c2 = *p ;   // c2 = a, also der Wert der Variablen c


Speicher allokieren (reservieren)

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch
#include <stdlib.h> // für malloc
#include <mem.h>   // für memset

int main()
{  
 // zeiger auf addresse im speicher
 char *text;
 // 2 integer, size ist groesse des zu reserv. speichers
 int i,size=1024;
 // speicher reservieren
 text=(char *)malloc(size);
 // speicher auf X setzen
 memset(text,'X',size);
 // ausgabe
 for(i=0;i<size;i++)
 {
   printf("%c",text[i]);
 }
 // speicher freigeben
 free(text);
 // wait 4 key
 getch();
 // ende
 return 0;
}

Dezimal/Binär-Konversion

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch
#include <string.h> // für strlen (ermittelt Laenge einer Zeichenkette)

// hilfsfunktion - errechnet base hoch exp
int fct(int base,int exp)
{
 int i,j=1;
 for(i=0;i<exp;i++)
 {
   j*=base;
 }
 return j;
}

int main()
{
 char c;
 int bytes=sizeof(int);  
 for(;;)
 {
   printf("1 DEC -> BIN\n");
   printf("2 BIN -> DEC\n");
   printf("ESC - ENDE\n");
   c=getch();
   if(c=='1')
   {
     int k,i,z;
     printf("Dezimalzahl? ");
     scanf("%d",&z);
     fflush(stdin);
     printf("hex: %x\n",z);
     printf("binary: ");      
     for(i=bytes*8-1;i>=0;i--)
     {
       k=fct(2,i);
       if(z>=k)
       {
         z-=k;
         printf("1");
       }
       else
       {
         printf("0");
       }
     }
     printf("\n");
   }
   else if(c=='2')
   {
     char bin[33];
     int k=0;
     unsigned int i;
     printf("Binaerwert (zB 11001)? ");      
     scanf("%s",bin);
     fflush(stdin);
     for(i=0;i<strlen(bin);i++)
     {
       if(bin[strlen(bin)-i-1]=='1')
       {
         k+=fct(2,i);
       }
     }
     printf("hex: %x\n",k);
     printf("dezimal: %d\n",k);
   }  
   else if(c==27)
   {
     break;
   }    
 }
 return 0;
}

Datei-Ein/Ausgabe

#include <stdio.h>  // für scanf und printf
#include <conio.h>  // für getch
#include <stdlib.h> // für malloc

int main()
{  
 FILE *file;
 char *text,*filename="C:\\autoexec.bat";
 long i,size;
 file=fopen(filename,"rb");
 if(file==NULL) // oder if(!file) ginge auch
 {
   printf("Fehler beim oeffnen von %s",filename);
   return 0;
 }
 // dateiende suchen
 fseek (file,0,SEEK_END);
 // größe bestimmen
 size=ftell(file);
 // zeiger wieder auf dateianfang setzen
 rewind(file);

 // speicher reservieren
 text=(char *)malloc(size);
 // datei laden
 fread(text,1,size,file);
 // ausgabe
 for(i=0;i<size;i++)
 {
   printf("%c",text[i]);
 }
 // speicher freigeben
 fclose(file);
 free(text);
 // wait 4 key
 getch();
 // ende
 return 0;
}

PI berechnen

#include <stdio.h> // printf
#include <math.h>  // pow
#include <conio.h> // getch

int main ()
{
 unsigned int i;
 double t1,t2,end=0;

 for (i=0;i<128000;i++)
 {
   t1=1/(2*(double)i+1);
   t2=pow(-1,i);
   end=end+4*t2*t1;
 }
 printf("PI: %lf",end);
 getch();
 return 0;
}

Zeichenkette (Satz) lesen und rückwärts ausgeben

#include <stdio.h>  // für scanf und printf
#include <string.h> // für strlen
#include <conio.h>  // für getch

int main()
{
 int i=0;
 char eingabe[256]; // 256 buchstaben - speicherplätze reserviert
 printf("Zeichenkette eingeben:\n");
 while((eingabe[i]=getch())!=13&&i<254)
 {
   printf("%c",eingabe[i]);
   i=i+1;
 }
 printf("\n");
 // rueckwaerts ausgeben
 for(i=strlen(eingabe)-1;i>=0;i--)
 {
   printf("%c",eingabe[i]);
 }
 getch();
 return;
}

Ich denke das reicht fürs erste. More coming s00n ;)

gruesse, die plapperkatz

zurück zur Kategorie "Tutorials"
[0 Kommentare]

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 215314 Besucher seit dem 23.01.2012 Login