Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

[C] Conferme esercizio su vettori

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] [C] Conferme esercizio su vettori

Messaggioda Foto Utentetecfil » 26 ago 2013, 22:18

Ciao a tutti!

Anche oggi sono qui con un nuovo esercizio in C :mrgreen: L'esercizio mi è "riuscito", metto le virgolette perché non credo proprio di aver utilizzato un metodo corretto, quindi vorrei chiedere a voi una conferma.

Testo esercizio:
Si sviluppi un programma in linguaggio C che riceva in ingresso due vettori, IN1 e IN2, di 10 elementi interi maggiori di zero. Si supponga che i vettori siano inseriti dall’utente in ordine crescente e che non contengano elementi ripetuti (i due vettori possono pero’ avere elementi in comune). Il programma deve creare e stampare un terzo vettore OUT di 20 elementi interi, ordinato in senso crescente, che includa tutti gli elementi di IN1 e IN2 senza ripetizioni (gli eventuali elementi non utilizzati di OUT devono essere posti a zero).

Ad esempio:
IN1: 2 5 9 14 15 20 25 27 30 32
IN2: 3 5 10 11 12 22 23 25 26 27
OUT: 2 3 5 9 10 11 12 14 15 20 22 23 25 26 27 30 32 0 0 0


Ecco il mio codice:
Codice: Seleziona tutto
#include <stdio.h>
#include <string.h>
#define DIM1 10
#define DIM2 20
int main ()
{
    int IN1[DIM1], IN2[DIM1], IN3[DIM2], zeri=0;
    int i,j, temp;
   
    printf("Riempi il primo vettore con %d numeri maggiori di zero in ordine crescente:\n", DIM1);
    for (i=0;i<DIM1;i++)
    {
        scanf("%d", &IN1[i]);
        if (IN1[i]<0)
        i--;
       
    }
    printf("Riempi il secondo vettore con %d numeri maggiori di zero in ordine crescente:\n", DIM1);
    for (i=0;i<DIM1;i++)
    {
        scanf("%d", &IN2[i]);
        if (IN2[i]<0)
        i--;
    }


    printf("\nEcco il vettore prima di essere ordinato:\n");
    for (i=0;i<DIM1;i++)
    {
        IN3[i]=IN1[i];
        printf("%4d", IN3[i]);
    }
    for (i=0;i<DIM1;i++)
    {
        IN3[i+DIM1]=IN2[i];
        printf("%4d", IN3[i+DIM1]);
    }

    for(i=1;i<DIM2;i++)
    {
        for(j=0;j<i;j++)
        {
            if (IN3[i]<IN3[j])
            {
                temp=IN3[i];
                IN3[i]=IN3[j];
                IN3[j]=temp;
            }
            if (IN3[i]==IN3[j])
            {
                IN3[i]=0;
                zeri++;
            }
        }   
    }
    printf("\nEcco il vettore dopo averlo ordinato:\n");
    for (i=0;i<DIM2;i++)
    {       
        if (IN3[i]!=0)
        {
            printf("%4d", IN3[i]);
        }
    }

    for (i=0;i<zeri;i++)
    {
        printf("   0");
    }
   
    return 0;
}


Qui ho messo l'if in modo da verificare che i numeri inseriti siano maggiori di zero.
Codice: Seleziona tutto
    for (i=0;i<DIM1;i++)
    {
        scanf("%d", &IN1[i]);
        if (IN1[i]<0)
        i--;
       
    }


Questo ciclo serve per copiare in un unico vettore chiamato IN3 il contenuto di IN1 e IN2.
Codice: Seleziona tutto
    for (i=0;i<DIM1;i++)
    {
        IN3[i]=IN1[i];
        printf("%4d", IN3[i]);
    }
    for (i=0;i<DIM1;i++)
    {
        IN3[i+DIM1]=IN2[i];
        printf("%4d", IN3[i+DIM1]);
    }


La parte che mi convince meno di tutte è l'ultima, la stampa degli zeri. Non riesco a capire come spostare tutti gli zeri in fondo al vettore. Sostituire al doppione lo zero l'ho fatto, però non credo che l'unico metodo per stampare gli zeri in fondo sia utilizzare un semplice printf :roll:

Grazie mille in anticipo!
Ciaoo :-)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

0
voti

[2] Re: [C] Conferme esercizio su vettori

Messaggioda Foto Utentesimo85 » 27 ago 2013, 3:18

È tardi peró dopo un primo sguardo scrivo un paio di opinioni.

La verifica degli input maggiori di zero puoi farla incrementando l'indice solo se appunto il valore è maggiore di zero, non incrementando la variabile di indice "i" e poi decrementarla successivamente.

Invece di stampare gli array con 2 cicli for, puoi usare solo un ciclo e stampi i due array usando la tabulazione con "\t" nell' argomento della printf.

Tutto questo per risparmiare bit ed istruzioni. :D

Ultima osservazione, è sempre bene dare un nome sensato alle variabili. Non a, b, c ... i, j ... etc.
È una brutta abitudine a cui spesso e volentieri si da poca importanza. :(
Nei semplici esempi da pochissime righe di codice può andar bene, ma nei programmi più complessi e corposi, rendono il codice difficile e pesante da seguire.

Non ho provato il codice. Se non lo hai ancora fatto o non li conosci, ti consiglio anche di dare una occhiata ai vari algoritmi di ordinamento (Bubble Sort, Merge Sort, Quick Sort etc.). Questo non toglie che una implementazione fai-da-te serve moltissimo nell' abilità di implementare gli algoritmi, ovviamente.

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: [C] Conferme esercizio su vettori

Messaggioda Foto Utentetecfil » 27 ago 2013, 9:36

Ciao!

Grazie per la risposta! Il programma funziona, però mi convince poco il metodo che ho utilizzato per stampare gli zeri in fondo al vettore. Penso che il metodo sia un po' alla buona :mrgreen:, quello che non riesco a capire è come fare ad eliminare un elemento dal vettore, scalare tutto il vettore di una posizione, e riempire lo spazio a fine vettore con lo 0.

La bubble sort non l'ho utilizzata perché il codice devo scriverlo su foglio a mano :mrgreen: con il ciclo for in teoria ho risparmiato qualche riga :mrgreen:

Grazie
Ciao :-)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

2
voti

[4] Re: [C] Conferme esercizio su vettori

Messaggioda Foto Utentesimo85 » 27 ago 2013, 10:38

No, il metodo degli zeri non va bene.
Il testo del problema chiede di azzerare gli elementi, non di stamparli in quella maniera :!:

Si tratta di:

  • 1) Azzerare inizialmente tutti gli elementi dell' array da 20 elementi.
  • 2) Assegnare i valori all' array OUT secondo il procedimento richiesto. Se per esempio gli elementi degli array IN da 10 elementi hanno l' indice #5 dello stesso valore, riempi solo UN elemento dell' array OUT da 20 elementi, in questo caso l' elemento #5, passando il controllo a IN[6] e lavorando su OUT[6] ed eventualmente su OUT[7], e cosi via..
  • 3) Ordinare l'array OUT.
  • 4) Stampare l'array.

EDIT: modificato il punto # 2.

Spero di essermi spiegato bene sul punto 2.
O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[5] Re: [C] Conferme esercizio su vettori

Messaggioda Foto Utentetecfil » 27 ago 2013, 16:05

Ciao!

E' da ore che ci riprovo ma non riesco a venirne a capo ||O ||O

Ho riscritto il codice:
Codice: Seleziona tutto
#include <stdio.h>
#define DIM1 10
#define DIM2 20
int main ()
{
    int IN1[DIM1], IN2[DIM1], IN3[DIM2], OUT[DIM2], s=0;
    int i,j, temp;
   
    printf("Riempi il primo vettore con %d numeri maggiori di zero in ordine crescente:\n", DIM1);
    for (i=0;i<DIM1;i++)
    {
        scanf("%d", &IN1[i]);
        if (IN1[i]<0)
        i--;
       
    }
    printf("Riempi il secondo vettore con %d numeri maggiori di zero in ordine crescente:\n", DIM1);
    for (i=0;i<DIM1;i++)
    {
        scanf("%d", &IN2[i]);
        if (IN2[i]<0)
        i--;
    }

    for (i=0;i<DIM2;i++)
    OUT[i]=0;
   
    for (i=0;i<DIM1;i++)
    {
        for (j=0;i<DIM1;i++)
        {
            if (IN1[i]!=IN2[j])
            {
                OUT[s]=IN1[i];
                s++;
            }
            if (IN1[i]==IN2[j])
            {
                break;
            }
        }
    }
    for (i=0;i<DIM1;i++)
    {
        OUT[s]=IN2[i];
        s++;
    }



   
   
    printf("\nEcco il vettore dopo averlo ordinato:\n");
    for (i=0;i<DIM2;i++)
    {
        printf("%4d", OUT[i]);
    }
   
    return 0;
}


Ho provato a seguire il tuo metodo, quindi ho chiamato un vettore di dimensione 20: OUT[20], e ho posto tutti gli elementi all'interno del vettore uguali a zero.

Fatto questo ho creato un ciclo che confronta se l'elemento di IN1[i] è diverso da tutti gli elementi di IN2[j]. Se l'elemento è diverso allora viene salvato nel vettore OUT, altrimenti passo ad un nuovo numero.

Fatto questo avrò salvato solamente i numeri del primo vettore che sono diversi dal secondo, quindi con un altro ciclo for vado ad aggiungere tutti gli altri numeri del secondo vettore.

Quello che non capisco è come mai mi vengono salvati tutti i numeri con anche i doppioni.

La mia idea era quella di salvare prima tutti i numeri del primo vettore, aggiungere quindi gli elementi del secondo vettore (che saranno unici in quanto i doppioni del primo non li ho salvati) e poi ordinare il vettore finale OUT tenendo in fondo gli zeri!

Grazie
Ciaoo :)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

0
voti

[6] Re: [C] Conferme esercizio su vettori

Messaggioda Foto Utentesimo85 » 27 ago 2013, 16:19

tecfil ha scritto:La mia idea era quella di salvare prima tutti i numeri del primo vettore, aggiungere quindi gli elementi del secondo vettore (che saranno unici in quanto i doppioni del primo non li ho salvati) e poi ordinare il vettore finale OUT tenendo in fondo gli zeri!


Attenzione, vedi che poco prima che tu aggiungessi la risposta ho modificato il messaggio # 4.

In un primo ciclo tu devi comparare i valori dei due array IN, riempire così l'array OUT tenendo traccia del suo indice di riempimento, e successivamente ordinare sempre l'array OUT.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[7] Re: [C] Conferme esercizio su vettori

Messaggioda Foto Utentetecfil » 27 ago 2013, 16:33

Ciao!

Grazie per la risposta. Ho provato a farlo con questo codice ma non funziona:
Codice: Seleziona tutto
    for (i=0;i<DIM2;i++)
    {
        OUT[i]=0;
    }
   
    for (i=0;i<DIM1;i++)
    {
        for (j=0;j<DIM2;j++)
        {
            if (IN1[i]!=IN2[j])
            {
                OUT[s]=IN1[i];
                s++;
            }
        }
    }
    for (i=0;i<DIM2;i++)
    {
        OUT[s]=IN2[i];
        s++;
    }


Nel primo pezzo pongo tutti gli elementi del vettore OUT a zero.
Codice: Seleziona tutto
    for (i=0;i<DIM2;i++)
    {
        OUT[i]=0;
    }

Vado quindi ad inserire nel vettore OUT solamente gli elementi del vettore 1 che sono diversi da quelli presenti nel vettore 2
Codice: Seleziona tutto
    for (i=0;i<DIM1;i++)
    {
        for (j=0;j<DIM2;j++)
        {
            if (IN1[i]!=IN2[j])
            {
                OUT[s]=IN1[i];
                s++;
            }
        }
    }

In questo modo se ho qualche numero uguale allora non lo salvo. Incremento la variabile s solamente quando aggiungo un numero nel vettore OUT.

Fatto questo vado ad aggiungere tutti i numeri del vettore 2 in OUT, così completo il vettore:
Codice: Seleziona tutto
    for (i=0;i<DIM2;i++)
    {
        OUT[s]=IN2[i];
        s++;
    }


Ora mi manca solo da ordinare il vettore, però fino a qua non riesco a far funzionare il codice.

Grazie
Ciaoo :-)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

1
voti

[8] Re: [C] Conferme esercizio su vettori

Messaggioda Foto UtenteDirtyDeeds » 27 ago 2013, 16:48

tecfil ha scritto:Nel primo pezzo pongo tutti gli elementi del vettore OUT a zero.


Non conviene farlo così, basta fare un'inizializzazione nella dichiarazione:

Codice: Seleziona tutto
int OUT[DIM2] = { 0 };


Poi ci sono altre cose che non vanno, anche nel codice in [1], appena riesco le scrivo.
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

0
voti

[9] Re: [C] Conferme esercizio su vettori

Messaggioda Foto Utentetecfil » 27 ago 2013, 16:51

Ciao!

Grazie mille, il codice in [1] l'ho riscritto dopo in [3] perché effettivamente non andava bene il metodo utilizzato!

Grazie
Ciao :)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

1
voti

[10] Re: [C] Conferme esercizio su vettori

Messaggioda Foto Utentesimo85 » 27 ago 2013, 16:52

Ciao Foto Utentetecfil,

Mi sono permesso di modificare leggermente il tuo codice, senza ordinare l' array.

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
   
#define DIM1 10
#define DIM2 20
   
int main (void)
{
   int IN1[DIM1] = {0}, IN2[DIM1] = {0}, OUT[DIM2] = {0};
   int indexIn = 0, indexOut = 0;
       
   printf("Fill the 1st array:\n");
   while(indexIn < DIM1)
   {
      scanf("%d", &IN1[indexIn]);

      if(IN1[indexIn] < 0)
            indexIn++;
   }
       
   indexIn = 0;
       
   printf("Fill the 2nd array:\n");
   while(indexIn < DIM1)
   {
      scanf("%d", &IN2[indexIn]);
           
      if(IN2[indexIn] < 0)
         indexIn++;
   }
       
   indexIn = indexOut = 0;
       
   while(indexIn < DIM1)
   {
      if(IN1[indexIn] < IN2[indexIn])
      {
         OUT[indexOut] = IN1[indexIn];
         OUT[indexOut + 1] = IN2[indexIn];
               
         indexOut += 2;
      }
      else if(IN1[indexIn] > IN2[indexIn])
      {
         OUT[indexOut] = IN2[indexIn];
         OUT[indexOut + 1] = IN1[indexIn];
               
         indexOut += 2;
      }
      else if(IN1[indexIn] == IN2[indexIn])
      {
         OUT[indexOut] = IN1[indexIn];
                   
         indexOut += 1;
      }
           
      indexIn++;
   }
       
   indexOut = 0;
       
   while(indexOut < DIM2)
      printf("OUT[%.2d] = %.2d\n", indexOut, OUT[indexOut]);           
   
   exit(0);
}


Essendo privo di compilatore, l'ho scritto a mano senza provarlo. :oops:
Spero funzioni.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 30 ospiti