GESPRG: Uitwerking huiswerk les 2.

© Harry Broeders.

Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie voor Technology, Innovation & Society Delft.

Huiswerk les 2:

Uitwerking:

5. In Microsoft Visual C++ 2010 is genest commentaar niet toegestaan (2_15_5.c):

#include <stdio.h>

int main(void) {
    /* Dit is een proging om /* commentaar */ te nesten */
    return 0;
}

Het compileren van dit programma geeft de volgende foutmeldingen (allemaal op regel 4):

..\gesprg\progs\2_15_5.c(4): 'te' : undeclared identifier
..\gesprg\progs\2_15_5.c(4): syntax error : missing ';' before identifier 'nesten'
..\gesprg\progs\2_15_5.c(4): expression has no effect; expected expression with side-effect
..\gesprg\progs\2_15_5.c(4): '*/' found outside of comment
..\gesprg\progs\2_15_5.c(4): 'nesten' : undeclared identifier
..\gesprg\progs\2_15_5.c(4): error C2059: syntax error : '/'

Ook de opensource compiler gcc accepteert geen genest commentaar. De compiler gcc geeft de volgende foutmeldingen (beide op regel 4):

2_15_5.c: In function 'main':
2_15_5.c:4:47: error: unknown type name 'te'
2_15_5.c:4:57: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token

7. 2_15_7.c:

#include <stdio.h>

int main(void) {
    int 3id;
    int __yes;
    int o_no_o_no;
    int 00_go;
    int star*it;
    int 1_i_am;
    int one_i_aren't;
    int me_to-2;
    int xYshouldl;
    int int;

    return 0;
}

Het compileren van dit programma geeft de volgende foutmeldingen(sommige foutmeldingen zijn het gevolg van eerdere fouten):

..\gesprg\progs\2_15_7.c(4): error C2059: syntax error : 'bad suffix on number'
..\gesprg\progs\2_15_7.c(4): error C2143: syntax error : missing ';' before 'constant'
..\gesprg\progs\2_15_7.c(4): error C2059: syntax error : 'empty declaration'
..\gesprg\progs\2_15_7.c(4): error C2146: syntax error : missing ';' before identifier 'id'
..\gesprg\progs\2_15_7.c(4): warning C4555: expression has no effect; expected expression with side-effect
..\gesprg\progs\2_15_7.c(4): error C2065: 'id' : undeclared identifier
..\gesprg\progs\2_15_7.c(4): warning C4555: expression has no effect; expected expression with side-effect
..\gesprg\progs\2_15_7.c(5): error C2143: syntax error : missing ';' before 'type'
..\gesprg\progs\2_15_7.c(6): error C2143: syntax error : missing ';' before 'type'
..\gesprg\progs\2_15_7.c(7): error C2059: syntax error : 'bad suffix on number'
..\gesprg\progs\2_15_7.c(7): error C2143: syntax error : missing ';' before 'type'
..\gesprg\progs\2_15_7.c(8): error C2143: syntax error : missing ';' before 'type'
..\gesprg\progs\2_15_7.c(9): error C2059: syntax error : 'bad suffix on number'
..\gesprg\progs\2_15_7.c(9): error C2143: syntax error : missing ';' before 'type'
..\gesprg\progs\2_15_7.c(10): error C2143: syntax error : missing ';' before 'type'
..\gesprg\progs\2_15_7.c(10): error C2001: newline in constant
..\gesprg\progs\2_15_7.c(12): error C2143: syntax error : missing ';' before 'type'
..\gesprg\progs\2_15_7.c(13): error C2632: 'int' followed by 'int' is illegal
..\gesprg\progs\2_15_7.c(13): error C2143: syntax error : missing ';' before 'type'

Conclusies:

3id          is geen geldige identifier omdat het begint met een cijfer (3).
__yes        is wel een geldige identifier, maar identifiers die beginnen met een _ zijn gereserveerd voor "het systeem".
o_no_o_no    is wel een geldige identifier.
00_go        is geen geldige identifier omdat het begint met een cijfer (0).
star*it      is geen geldige identifier omdat er een * in voorkomt.
1_i_am       is geen geldige identifier omdat het begint met een cijfer (1).
one_i_aren't is geen geldige identifier omdat er een ' in voorkomt.
me_to-2      is geen geldige identifier omdat er een - in voorkomt.
xYshouldl    is wel een geldige identifier.
int          is geen geldige identifier omdat int een gereserveerd woord (keyword) is (zie tabel op pagina 63).

Als we alle ongeldige identifiers verwijderen dan compileert het programma zonder fouten:

#include <stdio.h>

int main(void) {
    int __yes; /* kies liever een andere naam want deze is gereserveerd! */
    int o_no_o_no;
    int xYshouldl;

    return 0;
}

9. Dit programma compileert inderdaad zonder fouten.

main(
){float qx,
zz,
tt;printf("gimme 3"
);scanf
("%f%f  %f", &qx,&zz
,&tt);printf("gemiddeldeis=%f",(qx+tt+zz)/3.0);}

Hier is de opgeschoonde versie 2_15_9.c:

#include <stdio.h>

int main(void) {
    double getal1, getal2, getal3;
    printf("Geef 3 floating point getallen: ");
    scanf("%lf%lf%lf", &getal1, &getal2, &getal3);
    printf("Het gemiddelde = %f", (getal1 + getal2 + getal3) / 3.0);
    fflush(stdin);
    getchar();
    return 0;
}

1. 3_13_1.c:

#include <stdio.h>

int main(void) {
    double x = 123.45123451234512345;
    double y = 123.45123451234512300; /* laatste 2 cijfers verschillen */

    printf("%.17f %.17f\n", x, y);

    getchar();
    return 0;
}

Dit programma print inderdaad 2x hetzelfde getal. Het type double heeft niet genoeg significante cijfers om het verschil op te slaan.

Een double heeft minimaal 15 en maximaal 17 significante cijfers (zie double.htm).

Als we y op 4 nullen laten eindigen dan zien we wel een verschil: