Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Buzzz
    Registrato dal
    Jan 2009
    Messaggi
    775

    [C] - Puntatori, ordine decrescente



    devo fare un piccolo programma per scuola, dove preso in ingresso un vettore (di dimensione definita dall'utente).. devo, con l'utilizzo dei soli puntatori (quindi no vettori), ordinare il vettore in ordine decrescente e calcolare la frequenza (il numero di volte) che un determinato numero è stato insterito..

    io il programma l'ho fatto con i vettori, poi ho provato a convertirlo con i puntatori.. non da errori, quindi lo compila, però la funzione dell'ordinamento decrescente e della frequenza non funzionano..

    qualcuno può aiutarmi?

    codice:
    /*
    Ongaro Samuele
    */
    
    #include <stdio.h>
    
    //inserisci i valori nel vettore
    int insVett(int *dati,int l){
    	int i,num;
    	for(i=0;i<l;i++){
    		printf("Inserisci un numero %d di %d: ",i+1,l);
    		scanf("%d",& num);
    		*dati++=num;
    	}
    }
    
    //visualizza vettore
    int visVett(int *dati,int l){
    	int i;
    	for(i=0;i<l;i++){
    		printf(" %d ",*dati);
    		*dati++;
    	}
    }
    
    //ordina i valori in modo Decrescente (TOGLIERE RIPETIZIONI)
    int ordinaVettDec(int *dati,int lung){
    	int scambio=1,i,app;
    	while(scambio){
    		scambio=0;
    		for(i=0;i<lung-1;i++){
    			if(*dati<*dati){
    				app=*dati;
    				*dati=*dati++;
    				*dati++=app;
    				scambio=1;
    			}
    		}
    	}
    }
    
    //numero con maggior frequenza (TOGLIERE RIPETIZIONI)
    int frequenza(int *dati,int lung){
    	int i,k,cont=0;
    	for(i=0;i<lung;i++){
    		cont=0;
    		for(k=0;k<lung;k++){
    			if(dati[i]==dati[k]){
    				cont++;
    			}
    		}
    		printf("\nIl valore %d e' stato inserito %d volte.",dati[i],cont);
    	}
    }
    
    int main(){
    	int lung1=0,test=-1,scelta;
    	
    	//while(lung1<=50){
    		printf("Inserisci il numero di valori da inserire: ");
    		scanf("%d",&lung1);
    	//}
    	int vett1[lung1];
    	
    	insVett(vett1,lung1);
    	
    	while(test!=0){
    		printf("\n1- Ordine Decrescente;");
    		printf("\n2- Frequenza;");
    		printf("\n0- Esci;");
    		printf("\nScelta: ");
    		scanf("%d",&scelta);
    		
    		switch(scelta){
    			case 1:{
    				printf("\nOrdine Decrescente:\n");
    				ordinaVettDec(vett1,lung1);
    				visVett(vett1,lung1);
    				printf("\n");
    				break;
    			}
    			case 2:{
    				frequenza(vett1,lung1);
    				printf("\n");
    				break;
                		}
                		case 0:{
                    		test=0;
                    		break;
                		}
            	}
        	}
        	getchar();
    }
    Grazie mille,

  2. #2
    codice:
    //ordina i valori in modo Decrescente (TOGLIERE RIPETIZIONI)
    int ordinaVettDec(int *dati,int lung){
    	int scambio=1,i,app;
    	while(scambio){
    		scambio=0;
    		for(i=0;i<lung-1;i++){
    			if(*dati<*dati){  // sempre falso
    				app=*dati;
    				*dati=*dati++;
    				*dati++=app;
    				scambio=1;
    			}
    		}
    	}
    }

  3. #3
    Utente di HTML.it L'avatar di Buzzz
    Registrato dal
    Jan 2009
    Messaggi
    775
    Grazie per la risposta, però non funziona..
    cioè compila, però non mi ordina i valori in modo decrescente.. ><

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma questa if

    if(*dati<*dati){

    come ti ha fatto notare clynamen, come l'hai corretta?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di Buzzz
    Registrato dal
    Jan 2009
    Messaggi
    775
    Ho provato con:

    if(*dati<*dati[i+1])

    però da errore, quindi ho provato in logica a fare:

    codice:
    //ordina i valori in modo Decrescente (TOGLIERE RIPETIZIONI)
    int ordinaVettDec(int *dati,int lung){
    	int scambio=1,i,app;
    	while(scambio){
    		scambio=0;
    		for(i=0;i<lung-1;i++){
    			if(*dati<*dati++){  // sempre falso
    				app=*dati;
    				*dati=*dati++;
    				*dati++=app;
    				scambio=1;
    			}
    		}
    	}
    }
    nessun errore, però non funziona l'ordinamento.. ><
    non saprei in che altro modo fare, per incrementare il puntatore di uno.. ho provato anche con due puntatori, assegnando:

    P1=dati[i];
    P2=dati[i+1];

    ma non funziona..

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    No ... devi scrivere

    codice:
      if(*(dati+i)<*(dati+i+1))
      {
          app=*(dati+i);
          *(dati+i)=*(dati+i+1);
          *(dati+i+1)=app;
          scambio=1;
      }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di Buzzz
    Registrato dal
    Jan 2009
    Messaggi
    775
    Perfetto! Grazie mille oregon..

    ultima cosa.. nella funzione frequenza, come posso togliere le ripetizioni?
    cioè, se il mio vettore è:

    [ 4 ] [ 5 ] [ 4 ] [ 1 ] [ 2 ]

    come output, avrò:

    il valore 4 è stato inserito 2 volte.
    il valore 5 è stato inserito 1 volte.
    il valore 4 è stato inserito 2 volte.
    il valore 1 è stato inserito 1 volte.
    il valore 2 è stato inserito 1 volte.

    come posso togliere quella ripetizione del 4?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Utilizza due vettori ausiliari. Nel primo aggiungi il numero e nel secondo le ripetizioni. Ma aggiungilo solo se non presente. Ad esempio usa

    num[lung1] e rip[lung1]

    azzerandoli all'inizio.

    Poi, quando trovi che il valore 4 è stato ripetuto 2 volte, cerca in num il valore 4 e se non lo trovi, aggiungilo in num e aggiungi il 2 in rip ... ovviamente se lo trovi non aggiungerlo.

    Alla fine potrai visualizzare num e rip in cui ci saranno le frequenze dei valori non ripetuti ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.