Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - inserire combinazioni in array
Forum - C/C++ - inserire combinazioni in array

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
sara82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 13/07/2009

Segnala al moderatore
Postato alle 12:24
Lunedì, 13/07/2009
Ciao a tutti!Sono Sara e mi sono avvicinata da poco tempo al C
Insieme al mio gruppo universitario ho dovuto creare un programma statistico in C che mi permetta di effettuare combinazioni di n valori in k gruppi
Per quanto riguarda le combinazioni dopo un pò di fatica sono riuscita a trovare un algoritmo da adattare al mio codice. Ora sono davanti a un problema: il programma mi stampa le combinazioni mentre a me serve non che le stampi, ma che le inserisca in un array a parte su cui poi continuare a lavorare...qualcuno può aiutarmi?
Posto qui sotto il mio codice.
-----------------------------------------------------------------------------
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>


#define MAXNC 600
#define MAXNF 600
#define MAXR 1200

  


void print_tab(unsigned char tab[],int size_tab)
{ int i;
for(i=0;i<size_tab;i++)
printf("%d",tab);
printf("\n");
}
void permute(unsigned char tab[],unsigned char i,unsigned char j)
{
unsigned char c;
c=tab;
tab=tab[j];
tab[j]=c;
}
void combin(unsigned char tab[],int i, int size_tab)
{
unsigned char j;
if (i==size_tab)
{
print_tab(tab,size_tab);
}
else
for(j=i;j<size_tab;j++)
{
permute(tab,i,j);
combin(tab,i+1,size_tab);
permute(tab,i,j);
}
}

void  main()
{
  int valorec[MAXNC], valoref[MAXNF], i, nc, nf;
  int valoritot[MAXR];
/*Presentazione del programma*/
   printf("Gentile utente \n");
   printf("Questo e' un Test di permutazione applicabile a grandi campioni \n");
   printf("Questo programma vi consentira'di valutare eventuali effetti del vostro farmaco\n");
   printf("su un gruppo di individui in analisi rispetto a un gruppo di controllo\n");
   printf("\n\n\n");

  do {
  printf("\n inserire il numero di individui del gruppo di controllo: \n");
  scanf("%d", &nc);
}
   while(nc<1 || nc>600);

   do
   {
  printf("\n inserire il numero di individui del gruppo di analisi del farmaco: \n");
  scanf("%d", &nf);
      }
   while(nf<1 || nf>600);

  
  printf("\n inserire i valori ottenuti da %d individui del gruppo di controllo \n", nc);

/*array di immissione dei valori ottenuti nel gruppo di controllo*/
  for(i=0; i<nc; i++) {
    printf("valore %d individuo: ", i+1);
    scanf("%d", &valorec);
  }

  printf("\n inserire i valori ottenuti dagli individui del gruppo di analisi del farmaco \n");
/*array di immissione dei valori ottenuti nel gruppo farmaco */
  for(i=0; i<nf; i++) {
    printf("valore %d individuo: ", i+1);
    scanf("%d", &valoref);
  }


/*  fusione dei due array  */
int j,k;
i = 0; j = 0; k = 0;
   do {
      if(valorec<=valoref[j])
         valoritot[k++] = valorec[i++];
      else
         valoritot[k++] = valoref[j++];
   }
   while(i<nc && j<nf);
   if(i<nc)
      for(; i<nc; valoritot[k++] = valorec[i++]);
        
   else
      for(; j<nf; valoritot[k++] = valoref[j++]);
        
int individui;
individui = nc + nf;

  
unsigned char tab;
for(i=0;i<individui;i++){
   tab=valoritot;
   }

combin(tab,0,nf);

  
}

------------------------------------------------------------------------------

come posso fare per "nascondere" la stampa delle permutazioni e inserirle tutte in un array?
spero qualcuno possa aiutarmi...
Grazie
Sara 8-|:hail:

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 13:40
Lunedì, 13/07/2009
Ciao Sara, prima di pensare a come memorizzare i risultati in un array dovresti mettere a posto questo codice perchè ci sono alcuni errori:

Codice sorgente - presumibilmente C++

  1. void permute(unsigned char tab[],unsigned char i,unsigned char j)
  2. {
  3. unsigned char c;
  4. c=tab; //c è un char, tab un array. Non puoi fare questo assegnamento
  5. tab=tab[j]; //???? tab è un array, tab[j] è un char. Non puoi fare questo assegnamento.
  6. tab[j]=c;
  7. }



Codice sorgente - presumibilmente C/C++

  1. o {
  2.       if(valorec<=valoref[j]) //valorec è un array, questo confronto non è corretto
  3.          valoritot[k++] = valorec[i++];
  4.       else
  5.          valoritot[k++] = valoref[j++];
  6.    }
  7.    while(i<nc && j<nf);



Codice sorgente - presumibilmente C/C++

  1. for(i=0;i<individui;i++){
  2.    tab=valoritot; //tab è un char, valoritot un array. Questo assegnamento non è corretto. Cosa intendevi?
  3.    }



Codice sorgente - presumibilmente Plain Text

  1. combin(tab,0,nf); //Questa chiamata alla funzione combin non è corretta. Quella funzione chiede come 1° argomento un puntatore, non puoi passargli un carattere.


Ultima modifica effettuata da Matthew il 13/07/2009 alle 13:42
PM Quote
Avatar
sara82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 13/07/2009

Segnala al moderatore
Postato alle 13:47
Lunedì, 13/07/2009
intanto devo ringraziarti e chiedere scusa, non avendo visto la funzione [code*] non l'ho utilizzata e il codice è uscito "tagliato"..
lo riporto qui
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <conio.h>
  6.  
  7.  
  8. #define MAXNC 600
  9. #define MAXNF 600
  10. #define MAXR 1200
  11.  
  12.  
  13. void print_tab(unsigned char tab[],int size_tab)
  14. { int i;
  15. for(i=0;i<size_tab;i++)
  16.  printf("%d",tab[i]);
  17. printf("\n");
  18.         }
  19. void permute(unsigned char tab[],unsigned char i,unsigned char j)
  20. {
  21. unsigned char c;
  22. c=tab[i];
  23. tab[i]=tab[j];
  24. tab[j]=c;
  25. }
  26. void combin(unsigned char tab[],int i, int size_tab)
  27. {
  28. unsigned char j;
  29. if (i==size_tab)
  30. {
  31. print_tab(tab,size_tab);
  32. }
  33. else
  34. for(j=i;j<size_tab;j++)
  35. {
  36. permute(tab,i,j);
  37. combin(tab,i+1,size_tab);
  38. permute(tab,i,j);
  39. }
  40. }
  41.  
  42. void  main()
  43. {
  44.         float alfa;
  45.   int valorec[MAXNC], valoref[MAXNF], i, nc, nf;
  46.   int valoritot[MAXR];
  47.  /*Presentazione del programma*/
  48.         printf("Gentile utente \n");
  49.         printf("Questo e' un Test di permutazione applicabile a grandi campioni \n");
  50.         printf("Questo programma vi consentira'di valutare eventuali effetti del vostro farmaco\n");
  51.         printf("su un gruppo di individui in analisi rispetto a un gruppo di controllo\n");
  52.         printf("\n\n\n");
  53.  
  54.  printf(" Inserire l'errore di I tipo in forma decimale: ");
  55.   scanf("%f", &alfa);
  56.  do {
  57.   printf("\n inserire il numero di individui del gruppo di controllo: \n");
  58.   scanf("%d", &nc);
  59.  }
  60.         while(nc<1 || nc>600);
  61.  
  62.         do
  63.         {
  64.   printf("\n inserire il numero di individui del gruppo di analisi del farmaco: \n");
  65.   scanf("%d", &nf);
  66.                 }
  67.         while(nf<1 || nf>600);
  68.  
  69.  
  70.   printf("\n inserire i valori ottenuti da %d individui del gruppo di controllo \n", nc);
  71.  
  72. /*array di immissione dei valori ottenuti nel gruppo di controllo*/
  73.   for(i=0; i<nc; i++) {
  74.     printf("valore %d individuo: ", i+1);
  75.     scanf("%d", &valorec[i]);
  76.   }
  77.  
  78.   printf("\n inserire i valori ottenuti dagli individui del gruppo di analisi del farmaco \n");
  79. /*array di immissione dei valori ottenuti nel gruppo farmaco */
  80.   for(i=0; i<nf; i++) {
  81.     printf("valore %d individuo: ", i+1);
  82.     scanf("%d", &valoref[i]);
  83.   }
  84.  
  85. /*stampa dei valori inseriti dall'utente
  86.   printf("\n\n Verifca  dei valori inseriti\n\n");
  87.   printf("Gruppo di controllo\n");
  88.  
  89.   for(i=0; i<nc; i++) {
  90.     printf("valore %d individuo: %d \n", i+1, valorec[i]); }
  91.  
  92.   printf("\n\nGruppo di analisi\n");
  93.  
  94.   for(i=0; i<nc; i++) {
  95.     printf("valore %d individuo: %d \n", i+1, valoref[i]); }
  96.         getchar(); */
  97.  
  98. /*  fusione dei due array  */
  99. int j,k;
  100. i = 0; j = 0; k = 0;
  101.         do {
  102.                 if(valorec[i]<=valoref[j])
  103.                         valoritot[k++] = valorec[i++];
  104.                 else
  105.                         valoritot[k++] = valoref[j++];
  106.         }
  107.         while(i<nc && j<nf);
  108.         if(i<nc)
  109.                 for(; i<nc; valoritot[k++] = valorec[i++])
  110.                         ;
  111.         else
  112.                 for(; j<nf; valoritot[k++] = valoref[j++])
  113.                         ;
  114.         /* visualizzazione della fusione
  115. for(i=0; i<k; i++)
  116.                 printf("\n%d", valoritot[i]); */
  117.         int individui;
  118.         individui = nc + nf;
  119.         /* printf("individui totali: %d", individui); */
  120.  
  121.  
  122.  
  123. unsigned char tab[i];
  124. for(i=0;i<individui;i++){
  125.         tab[i]=valoritot[i];
  126.         }
  127.  
  128. combin(tab,0,nf);
  129.  
  130.        
  131. }



per quanto riguarda il codice ho utilizzato un algoritmo trovato in rete e non da problemi...:) ma essendo "nuova" nell'ambiente C sinceramente non so riconoscere a colpo d'occhio eventuali errori :D

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 14:28
Lunedì, 13/07/2009
Allora c'è un'altro problemino.
Non puoi allocare memoria per una matrice in questo modo:
Codice sorgente - presumibilmente C/C++

  1. unsigned char tab[i];


ma devi scrivere:
Codice sorgente - presumibilmente C++

  1. unsigned char *tab = new unsigned char[i];


PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 14:43
Lunedì, 13/07/2009
Allora per quanto riguarda il salvataggio dei risultati in un array la cosa più semplice da fare è dichiarare un vector e inserirci i risultati.
Per prima cosa devi usare la libreria vector:
Codice sorgente - presumibilmente C/C++

  1. #include <vector>



Poi dichiari il vector:
Codice sorgente - presumibilmente Plain Text

  1. vector<char> vect;



Infine inserisci i dati così:
Codice sorgente - presumibilmente C++

  1. void print_tab(unsigned char tab[],int size_tab)
  2. {
  3.         int i;
  4.         for(i=0;i<size_tab;i++)
  5.                 vect.push_back(tab[i]);
  6.         printf("\n");
  7.     }



Alla fine ottieni un array che contiene tutti i risultati. L'array è stato dichiarato globalmente pertanto lo puoi richiamare da qualsiasi punto del programma.
Il vantaggio della classe vector è che alloca automaticamente la memoria a seconda della quantità di dati che ci inserisci. A differenza dei comuni array puoi quindi dichiararlo e inserirci dati anche quando non conosci ancora la quantità di memoria di cui avrà bisogno.
Spero di aver chiarito i tuoi dubbi, ma se hai ancora bisogno di aiuto non esitare a chiedere...
PS: se ti servono info a proposito dei vector puoi dare un'occhiata alla dispensa a questo proposito che ho recentemente scritto... La trovi nella home page del sito

Ultima modifica effettuata da Matthew il 13/07/2009 alle 14:49
PM Quote
Avatar
sara82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 13/07/2009

Segnala al moderatore
Postato alle 14:55
Lunedì, 13/07/2009
non ho parole per la tua disponibilità, ti ringrazio tantissimo!
ora ci lavoro su e ti aggiorno, purtroppo pur non avendo molta conoscenza del C mi trovo a combattere con un progetto più grande di quanto mi aspettassi...
grazie ancora:k::k::k:

PM Quote
Avatar
sara82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 13/07/2009

Segnala al moderatore
Postato alle 15:04
Lunedì, 13/07/2009
non ho parole per la tua disponibilità, ti ringrazio tantissimo!
ora ci lavoro su e ti aggiorno, purtroppo pur non avendo molta conoscenza del C mi trovo a combattere con un progetto più grande di quanto mi aspettassi...
grazie ancora:k::k::k:

PM Quote
Avatar
sara82 (Normal User)
Newbie


Messaggi: 7
Iscritto: 13/07/2009

Segnala al moderatore
Postato alle 15:06
Lunedì, 13/07/2009
ok..ho postato due volte per sbaglio lo stesso messaggio...
devo nuovamente disturbarti per una domanda..
se non ho capito male la libreria vector è di C++, ne esiste una equivalente per il C?o può essere usata indifferentemente?
scusami di nuovo e grazie

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 15:19
Lunedì, 13/07/2009
Allora... Ti chiedo scusa mi sono confuso... La libreria vector è esclusivamente per il C++.
In C l'utilizzo di array dinamici non è così semplice...
Però credo si possa fare anche senza gli array dinamici. Tu conosci la quantità di dati che dovrai immagazzinare no? Voglio dire quando l'utente inserisce il numero di individui nei due gruppi (ossia il numero di dati sperimentali), tu potresti già calcolare quanti risultati otterrai no? Così calcolato il numero di dati da inserire nell'array con i risultati potresti già allocare per l'array tutta la memoria che ti servirà.

Ultima modifica effettuata da Matthew il 13/07/2009 alle 15:21
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo