Accedi per seguire   
Seguaci 0
spiug

[c] Esercitazione 4

15 messaggi in questa discussione

ESERCIZIO 1

Scrivere una funzione int ordinato(int a[ ], int dim) che verifichi

array di interi è ordinato in senso decrescente. La funzione deve

restituire 0 se l’array non è ordinato e 1 se l’array è ordinato.

Come l'ho risolto...

# include <stdio.h>
# define n 10

int ordinato(int a[ ], int dim);

main () {
 int arr[n];
 int i;
 int num=10;

 for ( i=0; i<n; i++ ) {
 printf ("Ok, inserisci il valore dell'array al posto %d\n",i+1);
 scanf (" %d",&arr[i]);
 }
 printf ("Adesso ti dico se l'array che mi hai fornito è immesso ordinato in maniera decrescente\n");
 printf ("1=si 0=no\n");
 printf ("%d",ordinato(arr,num));


 scanf (" %d",&arr[i]);
}


int ordinato(int a[], int dim) {
int si=1;
int i=1;
while (si=1 || i<dim) {
	  if (a[i]<=a[i-1])
		 si=0;
	  i++;
	  }
return si;
}	 

Però appena durante il processo arriva alla funzione compare un messaggio di Windows (quelli con invia o non invia) che fà terminare il processo!!

Che è colpa mia?? :angel_not:

Che c'è che non và?! :P:)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Tra un po' ci do' un occhio e ti dico ;-)

:)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

ESERCIZIO 1

Come l'ho risolto...

# include <stdio.h>
# define n 10

int ordinato(int a[ ], int dim);

main () {
 int arr[n];
 int i;
 int num=10;

 for ( i=0; i<n; i++ ) {
 printf ("Ok, inserisci il valore dell'array al posto %d\n",i+1);
 scanf (" %d",&arr[i]);
 }
 printf ("Adesso ti dico se l'array che mi hai fornito è immesso ordinato in maniera decrescente\n");
 printf ("1=si 0=no\n");
 printf ("%d",ordinato(arr,num));


 scanf (" %d",&arr[i]);
}
int ordinato(int a[], int dim) {
int si=1;
int i=1;
while (si=1 || i<dim) {
	  if (a[i]<=a[i-1])
		 si=0;
	  i++;
	  }
return si;
}	 

Però appena durante il processo arriva alla funzione compare un messaggio di Windows (quelli con invia o non invia) che fà terminare il processo!!

Che è colpa mia?? :angel_not:

Che c'è che non và?! :P:)

Eccomi :P

C'è un errore che è un classico errore ba*****o del C :wub:

Poi la funzione "ordinato" non fa proprio il suo lavoro... Nel senso che non ti dice se l'array è ordinato in maniera decrescente...

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Spiug, vai a Cepu!!! :):P ;-)

No No, resta qui si WinInizio :P

Non sono errori gravi :P Il primo è un errore classico... Ed altrettanto difficile da trovare :wub:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

No No, resta qui si WinInizio :P

Non sono errori gravi :wub: Il primo è un errore classico... Ed altrettanto difficile da trovare :P

Si...Ok...e di cosa si tratterebbe?!

Me ne rendo conto che non è dei migliori programmi (l'ho fatto su in 4 e 4 8 su 2 piedi in 5 minuti) :P

sicuramente si può migliorare (e molto), ma intanto mi basta che parta ;)

...non vado da Cepu altrimenti mi innamoro della professoressa :)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Si...Ok...e di cosa si tratterebbe?!

Me ne rendo conto che non è dei migliori programmi (l'ho fatto su in 4 e 4 8 su 2 piedi in 5 minuti) :P

sicuramente si può migliorare (e molto), ma intanto mi basta che parta ;)

...non vado da Cepu altrimenti mi innamoro della professoressa :P

Nel while invece che fare un controllo: si == 0 tu fai un'assegnazione: si = 0 e questo è un errore molto frequente in C e molto subdolo :wub: Visto che per il C il valore 0 è valido come booleano e "vale" false. Inserendolo nel while, assegni a si il valore 0 (modificando il suo vero valore), e il while lo interpreta come false (e quindi non da errore). Essendo sempre valido quel confronto, rimani sempre dentro il ciclo, ed incrementi i fino a che, dopo un po' che controlli valori dell'array oltre il limite, arrivi ad un certo punto che esci dallo spazio di memoria assegnato e Windows s'arrabbia :P

Poi quello che chiede il programma è dire se l'array è ordinato in maniera decrescente.

Per fare questo ti conviene scrivere il ciclo in questo modo:

int ordinato(int a[], int dim) {
int si=1;
int i=1;
while (si==1 && i<dim) {
	  if (a[i]>a[i-1])
		 si=0;
	  i++;
}
return si;
}

Così facendo parto dal presupposto che l'array sia ordinato in maniera decrescente ed entro nel ciclo. Se arrivo in fondo al ciclo senza mai mettere "si" a false (0) allora l'array e' decrescente. Appena trovo un valore maggiore del precedente, esco dal ciclo mettendo "si" a false (0).

:) ;-)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

<_<

...mi sà che ultimamente stò diventando una talpa...

non mi sono ancora del tutto abituato al C (fin prima usavo Delphi e i doppi == proprio non esistevano) :)

...ma niente scuse...sono proprio talpino (B)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

<_<

...mi sà che ultimamente stò diventando una talpa...

non mi sono ancora del tutto abituato al C (fin prima usavo Delphi e i doppi == proprio non esistevano) :P

...ma niente scuse...sono proprio talpino (B)

Tranquillo ;-)

E' un errore tipico in C proprio perchè non viene mai segnalato a tempo di compilazione...

Ed è ancora più tipico per le persone che vengono dal Pascal (dove l'operatore di uguaglianza è = e non ==) :P

:)

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Esercizio 2

Scrivere un programma che, inizializzati con valori inseriti dall’utente

due array di interi a e b della stessa lunghezza n, calcoli la somma

incrociata degli elementi: a[0]+b[n-1], a[1]+b[n-2], ... e la memorizzi in

un terzo array c.

Ottimamente risolto così:

# include <stdio.h>
# define n 3

int somma_incrociata(int uno, int due);

main () {
 int a[n];
 int b[n];
 int c[n];
 int i;

 printf ("Ora dammi il vettore A\n");
 for ( i=0; i<n; i++){
	 printf ("Dammi il %d valore\n",i+1);
	 scanf ("%d",&a[i]);
	 }

 printf ("\n");	  

 printf ("Ora dammi il vettore B\n");
 for ( i=0; i<n; i++){
	 printf ("Dammi il %d valore\n",i+1);
	 scanf ("%d",&b[i]);
	 }

 printf ("\n"); 

 printf ("Ok, ora effettuerò e ti mostrerò la somma incrociata con destinazione su C\n");
 for ( i=0; i<n; i++){	
	 c[i]=somma_incrociata(a[i],b[(n-1)-i]);
	 printf ("Valore nella posizione %d\n",i+1);
	 printf ("%d\n",c[i]);
	 }
}

int somma_incrociata(int uno, int due) {
int somma;
somma=uno+due;
return somma;
}

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Esercizio 3

Scrivere un programma che gestisca le scommesse sul gioco ‘craps’

visto a lezione. Impacchettate in una funzione la porzione di

programma che esegue un singolo gioco ai dadi. Inizializzate una

variabile saldo a 1000 dollari. Usate un ciclo while per chiedere al

giocatore di immettere una puntata, controllando che non sia

superiore a saldo. Dopo che sarà stata inserita una puntata valida,

eseguite un gioco ai dadi. Nel caso in cui il giocatore vinca,

incrementate saldo di puntata e visualizzate il nuovo saldo. Nel

caso in cui il giocatore perda, decrementate saldo di puntata e

visualizzate il nuovo saldo. Il programma dovrà permettere al

giocatore di fare scommesse successive fino a quando il giocatore è

stanco oppure il suo saldo è arrivato a zero.

Fatto e pure funzionante!! :):wub:

# include <stdio.h>
# include <stdlib.h>

int giocata_singola(void);
int tira_dadi(void);
void stampa_risultato(int);

main () {
 int saldo=1000;
 int puntata;

 while (saldo>=0) {
 printf ("Prossima giocata. QUANTO VUOI PUNTARE?\n");
 scanf ("%d",&puntata);
 if (puntata<=saldo && puntata>0) {
	if (giocata_singola()==1)
	   saldo+=puntata;
	else
		saldo-=puntata;
	printf ("Il giocatore ha ancora a disposizione %d\n",saldo);
	printf ("\n");
	}
 else
 printf ("Non hai abbastanza soldi o hai immesso una puntata negativa\n");
 }	 
}

int giocata_singola() {
 int stato_gioco, somma_dadi, punteggio,i;

 somma_dadi=tira_dadi();
 switch (somma_dadi) {
					case 7 :
					case 11: stato_gioco=1; break;

					case 2 :
					case 12: stato_gioco=2; break;

					default: stato_gioco=0; punteggio=somma_dadi;
 }

 while (stato_gioco=0) {
	   somma_dadi=tira_dadi();
	   if (somma_dadi==punteggio)
		  stato_gioco=1;
	   else {
			if (somma_dadi==7)
			   stato_gioco=2;
	   }
 }

 stampa_risultato(stato_gioco);

 return stato_gioco;
}


int tira_dadi() {
int d1,d2,somma;
d1=1+rand()%6;
d2=1+rand()%6;
somma=d1+d2;
printf ("Il giocatore ha tirato e risulta %d + %d = %d\n",d1,d2,somma);
return somma;
}

void stampa_risultato(int finale) {
 if (finale==1)
	printf ("HAI VINTO!!!\n");
 else
	 printf ("Mi dispiace...HAI PERSO\n");
 return;
}

Mi pongo una domanda...mi sono accorto che il compilatore mi dà sempre gli stessi risultati!! ...e perdo sempre :P

Mi chiedevo come funzionasse la funzione random (ovvero come il compilatore la interpreta e la fà funzionare). Essendo il computer "stupido", come fà a prenderne uno a caso di SUA iniziativa?? :P

Chissà se riuscirete a darmi una risposta su questa mia domanda da 100 milioni di dollari?!

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Mi pongo una domanda...mi sono accorto che il compilatore mi dà sempre gli stessi risultati!! ...e perdo sempre :P

Mi chiedevo come funzionasse la funzione random (ovvero come il compilatore la interpreta e la fà funzionare). Essendo il computer "stupido", come fà a prenderne uno a caso di SUA iniziativa?? :)

Chissà se riuscirete a darmi una risposta su questa mia domanda da 100 milioni di dollari?!

Come dici bene tu, il computer non è abbastanza intelligente per generare numeri casuali di propria iniziativa. Quelli che genera la funzione rand(), infatti, sono numeri PSEUDO-Casuali. In pratica, vengono generati in maniera deterministica numeri che sembrano essere generati a caso. Se si utilizza la funzione diverse volte durante l'esecuzione dello stesso programma, questa sembra generare numeri che non hanno nulla a che fare l'uno con l'altro (casuali). Se, però, ripetiamo il programma di nuovo, ci renderemo conto che la sequenza di numeri generati è sempre la stessa. Per fare in modo che ad una nuova esecuzione si abbia una sequenza "casuale" differente, bisogna cambiare il SEME utilizzato dalla funzione casuale per generare la sequenza di numeri. Questa operazione prende il nome di RANDOMIZZAZIONE. Per modificare il seme si utilizza la funzione

srand(unsigned)

dove il valore passato deve essere unsigned (intero senza segno). Per fare in modo che ad ogni esecuzione venga passato un seme sempre diverso (se noi utiliziamo nel programma sempre lo stesso seme, ci troviamo al punto di partenza) possiamo sfruttare l'orologio di sistema. La funzione

time(NULL)

che si trova nella libreria time.h, restituisce l'ora corrente come numero di millisecondi rappresentati come intero senza segno (unsigned appunto).

Quindi basta che come prima istruzione del nostro programma si metta:

srand(time(NULL));

ed otterremmo un programma che ad ogni avvio genera una sequenza PSEUDO-Casuale differente :wub:

:P

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Tutto chiarissimo!!!!...(meno che per me....anti-old.gif ) :):P:P:wub:

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Come dici bene tu, il computer non è abbastanza intelligente per generare numeri casuali di propria iniziativa. Quelli che genera la funzione rand(), infatti, sono numeri PSEUDO-Casuali. In pratica, vengono generati in maniera deterministica numeri che sembrano essere generati a caso. Se si utilizza la funzione diverse volte durante l'esecuzione dello stesso programma, questa sembra generare numeri che non hanno nulla a che fare l'uno con l'altro (casuali). Se, però, ripetiamo il programma di nuovo, ci renderemo conto che la sequenza di numeri generati è sempre la stessa. Per fare in modo che ad una nuova esecuzione si abbia una sequenza "casuale" differente, bisogna cambiare il SEME utilizzato dalla funzione casuale per generare la sequenza di numeri. Questa operazione prende il nome di RANDOMIZZAZIONE.

....

srand(time(NULL));

ed otterremmo un programma che ad ogni avvio genera una sequenza PSEUDO-Casuale differente :P

Si, l'avevo notata questa cosa... <_<

...quindi tu consigli di prendere in considerazione l'operazione srand(time(NULL)); al posto del classico random (che non è poi così tanto efficace) per ottenere VERAMENTE numeri sempre differenti :)

E come mai allora il vecchio random è così tanto utilizzato (o per lo meno è citato su tutte le guide, ma questo problema non è spesso menzionato)??

PS: quel NULL non è indispensabile metterlo?! No, vero??

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Si, l'avevo notata questa cosa... <_<

...quindi tu consigli di prendere in considerazione l'operazione srand(time(NULL)); al posto del classico random (che non è poi così tanto efficace) per ottenere VERAMENTE numeri sempre differenti :)

E come mai allora il vecchio random è così tanto utilizzato (o per lo meno è citato su tutte le guide, ma questo problema non è spesso menzionato)??

PS: quel NULL non è indispensabile metterlo?! No, vero??

No no... rand() è la funzione che crea i numeri PSEUDO-Casuali a partire da un seme iniziale.

Questo seme è sempre lo stesso... Quindi ogni volta che si esegue il programma che utilizza la funzione rand(), si avrà sempre la stessa sequenza di numeri PSEUDO-Casuali. Per evitare questo, è bene utilizzare ANCHE la funzione srand() (che modifica il seme) ed utilizzare l'orologio di sistema (con time()) per avere un seme che sia diverso ad ogni avvio del programma (visto che si avvia sicuramente a millisecondi diversi).

Quindi il tuo programma va modificato semplicemente aggiungendo la generazione e l'assegnazione di un seme nuovo all'avvio del main:

main() {
srand(time(NULL));
.
.
.
}

Naturalmente devi includere anche la libreria time.h ;-)

;)

Tutto chiarissimo!!!!...(meno che per me....anti-old.gif ) :P:P:wub::P

:(

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Crea un account o accedi per lasciare un commento

Devi essere un utente registrato per partecipare

Crea un account

Iscriviti per un nuovo account nella nostra community. È facile!


Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.


Accedi Ora
Accedi per seguire   
Seguaci 0