Foros-FIUBA Foros HostingPortal
 FAQ  •  Buscar  •  Wiki  •  Apuntes  •  Planet  •  Mapa  •  Eyeon  •  Chat
Preferencias  •  Grupos de Usuarios
Registrarse  •  Perfil  •  Entrá para ver tus mensajes privados  •  Login
Ver tema siguiente
Ver tema anterior

Responder al tema Ver tema anteriorEnviar por mail a un amigo.Mostrar una Lista de los Usuarios que vieron este TemaGuardar este Tema como un archivoPrintable versionEntrá para ver tus mensajes privadosVer tema siguiente
Autor Mensaje
Uciel
Nivel 6


Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288

Carrera: Informática
argentina.gif
MensajePublicado: Lun Ago 26, 2013 11:45 am  Asunto:  Ayuda con esta función en lenguaje C Responder citandoFin de la PáginaVolver arriba

Hola, necesito hacer esta funcion en lenguaje C pero no me sale :S

Es asi: por entrada estandar (standar input) se ingresa un conjunto de 1´s y 0´s separados con coma. Ej:

1,0,1,0,1,1,1,0,1,0

(max cantidad posible de numeros 3600, teniendo en cuenta tambien las comas, que serian 3600, se puede suponer que la cantidad de caracteres ingresados no supera los (3600+3600) 7200)

esa cadena de caracteres se le debe pasar a una función que lo que hace es devolverme un vector que solo contenga los numeros. Es decir para el ejemplo anterior me devolveria:

1010111010


Bueno, cualquier ayuda para resolverlo me viene bien Smile

Saludos. Uciel


Tauro Género:Masculino Caballo OfflineGalería Personal de UcielVer perfil de usuarioEnviar mensaje privado
Sebastian Santisi
Administrador Técnico


Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451


argentina.gif
MensajePublicado: Lun Ago 26, 2013 12:55 pm  Asunto:  Re: Ayuda con esta función en lenguaje C Responder citandoFin de la PáginaVolver arriba

Para lo que tenés que resolver, si necesitás manejar números separados por comas, a nivel biblioteca te pueden servir strtok()+sscanf() o strtol().

De todos modos, siendo que son sólo ceros o unos, alcanza con iterar la cadena y meter un condicional adentro.

Digo, no qué qué elegancia necesitás, pero sale en una línea:

for(n = 0, i = 0; s[i]; i++) if(s[i] == '0' || s[i] == '1') ns[n++] = s[i] - '0';

ya tenés el problema resuelto.

_________________
Image[tex] ${. \ \ \ \ \ \ \ \ \ .}$ [/tex][tex] ${\Large Usá \LaTeX, no seas foro...}$ [/tex]

Aries Género:Masculino Perro OfflineGalería Personal de Sebastian SantisiVer perfil de usuarioEnviar mensaje privadoVisitar sitio web del usuario
RiaNo
Nivel 8


Edad: 40
Registrado: 19 Mar 2008
Mensajes: 586

Carrera: Electrónica
argentina.gif
MensajePublicado: Lun Ago 26, 2013 1:03 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

¿Y concretamente qué es lo que no sabés de C?
¿Cómo programar?
¿Cómo hacer/usar funciones?
¿Cómo usar un FOR?
¿Cómo pedir memoria?
¿Cómo hacer/recorrer un vector?
¿Otra cosa?

Un detalle que no cambia casi nada: Si hay N números, hay N-1 comas (salvo que al final de todo vaya una coma, sin nada que le siga). Por si no soy claro: Fijate en el ejemplo que pusiste vos cuántos dígitos hay u cuántas comas hay; no son la misma cantidad.

El algoritmo que yo usaría es el siguiente:
- Leer todos los caracteres desde la entrada hasta que termine, y guardarlos en un vector X de tamaño adecuado.
- Pasarle dos vectores (X e Y) a una funcion SACAR_COMAS, a la cual le metés el vector X con el origen de los datos, y el vector Y que es el lugar donde vas a poner los datos "filtrados".
- La funcion SACAR_COMAS tiene adentro un FOR que va leyendo caracter por caracter y lo va pegando en el vector Y... cuando lee un caracter "coma", lo saltea (lo ignora)... y sigue copiando todo lo demás...
- Cuando termina de leer todo el vector X, la funcion SACAR_COMAS termina y listo: en el vector Y tenés los ceros y unos filtrados, sin las comas.

Además tenés que hacer todas las validaciones que correspondan adentro de la función:
- Verificar que los caracteres son exclusivamente 0, 1 o "coma"... si hay algo distinto a eso podes tirar "error" y salir a la mierda.
- Verificar que el arreglo X no está vacío
- Etc.

Si no era esto lo que necesitabas, avisá.
Un abrazo.


Aries Género:Masculino Rata OfflineGalería Personal de RiaNoVer perfil de usuarioEnviar mensaje privado
Uciel
Nivel 6


Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288

Carrera: Informática
argentina.gif
MensajePublicado: Lun Ago 26, 2013 4:45 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Hola intente usar la linea que me paso sebastian, pero no me esta dando los resultados esperados. La estoy usando directamente desde un main asi:

char s[8000];
scanf("%s", s);
int n,i;

//no entiendo cual es la condicion de corte y tampoco entiendo el '0' del final
for(n = 0, i = 0; s[i]; i++) if(s[i] == '0' || s[i] == '1') s[n++] = s[i] - '0';

for(i = 0; s[i]; i++) printf("%d, s[i]);

Pero no devuelve lo esperado

1,0,1,0,1,0 --> lo que pongo
1 --> lo que devuelve

probe sacandole el '0' me de devolvio esto:

1,0,1,0,1 --> lo que puse
494849484944484449 --> lo que me devolvio

Ayuda :S


Tauro Género:Masculino Caballo OfflineGalería Personal de UcielVer perfil de usuarioEnviar mensaje privado
Uciel
Nivel 6


Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288

Carrera: Informática
argentina.gif
MensajePublicado: Lun Ago 26, 2013 4:49 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

undefined escribió:



¿Y concretamente qué es lo que no sabés de C?

¿Cómo programar?

¿Cómo hacer/usar funciones?

¿Cómo usar un FOR?

¿Cómo pedir memoria?

¿Cómo hacer/recorrer un vector?

¿Otra cosa?



Un detalle que no cambia casi nada: Si hay N números, hay N-1 comas (salvo que al final de todo vaya una coma, sin nada que le siga). Por si no soy claro: Fijate en el ejemplo que pusiste vos cuántos dígitos hay u cuántas comas hay; no son la misma cantidad.



El algoritmo que yo usaría es el siguiente:

- Leer todos los caracteres desde la entrada hasta que termine, y guardarlos en un vector X de tamaño adecuado.

- Pasarle dos vectores (X e Y) a una funcion SACAR_COMAS, a la cual le metés el vector X con el origen de los datos, y el vector Y que es el lugar donde vas a poner los datos "filtrados".

- La funcion SACAR_COMAS tiene adentro un FOR que va leyendo caracter por caracter y lo va pegando en el vector Y... cuando lee un caracter "coma", lo saltea (lo ignora)... y sigue copiando todo lo demás...

- Cuando termina de leer todo el vector X, la funcion SACAR_COMAS termina y listo: en el vector Y tenés los ceros y unos filtrados, sin las comas.



Además tenés que hacer todas las validaciones que correspondan adentro de la función:

- Verificar que los caracteres son exclusivamente 0, 1 o "coma"... si hay algo distinto a eso podes tirar "error" y salir a la mierda.

- Verificar que el arreglo X no está vacío

- Etc.



Si no era esto lo que necesitabas, avisá.

Un abrazo.


Mira, yo habia usado C++ en Algo2. Pero ahora estoy haciendo Taller I, y nos mandaron el TP1 para hacer en C. Pero no explicaron nadaaaa. El martes tuvimos la 1er clase y nos mandaron el TP para la semana siguiente. Busque info de varios lados y ahora estoy mas ducho. Sin embargo con esta funcion que quiero intentar escribir no hay caso :S

Habia intentado usar el strtok, pero no lo logro hacer que retorne lo esperado :S


Tauro Género:Masculino Caballo OfflineGalería Personal de UcielVer perfil de usuarioEnviar mensaje privado
Huey 7
Nivel 6



Registrado: 03 Mar 2010
Mensajes: 267

Carrera: Electrónica
CARRERA.electronica.5.gif
MensajePublicado: Lun Ago 26, 2013 9:11 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

El problema es el código que estás usando para mostrar el resultado:

Uciel escribió:
for(i = 0; s[i]; i++) printf("%d, s[i]);

La condición del for es lo que está mal, te debería dar los resultados que esperás si lo cambiás por:

for (i = 0; i < n; i++) printf ("%d", s[i]);

Respecto a esto:

Uciel escribió:
//no entiendo cual es la condicion de corte y tampoco entiendo el '0' del final
for(n = 0, i = 0; s[i]; i++) if(s[i] == '0' || s[i] == '1') s[n++] = s[i] - '0';

La condición de corte es (implícitamente) s[i] == 0 (valor numérico 0, no caracter '0'). En C no hay un tipo "string" equivalente al de otros lenguajes, pero los arrays de char que tienen un elemento nulo en alguna parte se comportan como un tipo string cuando son manipulados por ciertas funciones, como printf y scanf con el "%s". Y en C el tipo char es un tipo numérico (entero).

La función scanf que lee de la entrada estándar agrega un elemento extra de valor cero (el "caracter nulo") que para funciones que interpretan arrays de char como strings significa "final de string". El for(n = 0, i = 0; s[i]; i++) corta el bucle cuando encuentra ese elemento, porque significa que llegó al final del string (independientemente del tamaño del array s, que acá es 8000). Y restar el '0' lo que hace es restar el valor numérico del caracter '1' o el caracter '0' que esté siendo procesado en la iteración, con el valor numérico del caracter '0'. En C, en "condiciones normales" ("multibyte character sequences in the initial shift state") ambos caracteres tienen que tener valor numérico consecutivo, y el del caracter '1' tiene que ser mayor que el del caracter '0', así que la resta esa da o 0 ó 1, que es lo buscado.

_________________
Comisión de Estudiantes de Ingeniería Electrónica (ComElec)
Lista de correo - Página Web - Facebook

 Género:Masculino  OfflineGalería Personal de Huey 7Ver perfil de usuarioEnviar mensaje privado
Uciel
Nivel 6


Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288

Carrera: Informática
argentina.gif
MensajePublicado: Lun Ago 26, 2013 9:27 pm  Asunto:  (Sin Asunto) Responder citandoFin de la PáginaVolver arriba

Ya lo habia resuelto. Aunque la info que me diste acerca de las preguntas que hice me sirven ahora para orientarme mas y entender el "porque".

Muchas gracias Huey 7.

Saludos Wink


Tauro Género:Masculino Caballo OfflineGalería Personal de UcielVer perfil de usuarioEnviar mensaje privado
Mostrar mensajes de anteriores:      
Responder al tema Ver tema anteriorEnviar por mail a un amigo.Mostrar una Lista de los Usuarios que vieron este TemaGuardar este Tema como un archivoPrintable versionEntrá para ver tus mensajes privadosVer tema siguiente

Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro
No podés responder a temas en este foro
No podés editar tus mensajes en este foro
No podés borrar tus mensajes en este foro
No podés votar en encuestas en este foro
No Podéspostear archivos en este foro
No Podés bajar archivos de este foro


Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker
365 Attacks blocked.

Powered by phpBB2 Plus, phpBB Styles and Kostenloses Forum based on phpBB © 2001/6 phpBB Group :: FI Theme :: Mods y Créditos

Foros-FIUBA está hosteado en Neolo.com Cloud Hosting

[ Tiempo: 0.4562s ][ Pedidos: 20 (0.3628s) ]