AldoBaldo ha scritto:
M2, tieni sempre presente che ho imparato per i fatti miei, quindi sono come "un'isola nell'oceano".
Comunque sarebbe anche interessante capire perché li trovi illeggibili... Volendo ne posso fare l'analisi riga per riga, e in ciascuna riga c'è un perché (e un come) univoco, dunque esplicito.
A mia volta sto sviluppando un mio programma, non che abbia tantissimo tempo in questo momento.
comunque...
quando scrivo che è illeggibile, intendo che è "scritto da-cani-dilettanti-hobbysti", non che non si comprende, è banale.
Le variabili dal nome "strano" (ridotto ad una sigla,
Sono oggettivamente illeggibili.
Così lascia perdere l'uso del case (notazione simil-ungherese modificata).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define QMV 1000 // QMW: quantita' massima di valori
Nessuno saprà mai cos'è QMW all'interno di un sorgente non banale come questo.
Il commento che hai messo è inutile
void presentazione( void );
void notifica_esito( int **a, int *buff, int qEl, int qUni );
void libera_memoria_dinamica( int **a, int *buff, int qEl );
1) i prototipi delle funzioni sono inutili in questo caso, basta mettere il main in fondo
2) i nomi dei parametri sono incomprensibili
3) non si capisce se sono parametri di input, di output, o entrambi
4) qEl (del tutto impossibile capire cos'è) può essere benissimo UNSIGNED (anzi, dovrebbe esserlo)
int main() {
int qEl; // qEl: quantita' di elementi nell'array a[]
int qUni; // qUni: quantita' dei valori univoci nell'array a[]
int *a[QMV]; // l'array dei puntatori richiesti
int x;
come detto sopra non si capisce assolutamente cosa siano queste variabili, e cosa facciano
memset( a, 0, QMV*sizeof(*a) ); // azzera l'array
A cosa dovrebbe servire? Stiamo forse parlando di stringhe null terminate?
Mi serve sapere se gli elementi sono a zero, oppure no?
Mi servirebbero se, ad esempio, facessi un "distruttore" che elabora tutte le righe non vuote.
Ma se mantengo il numero degli elementi, e l'array è quindi compreso strettamente tra [0...fine] allora
è inutile
do {
printf( "Immetti un valore: " );
scanf( "%d", &x );
cosa sarà mai x? e perchè è definito intero?
Se vogliamo darci alla "storia" allora le variabili intere NON si chiamano X (che sono i float).
è una derivazione delle consuetudini di default FORTRAN
if( x >= 0 ) {
int i, gp; // gp: gia' presente
for( gp=0, i=0; i<qEl && !gp; ++i )
gp = ( *(a[i]) == x ) && ( a[i] != &x );
Cosa fa questa porzione di codice?
E, tral'altro, perchè i salta fuori dentro un ciclo (do in questo caso) ?
Siamo sicuri di essere certi della priorità degli operatori nella condizione del ciclo for?
A che serve ++i (se non per le seghe mentali rispetto a presunte ottimizzazioni rispetto a i++)
... per il resto controllo, poi edito
if( !gp ) {
a[qEl] = malloc( sizeof(*a[qEl]) );
if( NULL != a[qEl] ) {
*a[qEl] = x;
++qUni;
++qEl;
}
else {
printf( "\nAllocazione della memoria fallita!\n\n" );
for( --qEl; qEl>=0; --qEl ) {
if( a[qEl] != &x )
free( a[qEl] );
a[qEl] = NULL;
}
break;
}
}
else {
// di questa operazione proprio non capisco il senso,
// ma e' questo che sembra richiedere l'esercizio!!!
a[qEl] = &x;
++qEl;
}
}
} while( x >= 0 && qEl<QMV );
notifica_esito( a, &x, qEl, qUni );
libera_memoria_dinamica( a, &x, qEl );
printf( "Premi \"invio\" per lasciare il programma... " );
getchar();
return 0;
}
void presentazione( void ) {
printf( "Immissione dei dati.\n" );
printf( "Immetti una serie di massimo %d valori interi positivi.\n", QMV );
printf( "Per terminare l'immissione, immetti un valore intero negativo." );
printf( "\n\n" );
}
void notifica_esito( int **a, int *buff, int qEl, int qUni ) {
int i;
if( qEl >= 0 ) {
printf( qUni!=1 ? "\nSono stati immessi" : "\nE' stato immesso" );
printf( " nell'array %d ", qUni );
printf( "valor%c univoc%c", qUni!=1?'i':'e', qUni!=1?'i':'o' );
printf( "%c\n\n", qUni>0?':':'.' );
}
else {
printf( "S'e' verificato un errore, ");
printf( "l'immissione non e' significativa.\n\n" );
}
for( i=0; i<qEl; ++i ) {
if( a
!= buff )
printf( "%d%s", *(a), i!=qEl-1?" ":"\n\n" );
else printf( i!=qEl-1 ? "" : "\n\n" );
}
}
void libera_memoria_dinamica( int **a, int *buff, int qEl ) {
int i;
for( i=0; i<qEl; ++i ) {
if( a != buff ) {
free( a ); // questa punta a una variabile allocata dinamicamente
a = NULL; // superfluo in questo caso, ma ci sta sempre bene
}
}
}
[/code][/quote]