| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
dementor3
Registrado: 14 Nov 2007 Mensajes: 5
| Publicado: 29/11/2007 11:05 am | | | Título: Problema con cadenas |
| Hola Amigos, tengo el siguiente dilema: en un programa en turbo c tengo que ingresar 2 cadenas y contar cuantas letras iguales tienen.
pensaba utilizar dos ciclos for usando strlen para que vaya contando la cadena y despues compararla pero quede medio colgado ojala puedieran ayudarme
gracias _________________ The Hitman |
|
| Volver arriba | |
 |
digies
Registrado: 18 Nov 2005 Mensajes: 377 Ubicación: Cono Sur
| Publicado: 29/11/2007 2:01 pm | | | Título: |
| Sería conveniente que publiques el código hasta donde hiciste así te ayudamos, porque existen varias formas de resolverlo.
Un saludo |
|
| Volver arriba | |
 |
dementor3
Registrado: 14 Nov 2007 Mensajes: 5
| Publicado: 29/11/2007 2:19 pm | | | Título: |
| | digies escribió: | Sería conveniente que publiques el código hasta donde hiciste así te ayudamos, porque existen varias formas de resolverlo.
Un saludo |
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> void main()
{ char cad1[30], cad2[30]; int i, j; clrscr();
printf("Ingrese texto 1:"); gets(cad1); printf("Ingrese texto 3:"); gets(cad2);
for */ hasta aqui estoy obviamente conosco el funcionamiento del ciclo for pero no se como saber las coincidencias de letras de las cadenas ojala puedas ayudarme/* _________________ The Hitman |
|
| Volver arriba | |
 |
|
rir3760

Registrado: 01 Oct 2004 Mensajes: 3837 Ubicación: Mexico
| Publicado: 29/11/2007 3:55 pm | | | Título: |
| Lo mas pesado para resolver el enunciado es tomar una de esas cadenas y 1) ordenar sus caracteres, 2) eliminar los caracteres duplicados.
El siguiente paso (tercero) es relativamente facil y consiste en utilizar una funcion como strchr para conocer si un caracter forma parte de una cadena. Esto se haria en un bucle asi:
| Código: | letras_iguales = 0; for (i = 0; cadena[i] != '\0'; i++) if (strchr(cadena_2, cadena[i]) != NULL) letras_iguales++;
printf("Letras en ambas cadenas == %d\n", letras_iguales);
/* ... */ |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
dementor3
Registrado: 14 Nov 2007 Mensajes: 5
| Publicado: 30/11/2007 6:20 am | | | Título: Resp: |
| [quote="dementor3"]| digies escribió: | Sería conveniente que publiques el código hasta donde hiciste así te ayudamos, porque existen varias formas de resolverlo.
Un saludo |
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> void main()
{ char cad1[30], cad2[30]; int i, j; clrscr();
printf("Ingrese texto 1:"); gets(cad1); printf("Ingrese texto 3:"); gets(cad2);
for(i=0; i<=strlen(cad1)-1 j++) { for(j=0; i<=strlen(cad2)-1; j++) if(cad1[i]==cad2[j]) k++; } }
ahi ta listo ayer con la ayuda de amigos y profes pude hacerlo _________________ The Hitman |
|
| Volver arriba | |
 |
rir3760

Registrado: 01 Oct 2004 Mensajes: 3837 Ubicación: Mexico
| Publicado: 30/11/2007 8:13 am | | | Título: |
| Un problema con ese programa es el uso de gets para leer la entrada estandar, debido al uso de esa funcion el programa puede reventar (o no) dependiendo del contenido del bufer de la entrada estandar.
Otro problema es que no se maneja el caso de caracteres duplicados en una cadena como "cacao", "cacahuate", "chocolate", etc.
Un programa que evita el uso de gets y maneja correctamente los caracteres duplicados (al costo de una mayor complejidad) es (C estandar):
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
#define LONG_MAX_CADENA 32
int cmp(void const *p, void const *q);
int main(void) { char cadena[2][LONG_MAX_CADENA]; char *nl; int i; /* Obtener las dos cadenas de la entrada estandar */ for (i = 0; i < 2; i++){ printf("Cadena no %d: ", i + 1); if (fgets(cadena[i], LONG_MAX_CADENA, stdin) == NULL) return EXIT_FAILURE; if ((nl = strchr(cadena[i], '\n')) != NULL) *nl = '\0'; } /* Ordenar la primera cadena */ qsort(cadena[0], strlen(cadena[0]) - 1, 1, cmp); puts("Caracteres comunes a ambas cadenas:"); /* Procesar los caracteres de la primera cadena ... */ for (i = 0; cadena[0][i] != '\0'; i++){ /* ... ignorando los caracteres duplicados */ if (cadena[0][i] == cadena[0][i + 1]) continue; /* Imprimir el caracter solo si es comun a ambas cadenas */ if (strchr(cadena[1], cadena[0][i]) != NULL) printf("%c\n", cadena[0][i]); } return EXIT_SUCCESS; }
int cmp(void const *p, void const *q) { char a = *((char *) p); char b = *((char *) q); return a - b; } |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
|
| Volver arriba | |
 |
|
|