Newsgroup: it.comp.lang.c
Titolo: riempire la solita matrice!!

ciao a tutti, a quanto pare non riesco proprio a fare questo pezzo di
esercizio! una volta costruita un amtrice 4x4 la riempio (per ora) di
0. fin qua ho capito grazie a voi come si fa. il mio probl però è
riempire la matrice con numeri presi da un file dove ci sono n coppie
di numeri generati a caso e arrotondati per eccesso o per difetto (con
floor e ceil) a numeri interi. Io voglio che tali numeri generati
vadano a riempire l'elemento di matrice che corrisponde al loro
valore. Ad esempio, se la coppia è (1,1) voglio che si riempia
l'elemento 1,1 di matrice. Inoltre alla fine devo contare quante volte
un numero è finito in quell'elemento, e scriverlo dentro l'elemento
(se c'erano quindi 10 coppie (1,1) tra i casuali allora nell'elemento
di indice 1,1 della matrice si leggerà 10). A me nn riesce proprio di
impostare la cosa, mi date una mano??? grazie a tutti!!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void doPrint(int nCols, int nRows, double pa[nRows][nCols])
{
        int x, y;
        for(y = 0; y < nRows; y++)
        {       for(x = 0; x < nCols; x++)
                        printf("%.2f ", pa[y][x]);
                printf("\n");
        }
}
int main(void)
{
   //   FILE *fp;
    //  fopen=(fp, "r");
        int nCols = 4, nRows = 4;
        int x, y;
        double aMatrix[nRows][nCols];
         /* Inizializza a 0 la memoria */
        for(y = 0; y < nRows; y++)
                for(x = 0; x < nCols; x++)
                        aMatrix[y][x] = 0.0;
/*A QUESTO PUNTO DEVO INSERIRE LE COPPIE DI NUMERI CASUALI PRESE DAL
FILE E CONTARE QUANTE VOLTE SI SONO VERIFICATE*/
        /* stampa i valori */
        doPrint(nCols, nRows, aMatrix);
         return EXIT_SUCCESS;
}

 impostare la cosa, mi date una mano??? grazie a tutti!!
Cosa e' esattamente che non riesci a fare ???
Cerca almeno di scrivere l'algoritmo nei suoi passi piu' semplici
in italiano, dopo di che vai a vedere come tradurre
ogni passo in poche istruzioni. Se non ci riesci allora
puo' darsi che il passo sia ancora troppo complesso
e vada ulteriormente decomposto. Poi se qualche passo e'
insormontabile, prova a chiedere. Ma se non provi da solo/a non
impari nulla.
Per esempio:
1) apro il file
2) leggo le coppie di valori interi
    dal file.
3) per ogni coppia a, b incremento la posizione
    pa[a][b] di 1.
etc.etc.
in ogni caso sembra proprio che tu nella matrice pa[][] voglia
contare quante volte e' comparsa ogni coppia di valori a b nel
file. Quindi non avrebbe molto senso usare una matrice pa di double,
ma sarebbe molto meglio usare una matrice intera: prima la
inizializza a 0, poi ogni volta
che vedi una coppia a b incrementi la posizione corrispondente
pa[a][b]++;
in questo modo alla fine hai esattamente in ogni
posizione pa[a][b] il numero di coppie a b che hai visto.
ciao,
g.

 g.
 sì. e ti ringrazio molto per l'aiuto. il fatto è che sono alle prime
armi e mi sembrano cose molto difficili! ora ci provo, ciao

ecco il programma...mi blocco quando devo dirgli che ad ogni coppia
(n,a) di interi letta da file deve incrementare l'elemento di matrice
[n][a]. non riesco a capire come fare..ecco intanto quello che ho
fatto. è sensato?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void stampamatrice(int col, int righe, double pa[righe][col])
{
        int x, y;
        for(y = 0; y < righe; y++)
        {       for(x = 0; x < col; x++)
                        printf("%.0f ", pa[y][x]);
                printf("\n");
        }
}
int main(int argc, char *argv[])
{
    if(argc!=3)
        {
  fprintf(stderr,"Uso giusto: inserire numero col,numero righe\n");
	exit(1);
	}
         int col = atoi(argv[1]);
         int righe = atoi(argv[2]);
         FILE *fp;
        int i,n,a;
         int m=10;
  fp=fopen("coord.out", "r");
  if( fp==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
		  }
for(i=0;i<m;i++){
 fscanf(fp,"%d %d" , &n,&a);
}
 fclose(fp);
    /*non so come incrementare la posizione in matrice (n,a) per ogni
coppia di (n,a) letti!*/
 int aMatrix[righe][col]; // normalmente allocata sullo stack del
programma
// Inizializza a 0 la memoria.
        memset(aMatrix, 0, sizeof(aMatrix));
        //stampa i valori
        stampamatrice(col, righe, aMatrix);
         return EXIT_SUCCESS;
}

 fatto. è sensato?
Ti posto una base. Tu studiati come funziona e fai il tuo programma.
Se ci dovessero essere eventuali errori, scusami: l'ho scritta di getto.
*NB*: e' SOLO per compilatori C99
(eg: gcc -Wall -pedantic -std=c99 -o prg prg.c )
Ciao
== esempio file dati.dat ==========
2 3
1 2
1 2
4 5
1 2
=== prog.c =========
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void doPrint(int nCols, int nRows, int pa[nRows][nCols])
{
	for(int y = 0; y < nRows; y++)
	{	for(int x = 0; x < nCols; x++)
			printf("%3d ", pa[y][x]);
		printf("\n");
	}
}
int riempiMatrice(char *pFileName, int nCols, int nRows, int 
pa[nRows][nCols])
{
	FILE *fp;
	char bfLine[1024];
	if(!(fp = fopen(pFileName, "rt")))
		return 0;
	int bFoundErr = 0;
	while(fgets(bfLine, sizeof(bfLine), fp))
	{	
		int x = -1, y = -1;
		int n = sscanf(bfLine, "%d %d", &y, &x);
		if(n < 0) /* (dovrebbe essere una linea vuota: la salta) */
			continue;
		if(n != 2 || x < 0 || x >= nCols || y < 0 || y >= nRows)
		{	bFoundErr = 1;
			break;
		}
		pa[y][x]++;
	}
	if(ferror(fp))
		bFoundErr = 1;
	fclose(fp);
	return !bFoundErr;
}
int main(void)
{
	char *pFileName = "dati.dat";
	int nCols = 10, nRows = 10;
	int aMatrix[nRows][nCols];
	int nRetVal = EXIT_FAILURE;
	/* Inizializza a 0 la matrice */
	memset(aMatrix, 0, sizeof(aMatrix));
	if(riempiMatrice(pFileName, nCols, nRows, aMatrix))
	{	doPrint(nCols, nRows, aMatrix);
		nRetVal = EXIT_SUCCESS;
	}
	else	fprintf(stderr, "** Errore durante la lettura/apertura del file 
dati: %s\n", pFileName);
	return nRetVal;
}
======
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com


ciao, grazie mille per l'aiuto.. ho studiato il programma...e ci sono
delle cose che non mi tornano:se il file dati.dat ha per elementi
degli interi con più di una cifra il programma dà errore nella lettura
del file. Inoltre non ho capito cos'è char bfLine[1024], cioè perchè
proprio  [1024].. il file dati.dat può arrivare a contenere anche 1000
o 10000 righe di dati.
E' ininfluente?
grazie ancora!!


 o 10000 righe di dati.
non c'entra nulla con le righe (vd. sopra)
Ciao


 if(n != 2 || x < 0 || x >= nCols || y < 0 || y >= nRows)
 OK!chiaro!!
l'output è una matrice la cui prima colonna e prima riga sono =0, e il
programma non le conta, cioè parte dalla seconda riga e seconda
colonna.....del tipo :
 0   0   0   0   0   0   0   0   0   0   0
  0   0   3   0   0   0   0   0   0   0   0
  0   0   0   1   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   1   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   1
come mai?


non ti ho capito.


 sono stata un pò + chiara?
ora ti e' piu chiaro ?
Ciao


 ora ti e' piu chiaro ?
sì, grazie tante!! però se provo a fargli stampare la matrice sul file
"matr.out" il compilatore mi dà "abortito". Perchè? e che vuol
dire?!?!?
ciao e grazie!!
void stampamatrice(int col, int righe, int pa[righe][col])
{
         FILE *fa;
          fa=fopen("matr.out","w");
          if(fa==NULL){
           printf("errore nell'apertura del file");
            exit(1);
            }
          int x,y;
        for(y = 0; y < righe; y++)
        {       for(x = 0; x < col; x++)
                        fprintf(fa,"%3d ", pa[y][x]);
                //printf("\n");
               fclose(fa);
        }
}

                fclose(fa);
questa fclose che ci fa dentro il ciclo for()?


 questa fclose che ci fa dentro il ciclo for()?
OOPS!! grazie....