elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [44] 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 ... 160
431  Programación / Programación C/C++ / Re: problemas con long long int en: 13 Marzo 2014, 03:49 am
el problema no es que me los imprima al reves
Porque esa es la aproximación que tomas en tu programa, si quieres imprimirlos en orden opciones hay varias, por ejemplo almacenar los dígitos en un array y solo entonces imprimirlos, crear una función recursiva, etc.

¿por que me imprime espacios en blanco y como se los quito?
Para ayudarte primero debes publicar el código fuente del programa.

Un saludo
432  Programación / Programación C/C++ / Re: Leer datos de un cierto formato desde un fichero en: 13 Marzo 2014, 03:20 am
Me pasa un detalle para mi curioso. Con esto en el fichero:
Citar
...
1970-01-01 1.15
...
1980-01-01 1.225
...
1990-01-01 1.35

la salida es:
Citar
...
5: 1 0.15
...
5: 1 0.225
...
5: 1 0.35
Es decir, en el código que te pongo a continuación sólo actúa el scanf==5 y lo que hace el muy bandido es, cuando debería actuar para mi criterio el scanf==4, sigue actuando el scanf==5 y lo que hace es coger, en las líneas pares, el decimal y separarlo en la parte entera y la parte decimal y así no deja actuar al scanf==4.

¿Me podrían iluminar a ver qué diablos estoy haciendo fatal?.
El problema se debe a que la lectura con "%d %f" siempre sera exitosa ya se trate de un int y un float o bien un float.

Tomando como ejemplo la primera linea terminada con 1.15 el especificador "%d" consumirá "1" y "%f" consumirá ".15", eso explica la salida que obtienes en el programa.

Para solucionarlo hay que recordar que scanf y familia terminaran tan pronto falle una conversión, esa es la razón por la cual utilizo "%d%*[ ]%lf", ahí el espacio no es opcional, si no se encuentra por lo menos un espacio separando los dos números la función termina y su valor de retorno es uno.

Otro error en tu programa es, al utilizar directamente fscanf, el indicador de posición en el archivo se actualizara con la llamada a esa función sin importar su resultado.

Un saludo
433  Programación / Programación C/C++ / Re: problemas con long long int en: 13 Marzo 2014, 02:56 am
Tengo un codigo en el que tengo que pedirle a un usuario que me ingrese un numero de tipo long long int, y después tengo que escribir ese número en un archivo de texto, lo tengo que hacer dígito por dígito porque no tengo que usar cadenas
El primer problema con ese programa es utilizar, en su mayoría, la biblioteca estándar de C. ¿Porque no utilizas la de C++?

Ademas si el stream se abre en modo texto lo mas fácil es utilizar fprintf, si no te permiten hacerlo puedes utilizar fwrite para almacenar el numero completo (no tienes porque almacenar dígito por dígito de esa forma).

Un saludo
434  Programación / Programación C/C++ / Re: Me crashea el programa en: 13 Marzo 2014, 02:40 am
Aparte de todo lo dicho falta inicializar la semilla para los números aleatorios, esto puede hacerse con:
Código
  1. #include <stdlib.h>
  2. #include <time.h>
  3.  
  4. /* ... */
  5.  
  6. int main(void)
  7. {
  8.   /* ... */
  9.  
  10.   srand((unsigned) time(NULL));
  11.  
  12.   /* Uso de rand ...  */
  13. }

Y en el bucle la primera asignación a la variable "k" sobra, la asignación "c[ k ] = letra[ i ];" esta al revés (debería ser "letra[ i ] = c[ k ];") y por ultimo si se trata de una cadena falta agregar el terminador '\0'.

El code no está terminado pero no puedo terminar de resolver eso
En buen plan deberías conseguir un buen curso o libro, para recomendaciones solo tienes que utilizar el motor de búsqueda de los foros.

Un saludo
435  Programación / Programación C/C++ / Re: Leer datos de un cierto formato desde un fichero en: 12 Marzo 2014, 17:06 pm
Puedes utilizar la función fscanf siempre y cuando la entrada garantice solo esos dos tipos de linea y nada mas. Primero lees la fecha y a continuación verificas si el resto es uno de los dos casos.

Un ejemplo con sscanf:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char *linea[] = {
  7.      "1970-01-01 1 2.3",
  8.      "1970-01-01 4.5",
  9.      "1980-01-01 1 2.3",
  10.      "1980-01-01 4.5",
  11.      "1990-01-01 1 2.3",
  12.      "1990-01-01 4.5",
  13.   };
  14.   size_t num_elem = sizeof linea / sizeof linea[0];
  15.   size_t i;
  16.  
  17.   unsigned a;
  18.   unsigned m;
  19.   unsigned d;
  20.   int num_ent;
  21.   double num_pf;
  22.   int nc;
  23.  
  24.   for (i = 0; i < num_elem; i++)
  25.      if (sscanf(linea[i], "%u-%u-%u%n", &a, &m, &d, &nc) == 3){
  26.         printf("%u-%02u-%02u: ", a, m, d);
  27.  
  28.         if (sscanf(linea[i] + nc, "%d%*[ ]%lf", &num_ent, &num_pf) == 2)
  29.            printf("%d %.2f\n", num_ent, num_pf);
  30.         else if (sscanf(linea[i] + nc, "%lf", &num_pf) == 1)
  31.            printf("%.2f\n", num_pf);
  32.         else
  33.            puts("Error");
  34.      }
  35.  
  36.   return EXIT_SUCCESS;
  37. }

En tu caso solo tienes que leer el archivo linea por linea con fgets, a continuación la procesas con sscanf.

Un saludo
436  Programación / Programación C/C++ / Re: Asesoria Memoria Dinamica en: 12 Marzo 2014, 04:02 am
Como ya te comento eferion deberías utilizar la biblioteca estándar de C++. Puedes utilizar las clases vector y string para que ellas se encarguen del manejo de memoria y la clase istringstream para obtener las palabras de la linea. Por ejemplo:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <string>
  7. using std::string;
  8. using std::getline;
  9.  
  10. #include <vector>
  11. using std::vector;
  12.  
  13. #include <sstream>
  14. using std::istringstream;
  15.  
  16. int main()
  17. {
  18.   cout << "Introduce la linea: ";
  19.   string linea;
  20.   getline(cin, linea);
  21.  
  22.   istringstream is(linea);
  23.   vector<string> palabra;
  24.   string aux;
  25.   while (is >> aux)
  26.      palabra.push_back(aux);
  27.  
  28.   // En C++11 se puede utilizar "auto" para abreviar la declaracion
  29.   for (vector<string>::size_type i = 0; i != palabra.size(); ++i)
  30.      cout << i << ": " << palabra[i] << endl;
  31.  
  32.   return 0;
  33. }

Un saludo
437  Programación / Programación C/C++ / Re: Problema con un programa en C (string.h y funciones) en: 12 Marzo 2014, 03:38 am
Pero lo que quiero decir es que en un problema donde se requiriera llegar hasta el elemento del medio i = 2, habría que poner el (float), ya que de otro modo la sentencia i < N/2 con N = 5, llegaría hasta i = 1. Y si se nos ocurre poner i <= N/2 también estaría mal porque en el caso que N sea par, ejemplo N = 6, llegaría hasta i = 3 cuando debería ser hasta i = 2. En un caso como ese creo que no queda otro remedio que i < (float)N/2.
Si la intención es procesar la primera mitad de un array incluyendo el elemento pivote (si existe) me parece mas sencillo utilizar la expresión "i < (N + 1) / 2" para controlar el bucle.

Un saludo
438  Programación / Programación C/C++ / Re: Problema con un programa en C (string.h y funciones) en: 11 Marzo 2014, 16:45 pm
Por último un detalle sutil. Cuando la longitud N de la palabra sea impar, el cociente N/2 será decimal, pero los tipos de las variables i, N son enteros, por eso la comparación i < N/2 no será válida. Es necesario convertir N a float para que admita los decimales y por eso ponemos i < (float)N / 2.
La conversión al tipo float no es necesaria ya que la división entre dos números enteros resulta en un valor también entero (los decimales se descartan).

----

Una forma ligeramente distinta a las expuestas es:
Código
  1. #include <string.h>
  2.  
  3. int es_palindromo(char const *cad)
  4. {
  5.   int i;
  6.   int j = strlen(cad) - 1;
  7.  
  8.   for (i = 0; i < j && cad[i] == cad[j]; i++, j--)
  9.      ;
  10.  
  11.   return i >= j;
  12. }

Un saludo
439  Programación / Programación C/C++ / Re: Utilería, reemplazar TAB por " " en: 11 Marzo 2014, 15:57 pm
De todas formas, me refería a intentar hacer el tuyo propio. Es un reto interesante.
¿Que más hacen esos programas a parte de indentar?
Otro aplicación de ese tipo es astyle, un listado de sus opciones se encuentra en su documentacion en linea.

Un saludo
440  Programación / Programación C/C++ / Re: copiar una palabra de un archivo en C en: 11 Marzo 2014, 04:06 am
Otra opción, una vez se obtenga la linea del archivo, es utilizar la función strchr para encontrar las posiciones de los caracteres '(' y ')'. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void)
  6. {
  7.   char *linea[] = {
  8.      "agregar(001,serrucho,100.00, 5)",
  9.      "agregar(010,martillo, 20.00,10)",
  10.      "agregar(012,escalera,300.00,10)"
  11.   };
  12.   size_t num_lineas = sizeof linea / sizeof linea[0];
  13.   size_t i;
  14.  
  15.   char *p;
  16.   char *q;
  17.  
  18.   for (i = 0; i < num_lineas; i++)
  19.      if ((p = strchr(linea[i], '(')) && (q = strchr(++p, ')')) && q > p)
  20.         printf("%.*s\n", (int) (q - p), p);
  21.  
  22.   return EXIT_SUCCESS;
  23. }

Un saludo
Páginas: 1 ... 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [44] 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines