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

#811
Cita de: Lotux5 en 12 Mayo 2013, 17:45 PMcin.ignore(1000,'\n') ---> Esto hace que ignore todos los caracteres hasta que encuentra un salto de linea.
No exactamente. Con esa llamada se descarta un máximo de mil caracteres, pueden ser menos si se encuentra el carácter '\n' o se alcanza el final del archivo. Y si la linea contiene mas de mil caracteres no se descarta la linea completa.

Cita de: Lotux5 en 12 Mayo 2013, 17:45 PMPero lo que quiero que me expliquen (si es posible) es como usarlo para que ignore una serie de caracteres determinados.
No es posible ya que no se conoce de antemano el contenido de la linea.

Cita de: Lotux5 en 12 Mayo 2013, 17:45 PMSi creo una cadena con cin.getline(c,1000,EOF)
Un problema es, con esa llamada a función, lees un máximo de mil caracteres sin importar de cuantas lineas se traten (pueden ser varias).

Cita de: Lotux5 en 12 Mayo 2013, 17:45 PMdentro e esa cadena como hago para "ignorar" linea que empieze por '#', osea, una serie de de caracteres que empiece con el caracter '#' y acabe con '\n'.
Tienes que leer una linea, por ejemplo con getline:
Código (cpp) [Seleccionar]
char linea[1000];

// ...

cin.getline(linea, 1000); // El delimitador es '\n'


A continuación buscas el primer carácter que no sea espacio blanco y procedes según sea el caso.

Un programa de ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <cctype>
using std::isspace;

int main()
{
   char linea[1000];
   size_t i;
   
   cin.getline(linea, 1000);
   for (i = 0; isspace(linea[i]); i++)
      ;
   if (linea[i] == '\0')
      cout << "Linea en blanco";
   else
      cout << "El primer caracter es " << linea[i];
   cout << endl;
   
   return 0;
}


Una mejor aproximación es utilizar la clase string.

Un saludo
#812
Cita de: amchacon en 11 Mayo 2013, 12:09 PM
Cita de: rir3760 en 11 Mayo 2013, 05:10 AM
Esto:
Código (cpp) [Seleccionar]
int var;
cin >> var;
int x[var];

En C++ genera algo llamado comportamiento no definido (mejor conocido como UB). Como su nombre lo indica cualquier cosa puede pasar

Repito, está definido en el estándar C99 (dije  C98 pero lo acabo de comprobar y era C99):
http://en.wikipedia.org/wiki/C99#Design

Y bueno, compiladores no hay muchos. Salvo que utilize uno prehistorico debería funcionar con el mismo Mingw (o g++ en Linux).
Los arrays de longitud variable o VLAs se incluyeron en el lenguaje C a partir de ese estándar (C99) pero no forman parte del estandar de C++ (C++98).

Si un compilador de C++ los soporta es como una extensión y lo problemático de estas es su falta de garantías (quien desarrolla el compilador las decide a su criterio).

Una pagina (en ingles) donde se listan las diferencias es Incompatibilities Between ISO C and ISO C++

Un saludo
#813
Programación C/C++ / Re: Time.h [HELP]
11 Mayo 2013, 05:38 AM
Cita de: Borluck en  7 Mayo 2013, 18:25 PMQuisiera poder obtener la hora del sistema y almacenarla en un archivo .txt
Si solo necesitas una cadena con la hora y fecha actual puedes utilizar la función time para obtener esta como un valor de tipo time_t y a continuación la función ctime para generar la cadena. Mas o menos así:
time_t t;

/* ... */

time(&t);
fprintf(stdout, "%s", ctime(&t));

Por supuesto se debe, para empezar, sustituir stdout en la llamada a fprintf por el stream correspondiente.

----

O si lo que quieres es procesar de alguna forma los campos (minuto, hora, etc.) puedes hacerlo manualmente (siguiendo el ejemplo de leosan) o utilizando la función strftime (similar a sprintf). Un ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define LONG_CADENA 128

int main(void)
{
   time_t t;
   struct tm *u;
   char cadena[LONG_CADENA];
   
   /* 1) Obtener la fecha actual ('time_t') */
   if ((t = time(NULL)) == (time_t) -1)
      return EXIT_FAILURE;
   
   /* 2) Obtener la fecha actual ('struct tm *') */
   u = localtime(&t);
   
   /* Imprimir la fecha manualmente mediante printf */
   printf("%d/", u->tm_year + 1900);
   printf("%02d/", u->tm_mon + 1);
   printf("%02d\n", u->tm_mday);
   
   /* Imprimir la fecha mediante strftime */
   strftime(cadena, LONG_CADENA, "%Y/%m/%d", u);
   printf("%s\n", cadena);
   
   return EXIT_SUCCESS;
}


Un saludo
#814
Cita de: ThePinkPanther en 11 Mayo 2013, 00:36 AMNo era que para dimensionar un vector en tiempo de ejecución , se necesitaba reservar memoria dinamica?
Correcto. Una de las formas garantizadas es esa, mediante el par de operadores new y delete. La otra es utilizar la clase vector.

Cita de: ThePinkPanther en 11 Mayo 2013, 00:36 AMcomo puede ser que dimensione un vector con una variable.
Esto:
Código (cpp) [Seleccionar]
int var;
cin >> var;
int x[var];

En C++ genera algo llamado comportamiento no definido (mejor conocido como UB). Como su nombre lo indica cualquier cosa puede pasar, por ejemplo:

A) Funciona correctamente, no hay problema.
B) El programa revienta.
C) Se generan resultados aleatorios.
D) Cualquier otra cosa.

Y ese es el problema: no hay garantías en cuanto a la ejecución del programa. Yo te recomendaría que revisaras la documentación de tu compilador para conocer que extensiones (al lenguaje) soporta.

Un saludo
#815
Cita de: Luchoz95 en  7 Mayo 2013, 05:33 AMla verdad que no entiendo ese code
Es una tarea donde el estudiante debe completar un programa rellenando las partes faltantes indicadas con ________, supongo es una practica de POSIX.

Cita de: Luchoz95 en  7 Mayo 2013, 05:33 AMte dejo uno que hice medio rapido
Si tu idea es practicar con funciones parte de la Win32 API no hay problema. Solo un comentario: no es necesario llamar a ExitProcess para terminar el programa, basta con (en tu caso) la sentencia "return 1;".

Un saludo
#816
Cita de: nicolas2013alcubo en  6 Mayo 2013, 14:42 PM¿Por què no responden?.
Supongo se debe a que la ayuda aqui es voluntaria (en el tiempo libre), si a eso le sumas que tu pregunta es en Domingo ...

Cita de: nicolas2013alcubo en  6 Mayo 2013, 14:42 PMNo es dificil entender lo que quiero hacer, ya que en absolutamente todos los programas de bases de datos que corrían bajo D.O.S
Los dias de Clipper y dBase IV sobre MS-DOS fueron hace unos veinte años ...

Para lo que deseas debes utilizar una biblioteca de terceros o el API de tu sistema operativo. En mi opinion lo mas facil es mediante ncurses, cuestion de buscar un buen curso.

Un saludo
#817
Cita de: FMR en  6 Mayo 2013, 06:25 AMsólo un pequeño problema, no me permite ingresar más de 2 palabras, es decir, al momento de dejar el espacio para poner la segunda palabra, me marca como si estuviera vacío y me regresa a que ingrese de nuevo el texto.
Si estas aprendiendo C++ lo mejor es seguir el ejemplo de RyogiShiki ya que al utilizar la biblioteca estándar de C++ te olvidas de ciertos problemas (por ejemplo la longitud de la linea).

El programa que mencionas no acepta lineas con mas de una palabra porque su condición de salida lo prohíbe:
Código (cpp) [Seleccionar]
while(strchr(palabra, 32));
La función strchr retorna verdadero (una dirección diferente de NULL) cuando el carácter indicado por el segundo argumento (en este caso 32, mejor indicarlo con ' ') se encuentra en la cadena (primer argumento). Es por eso que el bucle se repetirá mientras la linea contenga un espacio.

En su lugar se debe verificar que la linea contenga al menos un caracter que no sea espacio o tabulador. Para ello se puede utilizar:
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
   char linea[30];
   size_t pos;
   
   do {
      cout << "Ingresa una cadena: ";
      cin.getline(linea, 30);
     
      pos = strspn(linea, " \t");
   }while (linea[pos] == '\0');
   
   cout << "Linea: " << linea << endl;
   
   return 0;
}


Pero, de nuevo, mejor enfocate en aprender la biblioteca estándar de C++.

Un saludo
#818
Programación C/C++ / Re: Vector i*8+j
3 Mayo 2013, 17:56 PM
Cita de: JohnMcb en  3 Mayo 2013, 01:28 AM
Se me pidió convertir un array de varias dimensiones en un vector unidimensional de dos maneras, uno por medio de apuntadores con doble indireccion y la otra por medio de una formula ; i*8+j, la que aun no entiendo como aplicarla o usarla para pasar el array a vector
Esa formula solo es un ejemplo que te dieron, supongo yo, al usar una matriz con ocho columnas por fila. La expresión que debes utilizar es:
Código (cpp) [Seleccionar]
pos = fila * columnas_x_fila + columna

Y se debe a que, siguiendo el ejemplo de una matriz de 8x8, las filas de la matriz terminan en las posiciones del array de esta forma:
La primera fila en las posiciones  0 ..  7
La segunda fila en las posiciones  8 .. 15
La tercera fila en las posiciones 16 .. 23


Un programa de ejemplo basado en el tuyo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

const int num_filas = 2;
const int num_cols = 3;
int main()
{
   int aa[num_filas][num_cols];
   int a[num_filas * num_cols];
   
   //Array de arrays de ints
   for (int i = 0; i < num_filas; i++)
      for (int j = 0; j < num_cols; j++){
         aa[i][j] = i * num_cols + j; // Para ejemplificarlo mejor
         cout << "aa[" << i << "][" << j << "] == " << aa[i][j] << endl;
         
         int pos = i * num_cols + j;
         a[pos] = aa[i][j];
      }
   cout << endl;
   
   // Array de ints
   for (int i = 0; i < num_filas * num_cols; i++)
      cout << "a[" << i << "] == " << a[i] << endl;
   
   return 0;
}


Un saludo
#819
Cita de: flony en  1 Mayo 2013, 04:37 AM
me da estos errores, alguna libreria esta como fuera de moda, uso visual c++ 2012

Citarerror C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.   c:\users\administrador\documents\visual studio 2012\projects\project2\project2\source.cpp   20
No es un error. Es un "detallito" del compilador de Microsoft.

Este indica que un conjunto de funciones parte de la biblioteca estándar de C pueden ser peligrosas (si lo son o no depende del código fuente) y, en su lugar, recomienda alternativas que son extensiones del compilador.

Ello sucede (en Visual C++ 2008, habrá que revisar las siguientes versiones) aun cuando se utilice la opción "/Za" que, al menos en teoría, desactiva las extensiones del compilador.

La solución es:

A) Si se trata de desarrollar un programa en C estándar solo hay que definir la macro _CRT_SECURE_NO_WARNINGS o bien hacer caso omiso al mensaje de advertencia (después de todo la única función realmente insegura es gets).

B) Si se trata de un programa para MS Windows utilizando solo ese compilador basta con cambiar el uso de fopen por fopen_s.

Un saludo
#820
Ademas de lo ya comentado hay que inicializar a cero la variables que almacenaran los totales (T1 y T2). Eso por dos razones: 1) garantizar se entre al bucle y 2) se impriman correctamente los totales.

Un saludo