Linguaggio C - Vettori

di il
9 risposte

Linguaggio C - Vettori

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100
int main(){
    /*Dato un vettore di 100 elementi generati casualmente, scrivere un programma
    che permetta all’utente di inserire un numero e di azzerare tutte le celle del vettore
    il cui numero è suo multiplo. Il programma dovrà terminare quando tutti gli elementi
    del vettore saranno pari a zero comunicando il numero di inserimenti effettuati
    dall’utente. Il programma dovrà inoltre mantenere uno storico, ovvero dovrà permettere di visualizzare
    quali celle sono state azzerate per ogni singolo inserimento dell’utente. */
    int vettore[MAX];
    int choice, i, modulo;
    srand(time(NULL));

    /**Inserimento valori casuali**/
    for(i=0; i<100; i++){
        vettore[i]=rand()%100;
        printf("\n#%d NUMERO = %d", i, vettore[i]);
    }
    /**Eliminazione dei multipli**/
    for (i=0; ; i++){
    printf("\nInserire numero da 1 a 10 di cui cancellare i multipli: ");
    scanf("%d", &choice);
        switch (choice){
            case 1:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%1;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
            case 2:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%2;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
            case 3:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%3;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            case 4:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%4;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
                case 5:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%5;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
            case 6:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%6;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
            case 7:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%7;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
            case 8:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%8;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
            case 9:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%9;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
            case 10:
                for (i=0; i<101; i++){
                    modulo=vettore[i]%10;
                    if (modulo!=0){
                        printf("\n#%d NUMERO = %d", i, vettore[i]);
                    }
                }
            break;
        }
    }
    return 0;
}
Il programma funziona ma non capisco come fare in modo che il ciclo continui finchè tutti i valori del vettore siano uguali a 0

9 Risposte

  • Re: Linguaggio C - Vettori

    Invece del for:
    for (i=0; ; i++){}
    Inserirei un while infinito, tipo così:
    
    while(1){}
    Alla fine del while ogni volta controlli, con un nuovo for, se tutti gli elementi sono zero, se lo sono metti un bel break uscendo così dal while infinito.
  • Re: Linguaggio C - Vettori

    CarDeFusco ha scritto:


    Invece del for:
    for (i=0; ; i++){}
    Inserirei un while infinito, tipo così:
    
    while(1){}
    Alla fine del while ogni volta controlli, con un nuovo for, se tutti gli elementi sono zero, se lo sono metti un bel break uscendo così dal while infinito.
    Starò sbagliando sicuramente ma il for così?
    for (i=0; i<101; i++){
                if(vettore[i]==0);
                break;
              }
                
  • Re: Linguaggio C - Vettori

    Danielee ha scritto:



    Starò sbagliando sicuramente ma il for così?
    for (i=0; i<101; i++){
                if(vettore[i]==0);
                break;
              }
                
    E' palesemente sbagliato. Così basta che almeno uno è zero ed esci dal while. Tu invece dei controllare che tutti siano zero. E' molto banale farlo e ci sono svariati modi, basta ragionarci un po'.
  • Re: Linguaggio C - Vettori

    CarDeFusco ha scritto:


    Danielee ha scritto:



    Starò sbagliando sicuramente ma il for così?
    for (i=0; i<101; i++){
                if(vettore[i]==0);
                break;
              }
                
    E' palesemente sbagliato. Così basta che almeno uno è zero ed esci dal while. Tu invece dei controllare che tutti siano zero. E' molto banale farlo e ci sono svariati modi, basta ragionarci un po'.
    Non so, non mi viene in mente come potrei verificare con un for che tutti i valori del vettore siano 0...scusa l'ignoranza ma programmo da poco
  • Re: Linguaggio C - Vettori

    Danielee ha scritto:


    CarDeFusco ha scritto:


    Danielee ha scritto:



    Starò sbagliando sicuramente ma il for così?
    for (i=0; i<101; i++){
                if(vettore[i]==0);
                break;
              }
                
    E' palesemente sbagliato. Così basta che almeno uno è zero ed esci dal while. Tu invece dei controllare che tutti siano zero. E' molto banale farlo e ci sono svariati modi, basta ragionarci un po'.
    Non so, non mi viene in mente come potrei verificare con un for che tutti i valori del vettore siano 0...scusa l'ignoranza ma programmo da poco
    Non è questione di programmare da poco o da tanto, basta solo usare un po' di logica. Ad esempio, un suggerimento, pensa a quanto fa la somma di tutti gli elementi in un vettore se questi sono tutti zero
  • Re: Linguaggio C - Vettori

    Potresti anche crearti una variabile "booleana" inizializzata ad un valore "vero" (es: 1) e mettendola ad un valore falso (0) nel momento in cui incontri il primo numero diverso da zero. All'uscita del ciclo puoi controllare questa variabile per sapere cosa c'era dentro al tuo array.

    Inoltre vorrei farti riflettere sul tuo codice: come vedi c'è una ripetizione abbastanza evidente fra i vari "case", in cui l'unica cosa che cambia è il numero che stai controllando. Visto che questo numero lo conosci (è "choice"), ti viene in mente qualcosa per fattorizzare tutti i casi specifici in un unico caso più generico?
  • Re: Linguaggio C - Vettori

    CarDeFusco ha scritto:


    Danielee ha scritto:


    CarDeFusco ha scritto:



    E' palesemente sbagliato. Così basta che almeno uno è zero ed esci dal while. Tu invece dei controllare che tutti siano zero. E' molto banale farlo e ci sono svariati modi, basta ragionarci un po'.
    Non so, non mi viene in mente come potrei verificare con un for che tutti i valori del vettore siano 0...scusa l'ignoranza ma programmo da poco
    Non è questione di programmare da poco o da tanto, basta solo usare un po' di logica. Ad esempio, un suggerimento, pensa a quanto fa la somma di tutti gli elementi in un vettore se questi sono tutti zero
    
    for (i=0; i<101; i++){
                somma_vettori+=vettore[i];
    }
    if(somma_vettori==0)
                break;
    

    Della ha scritto:


    Inoltre vorrei farti riflettere sul tuo codice: come vedi c'è una ripetizione abbastanza evidente fra i vari "case", in cui l'unica cosa che cambia è il numero che stai controllando. Visto che questo numero lo conosci (è "choice"), ti viene in mente qualcosa per fattorizzare tutti i casi specifici in un unico caso più generico?
    Sisi ci avevo gia pensato ma volevo prima risolvere il problema detto sopra, ora penso a risolvere anche questo
  • Re: Linguaggio C - Vettori

    Vedo che hai seguito il mio suggerimento, bravo.
  • Re: Linguaggio C - Vettori

    /*
    Dato un vettore di 100 elementi generati casualmente, scrivere un programma
    che permetta all’utente di inserire un numero e di azzerare tutte le celle
    il cui numero è suo multiplo. Il programma dovrà terminare quando tutti gli
    elementi del vettore saranno pari a zero comunicando il numero di inserimenti
    effettuati dall’utente. Il programma dovrà inoltre mantenere uno storico,
    ovvero dovrà permettere di visualizzare quali celle sono state azzerate per
    ogni singolo inserimento dell’utente.
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define MAX 10
    
    int main(){
    
        int vettore[MAX], storico[MAX], j=0;
        bool isEmpty = false;
        int choice;
        srand(time(NULL));
    
        //Inserimento valori casuali
        for(int i=0; i<MAX; i++){
            vettore[i] = rand() % 100;
            printf("\n#%d NUMERO = %d", i, vettore[i]);
        }
    
        //Eliminazione dei multipli
        while(!isEmpty){
            printf("\nInserire numero da 1 a 10 di cui cancellare i multipli: ");
            scanf("%d", &choice);
            //controlla se il numero inserito è compreso tra 1 e 10
    	if (choice > 0 && choice <= 10){
    		//scorre il vettore
    		for(int i=0; i<MAX; i++){
    			//se l'elemento del vettore non è zero
    			if(vettore[i]!=0){
    				//calcola il modulo per controllare se choice è modulo dell'elemento del vettore
    				if(vettore[i]%choice == 0){
    					//memorizza in un vettore storico l'elemento di vettore[] in questione
    					storico[j]=vettore[i];
    					//incrementa l'indice dello storico
    					j++;
    					//azzera elemento
    					vettore[i]=0;
    				}
    			}
    		}
    	} else {
    		printf("\nSono accettati solamente i numeri tra 1 e 10.\n");
    	}
    	
    	//controlla se il vettore è tutto azzerato
    	isEmpty=true;
    	for(int i=0; i<MAX; i++){
    		if(vettore[i]!=0) isEmpty = false;
    	}
        }
    
        //stampa vettore vuoto
        printf("\nVettore vuoto:");
        for(int i=0; i<MAX; i++){
    	printf("\n#%d NUMERO = %d", i, vettore[i]);
        }
        //stampa storico
        printf("\nVettore storico:");
        for(int i=0; i<j; i++){
    	printf("\n#%d NUMERO = %d", i, storico[i]);
        }
        return 0;
    }
    Ciao, io risolverei così.
    (nb: ho semplificato la parte dello storico per velocizzare)
Devi accedere o registrarti per scrivere nel forum
9 risposte