|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2002
Messaggi: 220
|
[C] allocazione matrice dinamica
Ciao,
sto imparando ora ad usare il C...ho praovato ad allocare un vettore dinamicamente e sembra che funzioni tranne il fatto che nn mi prende la lettera "è": #include <stdio.h> #include <conio.c> #include<stdlib.h> void leggi(int*,int); void stampa_vettore(int*,int); void main(void) { int n,*v; printf("Inserisci il numero degli elementi del vettore (Numero Intero)"); scanf("%d",&n); v =(int*)malloc(n*sizeof(int)); leggi(v,n); stampa_vettore(v,n); getch(); system("PAUSE"); } void leggi(int*p,int l) { int i; printf("inserisci i numeri nel vettore\n"); for( i = 0 ; i<l ; i++) scanf("%d",&p[i]); } void stampa_vettore(int*p, int l) { int i; printf("il vettore è....\n"); for( i=0;i<l;i++) printf("%3d\n",p[i]); printf("\n"); } ma il problema è la matrice!!!! nn capisco dove sbaglio!! #include <stdio.h> #include <conio.c> #include <stdlib.h> int n,m; void leggi_mat(int[][m],int,int); void stampa_matrice(int[][m],int,int); void main(void) { int i,n,m; int **mat; printf("Dammi il valore di n"); scanf("%d", &n); printf("Dammi il valore di m"); scanf("%d", &m); mat=(int**)malloc(n*sizeof(int*)); for (i=0;i<m;i++) mat[i]=(int)malloc(m*sizeof(int)); } void leggi_mat(int pmat[][m], int righe, int colonne) { int i,j; clrscr (); gotoxy (25,1); printf("Inserisci i dati"); for (i=0;i<righe;i++) for (j<0;j<colonne;j++) { gotoxy(10+3*j,5+i); scanf("%d",&pmat[i][j]); } Grazie....
__________________
Athlon xp 2500@2300mhz, abit nf7-s, creative geforce4 ti 250@300-500@600, 256x2 ddr 400 samsung dual channel, H.D. maxtor diamond plus 60gb, soundblaster live 5.1, mast.dvd piooner 105, mast.cd liteon 40125S, creative inspire 5+1..... |
|
|
|
|
|
#2 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Re: [C] allocazione matrice dinamica
Ciao.
Il primo programma va bene, a parte il fatto che in C l'header conio.h non è standard, e la funzione main dovrebbe essere dichiarata come int, e restituire: - 0 in caso di terminazione con successo; - 1 in caso di terminazione senza errori, ma non soddisfacente; - valori maggiori di 1 se si verificano errori. Passando alla matrice... Quote:
L'allocazione della matrice sembra corretta (suppongo che n sia il numero di righe ed m il numero di colonne: perché non usi rows e cols, o anche solo r e c?); leggi_mat non viene chiamata, ma se all'inizio del programma fai: Codice:
int n,m; void leggi(int[][m],int,int); Ora, in C, al momento del passaggio dei parametri a una funzione, gli array vengono automaticamente convertiti in puntatori: perciò il primo argomento di leggi_mat dovrebbe essere un int**. Altra cosa: non ricordo cosa fa gotoxy, ma mi sembra che si usi in modalità grafica, mentre tutto l'input-output del tuo programma avviene da riga di comando; così non riesco a capire a cosa serve. Infine, un trucchetto: in C, p[x] corrisponde esattamente a *(p+x), quindi nella scanf puoi scrivere p+x invece di &p[x]. (Per le matrici la cosa si fa più complicata.)
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Sep 2002
Messaggi: 220
|
L ho cambiata cosi....pero dopo che ho finito di inserire gli elementi della matrice la schermata in dos va via e torna al programma! Come mai?
Poi come faccio a visualizzare infine la matrice che ho creato? #include <stdio.h> #include <stdlib.h> void main(void) { int **mat; int righe, colonne, r, c; printf("Inserisci il numero delle righe della matrice: "); scanf("%d", &righe); printf("Inserisci il numero delle colonne della matrice: "); scanf("%d", &colonne); mat = (int **)malloc(righe * sizeof(int *)); for (r=0; r<righe; r++) mat[r] = (int *)malloc(colonne * sizeof(int)); for (r=0; r<righe; r++) for (c=0; c<colonne; c++) { printf("Inserisci elemento di riga %d e colonna %d: ", r, c); scanf("%d", &mat[r][c]); } }
__________________
Athlon xp 2500@2300mhz, abit nf7-s, creative geforce4 ti 250@300-500@600, 256x2 ddr 400 samsung dual channel, H.D. maxtor diamond plus 60gb, soundblaster live 5.1, mast.dvd piooner 105, mast.cd liteon 40125S, creative inspire 5+1..... |
|
|
|
|
|
#4 | |||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
E' normale che faccia cosi': semplicemente, appena la main del tuo programma termina, lui chiude la finestra DOS e torna all'ambiente di sviluppo integrato. Ci dovrebbe essere un'opzione nei menu per visualizzare la schermata DOS. Per far terminare la main quando dici tu, un metodo portabile e': Codice:
printf("Premi Invio per continuare...");
while (getchar() != '\n')
;
Quote:
Piuttosto: prima di uscire dal programma, ricordati di deallocare la matrice. Non basta chiamare subito free(mat), devi prima liberare ciascuna delle sue righe. Quote:
Molti compilatori accettano che sia dichiarata come void, ma non e' ne' standard ne' portabile.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|||
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Sep 2002
Messaggi: 220
|
Ciao,
innanzitutto grazie di tutti i consigli....cmq uso il Dev. Ora provo a rifare la matrice ma con le funzioni, in pratica riprendo la prima che avevo iniziato. In pratica quante funzioni mi occorrono per creare questa matrice nel modo piu semplice possibile? Mi conviene includerci anche la stampa_matrice? Scusa per le domande stupide....però se nn capisco questa cosa nn so come andare avanti. Dovrei creare questa matrice dinamica(come ho gia fatto per il vettore) da usare come "base" per poi fare tutti quegli altri programmini (trasposta, utilizza l ultima riga per memorizzare i totali della colonna, gira la matrice ecc......). Grazie di tutto!!!
__________________
Athlon xp 2500@2300mhz, abit nf7-s, creative geforce4 ti 250@300-500@600, 256x2 ddr 400 samsung dual channel, H.D. maxtor diamond plus 60gb, soundblaster live 5.1, mast.dvd piooner 105, mast.cd liteon 40125S, creative inspire 5+1..... |
|
|
|
|
|
#6 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Quote:
Se vuoi poter fare tutto in tranquillità, forse ti conviene usare una struttura dati in cui memorizzi numero di righe, numero di colonne, ed elementi: in questo modo, prima di fare un'operazione, controlli se si può fare davvero (es.: la somma si può fare solo tra matrici che hanno uguale numero di righe e di colonne). Anzi: mi sa che ti conviene fare proprio così, ti servirà anche da allenamento quando dovrai gestire dei casi altrettanto complicati nella "vita reale".
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Sep 2002
Messaggi: 220
|
ho provato cosi ma ci sono sempre degli errori.....sembra che ci sia qualcosa di sbagliato in "visualizza"
#include <stdlib.h> #include <stdio.h> #include <conio.c> /* dichiarazione dei prototipi di funzione */ int leggi_numero(char*); void inserisci(char*,int**,int,int); void visualizza(char*,int**,int,int,int); /* programma principale */ void main (void) { int righe,colonne; int **mat; /* puntatore a puntatore */ int i; righe = leggi_numero ("Inserisci il numero delle righe della matrice..."); colonne = leggi_numero ("Inserisci il numero delle colonne della matrice..."); mat = (int**)malloc(righe*sizeof(int*)); for (i=0;i<righe;i++) mat[i] = (int *)malloc(colonne*sizeof(int)); inserisci("Hai inserito la matrice:\n",mat,righe,colonne); visualizza("Hai inserito la matrice:\n",mat,righe,colonne); getch(); } /* definizione delle funzioni */ int leggi_numero(char*s) { int num; printf ("%s", s); scanf ("%d", &num); clrscr(); return (num); } void inserisci (char*s,int**x,int rig,int col) { int i,j; printf("%s Numero_righe: %d Numero_colonne: %d", s,rig,col); for (i=0;i<rig;i++) for (j=0;j<col;j++) scanf ("%d", &x[i][j]); clrscr(); } void visualizza (char*s, int**x,int rig,int col) { int i,j; printf("\n\n%s", s); for (i=0;i<rig;i++){ for (j=0;j<col;j++) printf("%d ", x[i][j]); printf("\n"); } printf("\n"); }
__________________
Athlon xp 2500@2300mhz, abit nf7-s, creative geforce4 ti 250@300-500@600, 256x2 ddr 400 samsung dual channel, H.D. maxtor diamond plus 60gb, soundblaster live 5.1, mast.dvd piooner 105, mast.cd liteon 40125S, creative inspire 5+1..... |
|
|
|
|
|
#8 | ||||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Quote:
Quote:
Potrebbe farlo il programma da solo; ma anche no. E poi, e' una buona abitudine da prendere. Quote:
A proposito: cosi' e' piu' chiaro per l'utente: Codice:
for (i=0; i<rig; i++) {
for (j=0: j<col; j++) {
printf("Inserire elemento di riga %d e colonna %d: ",i,j);
x[i][j] = leggi_int("");
} /* for j */
} /* for i */
clrscr();
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||||
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Sep 2002
Messaggi: 220
|
Ciao....ti ringrazio veramente!!!!
Oggi pomeriggio proverò a farla una senza char..... Stamattina ho provato a fare un altro programmino che crea un vettore con la somma delle righe di una matrice.....ovviamente mi da un errore!!!! Nn saprei veramente come fare la parte principale del programma, quella che calcola la somma delle righe. Mi potresti aiutare?? Scusa se ti chiedo cosi tante cose ma sei l unico che mi ha risposto.... Grazie Ciao ciao /*programma che crea un vettore con la somma delle righe di una matrice */ #include <conio.c> #include <stdlib.h> #include <stdio.h> const int rig = 3; /* dichiaro le costanti righe e colonne*/ const int col = 3; void leggi_matrice(int m[rig][col]); /* prototipi di funzioni*/ void stampa_matrice(int m[rig][col]); void stampa_vettore(int v[], int dim); void somma_righe(int m[rig][col], int vetMaxrig[]); void leggi_matrice(int m[rig][col]) { int i,j; for (i = 0; i < rig; i++) for (j = 0; j < col; j++) scanf("%d", &m[i][j]); } void stampa_matrice(int m[rig][col]) { int i, j; for (i = 0; i < rig; i++) for (j = 0; j < col; j++) printf("%5d", m[i][j]); printf("\n"); } void stampa_vettore(int v[], int dim) { int i; printf("Indice Elemento\n"); for (i = 0; i < rig; i++) printf("%6d %8d\n", i, v[i]); } void somma_righe(int m[rig][col], int vetMaxrig[]) /*crea il vettore somma delle righe*/ { int i,j; for (i = 0; i < rig; i++) vetMaxrig[i] = m[i][0]; for (j = 0; j < [0]col; j++) vetMatrig += m[i][j]; } int main(void) /*corpo principale funz. main*/ { int mat[rig][col]; int vetRighe [rig]; leggi_matrice (mat); somma_righe (mat, vetRighe); printf ("Vettore della somma delle righe...\n"); stampa_vettore (vetRighe, rig); system ("PAUSE"); }
__________________
Athlon xp 2500@2300mhz, abit nf7-s, creative geforce4 ti 250@300-500@600, 256x2 ddr 400 samsung dual channel, H.D. maxtor diamond plus 60gb, soundblaster live 5.1, mast.dvd piooner 105, mast.cd liteon 40125S, creative inspire 5+1..... |
|
|
|
|
|
#10 | |||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Quote:
Quote:
Codice:
return 0;
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|||
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Sep 2002
Messaggi: 220
|
Ok....ogni volta che mi da un errore te lo scrivo!!
Ora il prog funziona però nn fa assolutamente quello che vorrei che facesse!!!! Credo che l'errore sia nella funzione somma_righe..... però nn saprei come correggerlo per fargli memorizzare in un vettore la somma delle righe....potresti darmi qualche consiglio?? Grazie!!!!!!!!!!! /*programma che crea un vettore con la somma delle righe di una matrice */ #include <conio.c> #include <stdlib.h> #include <stdio.h> const int rig = 2; /* dichiaro le costanti righe e colonne*/ const int col = 2; void leggi_matrice(int m[rig][col]); /* prototipi di funzioni*/ void stampa_matrice(int m[rig][col]); void stampa_vettore(int v[], int dim); void somma_righe(int m[rig][col], int vetMaxrig[]); void leggi_matrice(int m[rig][col]) { int i,j; printf("Inserire i dati nella matrice %dx%d\n\n",rig, col); for (i = 0; i < rig; i++) for (j = 0; j < col; j++) scanf("%d", &m[i][j]); } void stampa_matrice(int m[rig][col]) { int i, j; for (i = 0; i < rig; i++) { for (j = 0; j < col; j++) printf("%5d", m[i][j]); printf("\n\n"); } } void stampa_vettore(int v[], int dim) { int i; printf("Indice Elemento\n"); for (i = 0; i < rig; i++) printf("%6d %8d\n", i, v[i]); } void somma_righe(int m[rig][col], int vetMaxrig[]) /*crea il vettore somma delle righe*/ { int i,j; for (i = 0; i < rig; i++) vetMaxrig[i] = 0; for (j = 1; j < col; j++) vetMaxrig += m[i][j]; } int main(void) /*corpo principale funz. main*/ { int mat[rig][col]; int vetRighe [rig]; leggi_matrice (mat); printf("La matrice che hai inserito...\n\n"); stampa_matrice (mat); somma_righe (mat, vetRighe); printf ("Vettore della somma delle righe...\n"); stampa_vettore (vetRighe, rig); system ("PAUSE"); return 0; }
__________________
Athlon xp 2500@2300mhz, abit nf7-s, creative geforce4 ti 250@300-500@600, 256x2 ddr 400 samsung dual channel, H.D. maxtor diamond plus 60gb, soundblaster live 5.1, mast.dvd piooner 105, mast.cd liteon 40125S, creative inspire 5+1..... |
|
|
|
|
|
#12 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:33.



















