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

#781
Los pasos en lo general son:

1) Declaras un array de estructuras para almacenar ahí cada uno de los registros.
2) Lees cada registro, lo políticamente correcto es utilizar fgets para leer una linea de texto y a continuación sscanf para extraer los tres campos pero, por sencillez, puedes empezar con fscanf.
3) Una vez tienes todos los registros en memoria los ordenas manualmente mediante una función propia o utilizando la función qsort (prototipo en <stdlib.h>). Sin importar el caso te conviene crear una función que compare dos registros y te diga su relación (si el primero es menor, igual o mayor que el segundo).

Empieza a desarrollarlo tu solo y te ayudamos en las partes donde tengas dificultades.

Un saludo
#782
Cita de: OmarHack en  7 Junio 2013, 22:51 PM
Fallo.cpp `string' does not name a type
¿Cual es el problema? ¿Tengo que instalar la librería? ¿No la traen ya codeblocks o devcpp?
El include está echo y lo he probado tanto con #include <string.h> como con <string> como con <cstring> y nada.
Debes incluir el encabezado <string> y referirte a la clase como "std::string" ya que se encuentra en el espacio de nombres estándar.

Para utilizar solo "string" debes primero utilizar la sentencia "using std::string;" o bien "using namespace::std;".

Un saludo
#783
Cuando se procesa el contenido de un archivo no se recomienda el uso de las funciones feof (en el caso de C) y eof (C++) ya que estas retornan verdadero solo después del fallo en una operación de lectura.

En su lugar lo usual es utilizar el valor de retorno de la función, por ejemplo el bucle en el programa de Puntoinfinito se puede reducir a:
Código (cpp) [Seleccionar]
while (archivo.getline(linea, sizeof(linea)))
   cout << linea << endl;


Un saludo
#784
Programación C/C++ / Re: Programa en C++
7 Junio 2013, 02:43 AM
Debes aclarar que lenguaje de programación estas utilizando ya que el titulo del tema es "Programa en C++" pero terminas tu mensaje con el texto "apenas voy empezando sobre el lenguaje C"

Para comparar cadenas en C puedes utilizar la función strcmp (prototipo en <string.h>), ella retorna el valor cero si las cadenas son iguales. Hay que recordar que en C y C++ las minúsculas son distintas de las mayúsculas.

Un ejemplo sencillo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
   char nombre[123]; /* O algun otro valor apropiado */
   
   printf("Introduce tu nombre: ");
   fflush(stdout);
   scanf("%s", nombre); /* Nombre simple (una sola palabra) */
   
   if (strcmp(nombre, "NetFire97") == 0)
      puts("Hola de nuevo!");
   else
      printf("Hola %s!\n", nombre);
   
   return EXIT_SUCCESS;
}


En C++ basta con utilizar la clase string y los operadores "==" y "!=".

Un saludo
#785
Algunos comentarios:

scanf(" \n%d",&dim);
En la cadena de formato " \n%d" no es necesario utilizar " \n" ya que la función lo primero que hace es descartar el espacio blanco (tabulador, avance de linea, etc). Solo es necesario cuando se utilizan los especificadores "%c" y "%[]" ya que con ellos el descarte no sucede.

scanf (" \n%d",&dim);

/* ... */

char matriz[dim][dim];

Si van a utilizar un array declarado en esa forma hay que asegurarse de que el compilador soporte el estándar C99 y se compile en ese modo (a veces sucede).

char matriz[dim][dim];

/* ... */

for (i = 1; i <= dim; i++){
   for (j = 1; j <= dim; j++){
      matriz[i][j] = '.';
      printf("%c ", matriz[i][j]);
   }
   
   printf("\n");
}

En C y C los indices de los arrays inician en 0 y terminan en N-1 donde N es el numero de elementos. Hay que cambiar el par de bucles a:
char matriz[dim][dim];

/* ... */

for (i = 0; i < dim; i++){
   for (j = 0; j < dim; j++){
      matriz[i][j] = '.';
      fputs(". ", stdout); /* Imprime ". " en la salida estandar */
   }
   
   printf("\n");
}


Un saludo
#786
Programación C/C++ / Re: Duda básica en C++
6 Junio 2013, 15:06 PM
Cita de: dorkam en  6 Junio 2013, 03:28 AM
Como digo, recien estoy empezando con esto de la programacion y este es un ejercicio judge.org en el que enviando el archivo .cpp te dice si el programa esta bien o no...

el ejercicio dice que el input seria:

30 10 2008
17 04 2012
15 08 1885
...

y segun el numero de fechas introducido debe poner de cada una si es correcta o no.
Debes leer linea por linea la entrada estándar. Aquí lo mas sencillo es utilizar la clase string y la función getline, un ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;
using std::getline;

int main()
{
   string linea;
   
   while (getline(cin, linea)){
      // Algun proceso ...
      cout << linea << endl;
   }
   
   return 0;
}


Cada linea debes procesarla, primero extraes de esta tres enteros (por ejemplo utilizando la clase stringstream) y validas estos mediante tu función. Si cualquiera de los dos pasos falla la fecha no es valida, caso contrario lo es.

Un saludo
#787
Cita de: leosansan en  1 Junio 2013, 22:23 PM
Cita de: rir3760) No se puede incrementar de forma incondicional el contador "i" ya que en el caso de la ultima palabra su delimitador es '\0'.
Respecto a lo primero, el que en la cadena estuviera el \0, no me lo plantee porque no era el caso en cuestión. La cadena era la que era y se trataba de explicar el por qué no  le funcionaba, cosa que dentro de mis modestísimos conocimientos traté de hacer con resultados, a mi entender, aceptables, más cuando nadie parecía interesado en darle una explicación o por falta de tiempo, interés  o ganas.

Vamos, que si la cuestión hubiera sido analizar una cadena genérica entrada por teclado, en lugar  de la indicada por el código, el planteamiento habría variado.
Por lo visto no lo pude explicar bien, déjame intentarlo de nuevo.

En tu programa dentro del bucle interno:
do{
   while(frase[i] != ' ' && frase[i] != '\0'){
      auxiliar[k] = frase[i];
      i++;k++;
   }

Buscas el carácter delimitador de la palabra a procesar, este sera un espacio salvo el caso de la ultima palabra. Con esta es el '\0' y se ubica en la posición "frase[ i ]".

Cuando se procesa la ultima palabra al incrementar incondicionalmente el contador con "i++" tenemos que "frase[ i ]" indicara un carácter que no es parte de la cadena a procesar. En otras palabras el bucle solo terminara cuando encuentre dos bytes continuos con el valor '\0'.

En mi caso (no tengo disponibles los documentos para ver el tema de alineación) si modifico el programa para tener cadenas contiguas:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char test[][43] = {
      "Hola como estas Hola como te va Hola amigo",
      "Hola como estas Hola como te va Hola amigo",
      "Hola como estas Hola como te va Hola amigo",
      "Hola como estas Hola como te va Hola amigo",
      "Hola como estas Hola como te va Hola amigo"
   };
   char palabra[] = "Hola" , auxiliar[10]={0}, auxiliar0[10]={0};
   int i = 0, j = 0,k = 0;
   char *frase = test[0];
   
   do{
      while(frase[i] != ' ' && frase[i] != '\0'){
         auxiliar[k] = frase[i];
         i++;k++;
      }
      auxiliar[k]='\0';
      k=0;
      i++;
      if(strcmp(auxiliar, palabra) == 0)
         j++;
      strcpy(auxiliar,auxiliar0);
   }while(frase[i] != '\0');
   printf("La palabra Hola se repite %d veces\n", j);
   return 0;
}

El programa reporta que "Hola" se repite quince veces.

Espero todo esto se tome como una critica constructiva.

Un saludo
#788
El error se encuentra en la linea:
Código (cpp) [Seleccionar]
cout << suma << "\n\n" endl;
Y se debe a la falta del operador "<<" entre "\n\n" y endl. Cambiala a:
Código (cpp) [Seleccionar]
cout << suma << "\n\n" << endl;

Un saludo
#789
Cita de: leosansan en  1 Junio 2013, 17:56 PM
El código corregido es ...
Dos comentarios sobre tu programa:

1) No se puede incrementar de forma incondicional el contador "i" ya que en el caso de la ultima palabra su delimitador es '\0'. Para explicarlo mejor (con un ejemplo) revisa el funcionamiento del programa cambiando la cadena a procesar a:
char frase[] = "Hola\0como\0estas\0Hola\0como\0te\0va\0Hola\0amigo";

2) No es necesario poner a cero todos los caracteres del array "auxiliar" vía strcpy, con asignar '\0' al primero basta.

Un saludo
#790
Programación C/C++ / Re: Vectores vs Listas
1 Junio 2013, 16:45 PM
Cita de: amchacon en  1 Junio 2013, 13:39 PMnecesitamos tener almacenados los disparos de una nave. Cada cierto tiempo comprobaremos los disparos y si alguno ha acertado/salido del mapa los eliminaremos.

¿Que contenedor deberíamos usar para obtener el máximo rendimiento? ¿Vectores o listas?
Los vectores te permiten un acceso constante y las listas una inserción/eliminación tan eficiente como sea posible. Elegir uno u otro depende de la operación mas frecuente (búsqueda, inserción en orden, eliminación, etc.).

Un saludo