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

#391
Ten en cuenta Daniel, que el hecho de que te guste un código o no a veces es un poco subjetivo. Lo que le guste a Leo no tiene porque ser siempre lo que te guste a tí o a mí. Por ejemplo en las declaraciones de función:
Código (cpp) [Seleccionar]
void binarioConvertir(int num, char cad[]){

//...

}


Yo soy más partidario de poner las llaves así porque se ve mejor cuando empieza y cuando acaba:
Código (cpp) [Seleccionar]
void binarioConvertir(int num, char cad[])
{

//...

}


Pero eso es cuestión de gustos.

Bueno y ya hablando del código, esta función:
Código (cpp) [Seleccionar]
int convertir_a_decimal (char cad[]){
  int decimal=0,i;
  for (i=6;i>=0;i--){
      if (cad[6-i]!='0'){
          decimal+=pow (2,i*((cad[6-i])-48));
      }
  }
  return decimal;
}


Esa función no es muy portable, puesto que para que funcione la cadena debe medir exactamente 6 caracteres.

Existe una función de la librería estándar que te calcula el tamaño de una cadena:
Código (cpp) [Seleccionar]
#include <string.h>

//...

strlen(cadena);


Podemos ayudarnos de ella para reescribir la función:

Código (cpp) [Seleccionar]
int convertir_a_decimal (char cad[]){
  int decimal=0,i;

 int tam_cadena = strlen(cad);

 for (i = tam_cadena-1;i>=0;i--)
 {
      if (cad[tam_cadena-i]!='0')
      {
          decimal+=pow (2,i*((cad[tam_cadena-i])-48));
      }
 }
 return decimal;
}


De esa forma esta función te valdrá para cualquier tamaño de cadena, por lo que la podrás reutilizar siempre que quieras.

Y aunque no la pienses reutilizar, es una buena costumbre hacer las funciones lo más generales posibles, de lo contrario te podrías encontrar con errores extraños si modificas el código.

Y siguiendo otra vez con la función, ese pow no es necesario. Podemos definir la potencia aprovechando las iteraciones del for, lo que haremos es cambiar el sentido del for y añadir una variable más:

Código (cpp) [Seleccionar]
int convertir_a_decimal (char cad[])
{
  int decimal=0,i;

 int tam_cadena = strlen(cad);
 int multiplicador = 1;

 for (i = 0; i < tam_cadena; i++)
 {
      if (cad[tam_cadena-i]!='0')
      {
          decimal += multiplicador * (cad[tam_cadena-i])-48);
          multiplicador *= 2;
      }
 }
 return decimal;
}


Y por último, quitaría ese 48 por un '0':
Código (cpp) [Seleccionar]
int convertir_a_decimal (char cad[])
{
 int decimal=0,i;

 int tam_cadena = strlen(cad);
 int multiplicador = 1;

 for (i = 0; i < tam_cadena; i++)
 {
      if (cad[tam_cadena-i] != '0')
      {
          decimal += multiplicador * (cad[tam_cadena-i]) - '0');
          multiplicador *= 2;
      }
 }
 return decimal;
}
#392
Indentar es poner las tabulaciones, vamos poner el código bonito.

Este es tú codigo sin indentar:
Código (cpp) [Seleccionar]
#include <stdio.h>

int esVocal (char c);
char sigVocal (char c);

int main ()
{
char c;
do{
   if(esVocal(c)) sigVocal(c);
   printf("%c", c);
       }while(scanf("%c", &c)!= EOF);

return 0;
}


int esVocal (char c){
if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
}

char sigVocal (char c){
if(c=='a')c='e';
if(c=='e')c='i';
if(c=='i')c='o';
if(c=='o')c='u';
if(c=='u')c='a';

return c;
}


Este es el código indentado:

Código (cpp) [Seleccionar]
#include <stdio.h>

int esVocal (char c);
char sigVocal (char c);

int main ()
{
   char c;
   do
   {
       if(esVocal(c)) sigVocal(c);
       printf("%c", c);
   }
   while(scanf("%c", &c)!= EOF);

   return 0;
}

int esVocal (char c)
{
   if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
}

char sigVocal (char c)
{
   if(c=='a')c='e';
   if(c=='e')c='i';
   if(c=='i')c='o';
   if(c=='o')c='u';
   if(c=='u')c='a';

   return c;
}


En cuanto al fallo de tú código, scanf lee hasta un espacio o salto de línea. Para leer letra a letra puedes usar getch() de la librería conio.h, decirte que no es estandar pero cumple su propósito.

Otro error que tienes es:

int esVocal (char c)
{
   if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') return;
}// fin esVocal


No devuelves nada?
#393
Programación C/C++ / Re: valor de Retorno
2 Enero 2014, 22:50 PM
En efecto ;)
#394
Los punteros son de C no de C++, y los bools se pueden representar con un char perfectamente. Yo lo que he hecho es poner esto al principio del código:
#define bool char
#define false 0
#define true 1


Y ya con eso compila con el compilador de C.

En cuanto al código, te recomendaría quitar el "." como identificador de final de la línea. Para eso ya está caracter nulo '\0'.

Y hablando de caracteres nulos, no me parece muy adecuado tu forma de leer. Lo que puedes hacer es leer la línea entera con fgets:
http://www.cplusplus.com/reference/cstdio/fgets/

(el FILE* es el stdin, que es el archivo del teclado).

Y después ir guardando las palabras una a una en un array, separandolas con un espacio. Otra forma es leerlas una a una con el scanf y finalizar cuando la palabra introducida sea "Terminar".

Y bueno tu problema es:
while(d_c!='.')

¿Has dado arrays? Pues d_c debe tratarse como un array bidimensional, lo que estás haciendo es comparar la dirreción de memoria donde está el array (d_c funciona como un puntero si no usas los operadores []). Eso siempre va a ser un bucle infinito.
#395
Programación C/C++ / Re: valor de Retorno
1 Enero 2014, 17:55 PM
Es el complemento a uno del número.

El complemento a uno es cuando en la expresión binaria se invierten las cifras: Se cambian los unos por ceros y los ceros por unos.
#396
¿Que lenguaje? ¿C o C++?

En c++ yo lo haría tal que así:

Código (cpp) [Seleccionar]
string aux;
string nombre; // variable con el código de operacion

getline(archivo,aux);
stringstream linea(aux);
linea>>nombre;


No es el sistema más eficiente pero si el más fácil de implementar.
#397
#include <pthread.h>

int main()
{
    sleep(3); //dormir 3 segundos
    return 0;
}


Lo de linkar no tiene nada que ver con el código, sino con la configuración del compilador. Si usas algún IDE, busca alguna opción para "linker settings".
#398
Programación C/C++ / Re: funcion strcmpi()
31 Diciembre 2013, 09:42 AM
Pasalo todo a minúscula y usa el strcmp de toda la vida ;)
#399
Programación C/C++ / Re: Threads en C bajo Unix
31 Diciembre 2013, 09:40 AM
¿Has considerado que a lo mejor necesitas otro algoritmo?

10.000 threads me parece una animalada, sobre todo si los estás ejecutando al mismo tiempo, sin pausas de por medio.

Si tú intención es mejorar el rendimiento, no deberías pasar de 4-5 (recuerda que los procesadores no pasan de 4 núcleos).
#400
En linux es con minúscula:
sleep(10);

Tienes que incluir la librería pthread.h y linkar con pthread

Cita de: minari02 en 30 Diciembre 2013, 20:55 PMAprovechando quiero preguntarles, hay alguna función importante en la librería windows.h? o solo sirven de adorno sus funciones?
Eso es la windows API. Te permite hacer tropecientas cosas:
http://msdn.microsoft.com/en-us/library/hh920509%28v=vs.85%29.aspx

Cita de: ivancea96 en 30 Diciembre 2013, 21:53 PM
Podrías hacerlo con la biblioteca Time. Un poco bestia, pero podría ir bien:

Código (cpp) [Seleccionar]

//
#include <Time.h>
//
void time(int milisecs){
   Time A = time();
   while(time()<A+milisecs); del reloj
}


Cabe decir, que no creo que ese código funcione. Y esque nunca usé las variables de Time.h, así que no se bien la sintaxis, ni los retornos de sus funciones. Pero es la idea :D
Eso no es la función sleep, eso es un asesinato de rendimiento.

Estás haciendo iteraciones en cada ciclo. Ahora mismo estás chupando un hilo de ejecución entero.

De hecho, hay un sencillo progama para saturar la CPU que consiste en crear un bucle:
Código (cpp) [Seleccionar]
while(1);

Y tantos hilos de ejecución como núcleos tenga un procesador.