|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
tra alcuni giorni ho l'esame, datemi qualche dritta
ciao a tutti!
tr un pò di giorni ho l'esame di fondamenti 1; fin'ora mi sono esercitato su esercizi elementari come verifica del triangolo, equazione di secondo grado etc usando i tipi di dato, istruzioni condizionali switch if....else, cicli do...while, while e for...e me la sono cavata bene! ora ho scaricato ilo programma dell'esame dal sito uni e la traccia dovrebbe come questa: Si realizzi un progamma strutturato tramite funzioni che consenta: di leggere da standard input un matrice di numeri interi, facendo scegliere all'utente il riempimento di riga e di colonna (funzione acquisisci); di leggere da standard input una seconda matrice, le cui dimensioni di riga e colonna siano fissate e pari a quelle della prima matrice (funzione acquisisci2); di stampare una matrice (funzione stampa); di trovare il minimo di una matrice, restituendolo come valore di ritorno della funzione (funzione minimo); di sommare gli elementi sulla diagonale principale di una matrice (funzione somma_diagonale); di calcolare la somma delle due matrici salvando il risultato in una terza matrice (funzione somma); probabilmente non vorrà tutto il codice, ma solo di completarlo...e ho alcune domanducce da fare....: 1) #define N 10 #define M 15 cosa significano? 2) void acquisisci(int mat[N][M],int *n,int *m); void stampa(int mat[N][M],int n,int m); int minimo(int mat[N][M],int n,int m); void acquisisci2(int mat[N][M],int n,int m); void somma(int mat1[N][M],int mat2[N][M],int mat3[N][M],int n,int m); int somma_diagonale(int mat[N][M],int n); è necessario il void? perchè? acquisisci e somma_diagonale sono 2 funzioni giusto? qual è il significato preciso del cotenuto delle parentesi? aiutooooooooooooooooooo |
|
|
|
|
|
#2 | ||||
|
Senior Member
Iscritto dal: Jun 2002
Città: Firenze
Messaggi: 630
|
Re: tra alcuni giorni ho l'esame, datemi qualche dritta
Quote:
Quote:
Quote:
Vedi N e M nelle dichiarazioni di funzioni, quando compili al posto di N e M vengono messe le due suddette costanti. Quote:
ACQUISISCI deve riempirti la matrice MAT con i valori inseriti da tastiera e ritornarti in "n" e "m" le sue dimensioni in righe colonne. Infatti sia MAT che "n" che "m" sono passati per indirizzo. SOMMA_DIAGONALE deve sommare la diagonale della matrice, la cui dimensione unica è "n", unica perché per esserci una diagonale devi avere una matrice quadrata in cui il numero di righe è uguale a quello delle colonne. La funzione deve ritornare il valore della somma.
__________________
---> Lombardp CSS Certified Expert (Master Level) at Experts-Exchange Proud user of LITHIUM forum : CPU technology Webmaster of SEVEN-SEGMENTS : Elettronica per modellismo |
||||
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
grazie per le risposte
una cosa: sto da ore per chiarirmi il concetto di array, ho fatto ricerche, ma sto impazzendo.... so cos'è (un contenitore di elementi dello stesso tipo, caratterizzati da indice che li distingue, da 0 a n-1 se avete qualche link, o avete la pazienza di spiegarmelo in parole povere (sopratutto il legame con il ciclo for, e l'incremento i++), o volete mandarmi un insulto ciaooooo |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
ecco il code
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
eccolo non era andato!
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
allora, se chiarisci meglio quali sono i tuoi dubbi sull'uso degli array ti possiamo dare delle spiegazioni più chiare.
l'utilità innanzitutto è inutile che te la spieghi... se devi memorizzare mettiamo 100 valori tu che fai? crei 100 variabili? no! fai un array di 100 elementi... hai voglia a fare 100 assegnamenti ad ognuna delle variabili, fai il ciclo e con 2 istruzioni sei a posto... operazioni da fare sugli elementi? quelle che fai su una variabile... perché sono legati al ciclo for? perché un array ha l'indice, tu scrivendo array[i] ad esempio indichi che vuoi l'iesimo elemento (in realtà sarebbe l'iesimo + 1 visto che gli indici di un array partono da 0). quando tu dici array[i] dici al programma che ti interessa prendere ciò che c'è in memoria all'indirizzo array + i, hai afferrato il concetto? un array è un'area di memoria contigua di x byte, dove x lo specifichi tu quando crei l'array. quando usi il for, con l'incremento della i, significa che ad ogni iterazione del ciclo consideri il successivo elemento dell'array, fino ad arrivare alla fine. il codice non l'ho visto, cmq se hai altri dubbi sii più specifico. ciao |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
forse inizio a capire qualcosa!
quindi, quando dopo la dichiarazione di array trovo: for(i=1;i<100;1++) questo ciclo non fa altro che "dare un numero" agli arrai da 0 a 99? non mettendo il ciclo, cosa accadrebbe? potre lo stesso operare su qualsiasi array, come "array[10]=pippo" ? qual'è il legame con le matrici? cia e grazie per l'aiuto ps: che bello il nome della tua città |
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Gli array con na dimensione (int a[N]) li puoi in pratica accomunare alle matrici riga o colonna...mentre gli array bidimensionali (int m[N][M]) li puoi accomunare alle matrici...
Per accedere agli array puoi farlo direttamente : a[10] = 100; //scrivi nell'undicesima posizione dell'array (ricordandoti che partono da zero) a[9][4] = 15; //scrivi nella decima riga, quinta colonna Oppure tramite una variabile intera : a[x] a[i][j] In pratica i for o while (o qualsiasi altro ciclo) ti servono per operare sugli array variando i,j o x come faresti in negli algoritmi che lavorano sulle matrici... Ad esempio "Sommatoria con i cha va da 1 a N(v(i))" dove v è un vettore di N elementi si traduce in questo modo : int v[N]; int i, somma; somma = 0; for(i = 0; i < N; i++) &nbsp;&nbsp;&nbsp;somma += v[i]; |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
Quote:
però è raro che accada, se fai un array in genere è perché vuoi operare proprio con un ciclo... se vuoi usare le matrici puoi fare come ti dice cionci più sopra, usi un doppio indice array[i][j] dove la i ti indica le colonne e la j le righe, oppure indicizzi l'array solo un una variabile e tieni conto che dopo x elementi (dove x è il numero di colonne) vai "a capo" nella riga successiva. cmq anche tu hai notato il nome della città... in genere la battutina è "ma a Erba ve ne fumate tanta?" |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
vediamo se ho capito, giudicate voi:
#include <stdio.h> #define R 2/*max numero righe*/ #define C 2/*max numero colonne*/ main() { int determinante,a[R][C]; scanf("%d",&a[0][0]); scanf("%d",&a[1][0]); scanf("%d",&a[0][1]); scanf("%d",&a[1][1]); determinante=((a[0][0]*a[1][1])-(a[0][1]*a[1][0])); printf("%d",determinante); } calcola il determinante della matrice quadrata 2x2. però non ho usato il for!!! perkè ancora non ci arrivo? sono stupido? non era lo stesso operare con 4 variabili?? |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Ma richiedi il numero di ricghe e il numero di colonne da tastiera e poi dimmi...oppure metti R = 50 e C = 50... In teoria potresti svilupparti anche tutto il prodotto, ma avrebbe poco senso... |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
ho iniziato così, x me sbagliando:
#include <stdio.h> #define R r/*ho detto che la variabile R deve essere r*/ #define C c/*ho detto che la variabile C deve essere c*/ main() { int a[R][C],a[r][c],determinante; /*dichiarazione dei 2 array*/ printf("INSERIRE IL NUMERO DI RIGHE: "); scanf("%d",&r); printf("INSERIRE IL NUMERO DI COLONNE: "); scanf("%d",&c); printf("%s%d%s%d%s","MATRICE A: ",r,"RIGHE E: ",c,"COLONNE"); a[r][c]=a[R][C];/*qui dico che la matrice a r righe e c colonne, definite dall'utente, deve corrispondere alla matrice a R righe e C colonne*/ for(r=0,r<R,r++);/*qui inizializzo r a 0, po dico che se r è minore di R, deve incrementerlo fino a raggiungere il valore di R; for(c=0,c<C,c++); dopo di questo non so come continuare; se ho capito, l'utente inserisce ad esempio il valore arbitrario r; r all'inizio vale zero, con il ciclo for viene aumentato fino a R; mettiamo caso r=4; for aumenta r da 0 fino a R=4; in questo modo la matrice a[r][c] assume tutti i valori (crescenti) fino al valore definito dall'utente.... se il mio ragionamento non è sbagliato, x il prodotto della diagonale (a parte mettere una condizione x la matrice quadrata) sarebbe impensabile fare come ho fatto prima (però l'utente potrebbe anche mettere 100000 come valore) come faccio? grazie mille x mi siete di grande aiuto, è moltobrutto leggere su un foglio che non risponde alle domande |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Scusa, ma mi sembra che tua abbia un po' di confusione in testa...non solo sugli array, ma anche sul C
Le #define in quel modo non si possono usare (o meglio...le puoi usare, ma non servono a niente in questo caso... Devi assegnare a R e C due valori che non vuoi siano superati durante l'immissione del numero di righe e colonne... Ad esempio 50... Quando immetti il numero di righe e colonne devi appunto controllare che r e c siano minori di R e C...altrimenti richiedi nuovamente i valori... Non capisco cosa intendi per : int a[R][C],a[r][c] a è già dichiarata...non puoi farlo più di una volta... Basta che tu dichiari a[R][C] e poi durante il programma userai solo una parte di questa matrice...cioè quella r * c con r e c immessi da tastiera... E non capisco nemmeno cosa vuoi fare qui : a[r][c]=a[R][C]; for(r=0,r<R,r++);/*qui inizializzo r a 0, po dico che se r è minore di R, deve incrementerlo fino a raggiungere il valore di R; for(c=0,c<C,c++); Perchè vuoi sporcare il valore di r e c che hai immaesso da tastiera ? Dopo ti servono pechè indicano le dimensioni delle matrici che devi usare all'interno del programma... D'accordo che funziona, ma al posto di questo : printf("%s%d%s%d%s","MATRICE A: ",r,"RIGHE E: ",c,"COLONNE"); potresti scrivere tranquillamente questo : printf("MATRICE A: %dRIGHE E: %dCOLONNE",r,c); |
|
|
|
|
|
#15 | ||||||
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
Quote:
Quote:
#define R 5 #define C 5 che sonno costanti e corrispondono al massimo indice dell'array che dopo definisco, giusto? quindi in questo caso max 5, cioè valori da 0 a 4. potrei farlo anche con if giusto? nel caso di define C 5, cosa succede se l'utente immette più di 5 valori? quale istruzione esegue? (in pratica, non esiste un else?) se non ricordo male, e mi puoi confermare, il compilatore se ne frega, con conseguenza che l'array supera la sua dimensione fissa e potrebbe dare errori? tu dici che come conviene farlo? define o if? Quote:
Quote:
capisco che ho sbagliato! Quote:
pensavo che servisse a dare gli indici all'array, che atrimenti sarebbero stati tutti 0... nella mia testa, ovviamente quindi non serve il for? Quote:
so che sono insistente, e ti ringrazio per la tua pazienza.... se hai icq, potrei chiederti alcune cose direttamente li! alla fine dopo aver detto che l'array deve essere max 5x5, come faccio a indicargli il prodotto di una colonna x esempio? o di una diagonale? devo scrivere per forza: a[0][0]*...... oppure c'è un metodo più elegante/veloce? e ancora, se non voglio un max di righe e colonne, come faccio? spero di essere stato chiaro! ps: che uni fai? |
||||||
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
non mi lasciate solo con i miei dubbi plz
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Al massimo ti posso fare un esempio...per chiarere i tuoi dubbi mi sa che ti serve un manuale o un libro sul C
Codice:
#include <stdio.h>
#define R 10 //massimo numero di righe
#define C 10 //massimo numero di colonne
void main()
{
int a[R][C], b[R][C], c[R][C];
int ar, ac, br, bc, i, j, k, somma;
do {
printf("\nInserire il numero di righe della matrice A : ");
scanf("%d",&ar);
//controllo che il numero immesso sia compreso fra 1 e R
if(ar < 1 || ar > R)
printf("\nIl numero di deve essere compreso fra 1 e %d\n",R);
} while(ar < 1 || ar > R);
do {
printf("\nInserire il numero di colonne della matrice A : ");
scanf("%d",&ac);
//controllo che il numero immesso sia compreso fra 1 e C
if(ac < 1 || ac > C)
printf("\nIl numero di deve essere compreso fra 1 e %d\n",C);
} while(ac < 1 || ac > C);
//il numero di righe di B deve essere pari al numero di colonne di A
printf("\nIl numero di righe di B e' %d. Necessario per fare il prodotto.\n",ac);
br = ac;
do {
printf("\nInserire il numero di colonne della matrice B : ");
scanf("%d",&bc);
//controllo che il numero immesso sia compreso fra 1 e C
if(bc < 1 || bc > C)
printf("\nIl numero di deve essere compreso fra 1 e %d\n",C);
} while(bc < 1 || bc > C);
printf("\nIMMISSIONE DELLA MATRICE A\n");
for(i=0; i<ar; ++i)
for(j=0; j<ac; ++j)
{
printf("Inserire A(%d,%d) : ",i+1,j+1);
scanf("%d",&a[i][j]);
}
printf("\nIMMISSIONE DELLA MATRICE B\n");
for(i=0; i<br; ++i)
for(j=0; j<bc; ++j)
{
printf("Inserisci B(%d,%d) : ",i+1,j+1);
scanf("%d",&b[i][j]);
}
//Prodotto righe-colonne : c è una matrice ar*bc
//Con i primi due for in pratica scorro gli elementi di c
for(i=0; i<ar; ++i)
for(j=0; j<bc; ++j)
{
//Ora devo sommare il prodotto fra gli elementi della
//i-esima riga di a e la j-esima colonna di b
//Con questo for scorro gli elementi dell'i-esima riga di a
//e della j-esima colonna di b (ac == br)
somma = 0; //uso questa varibile per comodità (e perchè è più veloce)
for(k=0; k<ac; ++k)
somma += a[i][k] * b[k][j];
c[i][j] = somma;
}
//Visualizzo C
printf("\nVISUALIZZAZIONE DELLA MATRICE C (%d righe x %d colonne)\n\n ", ar, bc);
for(j=0; j<bc; ++j)
printf("%6d", j+1);
printf("\n |");
for(j=0; j<bc; ++j)
printf("------");
for(i=0; i<ar; ++i)
{
printf("\n%2d|", i+1);
for(j=0; j<bc; ++j)
printf("%6d", c[i][j]);
}
printf("\n\n");
}
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
bhè mi sono un pò chiarito le idee e qualche programma l'ho fatto e funzionante per l'acquisizione, stampa a video e stampa su file...
ora vorrei chiederti come potrei sviluppare una bella funione per il calcolo del DETERMINANTE di una matrice! qualcuno mi da qualche spunto? ciao |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Lo sai l'algoritmo per il calcolo del determinante ? Ecco...basta applicarlo alla lettera
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:32.



















