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

#331
Tienes que diferenciar entre un error y un warning. Un error aborta la compilación. Un warning es cuando el compilador te avisa de "algo" que puede resultar ambiguo, extraño o que puede causar problemas, pero que puede seguir compilando sin problemas.

¿De que tipo es la variable palabras?
#332
Programación C/C++ / Re:
22 Enero 2014, 15:13 PM
Cita de: ivancea96 en 22 Enero 2014, 14:28 PM
Con 4 cifras y 6 posibilidades, son 360. 6*5*4*3.
Huy es verdad, menudo despiste :silbar:
#333
Ten en cuenta que hoy en día importa más la eficiencia que la memoria, hoy en día nadie se preocupa por 6-7 bytes de más pero sí un progama tarda menos o no. El realloc es una operación costosa (creas un nuevo vector, copias el contenido al nuevo vector byte a byte y borras el antiguo).

No obstante, te presento una versión con realloc "amortiguado":
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void LeerLinea(char** Linea)
{
   const int Incremento = 5;
   int tam = 0;
   int max = Incremento;
   int ch;

   (*Linea) = (char*) calloc(max,sizeof(char));

   while((ch = getchar()) != '\n' && ch != EOF)
   {
       (*Linea)[tam++] = ch;

       if (tam == max)
       {
           max += Incremento;
           (*Linea) = (char*)realloc (*Linea,max);

           if (*Linea == NULL)
           {
                printf("\n\t  Error de asignación de memoria, adios!!");
                exit(-1);
           }
       }
   }

   (*Linea)[tam] = 0; // caracter nulo
}

int main()
{
   char **cadena;
   int num_cadenas;
   int contador=0;
   int i,j;

   do
   {
       printf("Digite el numero de cadenas:  ");
       scanf("%d", &num_cadenas);
   }
   while(num_cadenas < 1);

   getchar();

   cadena = (char**) calloc(num_cadenas, sizeof(char*));

   if(cadena == NULL)
   {
       printf("\n\t  Error de asignación de memoria, adios!!");
       exit(-1);
   }

   // leyendo cada linea en memoria
   for(i=0; i<num_cadenas; i++)
   {
       LeerLinea(&cadena[i]);
   }

   for(i=0; i<num_cadenas; i++)
   {
       for(j=0;cadena[i]; j++ )
       {
           if(cadena[i][j] == ' ')
           {
               cadena[i][j] = cadena[i][j+1];
           }
       }
   }


   for (i = 0; i < num_cadenas; i++)
       printf("cadena # %2d: %s\n", i + 1, cadena[i]);


   /* Primero se libera la memoria de cada linea ... */
   for (i = 0; i < num_cadenas; i++)
       free(cadena[i]);

   /* ... a continuacion el bloque de memoria principal */
   free(cadena);
   return 0;
}


Es "realloc amortiguado" porque aumento la memoria de 5 en 5 en vez de 1 en 1. Así hago mucho menos reallocs y como mucho desperdicio 4 bytes.
#334
Cuando veas un código con un # es una directiva de compilador. Eso no se verá en el código final, por tanto el código compilado no es portable.

Lo que uso se llama "compilación condicional", si estoy compilando en windows windows hará esa línea y si estoy en linux compilará la otra. Si no estoy en ninguno de los dos muestra un error de compilación.

No solo es para los sistemas operativos, puede usarlo para las cosas que quieras. Por ejemplo, puedes definir cosas que se muestren solo en "modo depuración":

Código (cpp) [Seleccionar]
#define DEBUG

//... codigo

void funciona()
{
   #ifdef DEBUG
            ofstream escritura("debug.txt");

            //...

           // Imprimir el valor de las variables internas en un archivo...
   #endif
}


Si yo quito el #define DEBUG de ahí arriba, entonces esa función no hará nada.
#335
Cita de: vangodp en 22 Enero 2014, 11:58 AM
Tengo xp, y haciendo el include de windows.h si que me va.
No te digo que no. Pero una de dos, o windows.h tiene una función system propia o hace un include de la stdlib.

Cita de: vangodp en 22 Enero 2014, 11:58 AM¿cstdlib es estandar? O sea a ver si me explico: ¿si lo llevo a linux sirve con el system()?
:huh:
Sí, otra cosa son los comandos que le pases.

Por ejemplo, mira esta función génerica para limpiar la pantalla:
Código (cpp) [Seleccionar]
void limpiarPantalla()
{
   #ifdef _WIN32
       system("cls");
   #elif __gnu_linux__
       system("clear");
   #else
       #ERROR La funcion LimpiarPantalla no está definida para tu OS.
   #endif
}

#336
En C, system es de la librería <stdlib.h>. En C++ es <cstdlib>

Otra cosa esque windows.h incluya esa librería por su cuenta.
#337
Programación C/C++ / Re:
22 Enero 2014, 11:46 AM
Cita de: ivancea96 en 22 Enero 2014, 09:10 AM
Son 360 posibilidades. Mejor haz una funcion que lo verifique.
Con 4 cifras son 24 posibilidades (4 x 3 x 2 x 1).

En cuanto al tema en cuestión te dejo otra propuesta más generica:

Código (cpp) [Seleccionar]
// Prototipos...

bool comprobarCoincidencias(int a,int array[],unsigned int tam);
void generarNumeros(int Vector[],unsigned int tam, int max = RAND_MAX,int min = 0);

// Otro codigo...

// Declaracion de las funciones

void generarNumeros(int Vector[],unsigned int tam, int max,int min)
{
  // Se presupone que Vector tendrá al menos el tamaño de tam.
 
  if (tam == 0) return;
 
  Vector[0] = rand();

  for (unsigned int i = 1; i < tam;i++)
  {
         do
         {
             Vector[i] = (rand()%max)+min;
         } while (comprobarCoincidencias(Vector[i],Vector,i));
  }
}

bool comprobarCoincidencias(int a,int array[],unsigned int tam)
{
   for (unsigned int j = 0; j < tam;j++)
   {
         if (array[j] == a) return true;
   }

   return false;
}


No lo he probado pero debería funcionar. Tienes que pasarle el vector que quieres que te rellene, el numero de cifras y el máximo/menor (no inclusivo) valor que puede coger cada cifra. En este caso el maximo sería 10 porque quieres números del 0-9 supongo.

Por cierto:
Código (cpp) [Seleccionar]
void generarNumeros(int Vector[],unsigned int tam, int max = RAND_MAX,int min = 0);

Los "=" son son argumentos por defecto. Si no le dices nada el compilador te los rellena automaticamente:

Código (cpp) [Seleccionar]
generarNumeros(vector,tam);      // max = RAND_MAX y min = 0
generarNumeros(vector,tam,10);   // max = 10 y min = 0
generarNumeros(vector,tam,10,1); // max = 10 y min = 1
#338
¿Estas usando el compilador de C?

Cita de: engelx en 17 Enero 2014, 03:37 AMque el compilador no soporte
system("pause");
system es la librería estándar.
#339
Yo lo he interpetrado como n caraceteres  :-X

Por cierto:
Código (cpp) [Seleccionar]
while ((ch = getchar()) != '\n') {
    Cadena[i++] = ch;
           //printf("\ni=%d\n",i);
}


¡Peligro de desbordamiento! Si le meto más caracteres de la cuenta (5) estaré desbordando el array.
#340
Ah leñe, lo que tengo que hacer ahí es cambiar este printf:
Código (cpp) [Seleccionar]
printf("\nIntroduce un numero de 4 digitos: \n");

Por este más genérico:
Código (cpp) [Seleccionar]
printf("\nIntroduce un numero de %d digitos: \n",MAX);

Ala, problema resuelto ;D