Visualizzazione dei risultati da 1 a 10 su 10

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    144
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Non puoi risolvere senza allocare la memoria se non sai quanto è grande il file ...
    Dal testo del problema, so che il file non supera le dimensioni MAX_R x MAX_C

    Ecco il codice funzionante:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    #define MAX_R 50
    #define MAX_C 50
    
    
    int main(int narg, char *argv[])
    {
        char mat[MAX_R][MAX_C];
        /*il vettore riga mi serve per andare a*/
        char riga[MAX_R];
        /*op sta per operazione e sarebbe quello che tu hai chiamato "tipo" nel tuo programma*/
        char op;
        /*posizione invece sarebbe il numero della riga o della colonna che hai scelto di cancellare*/
        int pos;
        /*eff_r ed eff_c sono rispettivamente il numero di righe e colonne della matrice di caratteri letta dal file*/
        int eff_r, eff_c;
    
    
        int i,j;
        FILE *fp;
        /*flag_ciclo è una variabile che useremo per ciclare l'esecuzione del programma finche non si verificano errori o finchè l'utente non esca
        dal programma*/
        int flag_ciclo;
    
    
        if (narg!=2)
        {
            printf("Numero di parametri errato. \n");
            exit (1);
        }
    
    
        fp = fopen(argv[1], "r");
        if (fp == NULL)
        {
            printf("Errore nell'apertura del file %s \n", argv[1]);
            exit (1);
        }
    
    
        i = 0;
        /*leggo il file puntato da fp carattere per carattere e lo immagazzino in mat[i] (questo è quello che fa la funzione fgets).
        Il while si conclude quando si arriva alla fine del file*/
        while (fgets(mat[i],MAX_C,fp)!=NULL)
        {
            i++;
        }
        fclose(fp);
    
    
        printf("File %s letto correttamente. \n", argv[1]);
    
    
        /*memorizzo nella variabile effc la lunghezza di ogni riga (nota che sottraggo 1 perchè l'ultimo carattere presente nel vettore di stringhe
        mat è il terminatore di stringa '\0' che ovviamete non devo contare). Dunque effc rappresenta il numero di colonne della matrice*/
        eff_c = strlen(mat[0])-1;
    
    
        /*analogamente eff_r sarà il numero di righe della matrice che era memorizzato nella variabile i incrementata
        durante il while precedente*/
        eff_r = i;
    
    
        flag_ciclo = 0;
        /*tale ciclo mi serve perchè ogni volta che do il comando da tastiera, a fine esecuzione, il programma deve permettermi di digitare
        ulteriori comandi (in caso ti spiego meglio a voce)*/
        while(!flag_ciclo)
        {
            printf("Comando: ");
            /*La funzione gets brutalmente legge tutta la stringa corrispondente all’assegnazione e la funzione sscanf
            la scompone nei due elementi nome e valore del nome. La funzione sscanf restituisce il numero di campi che sono stati letti, in
            questo caso sarebbero 2: op e pos */
            gets(riga);
            j = sscanf(riga,"%c %d",&op,&pos);
    
    
            /*Qui ci sono due controlli per verificare che il numero di riga o di colonna sia stato immesso sulla linea di comando*/
            if ((op == 'r')&&(j == 1))
            {
                printf("Errore riga non specificata \n");
            }
            else if ((op == 'c')&&(j == 1))
            {
                printf("Errore colonna non specificata \n");
            }
            else
                /*Se l'utente ha inserito il comando completo verifico in quale caso mi trovo:*/
                switch(op)
                {
                  case 'x':
                      printf("Programma terminato senza salvataggio. \n");
                      return 1;
                      break;
                  case 'r':
                      /*se la posizione inserita supera il massimo numero di righe della matrice e/o la posizione < 1, visualizzo l'errore*/
                    if ((pos > eff_r)||(pos < 1))
                    {
                        printf("Errore: riga non specificata correttamente \n");
                        break;
                    }
                    else
                    {
                        //Rimuovi riga: copio ciclicamente riga+1 in riga e tolgo una riga totale
                        printf("Rimossa riga %d. La matrice contiene:\n", pos);
                        for (pos = pos-1; pos < (eff_r-1); pos++)
                        {
                            /*la funzione strcpy copia il contenuto di mat[pos+1] in mat[pos]. In pratica per eliminare la riga, sovrascrivo
                            la riga+1 in riga */
                            strcpy(mat[pos],mat[pos+1]);
                        }
                        /*decremento, giustamente, il numero di righe della matrice*/
                        eff_r--;
    
    
    
    
                            //Stampo la matrice dopo l'operazione
                            for (i = 0; i<eff_r; i++)
                            {
                                for (j = 0; j< eff_c;j++)
                                {
                                    printf("%c", mat[i][j]);
                                 }
                            printf("\n");
                            }
    
    
                    }
                    break;
                  case 'c':
                      /*al solito controllo che la posizione della colonna scelta sia una posizione ammissibile, ovvero che non superi i
                      limiti inferiore e superiore*/
                    if ((pos > eff_c)||(pos < 1))
                    {
                        printf("Errore: colonna non specificata correttamente \n");
                        break;
                    }
                    else
                    {
                        //Rimuovi colonna: copio ciclicamente colonna+1 in colonna e tolgo una colonna totale
                        printf("Rimossa colonna %d. La matrice contiene:\n", pos);
                        for (i = 0; i < eff_r; i++)
                            for (j = pos - 1; j < (eff_c-1);j++)
                                {
                                    /*qui avrei potuto utilizzare anche la funzione strcpy come fatto per le righe*/
                                        mat[i][j] = mat[i][j+1];
                                }
                        eff_c--;
    
    
                            //Stampo la matrice dopo l'operazione
                            for (i = 0; i<eff_r; i++)
                            {
                                for (j = 0; j< eff_c;j++)
                                {
                                    printf("%c", mat[i][j]);
                                 }
                            printf("\n");
                            }
                    }
                    break;
                  case 'q':
                    //Salvo il file copiando il contenuto della matrice nel file.
                  fp = fopen (argv[1], "w");
                  if (fp == NULL)
                    {
                        printf("Errore nell'apertura del file %s in scrittura \n", argv[1]);
                        exit (1);
                    }
                   for (i = 0; i<eff_r; i++)
                      {
                        for (j = 0; j< eff_c;j++)
                           {
                                    fprintf(fp,"%c", mat[i][j]);
                            }
                            fprintf(fp,"\n");
                      }
                    fclose(fp);
                    printf("Il file %s e' stato salvato correttamente. \n", argv[1]);
                    return 1;
                    break;
                  default:
                    printf("Errore: comando sconosciuto \n");
                }
        }
    
    
    
    
    
    
    
    
        return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Quote Originariamente inviata da mbistato Visualizza il messaggio
    Dal testo del problema, so che il file non supera le dimensioni MAX_R x MAX_C
    Questo cambia le cose, così il problema è diverso. Avresti dovuto precisarlo prima ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.