Programación por contrato - Revision : 1,8 Herramientas de Programación— Cuadernos de Prácticas Soluciones 19 de noviembre de 2004 Resumen Uso de la cabecera ’assert.h’. Uso de la librerı́a Nana. Dpto. Lenguajes y Sistemas Informáticos Universidad de Alicante Índice 1. Uso de assert.h 2 2. Uso de Nana 2 1 1. Uso de assert.h 1. /* gcc nne.c -o nne -lm */ /* gcc -DNDEBUG nne.c -o nne -lm */ #include <stdio.h> #include <math.h> #include <assert.h> float float_sqrt(float d) { float result; assert(d > 0.0); result = sqrtf(d); assert(result == (float) sqrt((double) d)); return result; } int main() { int n[] = { 1, 2, 3, 4 }; printf("fsqrt(5)=%f\n", float_sqrt(5)); printf("fsqrt(-5)=%f\n", float_sqrt(-5)); #ifndef NDEBUG int i, aux_s=0, aux_p=1; for (i=0; i<4; i++) { aux_s += n[i]; aux_p *= n[i]; } assert( (aux_s>9) && (aux_p==24) ); #endif return 0; } 2. Uso de Nana 1. 2 /* gcc nne2.c -o nne2 -lnana */ /* nana nne2.c >nne2.gdb */ /* gcc -DWITHOUT_NANA nne2.c -o nne2 */ #include <stdlib.h> #include <time.h> #include <nana.h> #include <stdio.h> #define MAX 100 void Rellenar(int *v) { int i,j; /*{P}*/ DI(v!=NULL); v[0]=1+(int)(100.0*rand()/(RAND_MAX+1.0)); for(i=1;i<MAX;i++) { j=1+(int)(100.0*rand()/(RAND_MAX+1.0)); v[i]=j; DL("j=%d\n", j); } /*{Q}*/ DI(i==MAX); } int numero_de_veces(int *v,int pos) { int cuenta,j; cuenta=0; /*{P}*/ DI((pos>=0) && (pos<MAX)); for(j=0;j<MAX;j++) { DS($c=cuenta); if(v[pos]==v[j]) cuenta++; } DL("cuenta de posicion %d es %d\n",pos,cuenta); /*{Q}*/ DI($c>=1); return cuenta; } int main() { 3 int vector[MAX],i; srand(time(NULL)); printf("RAND_MAX=%d\n", RAND_MAX); Rellenar(vector); i=numero_de_veces(vector,50); printf("Vector[50]: %d, %d veces",vector[50],i); printf("\n"); } 4