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

jueves, 12 de julio de 2012

Problemas: Analisis de argumentos

Problema 1:

Decir el nº de argumentos que recibe un programa en la linea del terminal




#include <stdio.h>

int main(int argc, char **argv)
{
    int c=0; // contador

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

    return 0;

}


2º Problema que recibe dos argumentos ademas del nombre del programa. Indicar si el primer argumento se encentra dentro del segundo.
1º opcion: Método usando función strstr
#include <stdio.h>
#include <string.h>
int busca(char *,char *);
int main(int argc, char **argv)
{
    int c=1; // contador leo a partr de la segunda cadena
    int c2=0; //contador en la 1 cadena
    int c3=0; //contador en la 2 cadena
    int resultado=0; // resultado de una busqueda
    while (c<3) {
        printf("Argumento nº %d, es:  %s \n",c,argv[c]);
        c++;
    }
    c=1;
    while (c<3) {
        printf("%s ...... %d \n",argv[c],strlen(argv[c]));
        c++;
    }

    if (strlen(argv[1])>strlen(argv[2])) {
        printf("El primer argumento es de mayor longitud que el segundo, por lo tanto no esta incluido... adios\n");
    } else {
        // vamos a buscar la cadena dentro de la otra...
        c2=0;
        c3=0;

        resultado=0;

        resultado=busca(argv[2],argv[1]); // el primer argumento es el texto donde deseo buscar, y el segundo es el texto a buscar
        if (resultado==10) {
            printf("BIEN.... LO HE ENCONTRADO \n");
        } else {
            printf("No lo he encontrado \n");
        }
    }
    return 0;

}

//----------------------------------------------------------------------------------------------------------------

int busca(char *palabra1,char *palabra2)
{
    if (strstr(palabra1,palabra2)!=NULL) {
        //hemos encontrado la palabra dentro de la  otra
        return 10;
    }
    return 1;
}


2º opcion creando una “subpalabra”  para compararla

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

int busca(char *,char *);

int main(int argc, char **argv)
{
    int c=1; // contador leo a partr de la segunda cadena
    int c2=0; //contador en la 1 cadena
    int c3=0; //contador en la 2 cadena
    int resultado=0; // resultado de una busqueda
    while (c<3) {

        printf("Argumento nº %d, es:  %s \n",c,argv[c]);
        c++;
    }
    c=1;
    while (c<3) {
        printf("%s ...... %d \n",argv[c],strlen(argv[c]));
        c++;
    }

    if (strlen(argv[1])>strlen(argv[2])) {
        printf("El primer argumento es de mayor longitud que el segundo, por lo tanto no esta incluido... adios\n");
    } else {
        // vamos a buscar la cadena dentro de la otra...
        c2=0;
        c3=0;

        resultado=0;


        resultado=busca(argv[2],argv[1]);

// el primer argumento es el texto donde deseo buscar, y el segundo es el texto a buscar

        if (resultado==10) {
            printf("BIEN.... LO HE ENCONTRADO \n");
        } else {
            printf("No lo he encontrado \n");
        }
    }
    return 0;

}

//
// el primer argumento (palabra1) es el texto donde deseo buscar, y el segundo es el texto a buscar (palabra2)
//

int busca(char *textolargo,char *textocorto)
{
    int c=0;
    int c2=0;
    int valor=0;
    char subpalabra[100];


    while (c<strlen(textolargo)) {

// crear subpalabra del texto largo
        c2=0;
        while (c2<(strlen(textocorto))) {
            subpalabra[c2]=textolargo[c+c2];
            c2++;
        }
        subpalabra[c2]='\0';

// nota: para señalar caracter lo ponemos entre comilla simple ('), si es una cadena ("), comillas dobles.


        printf("subpalabra: %s %s \n",subpalabra,textocorto);
        if (strcmp(subpalabra,textocorto)==0){
            //hemos encontrado la palabra dentro de la  otra
           // lo he encontrado en la posicion c
           printf("Encontrado en %d. \n",c+1); // muestra la posicion donde lo he encontrado...
            valor= 's';
            break;
        }

        c++;
    }

    if (valor=='s') {
        return 10;
    } else {
        return 0;
    }


}



3º Metodo: solucion del profesor: (se limita a trabajar con 2 argumentos (por eso comprueba distinto a 3 (0 es el nombre del progrmas, 1, es el 1º argumento y 2 es el 2º argumento)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FALSE 0  // nos creamos los valore booleanos
#define TRUE !FALSE // nos creamos los valore booleanos

int main(int argc, char **argv)
{
    int tamP1;
    int tamP2;
    int c2 = 0;
    int posicion = 0;
    int despla = 0;
    int encontrado = FALSE;
   
    // Comprobaciones previas
    // Son necesarios 3 argumentos
    if(argc != 3) {
        printf("%s: Uso: %s palabra_buscada palabra_en_la_que_se_busca\n", argv[0], argv[0]);
        exit(1);
    }
   
    tamP1 = strlen(argv[1]);
    tamP2 = strlen(argv[2]);
    // Si palabra1 es más larga que palabra2, es imposible que esté contenida en palabra2
    if(strlen(argv[1]) > strlen(argv[2])) {
        return 0;
    }
   
    // Mientras en palabra2 queden suficientes letras para que pueda contener palabra1
    // Busca la primera letra de palabra 1 en palabra 2
    // con tamP2-tamP1 limito mas la busqueda.
    for(c2 = 0; c2 <= tamP2 -tamP1 && !encontrado; c2++) {
        // Coincide la primera letra de palabra1
        if(argv[1][0] == argv[2][c2]) {
            // Busca el resto de las letras de palabra 1 a partir de donde se encontró la primera en palabra2:argv[1][despla] == argv[2][c2 + despla] && argv[1][despla] != '\0'
            for(despla = 0; argv[1][despla] == argv[2][c2 + despla] && argv[1][despla] != '\0'; despla++) {
            //este bucle no tiene contenido porque la propia condicion del for, esta haciendo todo lo que esta, darnos el valor de despla   
            }
            // Si despla llega a tamP1 indica que se a recorrido palabra1 por completo y coincide
            if(despla == tamP1) {
                posicion = c2;
                encontrado = TRUE;
            }
        }
    }
        // Si encontrado=True, muestra la posicion.
    if(encontrado) {
        printf("%d\n", posicion); // te dice la posicion donde lo ha encontrado (incluso mejor quitarle \n), para que sea mas facil la lectura de ese dato por otro programa....(estamos creando pequeñas herramientas de programas de sistemas para luego hacer mas cosas directamente con el sistema)
    }
    return 0;
}

No hay comentarios:

Publicar un comentario