Quando sono mancato la prof. ha spiegato le matrici e leggendo quell'infimissimo libro ho capito ben poco... è tipo un vettore, ma...?
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 , 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
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 , e comunque le graffe me le mette l'IDE in automatico
Ultima modifica di ZioYuri78; 17-01-13 alle 20:59:24
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:
Codice:#define NUM_RIGHE 3 #define NUM_COLONNE 5 int matrice[NUM_RIGHE][NUM_COLONNE] = {{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}}; poi per scorrere la matrice usi due cicli for annidati, ad esempio: for(int i=0; i<NUM_RIGHE; i++) {for(int j=0; j<NUM_COLONNE j++) {printf(...matice[i][j]..); }}
THIS.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 ,
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.
Ultima modifica di LordOrion; 28-01-13 alle 08:55:06
Sisi lo so, infatti ho anche detto che il codice l'ho scritto alla carlona, tanto per fargli capire il senso dell'algoritmo, raramente scrivo codice corretto negli esempi, altrimenti se uno si trova sempre la pappa pronta poi non impara più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.
Ok, mantrattare i newbie e cosa buona e giusta, ma non esageriamo dai
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
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 Mi prendono per pazzo perché vado direttamente in codifica senza diagramma di flusso
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...
Ultima modifica di saichisono; 11-02-13 alle 13:11:04
Raddoppio la domanda
Che ha di sbagliato questo programma?
Spoiler:
#include <stdlib.h>
#include <stdio.h>
int main () {
int i,j,f,fl,mat[2][2],m,v;
fl=0;
for(i=0;i<3;i++)
for(j=0;j<3;i++)
scanf("%d",&mat[i][j]);
for(j=0;j<3;j++){
m=mat[0][j];
for(i=1;i<3;i++)
if(m<mat[i][j]){
m=mat[i][j];
f=i;
}
for(v=0;v<3;v++)
if(m<mat[f][v]){
fl=1;
v=2;
}
if(fl!=1){
printf("%d","%d",f,j);
system("pause");
}
}
system("pause");
}
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
Ultima modifica di ZioYuri78; 13-02-13 alle 12:32:55
E boh. La prof aveva detto che "forse" era giusto*
*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
Inoltre a metà programma si utilizza una variabile non inizializzata
Ultima modifica di ZioYuri78; 15-02-13 alle 10:03:22
E perché dovrebbe andare in overflow?
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
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
Ma se scrivo (esempio) int vet[2] il vettore non dovrebbe avere le celle 0,1,2? Quindi non dovrebbe andare in overflow, o sbaglio?
Ad ogni modo ci metto i<=2 e siamo tutti contenti
Assolutamente no , int vet[2] imposta la dimensione dell'array a due celle di indici 0 e 1
Inoltre se metti i<=2 non risolvi il problema in quanto equivale a scrivere i<3, devi mettere i<2
Mapporca... spero che non se ne accorga leggendo il compito in classe
Grazie mille Zio.
Alla fine ho preso 7,5
Comunque sono qua per altre delucidazioni. Stavolta si parla di stringhe, in generale e in breve: non so nulla
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";
Non sono sicuro di aver afferrato. E poi non parli delle funzioni string copy, string compare e le altreora 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/
Riportato qualche post fa, miglior sito everc'è 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.
Ultima modifica di Frinn; 28-02-13 alle 19:34:32