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 - eferion

#961
No te preocupes por cosas como estas.

Lo ideal es que solamente añadas un include cuando el compilador te lo pida.

En proyectos pequeños es más o menos fácil saber que includes tienes que añadir en cada archivo... pero conforme el proyecto crece y se van creando dependencias entre archivos la cosa cambia.

Añadir includes innecesarios hace que el código tarde más en compilar y, claro, en proyectos pequeños no se nota... pero va siendo más palpable conforme añades archivos al proyecto.
#962
Cita de: erest0r en 11 Septiembre 2013, 08:22 AM
Muchas gracias, me salte ese pedazo, aunque igual creo que empezare a incluir ese encabezado de manera que se vea mas formal el codigo  :)

Dudo que encuentres muchos códigos fuente en los que se incluya la susodicha cabecera.

El operador new está disponible siempre en todo el código fuente y por esa razón no se incluye su cabecera por defecto.
#963

fread(&letra,sizeof(char),1,fd);
           if(letra == '1')
           {
               fseek(fd,-1,SEEK_CUR);
               letra = '5';
               printf("%c",fgetc(fd));
            }


A ver tu estás haciendo "letra = 5", es decir, estas asignando a una variable de tu programa el valor 5 y, acto seguido, lees del archivo con fgetc... obviamente la asignación no va a afectar al archivo si no le metes un fwrite.

Si quieres hacer esta comprobación tendrás que hacer algo así:


fread(&letra,sizeof(char),1,fd);
           if(letra == '1')
           {
               fseek(fd,-1,SEEK_CUR);
               letra = '5';
               fwrite( &letra, sizeof(char), 1, fd ); // primero modificamos el fichero
               fseek( fd, -1, SEEK_CUR ); // retrocedemos otra vez para poder leer
               printf("%c",fgetc(fd)); // y ahora si leemos lo que deberia ser un 5
            }
#964
Ese printf está fuera de los ciclos... salta cuando haya terminado de procesar el archivo...

if((fd = fopen("F:\\archivo2.txt","r+"))!=NULL)
   {
       while(!feof(fd))
       {
           // ...
       }
       printf("%d",i);
   }


y si has abierto el archivo, no te olvides de cerrarlo al final con fclose.
#965
Cita de: Almapa en 10 Septiembre 2013, 16:32 PM
El código de eferion está muy bien solo le faltaría detectar si dos de los números introducidos son iguales y meterlos en un string dentro de la variables mayor o menor según el caso.

PD: Creo que si este tema lo hubieses puesto en Programación C/C++ te habría ayudado más gente o al menos con mayor rapidez.

Un saludo!

Tampoco implica muchos cambios


OrdenarNumeros( int& mayor, int& menor )
{
  if ( menor > mayor )
  {
    int temp = menor;
    menor = mayor;
    mayor = temp;
  }
}

int main( )
{
  // ...

  int mayor = num1;
  int mediano = num2;
  int menor = num3;

  OrdenarNumeros( mayor, mediano );
  OrdenarNumeros( mediano, menor );
  OrdenarNumeros( mayor, mediano ); // Este se pone para cuando num3 es el mayor

   cout << "Los numeros que ha introducido ordenados de mayor a menos son: " << endl;

  if ( mayor == mediano )
  {
    if ( mediano == menor )
    {
      cout << "- Mayor: " << endl;
      cout << "- Mediano: " << mayor << "," << mediano << "," << menor << endl;
      cout << "- Menor: " << endl;
    }
    else
    {
      cout << "- Mayor: " << mayor << "," << mediano << endl;
      cout << "- Mediano: " << endl;
      cout << "- Menor: " << menor << endl;
    }
  }
  else
  {
    if ( mediano == menor )
    {
      cout << "- Mayor: " << mayor  << endl;
      cout << "- Mediano: " << endl;
      cout << "- Menor: " << mediano << "," << menor << endl;
    }
    else
    {
      cout << "- Mayor: " << mayor  << endl;
      cout << "- Mediano: " << mediano << endl;
      cout << "- Menor: " << menor << endl;
    }
  }
}


Se podría optimizar usando vectores, pero no se si merece la pena.
#966
Programación C/C++ / Re: C llaves en bucles
10 Septiembre 2013, 13:55 PM
Cita de: Pirat3net en 10 Septiembre 2013, 13:37 PM
en consecuenca en mi codigo los dos for terminarian inmediatamente cuando termine el if si e entendido bien,  una ultima cosa, cuano tengo bucles anidados, el los break/continue, afectan solo al bucle menor, es decir, al que esta declarado dentro del bucle general, o afectan a todos los bucles superiores?

Los break y continue solo afectan al bucle más cercano que tengan. Es decir


for (i = 0; linea[i] != '\0'; i++) // 1er for
      for (j = 0; abc[j] != '\0'; j++)  // 2o for, dentro del 1er for
         if (linea[i] == abc[j]){ // 1er if dentro del 2o for
            if (j + despl >= 26)  // 2o if dentro del 1er if
               linea[i] = abc[(j + despl) - 26]; // dentro del 2o if
            else  // else del 2o if
               linea[i] = abc[j + despl]; // dentro del else del 2o if

            break; // esto esta dentro del 1er if, afecta unicamente al 2o for
         }


Cita de: Pirat3net en 10 Septiembre 2013, 13:37 PM
PD MODIFICADO:   claro, pero esque ahora tengo la duda, si la siguiente linea es un if y le sigue un else,  el bucle sin llaves afectaria solo a el if, o tomaria el conjunto if else?

me refiero a el caso

for(...)
if(...){
}else{
}


Las instrucciones if - else, van siempre de la mano y se ejecutan dentro del mismo ámbito SIEMPRE. Es decir:


for(...)
if(...){ // esta dentro del for
}else{ // este else corresponde al if, luego sigue dentro del for
}

[/quote]

#967
Programación C/C++ / Re: C llaves en bucles
10 Septiembre 2013, 13:35 PM
Si no hay llaves, el bucle afecta únicamente a la siguiente instrucción.

El problema es que si tienes bucles anidados, como es el caso, la "siguiente instrucción" puede implicar varias líneas.

Me explico:


if ( a == 1 )
  a = 5; // entra en el if
a = 2; // no entra en el if



if ( a == 1 )
  if ( b == 2 ) // esta instruccion esta dentro del primer if
    a = 5;       // esta instruccion esta dentro del segundo if y, en consecuencia,
                    // dentro del primer if
a = 2; // no esta dentro de ningun if



if ( a== 1 ) // 1er if
  if ( b == 2 ) // 2o if, dentro de "1er if"
    a = 5;       // dentro de 2o if y, por tanto, del 1er if
  else            // else correspondiente al 2o if
    if ( c == 3 ) // 3er if, esta dentro del else del 2o if
      if ( d == 4 ) // 4ºif, esta dentro del 3er if
        a = 1;       // dentro del 4o if
      else            // else del 4o if
        a = 0;      // dentro del else del 4o if
a = 2; // no esta dentro de ningun if


Para evitar este caos, lo más lógico es emplear llaves cuando el contenido del bucle ocupe más de una instrucción.
#968
Cada vez que lees o escribes estás modificando el puntero interno del fichero.

Quiero decir... cuando tu abres un archivo, internamente se crea un puntero de posición. Este puntero es el que indica a partir de donde se van a iniciar las operaciones de lectura / escritura. Cuando tu realizas una de estas operaciones sobre el fichero, dicho puntero se actualiza. Esta es la razón por la que sucesivas escrituras no machacan la misma información sino que se concatenan.

Tu estás leyendo un carácter y, si éste es un '1', escribes un '5' en el fichero. El problema es que al lanzar la operación de lectura el puntero interno ha avanzado una posición y el '5' machaca la posición siguiente.

Para evitar esto tienes que hacer esto:


fread(&letra,sizeof(char),1,fd);
            if(letra == '1')
            {
                fseek( fd, -1, SEEK_CUR );
                 letra = '5';
                fwrite(fd,sizeof(char),1,letra);
            }


De esta forma vuelves a posicionar el puntero sobre el carácter '1' y la operación de escritura machacará dicho carácter.

No he compilado el código, pero debería funcionar.
#969
Consejo de presentación: No tiene sentido que tabules el código que se encuentre tras un cierre de llave.

Si no lo haces corres el riesgo de que el código se desparrame ante una secuencia de if-elseif-elseif grande.

Código (cpp) [Seleccionar]

    if (num1 > num2 && num1 > num3){
             mayor=num1;
             if(num2 > num3){
                     mediano=num2;
                     menor=num3;
                     }else {
                           mediano=num3;
                           menor=num2;
                           }


Código (cpp) [Seleccionar]

    if (num1 > num2 && num1 > num3){
             mayor=num1;
             if(num2 > num3){
                     mediano=num2;
                     menor=num3;
             }else {
                     mediano=num3;
                     menor=num2;
             }


Y hablando ahora de tu código, veo que es bastante lioso, deberías abstraer un poco más.

Una opción puede ser usar vectores y aprovechar los algoritmos que te proporciona la librería estándar:

Código (cpp) [Seleccionar]

#include <algorithm>
#include <iostream>
#include <vector>

bool ordenarnumeros(int i, int j)
{
  return (i>j);
}

int main()
{
  vector< int > numeros;
  int num;

  cout << "Introduce el primer numero: " << endl;
  cin >> num;
  numeros.push_back( num );

  cout << "Introduce el segundo numero: " << endl;
  cin >> num;
  numeros.push_back( num );
   
  cout << "Introduce el tercer numero: " << endl;
  cin >> num;
  numeros.push_back( num );

  sort( numeros.begin( ), numeros.end( ), ordenarnumeros );

   cout << "Los numeros que ha introducido ordenados de mayor a menos son: \n\n"
      << "- Mayor: " << numeros[ 0 ]<< "\n" << "- Mediano: " << numeros[1] << "\n- Menor: " << numeros[2] << endl;
}


Si prefieres no usar vectores, hay otras opciones:

Código (cpp) [Seleccionar]

OrdenarNumeros( int& mayor, int& menor )
{
  if ( menor > mayor )
  {
    int temp = menor;
    menor = mayor;
    mayor = temp;
  }
}

int main( )
{
  // ...

  int mayor = num1;
  int mediano = num2;
  int menor = num3;

  OrdenarNumeros( mayor, mediano );
  OrdenarNumeros( mediano, menor );
  OrdenarNumeros( mayor, mediano ); // Este se pone para cuando num3 es el mayor

   cout << "Los numeros que ha introducido ordenados de mayor a menos son: \n\n"
      << "- Mayor: " << numeros[ 0 ]<< "\n" << "- Mediano: " << numeros[1] << "\n- Menor: " << numeros[2] << endl;
}
#970
Esconder o proteger...

A ver, los sistemas operativos disponen de características para que un archivo o carpeta no sea visible en una vista normal de usuario ( en el explorador de carpetas ) ... no obstante esta característica se puede desactivar y los archivos y carpetas serán visibles.

Tu programa al final se apoya en el sistema operativo y el sistema de archivos y carpetas lo controla el sistema operativo, no tu, por lo que idear un mecanismo que controle todo esto te puedes imaginar que no es sencillo.

La opción b es cifrar los archivos y carpetas con el fin de que sólo aquel que ejecute tu programa pueda descifrar los archivos para acceder a su contenido. Para hacer esto deberías echar un vistazo a tutoriales sobre cifrado y criptoanálisis.

Una buena librería para empezar con este menester es openssl... para más información tienes miles de tutoriales y ejemplos por la web.