PDA

Visualizza la versione completa : [C] inserire combinazioni in un array


gnoma82
13-07-2009, 12:21
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 :D

YuYevon
13-07-2009, 13:15
Non credo che queste righe segnate in rosso



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;
}


originariamente fossero scritte così... immagino ci fosse un



tab[i]


al posto del semplice "tab"... riposta il codice con i tag "code" così non si perde l'indentazione e non succedono queste "magie". Basta scrivere

[code*]
qui_metti_il_codice
[/code*]

senza gli asterischi nelle parentesi quadre (li ho messi per invalidare i tag e mostrare come si usano).

È scritto anche nel regolamento ;)

gnoma82
13-07-2009, 13:28
hai ragione chiedo scusa e il bello è che lo sapevo anche inserire O_o
me ne sono dimenticata all'ultimo sorry



#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);


}

YuYevon
13-07-2009, 14:18
Ci sono alcune cose che non capisco. Le combinazioni sono quelle riportate in tab dopo la chiamata alla procedura combin()? Ma se sono dati numerici, perché usi un array di caratteri senza segno? Per risparmiare spazio in memoria forse perché sai che questi valori saranno sempre compresi tra 0 e 255?

Poi, se le combinazioni sono appunto contenute in tab, non le tieni già salvate in un array?

E ancora, il C non permette dichiarazioni di variabili in punti arbitrari del codice, bisogna scrivere tutte le dichiarazioni all'inizio della funzione... so che può essere comodo, ma è un'estensione del C++ e se compili con opzioni più restrittive (o con un compilatore C puro) dovrebbe segnalartelo.

Loading