C_testat_3
Home Nach oben

 

Home
Nach oben
C_testat_1
C_testat_2
C_testat_3
C_testat_4
C_testat_5
C_testat_6
C_testat_7
C_testat_8

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);
}