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

#1561
Programación C/C++ / Re: Nuevo y primera duda
2 Agosto 2011, 19:27 PM
Dev-C++ tiene años sin actualizarse, mejor utiliza otro como los basados en GCC o la version gratuita de Microsoft. Para mas informacion revisa los temas fijos de los foros.

Un saludo
#1562
Programación C/C++ / Re: [C] Como saber
2 Agosto 2011, 18:47 PM
Cita de: ANTRUCK en  1 Agosto 2011, 21:40 PM
Tengo una pequeña duda, como saber que códigos en C va en tales librerías ?
Como ya te explicaron eso lo encuentras en cualquier material de referencia de calidad. Un pagina con la referencia en linea de C99 y C++ que me parece no se ha mencionado en estos foros, muy buena pero en ingles es:

Standard C Library

Un saludo
#1563
En respuesta a peterfly: necesitas un buen libro o curso sobre C++ y seguirlo a detalle ya que con "palos de ciego" ni aprendes bien ni aprendes rápido. Revisa los temas fijos de este foro, ahí hay información para entretenerse por meses.

En cuanto al programa honestamente no lo veo sentido pero se puede hacer asi:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;

#include <limits>
using std::numeric_limits;

int main ()
{
   string pregunta;
   char continuar;
   
   do {
      cout << "Escribe la pregunta:  ";
      getline(cin, pregunta);
     
      if (pregunta == "que edad tengo?")
         cout << "Pregunta correcta!" << endl;
      else
         cout << "Pregunta incorrecta!" << endl;
         
      cout << "Desea continuar (s o n)?" << endl;
      std::cin >> continuar;
      cin.ignore(numeric_limits<int>::max(), '\n');
   } while (continuar == 's' || continuar == 'S');
   
   return 0;
}



----


Un comentario sobre el programa de Dark Invader , el uso de la función:
Código (cpp) [Seleccionar]
setbuf(stdin,NULL);
Para así vaciar el bufer de la entrada estándar no es correcto ya que esa función termina en una llamada a "setvbuf". El problema aquí es que esta ultima solo puede llamarse antes de cualquier uso del stream (salvo su apertura con fopen).

Un saludo
#1564
Cita de: Triper0 en 27 Julio 2011, 04:09 AM
Ese "N se refiere a número de elementos" cómo sería?... Por ejemplo, si yo tengo un puntero de tipo int, sería N=1
Y si tengo un char *nombre[10] sería N=10... ¿Así?
No.

El numero de elementos que piensas utilizar. Por ejemplo si necesitas espacio para una cantidad N de enteros (determinado en tiempo de ejecución) utilizas (sin validación para que sea mas sencillo):
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int *p;
   int num_elem;
   int i;
   
   printf("Indica el numero de elementos: ");
   fflush(stdout);
   scanf("%d", &num_elem);
   
   /* Reserva de memoria */
   p = malloc(num_elem * sizeof *p);
   
   /* Lectura de datos */
   for (i = 0; i < num_elem; i++){
      printf("p[%d] == ", i);
      fflush(stdout);
      scanf("%d", p + i); /* Equivalente a "&p[i]" */
   }
   
   /* Algun proceso de datos ... */
   
   /* Liberacion de memoria y salida del programa */
   free(p);
   return EXIT_SUCCESS;
}


Un saludo
#1565
En C la conversión explicita no es necesaria y no se recomienda, en este lenguaje el idioma (convención informal) para reservar memoria es:
p = malloc(N * sizeof *p);
Donde N es el numero de elementos.

En tus programas (me refiero a Triper0) sigues con el mismo error que ya te mencionaron: reservas memoria para "sizeof(algun_puntero)" cuando el tamaño debería indicar el tamaño del objeto apuntado. Por ejemplo:
#include <stdio.h>
#include <stdlib.h>

#define LONG_MAX_LINEA  1024

int main(void)
{
   char *p;
   
   if ((p = malloc(LONG_MAX_LINEA)) == NULL)
      return EXIT_FAILURE;
   
   puts("Introduce una linea de texto:");
   if (fgets(p, LONG_MAX_LINEA, stdin) == NULL)
      return EXIT_FAILURE;
   
   printf("Linea: %s", p);
   free(p);
   
   return EXIT_SUCCESS;
}

En este caso no se requiere de "sizeof *p" ya que es igual a "sizeof(char)" y este siempre es igual a uno.

En cuanto al ultimo programa (para practicar con uniones) tiene varios errores, el principal que se utiliza la unión como si fuera una estructura. Aquí lo mejor es conseguir (y seguir) un buen libro. Recomendaciones sobre ellos en uno de los temas fijos.

Un saludo
#1566
En C++ estándar cuando no se indica el valor de retorno de la función "main" este es igual a cero. Sin embargo (por "buenas costumbres") se recomienda indicarlo explícitamente.

Un saludo
#1567
Programación C/C++ / Re: getchar() != EOF
20 Julio 2011, 21:48 PM
En mi opinion uno de los mejores libros para aprender C (ademas de K&R2) es el siguiente, por desgracia solo disponible (hasta donde tengo entendido) en ingles:
----
Pointers on C, 1st edition
Kenneth Reek
Addison Wesley, July 25, 1997
ISBN: 0673999866
----

Un saludo
#1568
Programación C/C++ / Re: getchar() != EOF
19 Julio 2011, 18:21 PM
Cita de: Treppe en 19 Julio 2011, 13:42 PMEs sobre la salida y entrada de caráctares, no entiendo muy bien el concepto... en qué consiste?, en donde se efectua?, para que sirve?.
Si apenas empiezas con el lenguaje C te conviene tener a la mano un buen libro o curso sobre este, revisa los mensajes fijos en este foro, hay uno sobre el tema.

Cuando un programa se ejecuta se tienen disponibles tres streams (o flujos) de caracteres: la entrada estándar (stdin), la salida estándar (stdout) y la salida estándar para errores (stderr). Ellos te permiten acceder a la entrada y salida del programa en forma de una secuencia de caracteres (un stream en modo texto con algunas limitaciones).

El origen de esos streams depende del entorno. Por ejemplo el programa se puede ejecutar desde un script y su entrada puede ser un archivo de texto o tal vez la salida de otro programa.

De nuevo: para esto nada mejor que un buen libro.

Un saludo
#1569
Cita de: P.AGCD en 18 Julio 2011, 18:21 PMTengo un problema, mi codigo no lee correctamente el fichero y no se arreglarlo.
Va a ser difícil ayudarte con tu problema ya que no presentas el código fuente completo de esa función.

Hay algunos nombres que deberían ser mas largos, por ejemplo tienes "MAX", si bien es un máximo no hay forma de saber de que, seria mejor algo como "MAX_LONG_ALGO".

Otros nombres deberían ser mas cortos, por ejemplo en el tipo "Equipo" no es necesario indicar que el campo es "NombreEquipo" ya que eso se saca del contexto, bastaría con solo "nombre".

En cuanto al bucle principal en este no es necesario colocar la condición de escape dentro del bucle interno, eso lo das por sentado al finalizar el bucle.

Esto:
caracter = fgetc (archivoPartida);
while (caracter != '-') {
   ListaPartidas->InformacionPartida[i].Equipo1[k] = caracter;
   caracter = fgetc (archivoPartida);
   k++;
   if (caracter == '-')
      ListaPartidas->InformacionPartida[i].Equipo1[k] = '\0';
     
}

while (caracter != ':') {
   ListaPartidas->InformacionPartida[i].Equipo2[j] = caracter;
   caracter = fgetc (archivoPartida);
   j++;
   
   if (caracter == ':')
      ListaPartidas->InformacionPartida[i].Equipo2[j] = '\0';
}


Lo puedes reducir a:
while ((caracter = fgetc(archivoPartida)) != '-')
   ListaPartidas->InformacionPartida[i].Equipo1[k++] = caracter;
ListaPartidas->InformacionPartida[i].Equipo1[k] = '\0';

while ((caracter = fgetc (archivoPartida)) != ':') {
   ListaPartidas->InformacionPartida[i].Equipo2[j++] = caracter;
ListaPartidas->InformacionPartida[i].Equipo2[j] = '\0';

Se ve muy feo pero eso es a causa de los nombres excesivamente largos, del contexto se deduce que "ListaEquipos" y "ListaPartidas" son listas así que se pueden reducir a solo "equipos" y "partidas" sin afectar la claridad del código fuente.

Por cierto la variable "caracter" (mejor dejarlo como "car" o "ch") debe ser del tipo "int" ya que ese es el tipo de retorno de la función "fgetc".

Algo que también falta es descartar el resto de la linea (al menos el '\n') después de la llamada a fscanf, eso se consigue con:
{
   int ch;
   
   while ((ch = fgetc(archivoPartida)) != EOF && ch != '\n')
      ;
}


Una forma de leer las lineas almacenadas en un archivo y con el formato que indicas es:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LONG_MAX_LINEA  256
#define NOM_ARCHIVO  "Entrada.txt"

struct partido {
   char local[LONG_MAX_LINEA];
   char visitante[LONG_MAX_LINEA];
   int goles_loc;
   int goles_vis;
};

struct partido extraer(char const linea[]);

int main(void)
{
   FILE *entrada;
   char linea[LONG_MAX_LINEA];
   struct partido p;

   if ((entrada = fopen(NOM_ARCHIVO, "r")) == NULL){
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }

   while (fgets(linea, LONG_MAX_LINEA, entrada) != NULL){
      p = extraer(linea);

      printf("Local: %s\n", p.local);
      printf("Visitante: %s\n", p.visitante);
      printf("Resultado: %d - %d\n", p.goles_loc, p.goles_vis);
   }

   fclose(entrada);

   return EXIT_SUCCESS;
}

struct partido extraer(char const linea[])
{
   struct partido p;
   char *a;
   char *b;

   /* Obtenemos la posicion del caracter '-' */
   a = strchr(linea, '-');
   sprintf(p.local, "%.*s", a - linea, linea);

   /* Obtenemos la posicion del caracter ':' */
   a++;
   b = strchr(a, ':');
   sprintf(p.visitante, "%.*s", b - a,  a);

   /* Los goles los extraemos con sscanf */
   sscanf(++b, "%d %d", &p.goles_loc, &p.goles_vis);

   return p;
}


Un saludo
#1570
Programación C/C++ / Re: getchar() != EOF
18 Julio 2011, 16:27 PM
Cita de: Treppe en 18 Julio 2011, 13:41 PMBueno comprobando lo que me dijeron llegué a hacer el siguiente programa:

#include <stdio.h>

main()
{
      int c;
      while ((c = getchar())!= EOF)
            printf("%d\t\n", ((c = getchar()) != EOF));
            putchar(c);
}
Si vas a aprender C te conviene hacerlo bien, la definición de la función main debe ser "int main(void) ..." o bien "int main() ..." y se debe indicar su valor de retorno con al menos "return 0;".

Un problema importante en tu programa es que lees dos caracteres dentro del bucle: uno en la condición y otro en la llamada a printf. Y lo que se ejecuta en el bucle solo es la primera sentencia ya que faltan las llaves.


Como verificar que la expresión "(c = getchar()) != EOF" resulte en 1 o 0 esta implícito en tu programa: 1) El bucle se ejecuta solo mientras su condición resulte en un valor distinto de cero y 2) El resultado del operador de desigualdad  "!=" resulta en 1 si los operandos son distintos y 0 en caso contrario (si son iguales).


La macro EOF resulta en un valor de tipo int, puedes imprimirla como cualquier variable de ese tipo.

El programa con esas correcciones es:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int c;
   
   while ((c = getchar()) != EOF)
      putchar(c);
   
   printf("EOF == %d\n", EOF);
   
   return EXIT_SUCCESS;
}


Un saludo