Aufgabenstellung von Herren Grams
Syntax und Semantik von Ausdrücken
3.1 Bilden Sie die Syntaxbäume der folgenden Ausdrücke:
1) *p++ =+p++
2) 0<j & x[j]<x[j-1]
3) fabs(x)<fabs(y)? fabs(y)*sqrt(1+(x/y)*(x/y)): x==0? 0:
fabs(x)*sqrt(1+(y/x)*(y/x))
3.2 Geben Sie das folgende Programm ein. Erläutern Sie die Funktion des
Programms.
/*Ausdruck.c*/
#include <stdio.h>
void main()
{
char z;
int i;
float x,y;
char s[80]; //Puffer fuer eine Bildschirmzeile
printf("? Eingabe(char, int, float, float): ");gets(s);
printf("! Echo1: %s\n", s);
sscanf(s, "%c,%d,%e,%e ", &z,&i,&x,&y);
printf("! Echo2: %c %d %e %e\n",z,i,x,y);
printf("! Summe: %e\n",z+i+x+y );
}
3.3 Schreiben Sie ein Programm, das die Größen der fundamentalen Typen und
der Zeigertypen ausgibt. Verwenden Sie dazu den Operator sizeof
3.4 Schreiben Sie ein Programm shift,
das (0000100000100000) und die daraus durch Verschiebung um eine, vier bzw.
fünf Stellen nach links entstehende Dualzahl als Dezimalzahl ausgibt. Es sind
nur Ein- und Ausgabeanweisungen zulässig.
3.5 Zeigen Sie mit einem kleinen Programm, dass Dereferenzierung und
Adressoperator invers zueinander sind.
Lösungsansätze:
Aufgabe 3.2
/*Ausdruck.c*/
#include <stdio.h>
void main()
{
char z;
int i;
float x,y;
char s[80]; //Puffer fuer eine Bildschirmzeile
printf("? Eingabe(char, int, float, float): ");gets(s);
printf("! Echo1: %s\n", s);
sscanf(s, "%c,%d,%e,%e ", &z,&i,&x,&y);
printf("! Echo2: %c %d %e %e\n",z,i,x,y);
printf("! Summe: %e\n",z+i+x+y );
}
Aufgabe 3.3
/*sizeof*/
#include <stdio.h>
#include <stddes.h>
void main()
{
int *i;
char *c;
float *f;
short *s;
long *l;
double *d;
long double ld;
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(char)=%d\n",sizeof(char));
printf("sizeof(float)=%d\n",sizeof(float));
printf("sizeof(short)=%d\n",sizeof(short));
printf("sizeof(long)=%d\n",sizeof(long));
printf("sizeof(double)=%d\n",sizeof(double));
printf("sizeof(long double)=%d\n",sizeof(long double));
printf("sizeof(int *)=%d\n",sizeof(long double));
printf("sizeof(*int)=%d\n",sizeof i);
printf("sizeof(*char)=%d\n",sizeof c);
printf("sizeof(*float)=%d\n",sizeof f);
printf("sizeof(*short)=%d\n",sizeof s);
printf("sizeof(*long)=%d\n",sizeof l);
printf("sizeof(*double)=%d\n",sizeof d);
printf("sizeof(*long double)=%d\n",sizeof ld);
}
Aufgabe 3.4
/*sizeof*/
#include <stdio.h>
#include <string.h>
#include <math.h>
void main()
{
int i;
int j = 0;
int a[3] = {1,4,5};
printf("Dezimalzahl eingeben: ");
scanf("%d",&i);
printf("! Dezimalzahl: %d\n",i);
do
{
printf("Dezimalzahl um %d Stellen dual nachlinks verschoben =
%d",
a[j],i<<a[j++]);
}
while(j<3);
}
Aufgabe 3.5
/*Ausdruck.c*/
#include <stdio.h>
void main()
{
long int i,j=34,*p,*q;
printf("? Integerzahl: i=");
scanf("%d",&i);
p=&i;
j=*q;
printf("\n! Anfangsbedingungen");
printf("\n! p,q=Pointer\n! i,j=Integerzahlen\n! p=&i; j=*q");
printf("\n");
printf("\n! Integerzahl(i) = %d",i);
printf("\n! Integerzahl(j) = %d",j);
printf("\n! Adressoperator(&i) = %d",&i);
printf("\n! Adressoperator(&j) = %d",&j);
printf("\n! Zeiger(p) = %d",p);
printf("\n! Zeiger(q) = %d",q);
printf("\n! dereferenzierter Zeiger(*p) = %d",*p);
printf("\n! dereferenzierter Zeiger(*q) = %d",*q);
printf("\n");
printf("\n! dereferenzierter Adressoperator(*&i) = %d",*&i);
printf("\n! dereferenzierter Adressoperator(*&j) = %d",*&j);
printf("\n! Adressoperator dereferenziert (&*p) = %d",&*p);
printf("\n! Adressoperator dereferenziert (&*q) = %d",&*q);
}