ALCUNE LIBRERIE DEL C CHE SI UTILIZZANO . BREVI CARATTERISTICHE conio.h contiene la dichiarazione di funzioni usate per richiamare alcune routine DOS di gestione del video e della tastiera . NECESSARIA PER system(‘’cls’’) time.h fornisce un accesso standardizzato alle funzioni di acquisizione e manipolazione del tempo. NECESSARIA PER LA FUNZIONE TIME(NULL) libreria di Unix che contiene funzioni di chiamate di sistema basilari del sistema operativo compatibile con C . NECESSARIA PER LA FUNZIONE GETPIP unistd.h dos.h graphics.h contiene la definizione delle costanti e le dichiarazioni necessarie per chiamate specifiche al DOS contiene la dichiarazione delle routine grafiche iostream.h contiene la dichiarazione delle classi che operano sui canali fondamentali di I/O math.h contiene la dichiarazione delle principali funzioni matematiche stdio.h contiene le routine di I/O previste dal C standard stdlib.h contiene la dichiarazione di routine di uso comune string.h contiene la dichiarazione delle routine di manipolazione delle stringhe Equazione di 2 grado grezza Non molto intuitivo nell’esecuzione #include <math.h> #include <stdio.h> #include <iostream> main() { int a,b,c,i; float x1,x2,de; for (i=1;i<=3;i++){ printf(" \n"); printf("Scrivi il valore di a: "); scanf("%d", &a); printf("Scrivi il valore di b: "); scanf("%d", &b); printf("Scrivi il valore di c: "); scanf("%d", &c); de= b*b -4*a*c; printf("il delta risulta essere %f \n \n", de); if (de<0){ printf("\n L'equazione non ammette soluzioni reali \n \n \n"); system("pause"); } else { x1=(-b+sqrt(de))/(2*a); x2=(-b-sqrt(de))/(2*a); printf(" 1 soluzione X1 = %f \n \n " ,x1); printf(" 2 soluzione X2 = %f \n \n ",x2); printf(" \n"); if (de>0) { } else { } system("pause"); } } } x1=(-b+de)/(2*a); x2=(-b-de)/(2*a); printf("\n L'equazione ha soluzioni reali e coincidenti \n"); printf("\n le soluzioni coincidenti sono %f \n",x1); printf(" \n"); #include <math.h> #include <stdio.h> #include<conio.h> #include <iostream> Equazione di 2 grado elaborata L’aspetto del programma in esecuzione è più capibile dall’esecutore main() { int a,b,c,i; float x1,x2,de; for (i=1;i<=3;i++) { system("cls"); printf(" \n \n \n"); printf(" Equazione n° %d \n \n",i); printf("Un'equazione di secondo grado si scrive secondo la seguente forma: \n"); printf(" ax^2+bx+c = 0 \n"); printf(" \n"); printf("Scrivi il valore di a: "); scanf("%d", &a); printf("Scrivi il valore di b: "); scanf("%d", &b); printf("Scrivi il valore di c: "); scanf("%d", &c); de= b*b -4*a*c; printf(" \n"); printf("il delta risulta essere %f \n \n", de); if (de<0) { printf("\nL'equazione non ha soluzioni reali\n \n \n"); system("pause"); } else { if (de>0) { x1=(-b+sqrt(de))/(2*a); x2=(-b-sqrt(de))/(2*a); printf(" 1 soluzione X1 = %f \t " ,x1); printf(" 2 soluzione X2 = %f \t ",x2); printf(" \n"); } else { } printf(" \n "); system("pause"); } } } x1=(-b+de)/(2*a); x2=(-b-de)/(2*a); printf("\n L'equazione ha soluzioni reali e coincidenti \n"); printf("\n le soluzioni coincidenti sono %f \n",x1); printf(" \n"); // GENERAZIONE DI NUMERI CASUALI MEDIANTE IL CICLO FOR // #include <stdio.h> #include <stdlib.h> Prova a generare 3 numeri casuali e annota il risultato Prova a stampare 4 numeri casuali e annota il risultato Prova a stampare 5 numeri casuali e annota il risultato main() { int k,n; numeri 41 numeri 41 numeri 41 18467 18467 18467 6334 6334 6334 printf("%s \n %s \n %s", "Verranno stampati un certo numero di valori interi", "estratti in maniera casuale.", "Quanti ne vuoi vedere? "); scanf("%d", &n); for(k=0; k<n; k++) { printf("%7d", rand()); } printf("\n\n"); system("PAUSE"); return 0; } In pratica questo programma restituisce un certo numero di numeri casuali , compresi ta 0 e RAND_MAX . In realtà ogni volta che si manda in esecuzione il programma , qualunque sia il numero di numeri casuali che si vuole inserire esso restituisce sempre lo stesso set di numeri casuali . Questo accade perché la funzione rand() non è inizializzata , in quanto la sua definizione prevede che essa generi la stessa sequenza di numeri casuali . Quindi tali valori generati possono essere definiti PSEUDOCASUALI. 26500 26500 19169 // GENERAZIONE DI NUMERI CASUALI CON SRAND SU UNA COLONNA #include <stdio.h> #include <stdlib.h> main() { int k,n; printf("\n Dimmi quanti numeri casuali devo stampare:"); while(scanf("%d", &n)==0) { printf("\n Hai inserito un valore non valido!"); printf("\n Inserisci un nuovo valore numerico:"); while ( getchar() != '\n' ); } printf("\n Il valore inserito e' %d \n", n); srand(1); for(k=0; k<n; k++) { printf("\n%d",rand()); } Per ovviare alla generazione dei numeri pseduocasuali si utilizza la funzione srand , che serve proprio per inizializzare e creare quindi numeri effettivamente casuali a partire da un valore che si può assegnare inserendolo nel suo argomento srand(3) Tale numero , 3 , viene chiamato seme Se si assegna il valore 1 si ottiene la rand . Il programma parte dal numero inserito nell’argomento della srand a generare numeri casuali , ma se man mano non si cambia l’argomento , il programma restituisce gli stessi valori . Quindi bisognerebbe intervenire tutte le volte sul seme e cambiarlo prima e poi eseguire il programma , ma ovviamente non sarebbe un processo automatico . printf("\n \n"); system("PAUSE"); return 0; } L’istruzione while (getchar() != ‘\n’ ) composta da while con all’interno una getchar ha il compito di assorbire tutte le lettere che sono eventualmente presenti dopo il numero inserito e controlla che l’inserimento da tastiera sia un numero . Questa istruzione svuota il buffer ( la memoria di transito cioè la zona di memoria usata temporaneamente per memorizzare i dati ) // GENERAZIONE DI NUMERI CASUALI CON GETPID SU UNA COLONNA #include <stdio.h> #include <stdlib.h> #include <unistd.h> main() { int k,n; //pid = getpid(); printf("\n Dimmi quanti numeri casuali devo stampare:"); while(scanf("%d", &n)==0) { printf("\n Hai inserito un valore non valido!"); printf("\n Inserisci un nuovo valore numerico:"); while ( getchar() != '\n' ); } printf("\n Il valore inserito e' %d \n", n); srand(getpid()); for(k=0; k<n; k++) { printf("\n%d",rand()); } printf("\n \n"); system("PAUSE"); return 0; } Per ovviare al problema della srand() ed essere certi di generare numeri realmente casuali si può usare la funzione getpid . La funzione getip() ( il suo argomento deve essere nullo ) assegna alla variabile pid il numero di ID , ossia il suo numero di identificatore di processo . Il computer infatti assegna , in maniera del tutto casuale , un numero al programma che si sta eseguendo , e tale numero dipende anche dagli altri processi che il computer sta eseguendo in contemporanea . Il numero assegnato serve da indicatore al pc per riconoscere un ben preciso programma che si vuol eseguire , ossia ad ogni processo è assegnato un numero diverso da quello attribuito ad altri processi , in modo da facilitarne il ritrovamento da parte della memoria e l’esecuzione. Proprio per l’estrema casualità con cui il processore assegna questo indirizzo , tale funzione getpid è un ottimo punto di partenza da cui far generare numeri casuali. Dunque , tramite getpid si assegna alla variabile pid il valore generato casualmente ed essa diviene a sua volta l’argomento della srand, che ora inizializza la rand() in maniera del tutto casuale , evitando in tal modo di immettere ogni volta un valore diverso nel suo argomento per avere nuovi numeri random. La printf dopo l’assegnazione alla variabile pid serve proprio per evidenziare il numero di pid che il pc ha assegnato a tale processo e da cui inizierà a generare i numeri casuali . Affinchè tale funzione possa essere eseguita , è necessario inserire la libreria unistd.h , che è una libreria propria di Unix , ma che è compatibile anche con altri compilatori , come quello del c. // NUMERI CASUALI CON TIME (NULL) CON VALORE MASSIMO PRIMA VERSIONE #include <stdio.h> #include <stdlib.h> #include <time.h> Per ottenere numeri casuali si può utilizzare la funzione time(null) . Tale funzione prende l’orario dell’orologio del pc e genera numeri casuali a partire da tale valore main() { int k,n,q,l,h; int i=1; printf("\n Dimmi quanti numeri casuali devo stampare:"); while(scanf("%d", &n)==0) { printf("\n Hai inserito un valore non valido!"); printf("\n Inserisci un nuovo valore numerico:"); while ( getchar() != '\n' ); } Ciclo controllo immissione corretta di un numero printf("\n Il valore inserito e' %d \n", n); printf ("\n Dimmi il valore massimo dei numeri casuali da inserire:"); while(scanf("%d", &q)==0) { printf("\n Hai inserito un valore non valido!"); printf("\n Inserisci un nuovo valore numerico:"); while ( getchar() != '\n' ); } printf("\n Il valore max per i numeri casuali inserito e' %d \n", q); printf(" \n Il time e': %d \n", time (NULL)); srand(time(NULL)); Inserimento di seme mediante Ciclo controllo immissione corretta di un numero time(null) in srand for(k=0; k<n; k++) { if (k%1==0) putchar('\n'); l=i++; if (l<10) printf(" %d",l); if (l>=10) printf(" %d",l); printf(" %d", h=rand()*q/RAND_MAX); } printf("\n \n"); system("PAUSE"); return 0; } Ciclo controllo generazione di numeri casuali con il limite del valore massimo dei numeri da inserire // INTERVALLO NUMERI CASUALI FUNZIONE TIME (NULL) E INTERVALLO #include <stdio.h> #include <stdlib.h> #include <time.h> main() { int x,k,n,a,b; printf("\n Dimmi quanti numeri casuali devo stampare:"); while(scanf("%d", &n)==0) { printf("\n Hai inserito un valore non valido!"); printf("\n Inserisci un nuovo valore numerico:"); while ( getchar() != '\n' ); } printf("\n Il valore inserito e' %d \n", n); printf ("\n Dimmi l'estremo inferiore dell'intervallo:"); while(scanf("%d", &a)==0) { printf("\n Hai inserito un valore non valido!"); printf("\n Inserisci un nuovo valore numerico:"); while ( getchar() != '\n' ); } printf("\n Il valore minimo per i numeri casuali inserito e' %d \n", a); printf("\n Dimmi l'estremo superiore dell'intervallo:"); while(scanf("%d", &b)==0) { printf("\n Hai inserito un valore non valido!"); printf("\n Inserisci un nuovo valore numerico:"); while ( getchar() != '\n' ); } printf ("\n Il valore massimo per i numeri casuali inserito e' %d \n",b); printf(" \n Il time e': %d \n", time(NULL)); srand(time(NULL)); for(k=0; k<n; k++) { x= rand()*(b-a)/RAND_MAX+a; printf("\n%3d %d ",k+1,x); } printf("\n \n"); system("PAUSE"); return 0; }