Newsgroup: it.comp.lang.c
Titolo: Aiuto principiante arraydiarray e matrici.....

Ciao a tutti, spero possiate aiutarmi perchè ne ho davvero bisogno....
sto cercando di far funzionare un programma di controllo su una matrice 3x3
che deve eseguire alcune semplici operazioni....
ora vi posto il codice:
/* Programma che riceve una matrice di caratteri 3x3
 * e: 1) trasforma ogni lettera nel rispettivo numero
 * che rappresenta, ad esempio a=1 b=2 c=3 d=4 e copia il
 * contenuto in una nuova matrice.
 * 2) calcola la somma di tutti gli elementi di questa nuova matrice.
 * 3) verifica se la matrice è simmetrica, cioè se l'elemento
 * i,j è uguale all'elemento j,i */
#include <stdio.h>
#include <string.h>
#define MAX 3
typedef char matrice[MAX][MAX];
void leggimatrice(matrice s) {
 int i=0;
 int j=0;
 for (j=0; j<MAX; j++) {
  for (i=0; i<MAX; i++) {
   (s[j][i]=getchar());
  }
 }
}
void trasformamatrice(matrice s,matrice p){
 int i=0;
 int j=0;
 int d=0;
 for (j=0; j<MAX; j++) {
  for (i=0; i<MAX; i++) {
   for (d=0; d<27; d++) {
    if(s[j][i]=='a' + d)
    p[j][i]==1 + d;
   }
  }
 }
}
int somma(matrice p){
 int somma=0, i=0, j=0;
 for (j=0; j<MAX; j++) {
  for (i=0; i<MAX; i++)
   somma += p[j][i];
 }
 return somma;
}
int simmetrica(matrice s){
 int simmetrica=1;
 int i=0, j=0;
 for (j=0; j<MAX; j++) {
  for (i=0; i<MAX; i++) {
   if (s[j][i] != s[i][j])
   simmetrica = 0;
  }
 }
 return simmetrica;
}
void main() {
 matrice s,p;
 printf("Scrivi la matrice:\n");
 leggimatrice(s);
 trasformamatrice(s,p);
 printf("La somma degli elementi della matrice è %d\n",somma(p));
 if(simmetrica(s)>0)
 printf("La matrice è simmetrica");
 else
 printf("La matrice non è simmetrica");
}
credo di aver sbagliato parecchie cose,
non mi funziona nessuno dei metodi....
magari se mi potreste indirizzare.....
e poi volevo chiedervi,
si puo fare questa cosa:
for (j=0; j<MAX; j++) {
  for (i=0; i<MAX; i++) {
   for (d=0; d<27; d++) {
    if(s[j][i]=='a' + d)
    p[j][i]==1 + d;
cioè volevo sapere
se scrivo 'a' + 1 lui lo prende automaticamente come 'b' ?
Grazie scusate la confusione!

 se scrivo 'a' + 1 lui lo prende automaticamente come 'b' ?
se lo assegni ad un char si...
cya'
Fra

 uguale a prima... devi passarli per riferimento non per valore..
scusa perchč secondo te č sbagliato?
č come se scrivessi
void trasforma(char s[][],char p[][])
non deve restituire nulla deve solo memorizzare alcuni cambiamenti di s in
p.

 p.
è proprio quello il problema!! quando chiami una funziona "lui" si crea uno
spazio di memoria nuova e copia nel nuovo s e nel nuovo p le variabili che
gli stai passando!
(che sono in aree di memoria differenti da quelle presenti nel main, sono
variabili DIVERSE (fai finta che si chiamino traforma_p e non p!) )
se non sai usare i puntatori puoi:
1) usare delle variabili globali (le allochi fuori dal main e le puoi usare
in qualsiasi funzione)
2) mettere tutto nel main e non usare delle funzioni :P

 2) mettere tutto nel main e non usare delle funzioni :P
Beh la prima scelta mi sembra più logica :)
anche se comunque cerco aiuti a livello di algoritmi....
specie su quello della trasformazione da caratteri a numeri
e su quello della somma dei numeri....

 variabili DIVERSE (fai finta che si chiamino traforma_p e non p!) )
Ti stai sbagliando: lui ha usato un typedef per definire il "tipo" matrice
come un array multidimensionale di char, quindi era corretta come l'aveva
scritta lui.
Ciao

 Ciao
forse non ho scritto bene, pero' giusta in che senso?? così com'è scritta
non dovrebbe funzionare o sbaglio?? (anche se il tuipo è definito in modo
corretto ne crea comunque una copia, non cambia l'originale!)

 specie su quello della trasformazione da caratteri a numeri
da caratteri a numeri????
int a; char b;
b='a';
a=b-'a'; /* a=0 */
b='b';
a=b-'a'; /* a=1 */
ecc.

 ecc.
oddio cosi dovrei fare 26 if non è una cosa carina :)
misa che ci deve essere qualche modo decisamente piu compatto e lo sto
cercando :(

bestia ignorante!

26 if ???
epperchèmai??
chat a[]={'a','b','c','d'}
int b[4];
for (i=0;i<=3;i++)
b[i]=a[i]-'a';
/*  b={1,2,3,4} */

 corretto ne crea comunque una copia, non cambia l'originale!)
Certo, ma anche di un puntatore viene creata una copia nello stack della
funzione ;-)
Il fatto č che con il typedef che ha definito, la dichiarazione:
void trasforma(matrice s);
equivale a:
void trasforma(char s[MAX][MAX]);
e quindi quando viene passato un "oggetto" matrice alla funzione
automaticamente viene passato un array.
Ciao

"FRaNCeSCo" <?@?.?> ha scritto nel messaggio
news:UxhTa.2621$Df5....@news1.tin.it...

Mi sa che
/* b = {0,1,2,3} */
Ciao,
Ema

 b[i]=a[i]-'a';
Scusami mi sento stupido :)
mi spiegi cosa succede con a[i]-'a' ?
sottrai il carattere 'a' al carattere corrente dell'array?
se il carattere corrente è 'c' cosa succede se gli sottraggo 'a' ?
scusa ciao! e grazie


thenkiu' :)

chiarisciti un attimo la gestione dei caratteri e delle stringhe...
se tu dichiari:
int a;
char b;
a='a'; /* allora assegni ad a il valore asci di 'a' (a=54 in questo caso se
non sbaglio) */
a='c'-'a'; /* sottraggo al valore asci di c (57) quello di a (54) */
(i valori potrebbero essere sbagliati, non li so! e comuqnue potrebbero
variare da SO a SO)
se tu fai
printf("%c",57);
printf("%c",'a'+3);
printf("%c",'c');
in output hai sempre 'c'
se fai
b='a';
printf("%d",b);
printf("%d",54);
in output hai sempre 54
ok??
quando assegni un carattere a una variabile lui gli assegna il valore
asci...
(forse sbaglio qualcosa su quello che fa in realt' il compilatore, comunque
quello che vedi tu è questo)
(se qualcuno ha qualcosa da ridire è ben venuto)
FRa
comunque  leggi qualche guida di base alla programmazione in C

 ha scritto nel messaggio
news:0uuTa.197773$Ny5.5...@twister2.libero.it...

'a' e 'c' sono dei char, che sono numeri di un byte, che quindi vanno
da -128 a 127 se signed
da 0 a 255 se unsigned
'a', 'b', 'c', ...  rappresentano i rispettivi codici ascii: 97, 98, 99...
Siccome sono numeri se fai la sottrazione ottieni la differenza tra i due:
'c' - 'a' = 2
e cioe':
99 - 97=2
ad una variabile di tipo char puoi assegnare indistintamente le due
espressioni, che sono equivalenti:
char c1,c2;
c1 = 97;
c2 = 'a';
if (c1==c2) {
    /* sempre */
} else {
    /* mai */
}
Ciao,
Ema

mi stavo confondendo con la gestione delle stringhe.
quando passi una stringa e la leggi con char *
pero' in realtą gli hai passato l'indirzzo del vettore di stringhe!
:)
(ho capito quello che dicevi vero?)
Fra

 asci...
ohh ora capisco!
grazieee :)