Help programma in C

sara1s
ciao ragazzi!
mi aiutate con questo programma: devo trovare la frequenza di ogni valore che compare in una matrice data dall'utente, trovare i quattro maggiori della matrice e le loro relative occorrenze.
io ho cercato di far qualcosa ma sbaglio e vien fuori una schifezza se lo compilo.

vi copio-incollo quel che ho fatto.se avete qualche idea su come risolverlo, anche diversamente dalla mia impostazione, o anche solo una parte e non tutto ditemi.




#include
#include
#define N 2
#define M 4

typedef struct{ int valore;
int frequenza;
} elemento;

main()
{
int mat[N][N],i,j;
elemento ele[M];
int k=0;//contatore per il vetttore di tipo elemento
int s,r,fatto=0,num;
int max=0,maxfrequ;


printf("\n\nprogramma che lavora con le matrici...\n\nINIZIALIZZA MATRICE\n\n");

for(i=0;i for(j=0;j {do{printf("inserisci elemento tra 0-20 (%d,%d) : ",i,j);
scanf("%d",&mat[j]);
}while(mat[j]>20 || mat[j]<0);
}

printf("\n\nSTAMPA DELLA MATRICE (elem tra 0-20\n\n");
for(i=0;i {printf("\n");
for(j=0;j printf("%5d",mat[j]);
}


printf("\n\nORA SALVIAMO LE OCCORRENZE...\n\n");

for(s=0;s for(r=0;r
{ for(k=0;k if(mat[r]==ele[k].valore)
ele[k].frequenza++;
else
{
ele[k].valore=mat[r];
ele[k].frequenza=ele[k].frequenza++;
k++;
}
}


//stampa occorrenza di ogni val per controllare l'eseguzione del programma.
for(k=0;k printf("\n\nele[%d].valore=%d\nele[%d].frequenza=%d\n\n",k+1,ele[k].valore,k+1,ele[k].frequenza);

//calcolo dei quattro maggiori
printf("\n\nCALCOLO DEI 4 MAGGIORI\n");
maxfrequ=-1;
max=0;

for(k=0;k {
if(ele[k].frequenza!=maxfrequ)
{max=0;
if(max {maxfrequ=ele[k].frequenza;
max=ele[k].valore;
}
num=1;
printf("%d.%d per %d volte\n\n",num,max,maxfrequ);
num++;
}
}

printf("\n\nAbbiamo terminato...premi un tasto per uscire..\n");
getch();

}

grazie per qualsiasi aiuto.ciao


grazie per qualsiasi aiuto.
CIAO!!!!

Risposte
_Tipper
Io non userei una struttura ma un vettore con 21 componenti (visto che la matrice accetta solo interi fra 0 e 20), vettore costruito in modo che vettore contenga il numero di volte che la matrice contiene il valore i.
Una volta costruita la matrice (e mi sembra costruita correttamente) io farei così

for(k=0; k<21; k++)
vettore[k] = 0;
for(i=0; i<N; ++i)
{
   for(j=0; j<N; ++j)
   {
      k = mat[i][j];
      vettore[k]++;
   }
}

In questo modo, alla fine del ciclo, nel vettore vettore[] per ogni numero della matrice è memorizzata la rispettiva frequenza.
A questo punto trovare il massimo non è difficile.

sara1s
allora ho svolto il programma come mi hai detto tu e effettivamente è molto piu veloce fare così( io mi complico sempre tutto).

ora la prima pqarte funziona ma solo se ho degli interi, se nella matrice ci son dei char quando compilo sullo schermo cominciano a scorrere all'infinito dei numeracci.Tu hai qualche idea per farlo funzionare con elementi che non siano numeri?


Inoltre, non riesco a far funzionare la seconda parte che ricerca i 4 maggiori. So farlo in maniera un po sempliciotta riscrivendo 4 volte il calcolo del maggiore escludendo la volta successiva con un if il maggiore precedende.ma in quel modo nn credo vada bene.per far piu veloce uso un vettore max[.] di 3 elementi in cui salvo di volta in volta un maggiore.il programma viene compilato ma funziona male.


#include
#include
#define N 3
#define M 3
#define C 21
main()
{ int max[3],m,aux;
int mat[N][N],i,j,vettore[C];
int k=0;

int volte=0,piufrequente;

for(k=0;k<21;k++){
vettore[k]=0;k++;}
printf("\n\nprogramma che lavora con le matrici...\n\nINIZIALIZZA MATRICE\n\n");

for(i=0;i for(j=0;j {do{printf("inserisci elemento tra 0-20 (%d,%d) : ",i,j);
scanf("%d",&mat[j]);
}while(mat[j]>20 || mat[j]<0);
}

printf("\n\nSTAMPA DELLA MATRICE (elem tra 0-20\n\n");
for(i=0;i {printf("\n");
for(j=0;j printf("%5d",mat[j]);
}

// PRIMA PARTE : TROVA PIU FREQUENTE

for(k=0; k<21; k++)
vettore[k] = 0;
for(i=0; i {
for(j=0; j {
k = mat[j];
vettore[k]++;
}
}
//stampa per controllo

for(k=0;k<21;k++)
{
printf("\n\n%d compare %d volte\n\n", k, vettore[k]);
}


volte=0;
for(k=0;k<21;k++)
if(volte volte=vettore[k];
piufrequente=k;
}
printf("\n il piu frequente è %d e compare %d volte\n\n",piufrequente,volte);


//SECONDA PARTE: TROVA I 4 MASSIMI (li salvo in max[3] e poi stampo)

max[0]=0;max[2]=0;max[3]=0;max[2]=0;


for(m=0;m<3;m++) //m contatore per max[] i ,j contatori di righe e colonne della matrice
{aux=0;
for(i=0;i for(j=0;j {if(aux[j] && max[m-1]>aux) :!: secondo me lo sbaglio sta qua boh
max[m]=mat[j];
}
m++;
}


for(m=0;m<3;m++)
printf("\n\n%d° massimo= %d.",m+1,max[m]);

getch();

}

_Tipper
Potresti dichiarare un vettore int a 256 componenti e la matrice come char:

int vettore[256];
char mat[N][M];

e quando acquisisci un carattere puoi incrementare la posizione del vettore corrispondente al codice ASCII del carattere letto:

char c;
.
.
.
for(i=0; i<256; ++i)
vettore[i] = 0;
for(i=0; i<N; ++i)
{
   for(j=0; j<M; ++j)
   {
      c = mat[i][j];
      vettore['c']++;
   }
}

Così dovrebbe funzionare.

_Tipper
Per quanto riguarda la ricerca dei quattro termini più frequenti, potresti creare un vettore, ad esempio chiamato vettore1[], in cui copiare i valori di vettore[]. Almeno inizialmente vettore1[] è la copia sputata di vettore[]. A questo punto puoi ordinare vettore1[] in ordine decrescente, così le prime quattro posizioni sono relative ai quattro caratteri più frequenti. Estraendo la frequenza in vettore1[], e ricercando il valore in funzione della frequenza in vettore[] puoi risalire ai quattri caratteri più frequenti.

Non è che sia il massimo dal punto di vista della memoria occupata e della complessità computazionale, ma dovrebbe funzionare...

sara1s
non si tratta di trovare i 4 piu frequenti(quello era solo la prima parte la seconda nn c'entra nulla) , si tratta di trovare i 4 maggiori della matrice

esempio 3 4 5 6
5 8 9 3
3 5 6 8

1 maggiore 9
2 maggiore 8
3 maggiore 6
4 maggiore 5

Ad ogni modo anche in questo caso sarebbe simile al problema come l'hai inteso tu: basterebbe salvare su un vettore max[] i maggiori e poi stampare il vettore di 4 elementi ORDINANDOLO soltanto che nn riesco a salvarli in maniera adeguata e nn funziona bene .

comunque ti ringrazio moltissimo dei suggerimenti.ora la prima parte funziona anche con i char (anche se non riesce a vedere 2 elementi con la stessa frequenza ma fa nulla :wink: ).
Questo era un esercizio della prima parte di informatica A e mi faceva dannare.

in ogni caso ora, anche se un in maniera poco efficente, sembra almeno funzionare un pochino (a parte qualche raro caso rompipalle , vedi due elementi con uguale frequenza)

CIAO!!!!!!!

codino75
"sara1s":


in ogni caso ora, anche se un in maniera poco efficente, sembra almeno funzionare un pochino (a parte qualche raro caso rompipalle , vedi due elementi con uguale frequenza)

CIAO!!!!!!!


i casi rompipalle sono quelli dove ci si perde piu' tempo a risolverli...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.