Dove sbaglio nel codice?

di il
2 risposte

Dove sbaglio nel codice?

Ciao a tutti, ho problemi con un esercizio di programmazione..

Data una mappa rettangolare contenente lettere dell’alfabeto minuscole, memorizzata in un file di testo, devo realizzare un programma in grado di individuare la sequenza di caratteri uguali disposti sulla stessa riga o sulla stessa colonna ed avente lunghezza massima. Il nome del file e la lettera da ricercare sono passati su linea di comando. Un esempio di mappa è il seguente:

qqaaaczzbxq
wwwcccsbrrb
eddddddeeba
dddbacqwerr

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define R 4
#define C 11+1

struct sequenza { //dichiarazione struttura
    int riga,colonna;
    int inizio,fine;
    };

int main(int argc, char * argv[])
{
    char m[R][C];
    int i,j,max=0,lunghezza=0,flag_orizzontale=0;

    struct sequenza seq;

    FILE *fp;

    seq.riga=0, seq.colonna=0, seq.inizio=0, seq.fine=0;

    if(argc!=3){
        printf("Errore\n");
        return -1;
    }

    fp=fopen(argv[1],"r");
    if(fp==NULL){
        printf("errore apertura file\n");
        return -2;
    }


    //controllo se la sequenza e' in orizzontale
    for (i=0;i<R;i++){
        for (j=0;j<C;j++){
            fscanf(fp,"%c ",&m[i][j]); 

            if(*argv[2]==m[i][j]){ //argv[2] è la lettera che mi passa da riga di comando
                    lunghezza++;

                    if(lunghezza>max){ //se trovo una sequenza di caratteri uguali più lunga in orizzontale
                        max=lunghezza;
                        seq.riga=i+1; //la riga parte da 0 quindi +1

                        seq.fine=j+1;
                        seq.inizio=seq.fine-max;

                        flag_orizzontale=1; //se trovo la seguenza in orizzontale vale 1

                        lunghezza=0; //resetto il contatore per cercare eventualmente un altra sequenza max
                    }
                }
            }
        }

    //controllo se la sequenza e' in verticale
    for (j=0;j<C;j++){
        for (i=0;i<R;i++){

             if(*argv[2]==m[i][j]){ 
                    lunghezza++;

                    if(lunghezza>max){ //se trovo una sequenza di caratteri uguali più lunga in orizzontale
                        max=lunghezza;
                        seq.colonna=i+1;

                        seq.fine=j+1;
                        seq.inizio=seq.fine-max;

                        flag_orizzontale=0; //se trovo la seguenza in orizzontale vale 1

                        lunghezza=0; //resetto il contatore per cercare eventualmente un atra sequenza max
                    }
                }
            }
        }

    if (flag_orizzontale==1){
        printf("Sequenza trovata: Carattere %c - orizzontale - riga %d - lunghezza %d\n", *argv[2], seq.riga, max);
        printf("Inizio: Colonna %d - Fine: colonna %d \n", seq.inizio,seq.fine);
    }
    else
    {
        printf("Sequenza trovata: Carattere %c - verticale - colonna %d - lunghezza %d\n", *argv[2], seq.colonna, max);
        printf("Inizio: riga %d - Fine: riga %d \n", seq.inizio,seq.fine);
    }

    return 0;
} 
Potere aiutarmi a capire dove sbaglio? Il problema è che quando eseguo mi sballa totalmente le righe e colonne

2 Risposte

  • Re: Dove sbaglio nel codice?

    Comincerei a togliere quel "+1" da "#define C 11+1", poi passerei a verificare per bene il modo in cui hai usato gli indici.
  • Re: Dove sbaglio nel codice?

    AldoBaldo ha scritto:


    Comincerei a togliere quel "+1" da "#define C 11+1", poi passerei a verificare per bene il modo in cui hai usato gli indici.
    Cosa sbaglio con gli indici?
Devi accedere o registrarti per scrivere nel forum
2 risposte