Bienvenido(a), Visitante. Favor de ingresar o registrarse.

Ingresar con nombre de usuario, contraseña y duración de la sesión

Foros del Club

Páginas: [1] 2   Ir Abajo
  Enviar tema  |  Imprimir  
Autor Tema: escribir funcion similar a strcmp();  (Leído 1295 veces)
0 Usuarios y 1 Visitante están viendo este tema.
santiago89
Wizard
****

Prestigio: 0
Desconectado Desconectado

Mensajes: 9

Forista


« en: 13/02/2006, 21:30:26 »

Bueno en un ejercicio me piden que escriba una funcion que cumpla la misma funcion, valga la redundancia, que strcmp().

esto es lo que tengo por el momento:

Código
int strcmp1(const char *c1, const char *c2)
{
 
int i, j, k, l, cod;
k=strlen(c1);
l=strlen(c2);
 
for(i=0, j=0; i<k, j<l, i++, j++){
if(c1[i]<c2[j]){
cod=-1;
}
else if(c1[i]>c2[j]){
cod=1;
}
else if(c1[i]==c2[j]){
cod=0;
}
}
return cod;
}

El problema que se me presenta es que llego al final de la cadena y me encuentro con que el valor que retorna la funcion es el de la comparacion del ultimo caracter de cada cadena.

Quisiera saber si estoy muy errado y si es posible que alguien me aclare un poco las ideas para ver como puedo resolverlo.

Desde ya muchas gracias.
Saludos!
En línea
CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« Respuesta #1 en: 13/02/2006, 23:42:43 »

Bien, no creo que debas cambiar mucho tu lógica.
En si, encuentro un error y una sugerencia para hacerte.

El error lo veo en el for, deberias colocar un ; delante de los incrementos.
Y la sugerencia es que uses la palabra reservada break, dentro de cada if, para terminar con la ejecución del bucle. En realidad tenes muchas alternativas (llevar las variables de condicion a un valor de salida, colocar return, etc.)

Código
int strcmp1(const char *c1, const char *c2)
{
 
int i, j, k, l, cod;
k=strlen(c1);
l=strlen(c2);
 
for(i=0, j=0; i<k, j<l; i++, j++){
if(c1[i]<c2[j]){
cod=-1;break;
}
else if(c1[i]>c2[j]){
cod=1;break;
}
else if(c1[i]==c2[j]){
cod=0;
}
}
return cod;
}

Esa es una alternativa, el ultimo if no termina la ejecución. En su lugar permite recorrer toda la cadena hasta bien encontrar caracteres iguales o llegar al fin de la cadena.

Tengo otras sugerencias para que dejes el codigo un poco elegante:
- Encontrar la cadena mas corta, almacenar su valor en una variable local.
- utilizar un unico contador de cadena (para el for) con el limite en la cadena mas corta.
- comparar usando ese indice
- si las cadenas son iguales al terminar el for, pero las cadenas son de diferente longitud retornar el valor correspondiente.

Espero haberte guiado.
Saludos!
En línea

Daniel
Technocrat
*********

Prestigio: 7
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Ingeniería Informática
Profesión: Desarrollador Web 2.0 - Administrador de Redes
Mensajes: 110


WWW
« Respuesta #2 en: 14/02/2006, 13:24:05 »

Si yo en Programacion 1 usaba un break (o return) adentro de un for en lugar de usar un while, me sacaban a patadas en el traste del aula (me ha pasado, no con patadas, pero con una alta boludeada :'(). Lo ideal es usar el while con alguna bandera, pero fijate, si no te joden con eso lo podes hacer en for, pero no seria lo conceptualmente correcto.
Un saludo.
« Última modificación: 14/02/2006, 13:39:35 por D4rKSp3c1m3N » En línea

santiago89
Wizard
****

Prestigio: 0
Desconectado Desconectado

Mensajes: 9

Forista


« Respuesta #3 en: 14/02/2006, 13:42:18 »

Ok, pero como seria con while y porque no es conceptualmente correcto hacerlo con for?. Por lo demas no hay problema porque estoy aprendiendo solo no estoy en ninguna universidad todavia, quisiera saber esos detalles para el dia de mañana.
En línea
CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« Respuesta #4 en: 14/02/2006, 14:57:07 »

Yo recuerdo que la "buena programación" no debia utilizar goto porque desvirtua todo tipo de algoritmo, en cuanto a break, continue, etc... está permitido. Además, conceptualmente: funciona  Sonreir
Paso a explicarme:

Porque los programadores experimentados1 prefieren no usar goto?
Facil, porque la depuración se compara con un paseo por el infierno cuando se trabaja con sistemas de gran envergadura, con procedimientos de muchas lineas y complejos de interpretar. Desde ese punto de vista estoy de acuerdo que la practica de usar goto no es aconsejable, simplemente se podria usar en algoritmos pequeños, pero... eso podria llevar a acostumbrarse, lo cual realmente no es bueno. Pocas veces trabajamos con algoritmos de menos de 20 lineas. Entonces...
Que impide reescribir el algoritmo sin utilizar goto? Absolutamente nada.
Solo se necesita conocer todas las herramientas del lenguaje, y pensar en forma estructurada, siempre siguiendo un hilo de  ejecución lineal2.
Entonces porque no está mal visto el uso de break o continue?
Por dos motivos a mi entender.
Es cuestión de pensar el metalenguaje del lenguaje de programación, en este caso C++. Si el lenguaje lo trae y es totalmente necesario en ciertas estructuras de flujo de control3, hay que usarlo. Ésto puede darse a discusión, asi que plantearé mi segundo motivo.
El goto puede saltar a cualquier linea de codigo en cualquier archivo de codigo en nuestro programa, por lo que es un arma de doble filo. En cambio break salta al final del bucle siempre y continue al inicio del loop. Por lo que la depuración es sencilla.
Permite escapar de un loop sin necesidad de crear una nueva variable de control,  y personalmente, lo encuentro una salida elegante para terminar una ejecución repetitiva.
Más allá de esto, gustos son gustos. Pero creo que utilizar saltos con goto violan la programación estructurada, mientras que usar saltos como break o continue no lo hacen.

Pero bueno, a ver si sale con un poco de programación estructurada...

Código
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a<b?a:b
 
int strcmp1(const char *c1, const char *c2)
{
int i, k, l, cod = 0;
int min;
k = strlen(c1);
l = strlen(c2);
min = MIN(k,l);
for( i = 0; (i < min)&&(cod == 0); i++){
if(c1[i]<c2[i])
cod = -1;
else
if(c1[i]>c2[i])
cod=1;
}
if( cod == 0 )
cod = (k > l)?1:(k < l)?-1:0;
return cod;
}
 

Y ahora si, conceptualmente correcto, con utilización de centinelas (o banderas), sin saltos y con un único punto de salida. Excelente para cualquier profesor de programación  Sonreir

1 ... y los no tan experimentados...
2 No hablo de Threads
3Ahora pregunto: Como utilizarias el switch de c++ sin utilizar la instrucción break?

Código
switch (opcion)
{
   case 1:
       descuento=10;
       break;
   case 2:
       descuento=5;
       break;
   case 3:
       descuento=2;
       break;
   default:
       descuento=0;
       break;
}
Seguramente optarias por un bloque if anidado. No utilizando jamás switch.
En línea

santiago89
Wizard
****

Prestigio: 0
Desconectado Desconectado

Mensajes: 9

Forista


« Respuesta #5 en: 14/02/2006, 15:41:54 »

Muy buena explicacion CID, creo que con eso me quedan mucho mas claras unas cosas.

Saludos!
En línea
exe
Visitante
« Respuesta #6 en: 14/02/2006, 17:18:49 »

una versión usando while:
int mstrcmp ( const char *src, const char *dst ) {
    while ( *src == *dst && *src != '\0' && *dst != '\0' ) { src++; dst++; } /* hacemos todas las pasadas */
    if ( *src == *dst ) return 0; /* vemos si son iguales */
    else return ( *src > *dst ) ? 1 : -1; /* si son diferentes... */
}
ha det bra,
exe
En línea
loele
Sage
*****

Prestigio: 0
Desconectado Desconectado

Mensajes: 15

Forista


« Respuesta #7 en: 04/03/2006, 01:50:43 »

ke garka! hace la tarea solo!
btw mi version:

int comparar(char* carola,char *reina) {
while(*carola && *reina) { if (*carola++ != *reina++) return 1; } return 0;
}
En línea
CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« Respuesta #8 en: 04/03/2006, 10:17:38 »

ke garka! hace la tarea solo!
btw mi version:

int comparar(char* carola,char *reina) {
while(*carola && *reina) { if (*carola++ != *reina++) return 1; } return 0;
}

El chico primeramente indica que es un ejercicio que le pidieron hacer, luego muestra un código hecho por el, y plantea un problema. No obliga a nadie a hacer su tarea, porque de hecho el ya la habia hecho. Solo buscaba correcciones.
Asi que te pediria, por utlima vez, que no le faltes el respeto a los usuarios del foro.
Sin más.

Saludos.
En línea

loele
Sage
*****

Prestigio: 0
Desconectado Desconectado

Mensajes: 15

Forista


« Respuesta #9 en: 06/03/2006, 00:06:05 »

jajaja bola! lo dije en broma sino no le huubiese pegado el code.. que para colmp tiene un  error!!
el while (*carola && *reina) deberia ser while(*carola || *reina) x')
sino cuando uno de los parametros fuera nulo retornaria 0 aunque no fuewran iwales
En línea
Foros del Club
   

 En línea
Páginas: [1] 2   Ir Arriba
  Enviar tema  |  Imprimir  
 
Ir a: