Programma linguaggio C

gaetano010
Salve ragazzi,
un esercizio mi richiede di trovare,in una matrice di caratteri,di trovare una parola inserita da utente e dire se tale parola si trova in orizzontale,verticale,o in obliquo.

Qualche suggerimento ?

Risposte
xneo1
Se conosci ciclo for e puntatori sei a cavallo.

gaetano010
"xneo":
Se conosci ciclo for e puntatori sei a cavallo.

un piccolo input? sono alle prime armi e ho un pò di difficoltà

xneo1
E' un esercizio talmente banale che il piccolo input sarebbe scriverti la soluzione.
Sai come scandire una matrice per righe, per colonne e in obliquo (indendi diagonale principale e secondaria? o andare a scandire in obliquo anche i triangoli?)?
Se no, impara (Google ti darà una mano ;) )
Se si, l'esercizio sta tutto nel capire se una stringa è contenuta in un array di caratteri.

gaetano010
"xneo":
E' un esercizio talmente banale che il piccolo input sarebbe scriverti la soluzione.
Sai come scandire una matrice per righe, per colonne e in obliquo (indendi diagonale principale e secondaria? o andare a scandire in obliquo anche i triangoli?)?
Se no, impara (Google ti darà una mano ;) )
Se si, l'esercizio sta tutto nel capire se una stringa è contenuta in un array di caratteri.


no,intendo proprio scandire tutti gli elementi della matrice,quello che non capisco è come far capire al programma che la parola sia orizzontale,verticale,o in obliquo...e i triangoli non ne ho idea di come si faccia...

xneo1
Ripeto, sai scandire una matrice per righe? Se si, a questo punto se la sequenza di caratteri che forma la riga (e quella nell'ordine inverso, cioè da destra verso sinistra) è uguale alla stringa data, significa che la stringa è contenuta in orizzontale.
Sai scandire la stringa per colonne? Se si, se la sequenza di caratteri che forma la colonna ( e quella nell'ordine inverso, cioè dal basso verso l'alto) è uguale alla stringa data, significa che la stringa è contenuta in verticale.
Per semplificare, supponiamo che per obliquo si intendano solo le diagonali, il ragionamento è lo stesso.

Se alle domande ti rispondi in modo negativo, allora cerca su Google -> matrici in C.

vict85
@xneo : professionalmente parlando, nessuno implementa le matrici in C come suggerito dalla maggior parte dei professori. I loro esercizi sulle matrici sono più fatti per esercitare gli studenti sull'allocazione dinamica che reali consigli su come si allocano matrici in ambiente professionale. In genere una matrici si alloca come un unico array \(M\times N\) dimensionale e accedendo agli elementi come \(A_{i,j} = A[ i\times N + j ]\).

@gaetano0: Il tuo esercizio non è diverso da quello di cercare una parola in un array. Semplicemente la direzione della seconda parola non è definita a priori. Prova ad implementare il primo e poi generalizza. Insomma viene implementato in maniera abbastanza brute force.

xneo1
@vict85 Credo che l'utente sia ancora in una fase "didattica" (mi sembra un classico esercizio sulle matrici per usare i due for innestati). Non mi sembra opportuno complicargli ancora di più le cose.

apatriarca
Mi sembra abbastanza chiaro che @gaetano0 non ha ancora abbastanza dimestichezza con le matrici o con i cicli for da svolgere l'esercizio senza suggerimenti più chiari. Suppongo che con matrice bidimensionale di caratteri tu intenda qualcosa dichiarato come segue:
char matrice[N][N];


La struttura generale del programma sarà qualcosa come segue:
1. Inizializzazione matrice (non ho idea se sia costante o se va inserita dall'utente o altro)
2. Lettura della parola dall'utente
3. Ricerca della parola in orizzontale su ogni riga. Dovrai fare insomma un ciclo per ogni riga e cercare la parola in quella riga con due cicli for annidati. Se trovi la parola allora puoi comunicare all'utente che si trova in orizzontale e uscire dal programma.
4. Ricerca della parola in verticale su ogni colonna. Devi insomma fare un ciclo per ogni colonna e cercare la parola in quella colonna con due cicli annidati. Se trovi la parola allora puoi comunicare all'utente che si trova in verticale e uscire dal programma.
5. Ricerca della parola in diagonale. In questo caso è un po' più complicato ma comunque simile ai precedenti. Una volta risolti i punti 3 e 4 possiamo passare a questo punto.

Per i punti 3 e 4 è sufficiente osservare che una riga è costituita dagli elementi della matrice con il primo indice fissato e una colonna è costituita dagli elementi della matrice con il secondo indice fissato. Se \(i\) rappresenta il primo indice e \(j\) il secondo avremo quindi qualcosa come segue:
// Orizzontale
for (i = 0; i < N; ++i) { /* ciclo per ogni riga */
    /* ricerca della parola in matrice[i][*] dove l'asterisco indica l'indice che 
        andrà modificato nel ciclo interno che ho omesso */
}

// Verticale
for (j = 0; j < N; ++j) { /* ciclo per ogni colonna */
    /* ricerca della parola in matrice[*][j] dove l'asterisco indica l'indice che 
        andrà modificato nel ciclo interno che ho omesso */
}

gaetano010
ma io pensavo di fare un ciclo di questo tipo

for(i=0;i {
for(j=0;j if(s1==MAT[j])
printf(" la parola è orizzontale");
}

for(j=0;j for(i=0;i if(s1[j]==MAT[j])
printf("la parola e' verticale");



dove s1 è la stringa inserita da utente ma il programma va in loop

gaetano010
"apatriarca":
Mi sembra abbastanza chiaro che @gaetano0 non ha ancora abbastanza dimestichezza con le matrici o con i cicli for da svolgere l'esercizio senza suggerimenti più chiari. Suppongo che con matrice bidimensionale di caratteri tu intenda qualcosa dichiarato come segue:
char matrice[N][N];


La struttura generale del programma sarà qualcosa come segue:
1. Inizializzazione matrice (non ho idea se sia costante o se va inserita dall'utente o altro)
2. Lettura della parola dall'utente
3. Ricerca della parola in orizzontale su ogni riga. Dovrai fare insomma un ciclo per ogni riga e cercare la parola in quella riga con due cicli for annidati. Se trovi la parola allora puoi comunicare all'utente che si trova in orizzontale e uscire dal programma.
4. Ricerca della parola in verticale su ogni colonna. Devi insomma fare un ciclo per ogni colonna e cercare la parola in quella colonna con due cicli annidati. Se trovi la parola allora puoi comunicare all'utente che si trova in verticale e uscire dal programma.
5. Ricerca della parola in diagonale. In questo caso è un po' più complicato ma comunque simile ai precedenti. Una volta risolti i punti 3 e 4 possiamo passare a questo punto.

Per i punti 3 e 4 è sufficiente osservare che una riga è costituita dagli elementi della matrice con il primo indice fissato e una colonna è costituita dagli elementi della matrice con il secondo indice fissato. Se \(i\) rappresenta il primo indice e \(j\) il secondo avremo quindi qualcosa come segue:
// Orizzontale
for (i = 0; i < N; ++i) { /* ciclo per ogni riga */
    /* ricerca della parola in matrice[i][*] dove l'asterisco indica l'indice che 
        andrà modificato nel ciclo interno che ho omesso */
}

// Verticale
for (j = 0; j < N; ++j) { /* ciclo per ogni colonna */
    /* ricerca della parola in matrice[*][j] dove l'asterisco indica l'indice che 
        andrà modificato nel ciclo interno che ho omesso */
}




il problema non sono l'uso dei cicli,ma come cercare una parola in un array

Super Squirrel
Io farei nel seguente modo:

- scorrendo la matrice (per esempio per righe), trovare un carattere che coincide con l'iniziale della parola;
- considerando gli indici del suddetto elemento e la lunghezza della parola, capire se la parola potrebbe essere contenuta nella matrice a partire dall'elemento considerato in una data direzione e in un dato verso;
- in caso di risposta affermativa controllare se la parola è effettivamente contenuta attraverso l'utilizzo di un ciclo for.

Magari inizia ad impostare qualcosa ricercando solo in orizzantale (da sinistra verso destra) e in verticale (dall'alto verso il basso). Fatto questo si può poi ragionare sugli altri casi.

vict85
Se lo scopo è fare un programma che risolva il gioco "trova la parola" allora dovresti tenere conto che la parola potrebbe esserci anche "rovesciata".

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.