Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Domande su argomenti programmazione c
Forum - C/C++ - Domande su argomenti programmazione c

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
gabama (Normal User)
Rookie


Messaggi: 26
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 23:15
Domenica, 12/04/2009
Intanto Buona Pasqua a tutti,
sono un nuovo iscritto e vorrei chiedere alcune conferme su questo codice
#include<stdio.h>
#define N 5
int pari(int a[N]);
main(){
int a[N];
int i=0;
printf("INSERISCI LISTA\n");
for(i=0;i<N;i++){
printf("\nInserisci elemento %d di %d ",i+1,N);
scanf("%d",&a);}

printf("\nSTAMPA LISTA");
for(i=0;i<N;i++){
printf("\nL' elemento e' %d ",a);}

int cont=0;
cont=pari(a);
printf("\npari e' %d ",cont);
}

int pari(int a[N]){
int u=1;int i=0;
while ((i<N) && (u!=0)){

if(a%3!=0) u=0;
i++;
}
return u;
}

In questo codice, nel ciclo (ovviamente nella funzione)
-l' asserzione iniziale è i compreso tra 0 e N-1 e u=1?
-l' asserzione finale è u =0 o 1?
-L'invariante è i compreso tra 0 e N-1 e u = 0 o 1?
-La complessità è o O(n) perchè al massimo si scorre una volta l' array?
-Nel caso di un ordinamento la complessità è quadratica perchè si richiama al peggio n-1 volte il codice?
Spero che qualcuno risponda perchè è molto importante

PM Quote
Avatar
andrea.b89 (Ex-Member)
Pro


Messaggi: 129
Iscritto: 03/03/2009

Segnala al moderatore
Postato alle 1:27
Lunedì, 13/04/2009
Nel codice ci sono diversi errori, come la lettura degli elementi, o l'accesso agli elementi del vettore.
Poi non si capisce bene quale sia lo scopo di pari. Letta così dovrebbe ritornare un valore pari a 1 se tutti gli elementi del vettore sono pari, 0 altrimenti. Ma nel caso il suo scopo fosse proprio questo allora a livello di logica non funziona perchè facendo % 3 nell'if si ottengono 3 possibili risulti : 0 1 2. Un numero risulta pari quando tale operazione da esito 0 oppure 2. Lo si dovrebbe sostituire con % 2.

Ora tralasciando il mero codice del programma e analizzando la funzione, giusta o sbagliata che sia, a mio avviso le risposte alle tue domande sono le seguenti.

1) Si
2) Si
3) Che intendi per "invariante"?
4) La complessità dell'intero programma risulta essere O(n^2) in quanto il secondo for del main presenta complessità O(n). La complessità della funzione pari è O(n) dove n = N perchè al massimo devi eseguire N volte una serie di operazioni di costo costante.
Analizzando matematicamente le 2 funzioni O otterresti O(n*n) = O(n^2)

5) O(n^2) in quanto la complessità resta invariata. Ehm.. scusa la domanda, ma che c'entra poi l'ordinamento? Alla fine per il codice che hai postato l'ordinamento non cambia le cose.

Dato che ciò che ho scritto è frutto di una mia personale analisi effettuata in presenza di alcuni dubbi (mi riferisco alle domande che ti ho fatto sopra) se potessi chiarirmeli sarei in grado di confermare quanto detto, e al massimo di correggermi in caso di errori.

Questo è quanto. Spero di essere stato chiaro e di aiuto. :k:

PM Quote
Avatar
gabama (Normal User)
Rookie


Messaggi: 26
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 10:47
Lunedì, 13/04/2009
Andrea intanto grazie mille per avermi risposto,
-nel ciclo ho postato %3 per avere i multipli di 3,giustamente come hai detto se lo sono tutti o no
-per invariante intendo l' invariante del ciclo della funzione
-per quanto riguarda l' ordinamento hai ragione a dire che non c' entra niente con questo,era solo per non aprire 2 post.....,quindi mi confermi che la complessità è O(n^2) perchè si usa su n-1 elementi?

Grazie ancora
Ciao e Buona Pasquetta!

PM Quote
Avatar
andrea.b89 (Ex-Member)
Pro


Messaggi: 129
Iscritto: 03/03/2009

Segnala al moderatore
Postato alle 11:31
Lunedì, 13/04/2009
Invariante di un ciclo sinceramente è la prima volta che lo sento. Magari lo conosco sotto un altro nome.

Si la complessità è O(n^2) perchè nel caso peggiore nella funzione fa N volte il ciclo e stessa cosa nel secondo for del main e quindi diventerebbe N*N = N^2.
Riguardo all'ordinamento, come ti dicevo non ha senso perchè ci sono diversi metodi di ordinamento, tanto per citarne alcuni BubbleSort, MergeSort, HeapSort ecc, e in base al metodo cambia la complessità, ce ne sono alcuni (ad esempio BubbleSort) che sono O(n^2) altri (ad esempio MergeSort) che sono O(n*logn) quindi la mia domanda è :

vuoi sapere se l'ordinamento influenza le tue operazioni oppure altro?

Poi comunque nel codice ci sono degli  errori nell'accesso al vettore. Se devi verificare se l'elemento i-esimo del vettore è multiplo di 3 allora devi scrivere
Codice sorgente - presumibilmente C/C++

  1. if (a[i] % 3 != 0) ...



stessa cosa quando effettui la letture

Codice sorgente - presumibilmente Plain Text

  1. scanf("%d", &a[i])



e come sopra per quando lo stampi

Codice sorgente - presumibilmente Plain Text

  1. printf("%d\n", a[i])




PM Quote
Avatar
gabama (Normal User)
Rookie


Messaggi: 26
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 12:19
Lunedì, 13/04/2009
ti ringrazio,no volevo solo sapere la complessità dell' ordinamento senza attinenza al codice.
Sto lavorando a un nuovo codice ,più tardi saresti così gentile ancora da darmi alcune conferme?
Grazie ancora ciao!

PM Quote
Avatar
andrea.b89 (Ex-Member)
Pro


Messaggi: 129
Iscritto: 03/03/2009

Segnala al moderatore
Postato alle 12:20
Lunedì, 13/04/2009
si certo nessun problema :k:

PM Quote
Avatar
gabama (Normal User)
Rookie


Messaggi: 26
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 18:16
Lunedì, 13/04/2009
è ancora un codice molto simile al precedente,
main(){
int i=0;int u=1;
int a[N]={3,6,9,10,15};
for(i=0;i<N-1;i++){
if(a%3!=0) u=0;
if(u==0) break;}

-ass. iniziale  ,che u sia = 1
-ass. finale u = 0 o 1
-invariante con i compreso tra 0 o N-1 e u=0 o 1
-complessità O(n)
PROVO A FARE IL DIAGRAMMI A BLOCCHI
a[N]
||
i=0;u=1;
||
i=i+1;
||
test
a%3!=0     SI    print u=0;
||
NO
u=1;
TEST
i=N-1         SI    print u
NO
RICOMINCIA DA SOPRA i=i+1
si può generalizzare che l' asserzione iniziale sono le condizioni necessarie all' inizio e quella finale il "risultato"

Ultima modifica effettuata da gabama il 13/04/2009 alle 18:25
PM Quote
Avatar
andrea.b89 (Ex-Member)
Pro


Messaggi: 129
Iscritto: 03/03/2009

Segnala al moderatore
Postato alle 18:33
Lunedì, 13/04/2009
la domanda sarebbe?

PM Quote
Avatar
gabama (Normal User)
Rookie


Messaggi: 26
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 18:38
Lunedì, 13/04/2009
semplicemente se è tutto ok,o se ho detto stupidaggini

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo