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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: 1 ... 24 25 26 27 28 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 ... 160
381  Programación / Programación C/C++ / Re: com imprimir varibles varias veces en: 10 Abril 2014, 17:35 pm
Solo necesitas dos bucles, uno despues de otro, de esta forma:
Código
  1. for (i = 0; i < esp; i++)
  2.   putchar(' ');
  3. for (i = 0; i < sign; i++)
  4.   putchar('#');
  5. putchar('\n');

Un saludo
382  Programación / Programación C/C++ / Re: hexadecimal de 2 bytes en: 10 Abril 2014, 01:21 am
Ya te había comentado sobre varios errores en tus programas pero por alguna razón simplemente no haces caso. La copia de caracteres mediante sprintf y strcat:
Código
  1. for(cociente = numero;cociente > 0;cociente/=16){
  2.   residuo = cociente % 16;
  3.   num_hex = convertirHexadecimal(residuo);
  4.   sprintf(c,"%c",num_hex);
  5.   strcat(cadena,c);
  6. }
Sigue ahí cuando hay formas mas simples de hacerlo, te indique cuales en uno de tus otros temas.

En cuanto a imprimir un numero hexadecimal con al menos cuatro dígitos (relleno de ceros a la izquierda de ser necesario) basta con utilizar printf con el especificador "%04x". Un ejemplo sencillo que genera la salida que mencionas es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   printf("%d %x %04x\n", 33, 33, 33); /* Imprime 33 21 0021 */
  7.  
  8.   return EXIT_SUCCESS;
  9. }
Y si necesitas que la salida se almacene en una cadena/archivo puedes utilizar sprintf/fprintf.

Un saludo
383  Programación / Programación C/C++ / Re: Error programa encontrar una cadena dentro de otra en: 9 Abril 2014, 15:19 pm
Pero no entiendo porque no puedo declarar a "tamanio" como const. El compilador no me da ningún warning
Para que se generen los mensajes debes utilizar el modo mas estricto que tu compilador permita y ello debe indicarse claramente en su documentación.

Por ejemplo si este programa:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   const int a = 42;
  7.  
  8.   a = 69;
  9.   printf("%d\n", a);
  10.  
  11.   return EXIT_SUCCESS;
  12. }
Lo compilamos en la forma indicada utilizando Lcc-win32, Pelles C, CygMing (la version de gcc para Cygwin) y Visual C++ 2008 Express la salida es:
Código:
Lc.exe -A -ansic -check main.c

main.c:8:Error:assignment to const identifier 'a'
----
Pocc /Zs /W2 main.c

main.c(8): error #2032: Assignment to const identifier 'a'.
----
gcc (GCC) 4.7.3
gcc.exe -c -ansi -pedantic -Wall -O main.c -o main.tmp

main.c: In function ‘main’:
main.c:8:4: error: assignment of read-only variable ‘a’
----
CL.exe /TC /Zs /Za /Wall /W4 /D_CRT_SECURE_NO_WARNINGS main.c

main.c(8) : error C2166: Valor L especifica un objeto const

Un saludo
384  Programación / Programación C/C++ / Re: Error programa encontrar una cadena dentro de otra en: 9 Abril 2014, 04:50 am
Tengo que hacer un programa que verifique si una cadena se encuentra dentro de otra ( sin usar la función strstr() ).
La aproximación que tomas esta mal ya que si sucede una coincidencia parcial, por ejemplo si buscas "aab" en "aaab", los caracteres no se vuelven a verificar (en el ejemplo la búsqueda debe continuar a partir del segundo carácter).

Si la cadena es "s" y la subcadena a buscar es "t" la forma mas sencilla (fuerza bruta) es verificando cada posición de "s", por cada una revisas si los caracteres coinciden con la subcadena "t".

Un ejemplo de ello sencillo y sin funciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char *s = "anita lava la tina";
  7.   char *t = "tina";
  8.  
  9.   int i;
  10.   int j;
  11.  
  12.   for (i = 0; s[i] != '\0'; i++){
  13.      for (j = 0; s[i + j] == t[j] && t[j] != '\0'; j++)
  14.         ;
  15.  
  16.      if (t[j] == '\0')
  17.         printf("Coincidencia en la posicion %d\n", i);
  18.   }
  19.  
  20.   return EXIT_SUCCESS;
  21. }

SEGURAMENTE HAYA MÁS FALLOS
Me temo que si. Algunos de ellos:

* La variable "tamanio" la declaras como solo lectura (calificador const) y después la utilizas para almacenar ahí un valor con scanf. Elimina ese calificador.

* Cuando se utiliza un bucle para descartar el resto de la linea debes verificar el caso de error o fin de archivo, ese bucle hay que cambiarlo a:
Código
  1. while ((c = getchar()) != EOF && c != '\n')
  2.   ;

* Cuando declaras un array e indicas el numero de elementos mediante un valor calculado en tiempo de ejecución (tu caso con los arrays "cadenaOriginal" y "cadenaABuscar") si es valido depende del compilador.

* No utilices "truquitos" como este:
Código
  1. printf("Definir tama%co aproximado de la cadena: ", 164);
Para imprimir caracteres fuera del juego de caracteres ASCII porque los entornos de edición y ejecución dependen de la implementación. En buen cristiano caracteres como la 'ñ' no están garantizados (evitalos salvo una buena razón).

Un saludo
385  Programación / Programación C/C++ / Re: Metodos greedy en: 9 Abril 2014, 03:27 am
Hay algunos ejemplos en la pagina sobre el tema en Wikipedia: Greedy algorithm.

Un saludo
386  Programación / Programación C/C++ / Re: Duda EOF en: 9 Abril 2014, 03:13 am
basicamente no entiendo que es lo que hace EOF
Es una macro definida en <stdio.h> con un valor menor que cero (usualmente -1) y es el valor de retorno de algunas funciones de la biblioteca estándar (por ejemplo getchar) para indicar que la operación de lectura fallo al alcanzar el final del archivo.

les dejo ete programa que en teoria imprime la linea de entrada mas larga
Es uno de los ejemplos del libro "The C programming language".

pero yo ejecuto el programa y no hace nada, solo espera q le ingrese datos por teclado, yo creo que es por algo del EOF, que siempre da verdadero el while.
Es el comportamiento normal. Como se procesa la entrada estándar debes introducir varias lineas y a continuación la señal de fin de archivo ({CONTROL} + Z en MS Windows y {CONTROL} + d en Linux). Solo entonces el programa imprimirá la linea mas larga.

Un saludo
387  Programación / Programación C/C++ / Re: Duda función barajar en: 8 Abril 2014, 17:29 pm
No entiendo porqué se pasa wMazo[][13], es decir, porque se deja el primer corchete sin datos, ¿no debería ser wMazo[4][13]?
Puedes declararla así pero no tendrá efecto ya que en C cuando un argumento es de tipo array lo que recibe la función es la dirección en memoria de (un puntero a) su primer elemento. Si el array es de tipo "T [N]" la función recibe un puntero de tipo "T *".

Utilizando tu caso como ejemplo la función la puedes declarar en cualquiera de las dos formas:
Código
  1. void baraja( int wMazo[4][13] );
  2.  
  3. /* O tambien */
  4. void baraja( int wMazo[][13] );
Pero no importa ya que la función se procesa como si su declaración fuera (y es):
Código
  1. void baraja(int (*wMazo)[13]);

Esa funcion da problemas, es muy probable que el mazo generado tenga 2 cartas identicas.
En buen plan: lo reviso con cuidado y no veo como se pueda duplicar una carta. ¿Se me escapa algo?

Un saludo
388  Programación / Programación C/C++ / Re: Arreglos c++ en: 7 Abril 2014, 15:22 pm
No se como hacerle para que el numero que digite el usuario se comparee con los numeros que ya contiene el arreglo y imprima si es correcto o se equivoco y si se esquivoco imprimir  numero qe es.
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

Lo primero que debes hacer es evitar el uso de la biblioteca conio de Borland y cambiar la definición de la función main a "int main(void) ..." o "int main() ...". Las razones de ello en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

Antes de utilizar las funciones srand y rand debes incluir <stdlib.h>. El error principal se debe a la condición de la sentencia "if" dentro del bucle:
Código
  1. if (a[n] == p == a[i]) {
No es correcta, hay que cambiarla a:
Código
  1. if (a[n] == p) {

Por ultimo hay que eliminar la sentencia:
Código
  1. a[n] == p == a[i];
Ya que no tiene efecto.

Un saludo
389  Programación / Programación C/C++ / Re: Prioridad y asociatividad de los operadores en C. (Programa propio) en: 7 Abril 2014, 02:49 am
El primer cambio que debes hacer es almacenar el '\0' en el array "auxiliar" justo después del segundo bucle y para sustituir la cadena entre paréntesis por espacios el tercer bucle es demasiado complicado.

Con los cambios:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int i, j, inicio, final;
  6.   char cadena[100] = "3 * 5 + (9 - 2) + 5", auxiliar[100];
  7.  
  8.   for (i = 0; cadena[i]; i++){
  9.      if (cadena[i] == '(')
  10.         inicio = i;
  11.      if (cadena[i] == ')') {
  12.         final = i;
  13.         break;
  14.      }
  15.   }
  16.  
  17.   for (i = inicio + 1, j = 0; i < final; i++, j++)
  18.      auxiliar[j] = cadena[i];
  19.   auxiliar[j] = '\0';
  20.  
  21.   for (i = inicio; i <= final; i++)
  22.      cadena[i] = ' ';
  23.  
  24.   printf("auxiliar = \"%s\", cadena = \"%s\"\n", auxiliar, cadena);
  25.  
  26.   return 0;
  27. }

----

Editado: para obtener la subcadena delimitada por paréntesis mediante strchr basta con dos llamadas la primera buscando '(' y la segunda ')'. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void)
  5. {
  6.   char *s = "3 * 5 + (9 - 2) + 5";
  7.   char *p;
  8.   char *q;
  9.  
  10.   if ((p = strchr(s, '(')) && (q = strchr(p, ')')))
  11.      printf("%.*s\n", (int) (q - p + 1), p);
  12.  
  13.   return 0;
  14. }
Eso para imprimir la subcadena en la salida estándar, para almacenarla en un array basta con sustituir printf por sprintf.

Un saludo
390  Programación / Programación C/C++ / Re: ¿Ventajas de un puntero a una función? en: 6 Abril 2014, 18:21 pm
¿una llamada a una función con un puntero a función es más rápida que una llamada "normal"?
En el caso de C (habrá que revisar los puntos finos de C++) no hay diferencia ya que una llamada a función requiere de un puntero, cuando se llama a una función utilizando su identificador o una expresión que la denote (identifique, haga referencia) ello genera el puntero necesario.

Un ejemplo sencillo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int (*p)(const char *) = puts;
  7.  
  8.   p("puntero");
  9.   puts("identificador ==> puntero");
  10.   (*p)("expresion ==> puntero");
  11.  
  12.   return EXIT_SUCCESS;
  13. }

----

el segundo habría que hacer un while y comparar hasta que la entrada sea correcta.
En ambos. Pero como se trata de ejemplos ilustrativos no veo porque molestarse con validaciones (la idea es explicar otra parte del lenguaje, ya se agregaran cuando sean necesarias).

Un saludo
Páginas: 1 ... 24 25 26 27 28 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 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines