Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ksiksi en 15 Junio 2011, 19:12 pm



Título: ejercicios en c
Publicado por: ksiksi en 15 Junio 2011, 19:12 pm
Estoy trabado en una practica de la facultad:

Hacer una función que permita insertar en una secuencia de dígitos los caracteres guión cada 8 dígitos a partir del cuarto dígito, y un espacio cada 8 dígitos a partir del octavo dígito. Si la cantidad de dígitos no es múltiplo de ocho agregar delante de la cadena caracteres ‘0’ hasta que la misma sea múltiplo de 8.

   Ejemplos:   472348237388539055823012->4723-4823 7388-5390 5582-3012
      8237388539055823012      ->0000-0823 7388-5390 5582-3012

la idea es no usar la libreria string.h
#include <stdio.h>
int main () {
int i, j;
char numeros[100];
FILE *F;
F=fopen("numeros.txt", "r");
fgets(numeros,100,F);
while(numeros){
i++;}
/********************
y acá es donde no sé como continuar. En i me queda la cantidad de caracteres. Cómo compruebo que es multiplo de 8, con un while (i%8)?, no sé, la verdad, no tengo idea. 

*/


return 0}

PD: Notaron que stdio. Se lee: esetedio. Bueno, así se siente. Mucho tedio. ése tedio


Título: Re: ejercicios en c
Publicado por: Don Pollo en 15 Junio 2011, 19:27 pm
Primeramente deberás mirar si la longitud de la cadena es múltiplo de 8. Cuando ya hayas solucionado esto, puedes recorrerla con dos contadores, uno para contar los caracteres hasta el guión, y otro contando los caracteres hasta que toque el espacio.

Para saber si es múltiplo de 8 haces la comparación i%8==0, ya que el % lo que te devuelve es el resto de la división.


Título: Re: ejercicios en c
Publicado por: Dark Invader en 15 Junio 2011, 19:30 pm
Estoy trabado en una practica de la facultad:

Hacer una función que permita insertar en una secuencia de dígitos los caracteres guión cada 8 dígitos a partir del cuarto dígito, y un espacio cada 8 dígitos a partir del octavo dígito. Si la cantidad de dígitos no es múltiplo de ocho agregar delante de la cadena caracteres ‘0’ hasta que la misma sea múltiplo de 8.

   Ejemplos:   472348237388539055823012->4723-4823 7388-5390 5582-3012
      8237388539055823012      ->0000-0823 7388-5390 5582-3012

la idea es no usar la libreria string.h
#include <stdio.h>
int main () {
int i, j;
char numeros[100];
FILE *F;
F=fopen("numeros.txt", "r");
fgets(numeros,100,F);
while(numeros){
i++;}
/********************
y acá es donde no sé como continuar. En i me queda la cantidad de caracteres. Cómo compruebo que es multiplo de 8, con un while (i%8)?, no sé, la verdad, no tengo idea.

*/


return 0}

PD: Notaron que stdio. Se lee: esetedio. Bueno, así se siente. Mucho tedio. ése tedio

Para saber si es multiplo de 8 harias esto:

if(i%8 == 0){
tal cosa}

voy bastante mal,de momento tengo esto:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main () {
  4. int i, j;
  5. char numeros[100];
  6. FILE *F;
  7. char caracter = 'c';
  8. F=fopen("numeros.txt", "r");
  9. for(i=0;i<=strlen(numeros);i++){
  10.                    fgets(numeros,100,F);
  11.                    if ( i ==(i%8==0)){
  12.                         fwrite(&caracter,sizeof(caracter),1,F);
  13.                         }
  14.                         }
  15.                         fclose(F);
  16.                         getchar();
  17.                         return 0;
  18.                         }
  19.  
  20.  
   

PD:Te me adelantastes Don Pollo  :xD

Salu2


Título: Re: ejercicios en c
Publicado por: ksiksi en 15 Junio 2011, 19:58 pm
yo pensaba hacer un while (i%8) para saber la cantidad de 0 necesarios a agregar, pero me daba un numero muy grande, debo estar cansado asi que seguire la sugerencia de don pollo.
gracias.


Título: Re: ejercicios en c
Publicado por: Dark Invader en 15 Junio 2011, 20:01 pm
pero supuestamente no vas a poder usar la libreria string.h,que yo sepa para leer el tamaño de la cadena necesitas strlen,a menos que haya otro que no conozca.  :silbar:

Suerte


Título: Re: ejercicios en c
Publicado por: Queta en 15 Junio 2011, 20:46 pm
Código
  1. int strlen(char *cadena)
  2. {
  3. char *ptr = cadena;
  4.  
  5. while(*ptr++);
  6.  
  7. return ptr - cadena;
  8. }

Ya tienes la función strlen sin necesidad de usar la librería string ;D.


Título: Re: ejercicios en c
Publicado por: Dark Invader en 15 Junio 2011, 22:10 pm
Joer no está mal,no sabía de eso  :xD

No se si puedo preguntar en el post que ya ha hecho otra persona pero me gustaría saber una cosa...


   while(*ptr++);
 
   return ptr - cadena;

Mientras el valor almacenado en ptr aumente en 1, devuelve el valor de ptr - cadena,¿que da el resultado de ptr - cadena? :-\

Y luego lo de:

int strlen(char *cadena)

¿Habría que pasar la dirección de memoria de la cadena?.

Salu2 y gracias


Título: Re: ejercicios en c
Publicado por: fantasma306 en 16 Junio 2011, 13:54 pm

Código
  1. int strlen(char *cadena)
  2. {
  3. char *ptr = cadena;
  4.  
  5. while(*ptr++);
  6.  
  7. return ptr - cadena;
  8. }
solo un pequeño fallo, al final del bucle tienes que desincrementar ptr, por que al ser un char* tambien cuenta el caracter '\0';

Mientras el valor almacenado en ptr aumente en 1, devuelve el valor de ptr - cadena,¿que da el resultado de ptr - cadena? :-\
En realidad el while no tiene cuerpo, por lo tanto no se puede decir que mientras el valor almacenado en ptr aumente de 1 devuelve el valor de ptr-cadena...

solo devuelve la resta al final, cuando el while termina.
Lo que quiere hacer nuestro camarada Queta, es que la direccion de memoria (ptr) incremente hasta llegar al final de la cadena, luego resta ambas direcciones lo que devuelve es el tamaño de la cadena... (no se si ha quedado claro)

PD: no se por que pero al llamar a la funcion de Queta, "strlen" no entra dentro de su funcion, sino que usara la funcion de la libreria string.h (y eso que no la he incluido).


saludos


Título: Re: ejercicios en c
Publicado por: Queta en 16 Junio 2011, 14:58 pm
solo un pequeño fallo, al final del bucle tienes que desincrementar ptr, por que al ser un char* tambien cuenta el caracter '\0';

Verdad; añade solamente después del while:

Código
  1. *ptr--;

Dark Invader, respondo a tu duda después, que ahora no puedo.


Título: Re: ejercicios en c
Publicado por: Dark Invader en 16 Junio 2011, 15:58 pm
solo un pequeño fallo, al final del bucle tienes que desincrementar ptr, por que al ser un char* tambien cuenta el caracter '\0';
En realidad el while no tiene cuerpo, por lo tanto no se puede decir que mientras el valor almacenado en ptr aumente de 1 devuelve el valor de ptr-cadena...

solo devuelve la resta al final, cuando el while termina.
Lo que quiere hacer nuestro camarada Queta, es que la direccion de memoria (ptr) incremente hasta llegar al final de la cadena, luego resta ambas direcciones lo que devuelve es el tamaño de la cadena... (no se si ha quedado claro)

PD: no se por que pero al llamar a la funcion de Queta, "strlen" no entra dentro de su funcion, sino que usara la funcion de la libreria string.h (y eso que no la he incluido).


saludos

Pero...para coger la cadena no habria que pasar como parametro la direccion de memoria de la cadena y luego esta funcion muestra lo que hay escrito dentro de esa memoria?.Es que entonces la 2 linea se podria suprimir...

De todas maneras no se porque incrementa el valor del puntero ptr y luego lo resta de la cadena...

Gracias a ambos.

Salu2


Título: Re: ejercicios en c
Publicado por: fantasma306 en 16 Junio 2011, 16:14 pm
Código
  1. int strlen(char *cadena)
  2. {
  3. char *ptr = cadena;
  4.  
  5. while(*ptr++);
  6. *ptr--;
  7.  
  8. return ptr - cadena;
  9. }

le pasa la direccion de donde empieza la cadena.
digamos que la cadena esta en la direccion :70
cadena es un puntero, luego crea otro puntero y le pone la misma direccion que cadena es decir 70

(digamos que la cadena es "HOLA")
va imcrementando ptr hasta el fin de la cadena, al final del bucle ptr vale 75(4 letras + 1, el caracter '\0')
luego desincrementa ptr para que tenga la direccion 74; (es decir justo las 4letras)
y luego resta 74-70= y devuelve el resultado, 4, justo el numero de letras que tiene la cadena.

saludos


Título: Re: ejercicios en c
Publicado por: Queta en 16 Junio 2011, 17:42 pm
Bueno, el tema se complica si me dijiste que has empezado con C/C++ hace cosa de un mes. En el código estoy manejando cadenas y punteros:

http://www.cplusplus.com/doc/tutorial/arrays/ (http://www.cplusplus.com/doc/tutorial/arrays/)
http://www.cplusplus.com/doc/tutorial/pointers/ (http://www.cplusplus.com/doc/tutorial/pointers/)

Antes de que te lo explique, déjame mencionarte que en:

Código
  1. int strlen(char *cadena)

char *cadena es simplemente un parámetro. Si utilizásemos esta función deberíamos pasar una cadena, un array, al parámetro llamado cadena, ¿entiendes? Mira esto para más información:

http://www.cplusplus.com/doc/tutorial/functions/ (http://www.cplusplus.com/doc/tutorial/functions/)
http://www.cplusplus.com/doc/tutorial/functions2/ (http://www.cplusplus.com/doc/tutorial/functions2/)

A lo que iba, cuando hayas estudiado cadenas y punteros entenderás que (supongamos el siguiente ejemplo):

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6. char string[] = "Hola";
  7.  
  8. char *ptr = string;
  9.  
  10. printf("Elementos de la variable string:\n");
  11.  
  12. for(int a = 0; a <= strlen(string); a++)
  13. {
  14. printf("string[%d] = %c\n", a, string[a]);
  15. }
  16.  
  17. printf("\nElementos de la variable ptr:\n");
  18.  
  19. for(int b = 0; b <= strlen(ptr); b++)
  20. {
  21. printf("ptr[%d] = %c\n", b, ptr[b]);
  22. }
  23.  
  24.  
  25. return 0;
  26. }

ptr es un puntero que apunta a la variable (cadena) string. Al apuntar se reservan 5 celdas de memoria (vamos a llamarlo así) y se pone en ptr el contenido de string. O sea, quedaría una cosa así:

string[0] = “H” (siempre empieza por la celda 0)
string[1] = “o”
string[2] = “l”
string[3] = “a”
string[4] = “\0” (carácter nulo para finalizar la cadena)

y lo mismo con ptr:

ptr[0] = “H”
ptr[1] = “o”
ptr[2] = “l”
ptr[3] = “a”
ptr[4] = “\0”


Entonces esto es aplicable a la función strlen. ptr apunta a cadena. Lo bueno viene ahora. Ponemos por caso que le pasamos, al parámetro de la función, la cadena: elhacker. Luego la cadena cadena quedaría:

cadena[0] = “e”
cadena[1] = “l”
cadena[2] = “h”
cadena[3] = “a”
cadena[4] = “c”
cadena[5] = “k”
cadena[6] = “e”
cadena[7] = “r”
cadena[8] = “\0”


y ptr igual. Con el bucle avanzamos ptr hasta la penúltima celda (ptr[7]) pero cadena sigue en la primera celda (cadena[0]). Entonces se resta, en este caso 8 – 0, y queda el tamaño final.

Sé que lo explico fatal y fantasma306 lo explicó más breve y simple pero mira, así tienes diferentes opciones :).


Título: Re: ejercicios en c
Publicado por: Dark Invader en 16 Junio 2011, 18:45 pm
Gracias a ambos,

Queta ya he estudiado punteros y cadenas,ya te dije que iba por estructuras dinamicas como nodos y pilas  :xD Lo que pasaba es que si por ejemplo:

int strlen(char *cadena)

Esa es la funcion pero por parametro seria:

int strlen(&cadena)

Se enviaria la direccion cadena y el parametro de la funcion almacenaria el valor de esa direccion,en este caso de la cadena.Pero claro estudie que las cadenas y arrays ya estan definidos en memoria,y no haria falta pasar la direccion...O eso creo.

Pero imaginate que no sabes cuanto mide la cadena,imaginemos que has cazado la cadena con gets y a lo mejor son 9 letras(abcdefgh + el caracter de final de cadena)

Entonces¿seria la misma estructura,incrementando y luego decremento?

Y gracias a ti tambien fantasma 306 me quedo muy claro lo que dijistes,y gracias tambien a queta.

Salu2


Título: Re: ejercicios en c
Publicado por: Queta en 16 Junio 2011, 19:14 pm
Lo que pasaba es que si por ejemplo:

int strlen(char *cadena)

Esa es la funcion pero por parametro seria:

int strlen(&cadena)

Se enviaria la direccion cadena y el parametro de la funcion almacenaria el valor de esa direccion,en este caso de la cadena.Pero claro estudie que las cadenas y arrays ya estan definidos en memoria,y no haria falta pasar la direccion...O eso creo.

No hace falta; vuélvete a leer este enlace:

http://www.cplusplus.com/doc/tutorial/functions2/ (http://www.cplusplus.com/doc/tutorial/functions2/)

Si continúas sin entenderlo crea otro post y pregunta.

Pero imaginate que no sabes cuanto mide la cadena,imaginemos que has cazado la cadena con gets y a lo mejor son 9 letras(abcdefgh + el caracter de final de cadena)

Entonces¿seria la misma estructura,incrementando y luego decremento?

Fíjate que en mis códigos nunca “sé” el tamaño de las cadenas ::).


Título: Re: ejercicios en c
Publicado por: Dark Invader en 16 Junio 2011, 19:21 pm
Vale todo claro,gracias a ambos me habeis ayudado mucho  ;D

Salu2


Título: Re: ejercicios en c
Publicado por: fantasma306 en 16 Junio 2011, 21:27 pm
ksiksi la cadena al final tiene que tener siempre 29 digitos?