Quando sono mancato la prof. ha spiegato le matrici e leggendo quell'infimissimo libro ho capito ben poco... è tipo un vettore, ma...?
Visualizzazione Stampabile
Quando sono mancato la prof. ha spiegato le matrici e leggendo quell'infimissimo libro ho capito ben poco... è tipo un vettore, ma...?
E' un vettore di vettori :sisi:, tipo ad esempio
int matrice[][] = {{1,2,3,4,5},{1,2,3,4,5},poi per scorrere la matrice usi due cicli for annidati, ad esempio:
{1,2,3,4,5}};
for(int i=0; i<matrice.size(); i++) {
for(int j=0; j<matrice.size() j++) {
printf(...matice[i][j]..);
}
}
semplice, ovviamente il codice è messo lì da esempio ma il concetto alla fine è quello :sisi:
vai alla voce "multidimensional arrays"
http://www.cplusplus.com/doc/tutorial/arrays/
Si, credo si possa scrivere
for(.......)for(....)printfl(...)
ma io uso sempre le graffe, anche per una sola istruzione, sono abituato così e quando lavori con progetti dalle medie dimensioni in su molte volte una chiara indentazione del codice ti salva la vita :sisi:, e comunque le graffe me le mette l'IDE in automatico :asd:
Occhio:
Fixed.
Dire "vettore di vettori" per quanto possa sembrare corretto e' in realta' senmanticamente una cosa diversa.
Anche il codice d'esempio e' contiene un errore: L'operatore size() non esiste nei vettori "normali" in C/C++, ma solo nei contenitori STL. Indipercui il ciclo che hai scritto non compila. In casi come quello del suo esempio, quando cioe' la dimensione della matrice e' nota, si usano un paio di #define per creare delle costanti simboliche che rapresentano la dimensione della matrice e le si usano nella definizione e nella giardia die cicli for.
L'esempio corretto e quindi questo:
:sisi:
THIS.
L'uso delle graffe e' obbligatorio solo se il blocco di codice da eseguire nel ciclo/costrutto condizionale contiene piu' di una istruzione, ma e' un OTTIMA regola usarlo sempre e comunque, anche solo per aumentare la chiarezza del codice.
:asd:
Diciamo anche che tendo a fare esempi in pseudo codice misto C++/Java/Haskell per sintetizzare la cosa, poi certi particolari li ritengo ovvi a seconda del linguaggio usato e non li scrivo, però in effetti il ragazzo qua sopra magari ha proprio appena cominciato e rischia solo di confondersi le idee :asd:
Ragazzi mi siete stati davvero utili. Nonostante sia mancato alla spiegazione in classe sono uno di quelli che sa usare meglio di tutti le matrici :asd: Mi prendono per pazzo perché vado direttamente in codifica senza diagramma di flusso :bua:
Ora vi volevo porre un'altra domanda... come si utilizza il la selezione casuale dei valori (leggasi random)? La prof. ancora non l'ha spiegato ma caricare anche solo una matrice da 10x10 richiederebbe un botto di tempo... :bua:
Raddoppio la domanda :asd:
Che ha di sbagliato questo programma? :stress:
Spoiler:
Dovrebbe ricercare il massimo della riga e controllare se quest'ultimo è il minimo della colonna...
1) Per generare numeri casuali puoi usare il rand()
http://www.cplusplus.com/reference/c.../rand/?kw=rand
2) Così a prima vista nel secondo ciclo for incrementi ancora "i" al posto di "j"
AH dimenticavo, nell'intestazione dei cicli for c'è un'altro errore abbastanza grave, ma lascio a te il piacere di scoprirlo :fag:
E boh. La prof aveva detto che "forse" era giusto* :bua:
*c'è stata mezz'ora ad interpretarlo e non era neanche sicura
No vabbè, ma cambiate profe, se nemmeno lei si è accorta che i cicli for vanno in overflow siete messi male :bua:
Inoltre a metà programma si utilizza una variabile non inizializzata :sisi:
E perché dovrebbe andare in overflow? :pippotto:
perchè la dimensione degli array che compongono la matrice è 2 mentre il ciclo for fa 3 "giri", gli indici di un array partono sempre da 0 quindi in questo caso sono 0 e 1, mentre nel ciclo la variabile "i" (e j) viene incrementata tre volte in quanto i=0; i<3; ovvero 0,1,2 e quando arriva a 2 va in overflow, va a leggere una cella di memoria che non appartiene all'array :sisi:
Alla fine ho preso 7,5 :asd:
Comunque sono qua per altre delucidazioni. Stavolta si parla di stringhe, in generale e in breve: non so nulla :bua:
ora hai una variabile chiamata "cacca" contenente una cosa che è fondamentalmente un array di caratteri char, e che puoi estrarre e modificare usando appunto un semplice array e il suo indice (es. per accedere alla 'o' di "congratulazioni", useresti voto[1]). Le stringhe sono molto comode. Ovviamente devi utilizzare cstring.h, se la memoria non m'inganna (non programmo da qualche anno, e non sono mai stato su chissà quali livelli).Codice:string compito = "congratulazioni per il voto";
c'è un sito molto utile dove trovare un sacco di informazioni in merito, con tanto di esempi! Here: http://www.cplusplus.com/reference/string/string/
Allora in C le stringhe sono semplicemente vettori di caratteri. Puoi definire una stringa nel seguente modo:
Se non avete studiato ancora i puntatori (e direi che sia cosi' visto l'obbrobrio di prima con le matrici) puoi fare anche cosi':Codice:char* foo = "stringa";
che tanto e' piu' o meno la stessa cosa.Codice:char foo[] = "stringa";
Per convenzione in C le stringhe sono zero-terminated, ossia esse finiscono sempre con un carattere di terminazione che viene spesso indicato come '\0' ad indicare che non e' il codice ascii di zero, ma proprio il valore 0.
In poche parole in C una stringa e' un vettore di caratteri piu' il terminatore \0 in fondo. Nell'esempio che ti ho mostrato la parola 'stringa' ha 7 caratteri, il che significa che il compilatore C creera' un vettore di 8 elementi (7 lettere + il terminatore).
Quindi:
foo[0] vale 's'
foo[1] vale 't'
foo[2] vale 'r'
foo[3] vale 'i'
foo[4] vale 'n'
foo[5] vale 'g'
foo[6] vale 'a'
foo[7] vale '\0'
Dal punto di vista del linguaggio, e' piu' o meno tutto quello che c'e' da dire sulle stringhe. E' un vettore e lo puoi trattare come tutti gli altri vettori. A livello di libreria, c'e' <string.h> (o <cstring>) che ti da accesso a funzioni di manipolazione delle stringhe. Le tre piu' famose sono:
strcpy - Copia una stringa in un'altra
strcmp - Confronta due stringhe
strlen - Ritorna il numero di caratteri della stringa (il terminatore non viene conteggiato)
Tutte queste funzioni assumono che la stringhe terminino correttamente con '\0'.
In C++ queste funzioni non andrebbero usate, visto che c'e' <string> che e' piu' sicura e robusta (e semplice da usare). Ci sono alcuni casi di applicazioni industriali in cui si deve usare per forza la stringa C style, ma in generale sarei sorpreso di trovare ancora le stringhe C in un programma moderno.