Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

examen 3: solución del alumno (2º variante): Con uso de estructuras y switch case

//examen 3: solución del alumno (2º variante): Con uso de estructuras y switch case (en pruebas)
//      wcjsbsan.c
//
//      Copyright 2011 julio
//
// Usando estructuras para los distintos casos de argumentos. y switch Case

#include <stdio.h>
#include <string.h> // manejamos  cadenas (copiar, comparar)

// defino funciones....
void contar(int,int,int,char *);
// primer argumento es si cuento caracteres
// segundo argumento es si cuento palabras " ","\t","\n"
// tercero argumento es si cuento lineas  "\n"
// cuarto argumento es el nombre del archivo

// crear estructura de opciones de argumentos  y tareas a hacer....
typedef struct {
    char nombre[15]; //14 caracteres (+1 de /0): adminteria -adfk y -a (por ejemplo)
    int tarea; // un numero que especifique que tarea hara...
} tipoopciones;

int main(int argc, char **argv) {
    // vemos los argumentos que nos han introducido....

    int c=0; // contador
    int d=0; //contador 2
    int posicion_nombre_archivo=0;          // guarda donde esta el archivo en los argumentos

// estas variables hacen una funcion de "interruptores"
    int contarpalabra=0; // si vale 0 no las contará, si vale 1  contara palabras
    int  contarlinea=0;// si vale 0 no las contará, si vale 1 contara lineas
    int contarcaracter=0; // si vale 0 no las contará, si vale 1 contara caracteres
  


    int errores=0;//contar errores (introduccion de parametros no validos

    while (c<argc) {
        printf("Argumento nº %d, es el %s \n",c,argv[c]);
        c++;
    }



    tipoopciones opcion[17]; //maximo numero de argumentos que nos va ha aceptar el programa

    // reviso cada argumento, si la primera letra es un - (guion),
    // se trata de un argumento a analizar, sino es el nombre del archivo a analizar...

// tabla de opciones posibles....

    strcpy(opcion[0].nombre,"-w");
    opcion[0].tarea=1; //contarpalabra=1

    strcpy(    opcion[1].nombre,"-l");
    opcion[1].tarea=2; //contarlinea=1

    strcpy(    opcion[2].nombre,"-c");
    opcion[2].tarea=3; //contarcaracter=1

    strcpy(opcion[3].nombre,"-wl");
    opcion[3].tarea=4;//contarpalabra=1 //contarlinea=1

    strcpy(    opcion[4].nombre,"-lw");
    opcion[4].tarea=4;//contarpalabra=1 //contarlinea=1

    strcpy(opcion[5].nombre,"--lines");
    opcion[5].tarea=2; //contarlinea=1

    strcpy(opcion[6].nombre,"--words");
    opcion[6].tarea=1; //contarpalabra=1

    strcpy(opcion[7].nombre,"-cw");
    opcion[7].tarea=8; //contarpalabra=1 //contarcaracter=1

    strcpy(opcion[8].nombre,"-wc");
    opcion[8].tarea=8; //contarpalabra=1 //contarcaracter=1

    strcpy(opcion[9].nombre,"-lc");
    opcion[9].tarea=9; //contarlinea=1 //contarcaracter=1

    strcpy(opcion[10].nombre,"-cl");
    opcion[10].tarea=9; //contarlinea=1 //contarcaracter=1

    strcpy(opcion[11].nombre,"-lwc");
    opcion[11].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1

    strcpy(opcion[12].nombre,"-wlc");
    opcion[12].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1

    strcpy(opcion[13].nombre,"-wcl");
    opcion[13].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1

    strcpy(opcion[14].nombre,"-cwl");
    opcion[14].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1

    strcpy(opcion[15].nombre,"-clw");
    opcion[15].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1

    strcpy(opcion [16].nombre,"-lcw");
    opcion[16].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1



    if (argc>20) {
        fprintf(stderr, "%s: %d: El numero de argumentos a superado los 20 elementos \n", argv[0], argc);
        errores++;
    }

    c=1;
    // caso
    while (c<argc) {
        if (argv[c][0]=='-') {
            // se trada de un argumento reviso la tabla....
            d=0;
            while (d<argc) {
                  //empiezo a comparar el argumento (c), con la lista de opciones que tengo
                if ( strcmp(argv[c],opcion[d].nombre)==0) {
                    switch(opcion[d].tarea) {
                    case 1:
                        contarpalabra=1;
                        break;
                    case 2:
                        contarlinea=1;
                        break;
                    case 3:
                        contarcaracter=1;
                        break;
                    case 4:
                        contarpalabra=1 ;
                        contarlinea=1;
                        break;
                    case 8:
                        contarpalabra=1 ;
                        contarcaracter=1;
                        break;
                    case 9:
                        contarlinea=1 ;
                        contarcaracter=1;
                        break;
                    case 10:
                        contarlinea=1 ;
                        contarcaracter=1;
                        contarcaracter=1;
                    default:
                        // en caso contrario las combinaciones de letras no valdrían...
                        fprintf(stderr, "%s: %s: Opcion no valia\n", argv[0], argv[c]);
                        errores++;
                    }
                }
            d++;
            }
        }    else {
            //sera el nombre del archivo
            if (argc>0) {
                posicion_nombre_archivo=c;
                break;
            } else {
                fprintf(stderr, "%s: %s: No se ha especificado nombre de archivo valido\n", argv[0], argv[0]);
            }
        }
        c++;
    }

    if (errores!=0) {
        return 1;
    }

    if (argc==2) {
        //significa que solo ha escrio el comando y el nombre de archivo
        //tenemos que ejecutar -w -l -c
        contarpalabra=1;
        contarlinea=1;
        contarcaracter=1;
    }

    fprintf(stdout, "wcjsb contara del archivo: %s\n",argv[posicion_nombre_archivo]);



    if (contarlinea==1) {
        fprintf(  stdout, "contara lineas\n");
    }

    if (contarpalabra==1) {
        fprintf(  stdout, "contara palabras\n");

    }
    if (contarcaracter==1) {
        fprintf(  stdout, "contara caracteres\n");
    }

    contar(contarcaracter,contarpalabra,contarlinea,argv[posicion_nombre_archivo]);
    return 0;
}

void contar(int caracter,int palabra,int linea, char *archivo) {
    int numero_caracter=0;
    int numero_palabra=0;
    int numero_linea=0    ;
    FILE *pf;
    char letra;
    char letraAnterior;
    int errores=0;


    if((pf=fopen(archivo,"r"))==NULL) {
        fprintf(stderr, "%s: %s: No se puede abrir el fichero\n", archivo, archivo);
        errores++;


    } else {

        // Lee el primer caracter del archivo ¡porque es posible que el archivo este vacio!

        letra = fgetc(pf);
        letraAnterior = letra + 1; // asi nuestra letra anterior nos aseguramos que es distinta al anterior
        //numero_caracter++;

        // Mientras no sea fin de fichero
        while(!feof(pf)) {
            // tengo que analizar el caracter:
            if (palabra==1) {
                if ( ((letra==' ') || (letra=='\n') || (letra=='\t')) && (letra!=letraAnterior) ) {
                    // comprobramos que esta entre espacios y que no son espacios consecutivos (letra != letraAnterior)
                    numero_palabra++;
                }
            }

            if (linea==1) {
                if (letra=='\n') {
                    numero_linea++;
                }
            }
            numero_caracter++;
            letraAnterior = letra;
            letra = fgetc(pf);
        }
        // Cierra el archivo
        fclose(pf);

        // escribe resultado segun lo que nos hayan pedido....


        fprintf(  stdout, "-------------Resultados-------------\n");

        if (linea==1) {
            fprintf(  stdout, "Nº de  lineas: %d\n",numero_linea);
        }

        if (palabra==1) {
            fprintf(  stdout, "Nº de palabras: %d\n",numero_palabra);

        }

        if (caracter==1) {
            fprintf(  stdout, "Nº de caracteres: %d\n",numero_caracter);
        }

        fprintf(  stdout, "-------------  fin  -------------\n");

    }

}

No hay comentarios:

Publicar un comentario