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

#21
Con solo C estándar no es posible. En el caso de Linux puedes utilizar una biblioteca como ncurses, un tutorial sobre esta es NCURSES Programming HOWTO y ejemplos sobre el tema que comentas se encuentran en el capitulo 6: Output functions.

Un saludo
#22
Cita de: DanielC# en 17 Mayo 2015, 19:07 PMSólo a titulo aclaratorio, no olvides que el archivo va a tener por ej. 50 frases distintas, tengo que implementar alguna manera para saber dónde comienza y termina una determinada frase.
Puedes colocar primero una linea cuyo único contenido sea el numero de lineas que componen la frase la cual viene a continuación, siguiendo tu ejemplo la información en el archivo se modificaría a:
4
Cada vez que emites
un juicio o una crítica,
Estás enviando algo que
terminará por volver a ti.
3
Abraza las cosas y personas malas como si fueran tu más preciada joya,
son tus más grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.
...


La lectura del archivo seria, mas o menos, así:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ARCHIVO  "Input.txt"
#define MAX_CHARS  4096

int main(void)
{
   FILE *in;
   char linea[MAX_CHARS];
   unsigned num_lineas;
   unsigned i;
   int frase;
   
   if ((in = fopen(NOM_ARCHIVO, "r")) == NULL){
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }
   
   frase = 1;
   while (fgets(linea, MAX_CHARS, in) != NULL && sscanf(linea, "%u", &num_lineas) == 1){
      printf("Frase %d:\n", frase);
     
      for (i = 0; i < num_lineas && fgets(linea, MAX_CHARS, in) != NULL; i++)
         printf("%s", linea);
     
      frase++;
   }
   fclose(in);
   
   return EXIT_SUCCESS;
}


Un saludo
#23
Cita de: Peregring-lk en 17 Mayo 2015, 01:47 AMEl otro "truco" (la `%c` final) sirve para evitar que el usuario introduzca cadenas más largas de la cuenta; por ejemplo: "24 11 19900asd".
El especificador "%c" al igual que "%[]" no descartan el espacio blanco inicial, por ello una linea que consista de los tres numeros (validos) para la fecha seguida del avance de linea (lo usual) resultara en la función scanf retornando cuatro.

La aproximación mas sencilla (en este caso) es utilizar scanf para leer y validar los tres números, a continuación se utiliza un bucle con getchar para verificar que el resto solo sea espacio/tabulador/etc. seguidos del carácter '\n'.

O bien se puede utilizar solo scanf pero queda (en mi opinión) muy feo:
int leidos =
   scanf("%2u%2u%4u", &fecha.tm_mday, &fecha.tm_mon, &fecha.tm_year) == 3
   && (scanf("%*[ \t]"), scanf("%1[\n]", &truco) == 1)
;


Un saludo
#24
Cita de: dato000 en 13 Mayo 2015, 03:37 AMno se porque siempre me imprime la primera posición del arreglo de estructuras de las personas
Porque:

* La función strcmp retorna un valor diferente de cero si las cadenas son distintas, solo retornara cero si son iguales.

+

* El bucle donde se realiza la búsqueda solo se ejecutara una vez ya que en ambas ramas de la sentencia condicional if terminas el bucle con la sentencia "break":
for (i = 0; i < 10; i++) {
   if (strcmp (nombreBusqueda, arregloPersonas[i].nombre)) {
      /* ... */
     
      break; /* Terminar el bucle si se cumple la condicion del if ... */
   }else {
      /* ... */
     
      break; /* ... y si no se cumple ... tambien */
   }
   
   //posicionBusqueda++;
}


+

* En la primera iteración del bucle se compara la palabra introducida por el usuario y leída con:
printf ("Escriba el nombre de la persona que busca:  "), /* mejor ';' */
scanf ("%s", nombreBusqueda);

Con el campo "nombre" del primer elemento del array el cual consiste de dos palabras:
PERSONA arregloPersonas[10] = {  { "manu chao", 50}, /* ... */
En buen cristiano no hay forma de que la palabra introducida por el usuario sea igual a esas dos palabras.

Para solucionarlo debes leer la entrada del usuario con fgets (asegurate de eliminar el resto de la linea anterior) y utilizar un bucle sin cuerpo mas o menos así:
for (i = 0; i < 10 && strcmp(nombreBusqueda, arregloPersonas[i].nombre); i++)
   ;
if (i != 10 /* Hay que evitar magic numbers, mejor una macro*/)
   puts("Nombre encontrado!");
else
   puts("El nombre no se encuentra en la base de datos");


Un saludo
#25
Cita de: DanielC# en 11 Mayo 2015, 19:33 PMEstoy aprendiendo a modular código en c y en el código que les dejo a continuación me da el siguiente error. Error: nombre de tipo desconocido 'Fecha', en las líneas 3:14 y 3:28.-
El error se genera porque el uso (1) del tipo "Fecha" aparece antes que su declaración (2):
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include "fechaDifDias.c" /* (1) Uso del tipo Fecha */

#define MENSAJE printf( "\n\n Pulse [Enter] para continuar..." ); getchar();

typedef struct{
int orden;
char b;
char fecha[11];
float verduras;
float almacen;
char nota[101];
}Super;

typedef struct{
int dia;
int mes;
int año;
}Fecha;  /* (2) Declaracion del tipo Fecha */

Para solucionarlo basta con cambiar el orden: primero la declaración y después su uso.

Con todo no se recomienda incluir mediante directiva del preprocesador una unidad (extensión ".c") ya que pueden generarse otros errores como la definición múltiple de una función. Hay algunos temas sobre programación modular en la base de datos de los foros, los puedes consultar mediante el motor de búsqueda.

Un saludo
#26
Cita de: jospar en  7 Mayo 2015, 11:05 AMuna cadena de caracteres almacenada en una tabla de caracteres me esta dando problemas.
En el primer fragmento el error se encuentra en el bucle donde obtienes la procedencia del paquete:
char tipo[TIPO];

/* ... */

for (i = 0, c = 0; i <= TIPO; c++,i++)
   tipo[c] = cad[i];

Ello porque el array "tipo" consiste de "TIPO" elementos y a ellos accedes mediante los indices 0 .. TIPO-1, si deseas almacenar ahí una cadena debes reservar el ultimo carácter para el '\0' con lo que los indices validos se reducen a 0 .. TIPO-2 pero en el bucle se copian los caracteres con indices 0 .. TIPO (un carácter de mas y no se agrega el '\0').

Para solucionarlo hay varias opciones, una es cambiar el bucle a:
for (i = 0; i < TIPO - 1; i++)
   tipo[i] = cad[i];
tipo[i] = '\0';

Otra es sustituir el bucle por una llamada a sprintf:
sprintf(tipo, "%.*s", TIPO - 1, cad);

Un saludo
#27
Programación C/C++ / Re: ayuda repeticion
9 Mayo 2015, 18:28 PM
Porque estas utilizando el operador OR cuando deberías utilizar AND. Cambia el bucle a:
do {
   printf("introduce ficha jug 1  x o o: ");
   fflush(stdout);
   scanf(" %c", &jug1);
}while (jug1 != fichaX && jug1 != fichaC);


Un saludo
#28
Cita de: Leonas en  8 Mayo 2015, 08:21 AMmi pregunta o duda es cómo hacer que la pantalla o la consola se muestre en pantalla completa?, habrá alguna función que lo implemente?
En el caso de MS Windows puedes utilizar la función SetConsoleDisplayMode.

Un saludo
#29
Programación C/C++ / Re: ayuda repeticion
9 Mayo 2015, 17:46 PM
El problema se debe a que el especificador "%c" se traga (procesa) el primer carácter que se encuentre en la entrada estándar sin importar cual sea este. Si tu tecleas:
x{ENTER}
Ahí tienes dos caracteres ('x' y '\n') los cuales generan el comportamiento que mencionas.

Para solucionarlo, esto es, descartar el espacio blanco inicial de forma similar a los otros especificadores como "%d", "%s", etc. basta con utilizar " %c" (un espacio antes de caracter '%').

Un saludo
#30
Cita de: santos96 en  8 Mayo 2015, 00:44 AMAhora el unico problema que tengo es el siguiente, por ejemplo:

int dia, mes, año, hora, minuto;
char fecha [10]  = "04/05/2015:11:15";

Como hago para guardar el día, mes, año, hora y minutos en las variables tipo int declaradas?
La funcion atoi no me valdria porque al llegar a la ' / ' daria error.
En tu ejemplo no debes indicar el numero de elementos del array "fecha" ya que la literal "04/05/2015:11:15" tiene un tamaño mayor.

Para extraer los valores de la cadena puedes utilizar sscanf, un ejemplo basado en el tuyo es:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
   char fecha []  = "04/05/2015:11:15";
   struct tm d;
   int rv;
   
   rv = sscanf(fecha, "%d/%d/%d:%d:%d",
      &d.tm_mday, &d.tm_mon, &d.tm_year, &d.tm_min, &d.tm_sec);
   
   if (rv == 5)
      printf("%04d/%02d/%02d\n", d.tm_year, d.tm_mon, d.tm_mday);
   
   return EXIT_SUCCESS;
}


Un saludo