Autor |
Mensaje |
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
Hola, necesito hacer esta funcion en lenguaje C pero no me sale
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
Saludos. Uciel
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
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.
|
|
|
|
_________________
|
|
|
|
|
RiaNo
Nivel 8
Edad: 40
Registrado: 19 Mar 2008
Mensajes: 586
Carrera: Electrónica
|
|
¿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.
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
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
|
|
|
|
|
|
|
|
|
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
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
Habia intentado usar el strtok, pero no lo logro hacer que retorne lo esperado
|
|
|
|
|
|
|
|
|
Huey 7
Nivel 6
Registrado: 03 Mar 2010
Mensajes: 267
Carrera: Electrónica
|
|
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.
|
|
|
|
_________________
|
|
|
|
|
Uciel
Nivel 6
Edad: 34
Registrado: 16 Ago 2010
Mensajes: 288
Carrera: Informática
|
|
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
|
|
|
|
|
|
|
|
|
|
|
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 CrackerTracker365 Attacks blocked.
|