CKurs - Aufgaben zu C

Google

1.Zeiger bzw. Pointer in C

Aufgabenstellung:

Testen und verstehen Sie folgendes C-Programm:

CCode:

#include <stdio.h>

      int main(void)
      {
            int *p, q;
            float *fp, **fpp, val;
            char s[] = "Eine Zeichenkette!"; // bzw. char *s = "Eine Zeichenkette!";
     
            // Zeiger auf Integer
            p = &q;
            q = 1;
            printf("%p ", p);
            (*p)++;
            printf("%d %p\n", q, p);
            *p+=1;
            printf("%d %p\n", q, p);
     
            // Zeiger auf Zeiger
            fp = &val;
            fpp = &fp;
            **fpp = 203.807;
            printf("%f %f\n", val, **fpp);

            return 0;
      }

Lösung:

Modifiziert man das Programm leicht, sodass alle aktuellen Variablen ausgegeben werden

CCode:

#include <stdio.h>

int
main()
{
int *p, q;
float *fp, **fpp, val;
char s[] = "Eine Zeichenkette"; // bzw. char *s = "Eine Zeichenkette!";
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
printf("--Programmbeginn--\nDefiniere p als die Adresse von q:");
p = &q; // Zeiger auf Integer
printf("q=%d p=%p (q wurde aber noch nicht initialisisert!)\n", q, p);
q = 1; printf("q=%d p=%p (q wurde jetzt der Wert 1 zugewiesen)\n", q, p);
(*p)++;printf("Zähle den Inhalt von p 1 hoch: q=%d p=%p \n", q, p);
*p+=1;printf("Weise dem Inhalt von p den um 1 erhöten wert vom Inhalt von p zu: q=%d p=%p \n", q, p);
// Zeiger auf Zeiger
fp = &val; printf("Definiere fp als die Adresse von val: val=%f fp=%p \n", val, fp);
fpp = &fp; printf("Definiere fpp als die Adresse von fp: val=%f fp=%p fpp=%p\n", val, fp,fpp);
**fpp = 203.807; printf("Definiere den Inhalt vom Inhalt von fpp als 203.807: val=%f fp=%p fpp=%p\n", val, fp,fpp);
printf("--Ende--");
return 0;
}

so erhält man:

Ausgabe stdout:

--Programmbeginn--
Definiere p als die Adresse von q:q=-1670453088 p=0012FED8 (q wurde aber noch nicht initialisisert!)
q=1 p=0012FED8 (q wurde jetzt der Wert 1 zugewiesen)
Zähle den Inhalt von p 1 hoch: q=2 p=0012FED8
Weise dem Inhalt von p den um 1 erhöten wert vom Inhalt von p zu: q=3 p=0012FED8
Definiere fp als die Adresse von val: val=0.000000 fp=0012FEE0
Definiere fpp als die Adresse von fp: val=0.000000 fp=0012FEE0 fpp=0012FEDC
Definiere den Inhalt vom Inhalt von fpp als 203.807: val=203.807007 fp=0012FEE0 fpp=0012FEDC
--Ende--

 



2.Aufgabe Pointer als Funktionesparameter

Aufgabenstellung:

   Schreiben Sie eine Funktion, die zwei Werte bekommt und sie vertauscht.

Lösung:

Der Code

CCode:

#include <stdio.h>

void swap(int* x,int* y)
{
int tmp;
tmp=*y;
*y=*x;
*x=tmp;
}
main()
{
int x=2, y=3;
freopen( "stdout.txt", "w", stdout ); //Leitet die Standardausgabe in die Datei stdout.txt um
printf("x=%d,y=%d\n",x,y);
swap(&x,&y);
printf("x=%d,y=%d",x,y);
return 0;
}

liefert die Ausgabe:

Ausgabe stdout:

x=2,y=3
x=3,y=2

Hinweis: Aus mir unerklärlichen Gründen funktioniert swap(x,y) mit void swap(int& x, int& y) nicht.



3.Aufgabe Genauigkeit von Fließkommazahlen

Aufgabenstellung:

Was erwartet man als Ergebnis beider Code Beispiele?
   a)

CCode:

#include<stdio.h>
      int main(){
          float p1 = 3.141592653589793,   p2 = 3.141592;   
          printf("%.17f\n", p1-p2);
          return 0;
      }


   b)
 

CCode:

#include<stdio.h>
      int main(){
          float i=0.0;
          for (i=0.0; i != 1.0; i += 0.1)
           {   
              printf("%f",i);
           }
           retrun 0;
}

Lösung

zu a) man erwartet 0.000000653589793, erhält aber

Ausgabe stdout:

0.00000065358979295

zu b) Man erwartet, dass die Zahlen von 0.1 bis 1 ausgegeben werden. Tatsächlich erhält man aber eine Endlosschleife, weil 1 nie genau erreicht wird. Daher sollte man besser <=1 verwenden. Vielleicht würde es sich hier anbieten eine neue Funktion für die Gleichheit bzw. Ungleichheit von floatwerten zu schreiben.