Newsgroup: it.comp.lang.c
Titolo: Esercizietto su array

Saluti a tutti.
Non riesco a svolgere un banale esercizietto sui vettori.
Vorrei copiare gli elementi del vettore w[] in v[], senza pero' ripeterli.
Ad esempio se w[10]={1,2,3,4,3,2,3,4,0,7} allora v[]={1,2,3,4,0,7}
Provo e riprovo, ma non riesco. Sotto una delle varie prove, ovviamente 
non funziona... Il secondo ciclo vorrebbe controllare che lo stesso 
numero non sia gia' stato scritto in v[] .
Grazie
#include <stdio.h>
int main(void) {
     int i,j=0,w[10]={1,2,3,4,3,2,3,4,0,3},v[10] ;
     int k=1;
     v[0]=w[0];
     for (i=1; i<10; i++)
         for (j=0; j<k; j++)
         if(w[i]!=v[j])
		v[k++]=w[i];
            for(i=0;i<k;i++)
            printf("%d",v[i]);
return(1);
}

 Ad esempio se w[10]={1,2,3,4,3,2,3,4,0,7} allora v[]={1,2,3,4,0,7}
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int w[10]={1,2,3,4,3,2,3,4,0,7};
    int v[10]={0};
    size_t vlen=0;
    size_t wlen=sizeof(w)/sizeof(w[0]);
    int i;
    for (i=0; i<wlen; i++) {
        int j, found=0;
        for (j=0; j<vlen; j++) {
            if (v[j] == w[i]) {
               found=1;
               break;
            }
        }
        if (!found)
          v[vlen++] = w[i];
    }
    printf("v[] = {");
    for (i=0; i<vlen; i++) {
       printf("%d", v[i]);
       if (i < vlen-1)
         printf(",");
    }
    printf("}n");
    return 0;
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Samba ha scritto:

io sono assai piï¿œ prolisso...(a favore della comprensibilitï¿œ) inoltre il
mio compilatore inizializza a 0 gli array di interi non definiti quindi
mi serve un valore di "non utilizzo".
Premesso ciï¿œ io avrei fatto una cosa tipo:
#include <stdio.h>
#define LEN 10
#define NOT_VALUE 999
int contiene(int arr[], int val, int len);
void array_dump(int arr[], int len);
void init_array(int arr[], int len);
int main(int argc, char** argv)
{
  int i,j=0,w[LEN]={1,2,3,4,3,2,3,4,0,7},v[LEN];
  init_array(v,LEN);
  for(i=0;i<LEN;i++)
  {
    if(!contiene(v,w[i],LEN))
    {
      v[j++] = w[i];
    }
  }
  array_dump(v,j);
  return 0;
}
int contiene(int arr[], int val, int len)
{
  int i = 0;
  for(i=0;i<len;i++)
  {
    if(arr[i] == val)
      return 1;
  }
  return 0;
}
void array_dump(int arr[], int len)
{
  int i = 0;
  for(i=0;i<len;i++)
  {
    printf("Posizione%d\tElemento:%d\n",i,arr[i]);
  }
}
void init_array(int arr[], int len)
{
  int i = 0;
  for(i=0;i<len;i++)
  {
    arr[i] = NOT_VALUE;
  }
}


Se i valori sono compresi tra 0 e N, con N numero accetabilmente
piccolo, puoi anche usare un'array di appoggio eliminando un ciclo
innestato di controllo (facendo quindi un solo for):
#define DIM 10
#define RANGE 20   /* la N di cui sopra */
int main()
{
    int w[DIM] = {1,2,3,4,3,2,3,4,0,3}, v[DIM] = {0};
    int t[RANGE] = {0};
    int i, j;
    for (i=j=0; i<DIM; ++i)
        if (t[w[i]]==0) {
            v[j++] = w[i];
            t[w[i]] = 1;
        }
    return 0;
}

 {
grazie a tutti!

Samba ha scritto:

stai controllando se ï¿œ diverso da almeno un elemento, non da tutti.


Andrea Laforgia ha scritto:
 >     for (i=0; i<wlen; i++) {
 >         int j, found=0;
 >         for (j=0; j<vlen; j++) {
 >             if (v[j] == w[i]) {
 >                found=1;
 >                break;
 >             }
 >         }
 >         if (!found)
 >           v[vlen++] = w[i];
 >     }
Io avrei risparmiato la variabile found:
      for (i=0; i<wlen; i++) {
          int j;
          for (j=0; j<vlen && v[j]!= w[i]; j++);
          if (j==vlen)
            v[vlen++] = w[i];
      }
E.