ayuda con una funcion en c

Iniciado por swagger14, 19 Octubre 2011, 18:03 PM

0 Miembros y 2 Visitantes están viendo este tema.

swagger14

lo tengo q hacer es una funcion (pero es posible una forma d hacerlo sin la función strcmp) que compare 2 cadena enteras y devuelva -1 si cad1 <cad2 0, si son iguale ,
y 1 si  es mayor  hasta a hora esto es lo que tengo
#include<stdio.h>
#include<stdlib.h>

const int lim=20;

int comparacadena( char cad1[lim],char cad2[lim]);


int comparacadena( char cad1[lim],char cad2[lim]){
     
      char cad1[lim],cad2[lim];
     
  printf("digite cadena 1 ");
     
  gets(cad1);
  printf("digite cadena 2");
  gets (cad2);
  fflush(stdin); 
     
      if (cad1[lim]< cad2[lim]){
         printf ("cadena 1 es menor");
         return -1;
         }
               
          if (cad1[lim]=cad2[lim]){
               printf("cadenas son iguales");
            return 0;}
             if  (cad1>cad2){
                  printf ("cadena1 es mayor que cadena 2");   
                   return 1; 
             }
             }
     
    int main(){
               
        comparacadena( char cad1[lim], char cad2[lim]));
     
        system ("pause");
        return 0;
                     
               
               
               

                }

rir3760

Lo digo sin mala intención: ese programa esta muy mal y si apenas empiezas con el lenguaje C deberías conseguir un buen libro, para ello revisa los temas fijos de este foro.

Casi todo el proceso que haces en la función de comparación como pedir las cadenas e indicar el resultado lo debes pasar a la función principal con ciertas correcciones como evitar el uso de "gets" y "fflush(stdin)".

En cuanto a la implementación de la función para comparar, a esta se le pasa la dirección base de dos cadenas y debe retornar el resultado indicado. Un solución utilizando punteros:
int fn_cmp(char const *s, char const *t)
{
   while (*s == *t && *s != '\0'){
      s++;
      t++;
   }
   
   return (*s > *t) - (*s < *t);
}


El resto te toca a ti.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

swagger14


darkvidhack

Hola!! te doy un par de consejillos jeje:

1. Implementa directamente la función 'comparacadena', no hagas la declaración y luego la implementación aparte, eso sería si la implementaras debajo del 'main'.

2. Procura que la función 'comparacadena' solo se encargue de comparar las cadenas que le pasas, hay que tener un cierto de nivel de abstracción, es muy importante en la programación, es decir, que si tienes una función que te compara dos cadenas, asegurate que sólo hace eso, la lectura de las cadenas puedes hacerla en el main o en otra función aparte.

3. En la declaración de 'comparacadena' pones que devuelve un dato de tipo entero, y luego en el main llamas a la función como si devolviera un void, no te salta el compilador?

4. En este caso, la variable globar 'im' no está mal del todo, aunque las variables globales siempre se deben escribir en mayúscula, LIM, por supuesto, no acostumbres a poner muchas variables globales, ya que puede inducir a errores si hay un cierto grado de dependencia de las funciones con esta variable.

Y... creo que nada más, si tienes alguna duda postea ;)
live and let die

la duda es la base de todo conocimiento


swagger14

que tal a horaa el copilador no decteta error pero no corre!#include<stdio.h>
#include<stdlib.h>

const int lim=20;

int comparacadena( char *cad1[lim],char *cad2[lim]);

int main(){
     char *cad1[lim],*cad2[lim];
     
      printf("digite cadena 1 ");     
      gets(*cad1);
      printf("digite cadena 2");
      gets (*cad2);
      fflush(stdin); 
      system ("pause");
      return 0;
     
      }
     
     
     
     
  int comparacadena( char *cad1[lim],char *cad2[lim]){
     
      {
   while (*cad1[lim] == *cad2[lim] && *cad1[lim] != '\0'){
      *cad1[lim]++;
      *cad2[lim]++;
   }
   if (*cad1[lim]< *cad2[lim]){
         printf ("cadena 1 es menor");
         return -1;
         }
               
          if (*cad1[lim]==*cad2[lim]){
               printf("cadenas son iguales");
            return 0;}
             if  (*cad1[lim]>*cad2[lim]){
                  printf ("cadena1 es mayor que cadena 2");   
                   return 1; 
             }
             
     
     
      }
      }
     
     

darkvidhack

hola de nuevo!! no corre el programa entero o la comparación? has pensado que quizás no estés llamando a la función 'comparacadena'? Porque en el main no veo ninguna llamada a la función, otra cosa, porque no pones 'comparacadena' que devuelva un bool?, así podrías poner

if (comparacadena(cadena1,cadena2) == true) {    mostrar que son iguales;    }  else  {

       mostrar que son distintas;
}


Saludos
live and let die

la duda es la base de todo conocimiento

rir3760

El programa sigue con errores: utilizas gets (no se recomienda), "fflush(stdin)" (tampoco), no llamas a la función (esto ya lo comento darkvidhack) y tratas de utilizar un array de punteros cuando debes utilizar un array.

En la función principal debes utilizar:

int main(void)
{
    char cad1[lim];
    char cad2[lim];
   
    printf("digite cadena 1 ");     
    gets(*cad1);
   
    printf("digite cadena 2");
    gets (*cad2);
   
    /* llamada a la funcion */
   
    return 0;
}


En cuanto a tu función de comparación lo mejor que se puede decir es que tiene varios errores que ya te comentamos mas algunos mas. Si no tienes material de referencia de calidad por favor revisa los temas fijos de estos foros, ahí encontraras a montones.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language