Oppure

Loading
13/07/09 10:24
sara82
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:
aaa
13/07/09 11:40
Matthew
Ciao Sara, prima di pensare a come memorizzare i risultati in un array dovresti mettere a posto questo codice perchè ci sono alcuni errori:

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


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


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


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 13/07/09 11:42
aaa
13/07/09 11:47
sara82
intanto devo ringraziarti e chiedere scusa, non avendo visto la funzione [code*] non l'ho utilizzata e il codice è uscito "tagliato"..
lo riporto qui
#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[i]);
printf("\n"); 
	} 
void permute(unsigned char tab[],unsigned char i,unsigned char j)
{
unsigned char c;
c=tab[i];
tab[i]=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()
{
	float alfa;
  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");

 printf(" Inserire l'errore di I tipo in forma decimale: ");
  scanf("%f", &alfa);
 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[i]); 
  }
 
  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[i]); 
  }

/*stampa dei valori inseriti dall'utente
  printf("\n\n Verifca  dei valori inseriti\n\n");
  printf("Gruppo di controllo\n");
 
  for(i=0; i<nc; i++) {
    printf("valore %d individuo: %d \n", i+1, valorec[i]); }

  printf("\n\nGruppo di analisi\n");

  for(i=0; i<nc; i++) {
    printf("valore %d individuo: %d \n", i+1, valoref[i]); } 
	getchar(); */

/*  fusione dei due array  */
int j,k;
i = 0; j = 0; k = 0;
	do {
		if(valorec[i]<=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++])
			;
	/* visualizzazione della fusione 
for(i=0; i<k; i++)
		printf("\n%d", valoritot[i]); */
	int individui;
	individui = nc + nf;
	/* printf("individui totali: %d", individui); */



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

combin(tab,0,nf);

	
}


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
aaa
13/07/09 12:28
Matthew
Allora c'è un'altro problemino.
Non puoi allocare memoria per una matrice in questo modo:
unsigned char tab[i];

ma devi scrivere:
unsigned char *tab = new unsigned char[i];
aaa
13/07/09 12:43
Matthew
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:
#include <vector>


Poi dichiari il vector:
vector<char> vect;


Infine inserisci i dati così:
void print_tab(unsigned char tab[],int size_tab)
{ 
	int i;
	for(i=0;i<size_tab;i++)
		vect.push_back(tab[i]);
	printf("\n");
    }


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 13/07/09 12:49
aaa
13/07/09 12:55
sara82
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:
aaa
13/07/09 13:04
sara82
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:
aaa
13/07/09 13:06
sara82
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
aaa