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

#1331
No "sale bien" porque no indicas la anchura del campo "producto" (debes utilizar "%Ns") y si indicas en los demás campos que la anchura es cero (por ejemplo con "%0.0f") es igual a no indicarla.

Un saludo
#1332
Para ello puedes utilizar la función printf.

Si no tienes material de referencia de calidad es hora de conseguirlo, una referencia en linea (pero en ingles) sobre salida con formato es Formatted Output.

Por ejemplo con los números enteros puedes utilizar "%Nd" que imprime, en un campo de N caracteres el valor de tipo signed int.

Con los números de punto flotante (float y double) puedes utilizar "%N.Mf" donde N es la anchura del campo y M el numero de decimales a mostrar.

Hay mas opciones, es cuestión de leer y practicar.

Un saludo
#1333
Lo ideal cuando se inicia con el lenguaje C es aprenderlo según su estándar. Ello tiene la ventaja de que todo lo aprendido esta garantizado (si no es así ya no estamos hablando de C) y no importa el compilador y SO utilizado.

Una vez lo domines ya pasas a temas particulares como Win32 API, POSIX, etc.

Para ello solo tienes que buscar un libro que este enfocado en el tema, usualmente se indica con titulos relacionados con "C estandar", "ANSI C", etc.

Puedes empezar utilizando el motor de búsqueda de los foros.

Un saludo
#1334
Si te refieres a la notación científica una explicación de esta la puedes encontrar en, por ejemplo, Wikipedia.

Un saludo
#1335
El error se debe a que al copiar el nombre en el array "name" no agregas el indicador de fin de cadena (el '\0'), justo después del bucle interno. Con el cambio:
for (k = 0, j = 0; j < 5; j++) {
   if (vec[i][j] != '\0') {
      name[k++] = vec[i][j];
      printf ("%c", vec[i][j]);
   }
}
name[k] = '\0';

/* ... */


Sin embargo ese bucle no es necesario ya que puedes hacer la comparación directamente, con un solo bucle:
for (i = 0; i < 5; i++)
   if (strcmp(nino, vec[i]) == 0)
      printf ("El nombre %s si se encuentra en la lista\n", nino);


Un saludo
#1336
Programación C/C++ / Re: Secuencias en C++
24 Enero 2012, 01:28 AM
Cita de: eleon en 23 Enero 2012, 18:44 PMEl único contra que he encontrado es que si introduces un texto con espacios, no guarda lo que haya después de un espacio.

Mi duda es: ¿es correcto el uso de esta forma del "string"?
Es correcto. En cuanto a leer una linea de texto puedes utilizar la función "getline", si necesitas ejemplos de su uso utiliza el buscador de los foros.

Cita de: eleon en 23 Enero 2012, 21:46 PMA ver si me podéis responder otra duda: en las tablas y strings ¿siempre hay que dejar un último elemento para la marca final (\0)?
Solo si se trata de un array de caracteres (por ejemplo "char linea[100]") y en el se piensa almacenar una cadena (el '\0' indica el final de ella).

Cita de: eleon en 23 Enero 2012, 21:46 PMquiero decir, si queremos crear una tabla o un string de 30 elementos, hacemos "string cadena[30]", donde podemos usar los espacios del 0 al 29 (30 elementos) pero nunca el último (posición 30), ¿es asi?.
Me parece una confusión:

* Con los arrays de caracteres no hay opción mas que reservar un elemento para el cero porque es obligatorio (si no hay '\0' no hay cadena).

* Cuando se declara un array se indica el numero de elementos, por ejemplo:
Código (cpp) [Seleccionar]
string linea[100];
Esa declaración indica que el array consta de 100 elementos a los cuales se accede mediante los indices 0 .. 99. El elemento "linea[100]" no existe ya que seria el indice del elemento 101 y no hay tal en el array.

Un saludo
#1337
El primer error en el programa es declarar el array "nino" de esta forma:
char nino[]="";
Ya que ello es equivalente a:
char nino[] = {'\0'};
Donde se declara un array que puede almacenar un único carácter. En su lugar debes declarar el array indicando su numero de elementos y sin inicializar (ya que lo primero que haces con la variable es asignarle un valor mediante la función "gets" que, para empezar deberías evitar).

Y si no se trata de una sopa de letras solo tienes que utilizar un bucle para procesar todas las cadenas del array, por cada una utilizas la función "strcmp" (prototipo en <string.h>) para verificar si coincide con la buscada o no.

Un saludo
#1338
Un problema es la creación de funciones cuando la biblioteca estándar de C ya provee las necesarias para el calculo de la longitud de una cadena (es "strlen") y para la búsqueda de una subcadena (es "strstr"), el prototipo de ambas se encuentra en el encabezado <string.h>.

En base a ellas (mas aritmética de punteros) se puede realizar el mismo proceso. Un programa de ejemplo reducido a lo (mas) básico es:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char cad[] =
   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
   "Solo es flufINICIOFINsolo es fluf\n"
   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
   "Solo es flufINICIOFINsolo es fluf\n"
   "Solo es flufINICIOEste es el texto de pruebaFINsolo es fluf\n"
;
char *inicio = "INICIO";
char *fin = "FIN";

int main(void)
{
   size_t len_inicio;
   size_t len_fin;
   char *p;
   char *q;
   
   len_inicio = strlen(inicio);
   len_fin = strlen(fin);
   p = cad;
   
   while ((p = strstr(p, inicio)) != NULL){
      p += len_inicio;
     
      if ((q = strstr(p, fin)) != NULL){
         if (q > p)
            printf("%.*s\n", q - p, p);
         
         p = q + len_fin;
      }
   }
   
   return EXIT_SUCCESS;
}


Las variables "globales" solo están ahí por una cuestión subjetiva: dejar en la función principal solo lo indispensable.

Un saludo
#1339
Programación C/C++ / Re: Problema con strcat
23 Enero 2012, 14:22 PM
No. En sus siguientes mensajes DickGumshoe aclara que todas las variables son de tipo "array de caracteres", el problema era una combinación de capacidad insuficiente (en los arrays) mas el uso de la función "gets".

Un saludo
#1340
Cita de: Metal-byte en 22 Enero 2012, 15:11 PMMi consulta es como quitarle o agregarle filas a esa matriz en tiempo de ejecución. Tengo entendido que puedo hacerlo mediante la función realloc, pero no entiendo como funcionaría en este caso (La he probado solo en arrays dinámicos, pero nunca en matrices :/)
Si se reserva la memoria en la forma usual solo tienes que seguir la explicación de Akai teniendo cuidado de, si el numero de filas se reduce, primero liberar esas filas.

Si como indicas el numero de columnas por fila es fijo puedes utilizar un puntero a array y reservar todo el bloque mediante malloc/realloc sin tener que preocuparte por reservas individuales.

Un programa de ejemplo en C sobre esto ultimo (sin validación de errores para acortar):
#include <stdio.h>
#include <stdlib.h>

#define NUM_FILAS  6
#define NUM_COLS   3

int main(void)
{
   int (*p)[NUM_COLS];
   int num_filas = NUM_FILAS;
   int i;
   int j;
   
   /* Reserva y asignacion */
   p = malloc(num_filas * sizeof *p);
   for (i = 0; i < num_filas; i++)
      for (j = 0; j < NUM_COLS; j++)
         p[i][j] = 10 * i + j;
   
   /* Impresion */
   for (i = 0; i < num_filas; i++){
      for (j = 0; j < NUM_COLS; j++)
         printf("%3d", p[i][j]);
     
      putchar('\n');
   }
   
   puts("---------");
   
   /* Reajuste (Capacidad a la mitad) */
   num_filas /= 2;
   p = realloc(p, num_filas * sizeof *p);
   
   /* Impresion */
   for (i = 0; i < num_filas; i++){
      for (j = 0; j < NUM_COLS; j++)
         printf("%3d", p[i][j]);
     
      putchar('\n');
   }
   
   free(p);
   
   return EXIT_SUCCESS;
}


Un detalle: si la función realloc falla esta retorna NULL y el puntero pasado como primer argumento continua siendo valido. Hay que considerar eso cuando se agrega validación de errores.

Un saludo