Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#381
Solo necesitas dos bucles, uno despues de otro, de esta forma:
for (i = 0; i < esp; i++)
   putchar(' ');
for (i = 0; i < sign; i++)
   putchar('#');
putchar('\n');


Un saludo
#382
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:
for(cociente = numero;cociente > 0;cociente/=16){
   residuo = cociente % 16;
   num_hex = convertirHexadecimal(residuo);
   sprintf(c,"%c",num_hex);
   strcat(cadena,c);
}

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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   printf("%d %x %04x\n", 33, 33, 33); /* Imprime 33 21 0021 */
   
   return EXIT_SUCCESS;
}

Y si necesitas que la salida se almacene en una cadena/archivo puedes utilizar sprintf/fprintf.

Un saludo
#383
Cita de: David8 en  9 Abril 2014, 12:11 PMPero 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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   const int a = 42;
   
   a = 69;
   printf("%d\n", a);
   
   return EXIT_SUCCESS;
}

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:
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
Cita de: David8 en  9 Abril 2014, 00:16 AMTengo 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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char *s = "anita lava la tina";
   char *t = "tina";
   
   int i;
   int j;
   
   for (i = 0; s[i] != '\0'; i++){
      for (j = 0; s[i + j] == t[j] && t[j] != '\0'; j++)
         ;
     
      if (t[j] == '\0')
         printf("Coincidencia en la posicion %d\n", i);
   }
   
   return EXIT_SUCCESS;
}


Cita de: David8 en  9 Abril 2014, 00:16 AMSEGURAMENTE 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:
while ((c = getchar()) != EOF && c != '\n')
   ;


* 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:
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 C/C++ / Re: Metodos greedy
9 Abril 2014, 03:27 AM
Hay algunos ejemplos en la pagina sobre el tema en Wikipedia: Greedy algorithm.

Un saludo
#386
Programación C/C++ / Re: Duda EOF
9 Abril 2014, 03:13 AM
Cita de: pedroedlp en  8 Abril 2014, 23:30 PMbasicamente 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.

Cita de: pedroedlp en  8 Abril 2014, 23:30 PMles dejo ete programa que en teoria imprime la linea de entrada mas larga
Es uno de los ejemplos del libro "The C programming language".

Cita de: pedroedlp en  8 Abril 2014, 23:30 PMpero 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
Cita de: David8 en  8 Abril 2014, 15:45 PMNo 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:
void baraja( int wMazo[4][13] );

/* O tambien */
void baraja( int wMazo[][13] );

Pero no importa ya que la función se procesa como si su declaración fuera (y es):
void baraja(int (*wMazo)[13]);

Cita de: amchacon en  8 Abril 2014, 16:02 PMEsa 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 C/C++ / Re: Arreglos c++
7 Abril 2014, 15:22 PM
Cita de: alfonsopf95 en  7 Abril 2014, 05:40 AMNo 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:
if (a[n] == p == a[i]) {
No es correcta, hay que cambiarla a:
if (a[n] == p) {

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

Un saludo
#389
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:
#include <stdio.h>

int main(void)
{
  int i, j, inicio, final;
  char cadena[100] = "3 * 5 + (9 - 2) + 5", auxiliar[100];
 
  for (i = 0; cadena[i]; i++){
     if (cadena[i] == '(')
        inicio = i;
     if (cadena[i] == ')') {
        final = i;
        break;
     }
  }
 
  for (i = inicio + 1, j = 0; i < final; i++, j++)
     auxiliar[j] = cadena[i];
  auxiliar[j] = '\0';
 
  for (i = inicio; i <= final; i++)
     cadena[i] = ' ';
 
  printf("auxiliar = \"%s\", cadena = \"%s\"\n", auxiliar, cadena);
 
  return 0;
}


----

Editado: para obtener la subcadena delimitada por paréntesis mediante strchr basta con dos llamadas la primera buscando '(' y la segunda ')'. Por ejemplo:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *s = "3 * 5 + (9 - 2) + 5";
   char *p;
   char *q;
   
   if ((p = strchr(s, '(')) && (q = strchr(p, ')')))
      printf("%.*s\n", (int) (q - p + 1), p);
   
   return 0;
}

Eso para imprimir la subcadena en la salida estándar, para almacenarla en un array basta con sustituir printf por sprintf.

Un saludo
#390
Cita de: David8 en  6 Abril 2014, 12:47 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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int (*p)(const char *) = puts;
   
   p("puntero");
   puts("identificador ==> puntero");
   (*p)("expresion ==> puntero");
   
   return EXIT_SUCCESS;
}


----

Cita de: ivancea96 en  6 Abril 2014, 17:46 PMel 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