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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21 22 23 24 25 26
151  Programación / Programación C/C++ / Re: copiar una palabra de un archivo en C en: 13 Marzo 2014, 01:05 am
Leosansan, cuándo hablas de códigos, ¿te refieres a los míos?

Si es así, por qué dices que el primero no funciona. ¿Lo ejecutaste? Su salida es:

001,serrucho,100.00,5
010,martillo,20.00,10
012,escalera,300.00,10

entonces ¿por qué no funciona?

Ahora, lo que dijo el usuario fue "unicamente los datos encerrados en los parentesis ()", lo cual excluye la palabra "agregar", precisamente por ello presenté el primer código.

El segundo programa que propuse es por lo que inferí de las palabras del autor del tema, aunque reconozco que el no lo pidió exactamente así. Pero bien, él dijo "los datos encerrados entre paréntesis", y al referirse a "los datos" me imagino que es sin las comas. Por eso el segundo programa muestra los datos separados. Pero creo que deberíamos esperar que sea el autor del post quién sentencie al respecto y nos diga cómo era que lo quería  :D
152  Programación / Programación C/C++ / Re: Utilería, reemplazar TAB por " " en: 13 Marzo 2014, 00:55 am
Interfaz gráfica que difícilmente usaré, jajajaja, deben saber que soy un "talibán" de la consola, jeje

Pero bueno como he dicho antes, cada quién con su gusto, hay quiénes gustan de la GUI's y a quiénes gustan de la consola, saludos  :D
153  Programación / Programación C/C++ / Re: tableros en: 12 Marzo 2014, 04:20 am
Pero indistintamente, lo cortés no quita lo valiente, siempre es bueno comentariar al menos a qué refieren las fórmulas aunque no se de una explicación detallada. P.ej.: posiciones centrales de las casillas.

Ya sabes, documentar el código para que sea más fácil de mantener por otra persona o por tí mismo en el futuro. Una vez leí un chiste de programadores que el código más odiado del mundo puede llegar a ser ........ tu propio código (de 6 meses atrás). Por que ya no te acuerdas de qué hacía ni como, jajajaja

espero no lo tomes a mal, saludos!!!
154  Programación / Programación C/C++ / Re: copiar una palabra de un archivo en C en: 12 Marzo 2014, 03:44 am
Bueno, opino que el enfoque de Cooper es el mismo que tomó leosansan, pero el primero más a mano y el segundo formalizado por medio de la función strtok()

La idea de rir creo que no necesita mejoras (como siempre  :D), aunque yo me quiero referir a la propuesta que se basa en la bonita función strtok() cuya finalidad es precisamente analizar léxicamente una expresión.

Pero hay un detallito leosansan, y es que la palabra "agregar" creo que no debe ir. Analicemos el funcionamiento de strtok(): En la primera ejecución debería buscar '(', en cuyo caso extrae de la cadena la frase "agregar", es decir, justo antes del '('. La segunda llamada debería ser con el divisor ')', en cuyo caso toma lo que está después del anterior '(' y antes del siguiente ')'. Ya no se necesitan más llamadas en esa línea del archivo.

Con leves modificaciones, propongo el programa así (el printf ("%s\n",p) es sólo para propósitos de verificar el resultado):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NOM_ARCHIVO_IN   "Entrada3.txt"
  6. #define NOM_ARCHIVO_OUT  "Entrada4.txt"
  7. #define NUM_CHARS     256
  8.  
  9. int main(void) {
  10.  
  11.   FILE *entrada,*salida;
  12.   char linea[NUM_CHARS],linea_out[NUM_CHARS];
  13.   char *p, *q;
  14.  
  15.   if ((entrada = fopen(NOM_ARCHIVO_IN, "r")) == NULL){
  16.   perror(NOM_ARCHIVO_IN);
  17.   return EXIT_FAILURE;
  18.   }
  19.  
  20.   if ((salida = fopen(NOM_ARCHIVO_OUT, "w")) == NULL){
  21.   perror(NOM_ARCHIVO_OUT);
  22.   return EXIT_FAILURE;
  23.   }
  24.   while (fgets(linea, NUM_CHARS, entrada) != NULL) {
  25.  
  26.      if ( ( p = strtok (linea, "(") ) == NULL ) continue;
  27.      if ( ( p = strtok (NULL, ")") ) == NULL ) continue;
  28.      printf ("%s\n", p);
  29.      fprintf(salida,"%s\n", p);
  30.   }
  31.  
  32.   fclose(entrada);
  33.   fclose(salida);
  34.   return EXIT_SUCCESS;
  35. }

cuya salida:

001,serrucho,100.00,5
010,martillo,20.00,10
012,escalera,300.00,10


==========================================
EDITO:

A juzgar por el problema original, pareciera que se tiene un fichero de órdenes que deben ser interpretadas (algo como un script ejecutable). En ese caso podría ser deseable separar los agumentos de la función agregar, a través del token ','. Para lo cual es ideal usar de nuevo la strtok(). Considérese que la primera llamada debe ser con la cadena de argumentos como primer parámetro y las posteriores con NULL, por eso los punteros p y q. Esta versión separa los argumentos con un '\n' (haciendo como una pila de ellos), aunque pudiera usarse un '\t', un espacio, etc:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NOM_ARCHIVO_IN   "Entrada3.txt"
  6. #define NOM_ARCHIVO_OUT  "Entrada4.txt"
  7. #define NUM_CHARS     256
  8.  
  9. int main(void) {
  10.  
  11.   FILE *entrada,*salida;
  12.   char linea[NUM_CHARS],linea_out[NUM_CHARS];
  13.   char *p, *q;
  14.  
  15.   if ((entrada = fopen(NOM_ARCHIVO_IN, "r")) == NULL){
  16.   perror(NOM_ARCHIVO_IN);
  17.   return EXIT_FAILURE;
  18.   }
  19.  
  20.   if ((salida = fopen(NOM_ARCHIVO_OUT, "w")) == NULL){
  21.   perror(NOM_ARCHIVO_OUT);
  22.   return EXIT_FAILURE;
  23.   }
  24.   while (fgets(linea, NUM_CHARS, entrada) != NULL) {
  25.  
  26.      if ( ( p = strtok (linea, "(") ) == NULL ) continue;
  27.      if ( ( p = strtok (NULL, ")") ) == NULL ) continue;
  28.      q = p;
  29.      while ( ( p = strtok (q, ",") ) != NULL ) {
  30.         printf ("%s\n", p);
  31.         fprintf(salida,"%s\n", p);
  32.         q = NULL;
  33.      }
  34.   }
  35.  
  36.   fclose(entrada);
  37.   fclose(salida);
  38.   return EXIT_SUCCESS;
  39. }

con la salida:

001
serrucho
100.00
5
010
martillo
20.00
10
012
escalera
300.00
10


Saludos!!
155  Programación / Programación C/C++ / Re: [?][C] Pausar y reanudar programa. en: 12 Marzo 2014, 01:34 am
¿Cuál es la diferencia entre readkey() y getchar()?

Disculpen, es que no soy muy entendido en funciones de bliblioteca Windows (si es éste el caso), prefiero dentro de lo posible moverme dentro del C estándar ...
156  Programación / Programación C/C++ / Re: encontrar el ultimo valor de la matriz recorrida en: 12 Marzo 2014, 01:29 am
Leo, acabo de leer tu artículo sobre los colores en la consola de Windows y lo entendí perfecto.

Yo creo que para ese propósito estaría bien preparar un pequeño fichero .h con nmemónicos para los colores, haciéndolos más fácil de recordar y utilizar. Porque la verdad cuando vi como color(7), color(191), etc .... no entendí nada, sólo que obviamente era un cierto color  :rolleyes:

Aunque aquél tema es viejo, vi la pregunta sobre ingeniársela para producir más de 255 colores. Sabes que soy un "minimalista", pero ese hecho no implica que nuestros trabajos deban ser limitados. Steve Jobs también era "minimalista", y mira a lo que llegó !!!. Si somos creativos, aunque tengamos una pequeña paleta de colores podríamos hacer programas funcionales y muy buenos. Por otra parte, irse a las API's tiene la desventaja de hacer el programa altamente dependiente de sistema, y tratándose de Windows hasta es posible que funcione en una determinada versión y no en otra.

En definitiva, si es una aplicación de consola yo no buscaría más colores, con los que muestras me parece suficiente, aunque no se qué opines tú ....
157  Programación / Programación C/C++ / Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas? en: 12 Marzo 2014, 01:17 am
... de ahí que mis códigos sean casi iguales al de los autores del tema pero funcionales, es decir con los errores corregidos y aclaradas las dudas. Esa es una cosa que me diferencia de otros usuarios, yo suelo contestar con código en lugar de con orientaciones, que la mayor parte de las veces les deja en el limbo, o con enlaces. Como ya comenté una vez, lo que nos parece trivial para algunos, para otros les puede resultar un muro insalvable.

Totalmente de acuerdo leosansan, pienso que hay que ser respetuoso con la línea original trazada por el usuario, y no procurar cambiársela sino mejorársela. Esto implica un compromiso delicado, pues a veces si por nosotros fuera le añadiríamos las mil y una cosas pero el autor no va a entender nada, jaja. Hay que agregar las mejoras pero siempre al alcance de la comprensión del usuario, y no de una forma que desnaturalice por completo la idea original del autor.

Y sí, a veces como "una imagen vale más que mil palabras", se tiene que "una línea de código vale más que mil palabras". Uno se da a entender mejor de esta manera en lugar de que te digan "anda a tal página web" y cuando vas no tiene la menor relación con lo que buscas  >:( >:(, o al menos a mí me ha pasado eso.

Yo creo que se trata de hacer a los demás como harías contigo mismo. Muchas veces me he beneficiado de los aportes de otras personas en la web, y lo que estoy haciendo aquí es básicamente agradecer esa ayuda que he recibido. De eso se trata la solidaridad humana, y es la ÚNICA vía que mejorará al planeta, sólo que la gente no tiene fe y a veces son muy pocos los que están dispuestos a dar su grano de arena por otra persona, .... pero no importa, ánimo y a seguir trabajando  :D

===============================

POR CIERTO, se han dado cuenta que el tema ha sido veces 693 veces hasta el momento ?. Se está haciendo popular !!!
158  Programación / Programación C/C++ / Re: Matriz Dinamica en c++. Como rellenarla en coordenadas especificas? en: 12 Marzo 2014, 01:04 am
Ok xuhipoint, pero por favor mantennos al tanto de lo que has hecho y cómo va funcionando. Es la manera de corresponder a los que nos hemos involucrado en este tema, y quisiéramos saber que lo has terminado y si te ha ido bien  :D.

Yo me uní a este foro porque precisamente rescata el espíritu anteriormente prevaleciente entre la comunidad de programadores, que era la solidaridad (bueno, hasta que llegó Microsoft y echó a perder todo, jaja). Es la misma filosofía GNU. Los programadores debemos ser personas sumamente humanitarias.

Ahora, pienso que un programa de esta complejidad, aunque para nosotros no parezca mucho, sí lo es para alguien que esté comenzando. Lleva asignación dinámica de memoria, manejo de matrices, elementos delicados donde si te pones a trabajar en "solitario" te vas a enredar y equivocar. No está mal que recibir ayuda.

Así que por favor ten en cuenta las recomendaciones generales que te hemos hecho. Todos hemos pasado por lo mismo y ya ganamos experiencia con ésto. En particular, yo señalaría con mucho énfasis:

  • Modulariza el código. De otro modo terminas teniendo lo que se llama "espagueti". Por ejemplo, en la función de asignar las minas tenías que ahí mismo calculabas cuántas minas rodeaban una casilla para mostrar las sumas. Así llegabas a tener cuatro (4) ciclos anidados, un for dentro de for, dentro de for, dentro de for, y empieza a volverse complicado. Debes tener una función exclusiva para colocar las minas, otra par sumar las minas adyacentes, otra para imprimir la matriz, etc. "Divide y vencerás".
  • El formato de declaración for (int i = 0 ....) donde el tipo de la variable contador está "auto-declarado" en lo particular me parece algo desaconsejable aquí. Tengo entendido (no se si me equivoco) que primero ésto es sólo válido en C99, y segundo al hacer ésto la "vida" o alcance de la variable es sólo dentro del bloque o ciclo en cuestión donde se declara, por lo que no puedes reutilizar el contador en otra parte del código. Declara las variables contador al inicio de la definición de la función.
  • Decide para los elementos de la matriz un tipo "consistente" de datos, que luego no tengas que estarlo cambiando o transformando. Si es char, que sea char. Si en entero, que sea entero. Pero no que sea char, el cual luego lo estás transformando a entero, y de nuevo a char, etc. Esto es fuente probable de errores, es inseguro, y por un pequeño descuido te puede echar a perder todo el programa.

Esto es en general lo que puedo comentar. Trabaja como quieras, pero sigue dichos consejos y no se si leosansan y eferion quieren añadir otros basados en su experiencia.
159  Programación / Programación C/C++ / Re: Utilería, reemplazar TAB por " " en: 12 Marzo 2014, 00:35 am
Bueno, una cosa es hacer un programilla a gusto propio en 5 ó 10 min (y justo para eso estamos, pues es un foro de programadores) para solucionar alguna necesidad sobre la marcha, y otra es ir más allá y probar una herramienta profesional, jeje.

Me parece interesante el "astyle" (Artistic Style), y sobre todo porque funciona por ordenes de comandos (en lo particular uso mucho más el teclado que el ratón), y por lo que leí permite crear y cargar un fichero de configuración con tus opciones preferidas, con la orden --options=opt_file

Por lo general creo no necesitar un embellecedor de código si el mismo lo hice yo (jeje) porque trato de ser prolijo en la escritura. Pero sí que sería necesario al abrir el código fuente que suben algunos usuarios (principiantes más que todo) de este foro, y los hacen feiiiiiísimos :o, con el beautifier se acomoda rápido y se puede editar más cómodamente.

Quizá termine proponiendo presentar nuestros propios minicódigos que imiten algunas de las funcionalidades de los buautifiers, .... ya saben, a manera de ejercicio para nosotros mismos  :D

=================================
EDITO:

Este astyle es fantástico, en primer lugar es tipo command-line lo que imagino lo hace muy potente. Para imitar el comportamiento de mi programa tab, la orden correspondiente es:

astyle --indent=spaces=3 < source.c > out.txt

para sacar la salida en un txt, reemplazando los TAB por 3 espacios.

Thanks.
160  Programación / Programación C/C++ / Re: Problema con un programa en C (string.h y funciones) en: 11 Marzo 2014, 23:05 pm
rir3760, no era exactamente eso lo que quería decir. Mi intención era precisamente que sí reconociera los decimales, por ejemplo, si la longitud es N=5 se consideraran los valores i = 0, i = 1, i = 2. O sea todos los valores enteros de i no mayores a 5/2 = 2.5, en cuyo caso debemos convertir a float o double, pues de otro modo la sentencia i < N/2 llegaría sólo hasta i=1.

Claro, ahondando en el fondo vemos que i = 2 no es necesario porque no necesitamos comparar el elemento del medio de la cadena. O sea que al final el (float) sí es redundante.

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

Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21 22 23 24 25 26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines