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

#1
Cita de: bash en  5 Junio 2015, 17:56 PMtengo cantidades monetarias en string y quiero agregarles en su debido lugar un caracter espeficio como son comas y puntos pero no me explota el programa cuando lo corro
pior que seria eso ?
El programa revienta porque no reservas memoria para la cadena resultante (1) y eso se manifiesta cuando tratas de escribir en NULL (2):
char *szTemp1 = NULL; /* 1 */

/* ... */

strncpy(szTemp1, szValue, 2); /* 2 */

Indicas que tratas de agregar comas Y puntos pero el fragmento de código sugiere que los puntos ya se agregaron, mejor aclara esa parte.

Si la cadena no contiene la parte decimal (".00" solo es ornato) una forma de agregarlos (sin validaciones y asumiendo la cadena de entrada contiene al menos un dígito) es:
char *addComma(char const *str)
{
   size_t i;
   char *p;
   char *q;
   
   i = strlen(str);
   p = q = malloc(i + (i - 1) / 3 + 4);
   
   while (1){
      *q++ = *str++;
     
      if (--i == 0)
         break;
      else if (i % 3 == 0)
         *q++ = ',';
   }
   strcpy(q, ".00");
   
   return p;
}


Un saludo
#2
Cita de: bastri en 10 Junio 2015, 05:46 AM1- Al poner en el while "... && !isdigit(ch)..." estamos diciendo que el while de verdadero si isdigit retorna 0, no?
Correcto. El bucle se ejecutara mientras el carácter leído no sea EOF (error o fin de archivo) y no sea un dígito.


Cita de: bastri en 10 Junio 2015, 05:46 AM2- Porque se usa el ultimo while con ungetc? busque sobre esta funcion pero las explicaciones no las pude entender.
Porque el bucle puede terminar cuando se lee un digito. Por ejemplo supongamos que el contenido del archivo es:
jhgkhjgjklh123
Todos los caracteres para los cuales isdigit retorna cero (falso) se descartan mediante el mentado bucle, se lee el carácter '1' el cual es un dígito y causa la salida de este. El detalle es que ese carácter se debe procesar con los siguientes para forma el numero 123, eso se logra retornando el carácter '1' al stream mediante la función ungetc.

Cita de: bastri en 10 Junio 2015, 05:46 AM3- fscanf va a retornar algo diferente a 1 si por ej: le especificamos un solo %d y este dato no es un digito?
Si. Cuando se utiliza "%d" con fscanf los posibles valores de retorno son:

A) 1 si se lee con éxito el entero.
B) 0 si falla por un matching failure, por ejemplo la entrada es "JKL".
C) EOF si falla por un input failure, por ejemplo el gato destrozo el HD.

Un saludo
#3
Cita de: JHodges en 10 Junio 2015, 18:30 PMy un apartado del programa es borrar el jugador introduciendo el nombre del equipo y su dorsal.
En ese caso debes debes utilizar un bucle donde iteres hasta encontrar un equipo que coincida con el nombre indicado o bien el contador del bucle sea igual al numero de equipos existente. Ese ultimo valor lo debes tener almacenado en alguna variable con un nombre como "num_equipos", "cant_equipos", etc.

No puedes utilizar (esta mal esta parte del fragmento):
i=0;
while((i<equipos[i].qt_jug) && (strcmp(equipos[i].nombre_e,nombre_aux)!=0)){
   i++;
}

Porque "equipos[ i ].qt_jug" es el numero de jugadores en la plantilla del equipo "i".

A continuación tienes la sentencia condicional:
if (strcmp(equipos[i].nombre_e,nombre_aux) == 0) ...
No es necesario otra llamada a strcmp ya que puedes reutilizar el valor de la variable "i": si esta es menor que el numero de equipos indica una coincidencia (equipo encontrado), si es igual al numero de equipos implica que no no hay uno con el nombre indicado.

A continuación debes buscar, de forma similar, al jugador que coincida con el dorsal indicado algo que no haces.

Un saludo
#4
Otro error se encuentra en los indices para acceder a los arrays (si estos para empezar fueran los correctos) ya que en C y C++ el primer elemento de un array tiene el indice 0 y el ultimo N-1.

Parece ser un ejercicio para practicar con punteros ya que las variables "L" y "A" apuntan a "l" y "a" pero si el objetivo es incrementar estas ultimas (eso sugiere el ultimo bucle) el incremento esta mal ya que, por ejemplo:
Código (cpp) [Seleccionar]
*L++
Debido a la prioridad de los operadores se evaluá así:
Código (cpp) [Seleccionar]
*(L++)
Con ello el resultado de la expresión se descarta y se incrementa la dirección en memoria (el puntero).

Lo mejor por sencillo es rescribir el programa utilizando las clases vector y string.

Un saludo
#5
Programación C/C++ / Re: ctrl+c en lenguaje c
11 Junio 2015, 03:10 AM
Cita de: sesiopower en 10 Junio 2015, 18:42 PM
estoy haciendo un ejercicio en lenguaje c con dev-c++ que tiene q ejecutarse infinitamente (lo hago con while(1) ) y para finalizarla pulso ctrl+c, pero quiero q cunado se pulse ctrl+c que haga por ejemplo un free(memoria) antes de cerrar la aplicacion, ¿es posible?.
Si. Descripción y ejemplo (en ingles) en MSDN: Console Control Handlers.

Un saludo
#6
Cita de: bastri en  9 Junio 2015, 08:06 AMEl motivo de mi post radica en que si yo al archivo le pongo algun caracter se genera un bucle que muestra infinitas veces el ultimo numero. Y por ende yo quisiera que no lea los caracteres del archivo que no sean numeros para que esto no suceda.

Como puedo solucionarlo y porque pasa esto? Gracias de antemano
Lo mejor por sencillo es seguir la recomendación de ivancea96.

Si aun así quieres leer los números en el archivo puedes utilizar:
* fscanf para leerlos.
* fgetc para leer y descartar los caracteres que no sean dígitos (isdigit).
* ungetc para retornar el ultimo carácter leído al stream.

De esta forma:
void leerarchivo(char *path)
{
   FILE *in;
   int rv;
   int num;

   if ((in = fopen(path, "r")) != NULL){
      while((rv = fscanf(in, "%d", &num)) != EOF){
         if (rv == 1)
            printf("Numero: %d\n", num);
         else {
            int ch;

            while ((ch = fgetc(in)) != EOF && !isdigit(ch))
               ;
            ungetc(ch, in);
         }
      }

      fclose(in);
   }
}


Un saludo
#7
Programación C/C++ / Re: Duda sobre do while
9 Junio 2015, 04:04 AM
Cita de: lucians en  6 Junio 2015, 18:22 PM
Muchísimas gracias, teníais razón, había que limpiar el bufe. Le he puesto
fflush(stdin) antes de los printf y va perfecto.
fflush(stdin) no se recomienda, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Tu problema se genera porque "%c" no descarta el espacio blanco antes de consumir los caracteres validos para la conversión indicada. Por ejemplo si al pedir el tipo de conversión introduces:
E{ENTER}
La primera llamada a scanf consume el carácter 'E', el carácter '\n' generado al presionar {ENTER} se queda en el bufer de la entrada estándar y es consumido por la segunda llamada a scanf.

Para evitarlo basta con utilizar " %c" en las dos llamadas a scanf.

Un saludo
#8
Cita de: minion123456789 en  5 Junio 2015, 15:44 PMtengo una matriz de 6x6, que el numero 1 lo ingreso en matriz[0][0]='1', y luego quiero ingresarlo en una nueva fila y columna(lo voy a cambiar una cierta cantidad de veces) y quiero que se borre el 1 anterior y se guarde en la nueva fila y columna de la misma matriz.
Para mover la pieza del jugador basta con sobrescribir la casilla actual con el indicador correcto (no lo indicas, bien puede ser un espacio) y escribir el carácter '1' en la nueva posición.

Lo mejor por sencillo es almacenar la posición actual y nueva del jugador en variables, con ello el fragmento termina, mas o menos, así:
if (matriz[fila][columna]=='2' || matriz[fila][columna]=='*'){
   printf("Jugador 1 se matiene en posicion\n");
} else { //para mover el 1 de posicion
   /*
   ** 1) Se libera la posicion actual
   ** j1_fila == Jugador 1 posicion actual, fila
   ** j1_col  == Jugador 1 posicion actual, columna
   */
   matriz[j1_fila][j1_col] = ' ';
   
   /* 2) Se coloca al jugador 1 en su nueva posicion */
   matriz[fila][columna] = '1';
   
   /* 3) Se toma nota de la nueva posicion */
   j1_fila = fila;
   j1_col  = columna;
}


Si no es posible por alguna razón (por ejemplo por los requisitos del enunciado) entonces hay que utilizar un par de bucles anidados para buscar el carácter que indique al jugador uno, sobrescribirlo con un espacio y colocar en la nueva posición un '1'.

Un saludo
#9
Cita de: Ream22Alvarado en  5 Junio 2015, 07:57 AMEstoy trabajando en DEVC++, espero me puedas decir por qué no corrió el programa con el clrscr();
Porque esa función es parte de la biblioteca conio de Borland y antes de utilizarla se debe incluir el encabezado necesario (usualmente <conio.h>). De todos modos no se recomienda su uso, la explicación a ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
#10
Cita de: pacosn1111 en  3 Junio 2015, 10:00 AMtengo mucha curiosidad por resolver el problema.
Al parecer tratas de implementar el algoritmo de ordenacion por selección o InsertSort pero me temo que hay bastantes errores, algunos de estos son:

* No descartas el menor en cada iteración.
* Ignoras los repetidos al ordenar cuando, en el mejor escenario, deberías eliminar los repetidos después del elemento (lo mas sencillo es simplemente ordenar la lista y solo entonces ignorar repetidos).
* En todos los bucles menos el primero tienes una iteración de mas, por ejemplo:
for (int x = 0; len + 1 > x; x++) ...
Hay que eliminar el "+ 1" de todos esos bucles. Bueno, en realidad hay que cambiar de forma significativa los bucles acorde a la forma correcta del algoritmo.
* En las dos ultimas funciones tratas de calcular el numero de elementos en el array mediante sizeof, esto no es posible ya que toda función declarada en la forma:
void ordenar_array(int num_array[], int num_result[]);
Se procesa como si la declaracion fuera:
void ordenar_array(int *num_array, int *num_result);
En su lugar modifica las funciones para que acepten un argumento adicional, por supuesto este es el numero de elementos del array.

Una explicación a detalle pero en ingles del algoritmo es The Selection Sort, una mas cortesía de Wikipedia: Selection sort

Un saludo