elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21
151  Programación / Programación General / Re: Es necesario aprender Visual Basic? en: 12 Febrero 2012, 17:18 pm
El que sea necesario o no lo debes de responder tú. Lee y documéntate para que sepas en qué te puede ser útil el Visual Basic
152  Programación / Programación C/C++ / Re: ¿Printf y scanf en funciones? en: 12 Febrero 2012, 16:11 pm
BlackZeroX (Astaroth) No quise ofenderte amigo (si es que lo hice, disculpas. Solo dije que me mareé con tu código no porque esté desordenado sino porque el que aún no tiene los recursos suficientes como para entender soy yo, pero voy a documentarme más respecto a las cosas que mencionas en tu comentario, sobre debugger y stderr, etc). Me podrías explicar que quieres decir con esto:
Citar
Se te agradecerá cuando cites algo importante sin citar de manera tan impulsiva un post
) ).
Yo solo puse mi opinión respecto al mal uso de funciones printf y scanf en funciones, no digo que tengo toda la razón:
Citar
En mi humilde opinión
....
Citar
Esa es mi opinión......
. Pero creo que en algo puedo aportar. Y sí, como tú dices, estoy totalmente de acuerdo con esto:
Citar
esto de usar scanf y printf no solo tiene que ver con formalismos, de hecho se hace mas legible un codigo a la hora de leer
153  Programación / Programación C/C++ / Re: ¿Printf y scanf en funciones? en: 12 Febrero 2012, 05:36 am
 :huh: :huh: :huh: :huh: :huh: :huh:

Citar
lo ideal es que tus funciones que realicen un proceso X retornen códigos de error para que funciones madres por ejemplo main sepa que hacer ante mas de 1 o 2 situaciones. se puede usar de una manera pero seria con fprintf() en conjunto a Standard error stream (stderr) solamente para debugear y mostrar los errores, pero que solo una persona especializada (en este caso tu) sepas que a ocurrido y el usuario normal solo se preocupe en su funcionamiento y no en codigo o errores que a final de cuentas a el no le interesan... un ejemplo:

Código
#include <stdlib.h>
#include <stdio.h>   //<stdio.h>
#include <string.h>
 
char* readInput(FILE* FileSrc)
//  Retorna un puntero a una cadena ansi que debera ser liberada con free();
{
    char c = 0;
    char *szRet = NULL;
    size_t size = 0;
 
    while(++size)
    {
        szRet = (char*)realloc(szRet, size);
        fread(&c, 1, 1, FileSrc);
        if (c == '\n')
            break;  //  exit while(1)
        szRet[size - 1] = c;
    }
    return szRet;
}
 
long int getActionFromString(const char *szStr)
//  Verifica la existencia de vocales dentro de una cadena dada.
{
    long int lFlags = 0;
    if (szStr)
    {
        do
        {
            switch(*szStr) // <-- en luigar de poner los printf usamos flags para saber que hacer en un proceso que nos llamo...
            {
                case 'A':case 'a': lFlags |= 0x1;
                break;
                case 'E':case 'e': lFlags |= 0x2;
                break;
                case 'I':case 'i': lFlags |= 0x4;
                break;
                case 'O':case 'o': lFlags |= 0x8;
                break;
                case 'U':case 'u': lFlags |= 0x10;
                break;
            }
        } while (*(++szStr) != '\0');
    }
    return lFlags;
}
 
int main()
{
   // claro evita poner mucho codigo tambien en el main()... evita esto que hice.
    char* szTmp = NULL;
    long int lFlags = 0;
 
    puts("ingresa una cadena:");
    szTmp = readInput(stdin);
    lFlags = getActionFromString(szTmp);
 
    if (lFlags == 0x0)
    {
        fprintf(stdout, "Cadena limpia de vocales\n");
    } else {
        fprintf(stdout, "Error cadena con vocales\n");
        if (lFlags & 0x1)
            fprintf(stderr, "Error Contiene la vocal \"a\" code: %d\n", lFlags);
        if (lFlags & 0x2)
            fprintf(stderr, "Error Contiene la vocal \"e\" code: %d\n", lFlags);
        if (lFlags & 0x4)
            fprintf(stderr, "Error Contiene la vocal \"i\" code: %d\n", lFlags);
        if (lFlags & 0x8)
            fprintf(stderr, "Error Contiene la vocal \"o\" code: %d\n", lFlags);
        if (lFlags & 0x10)
            fprintf(stderr, "Error Contiene la vocal \"u\" code: %d\n", lFlags);
    }
 
    free(szTmp);
 
    return EXIT_SUCCESS;
}
 

Dulces Lunas!¡.

La verdad que me mareé con esta respuesta. En mi humilde opinión te puedo decir que la razón por la que los libros dicen que es incorrecto usar printf y scanf en funciones, se debe a puros formalismos. (Corrección: Se debe en parte a la formalidad en el uso de una función)Porque, si se trata de una función que devuelve un único valor ya sea int, char, bool, o algún otro tipo que no sea void, lo correcto sería que a esta función se le proporcione toda la información de entrada mediante sus parámetros. Osea, en la llamada a la función, la unidad (programa principal o algún subprograma) que llama a la función debe pasarle toda la información necesaria mediante la lista de argumentos (y así se evita pedir más información mediante scanf) para que trabaje con ellos y luego, una vez procesados, devuelva algún resultado mediante la setencia return (y ya no con la función printf). Ya que este debería ser el uso que se le debería dar a una función de manera legal, formal y correcta.

Cuando se trata de funciones que devuelve el tipo void ya es muy diferente, porque en realidad, estas ya no son funciones propiamente dichas sino que se tratarían de procedimientos. Generalmente en los procedimientos (funciones que retornan el tipo void) se vería no tan mal el uso de printf y scanf. Esa es mi opinión.
154  Programación / Programación C/C++ / ¿Qué significan aquellos parámetros de la lista de argumentos del main ? en: 12 Febrero 2012, 05:23 am
Últimamente he visto que en varios códigos en vez de simplemente hacer:

Código:
int main(){
   return 0;
}

hacen:
Citar
int main(int argc, char *argv[]) {

Quisiera saber el motivo!! Muchas gracias
155  Foros Generales / Dudas Generales / Re: Unas preguntas piadosas :D en: 30 Enero 2012, 23:38 pm
Estás preguntando en forma muy general. Primero investiga un poco e interésate en algo en específico, no puedes abarcar todo desde un principio y menos cuando no tienes ni la menor idea. Hay varias campos, entre ellos Redes, Ensamblaje de Computadoras, Diseño Gráfico, Edición de videos, Programación de Computadoras, Diseño Web, Cracking, etc, etc, etc, Debes empezar con el que más te guste y para eso debes de por lo menos documentarte por tu propia cuenta. Una vez que decidas qué es lo que te gusta, es recién cuando empiezas a profundizar en eso. Por ejemplo, en mi caso me gustó la programación, y la programación es todo un mundo, tuve que documentarme acerca de los distintos tipos de programación que existen: C, C++, Pascal, BASIC, Cobol FORTRAN, Java, etc etc. De todos ellos me decidí por estudiar el Lenguaje C. Ahora, para estudiar el lenguaje C tuve que buscar muchísimos libros, manuales, tutoriales, etc etc. Y de entre todos ellos tuve que eligir los que me parecieron buenos, en mi caso estoy estudiando: "Cómo aprender C y C++ de Deitel", también "Introducción a la programación con C". Luego que aprenda esto, estudiaré C++ y seguiré con JAVA. Luego pienso incursionar en el diseño Web. Luego Diseño gráfico, multimedia, etc.

Y no existe un único libro en donde esté todo. No es como el colegio que en un solo libro está todo ordenadito y completito. No, los libros se complementan, por eso tienes que ir revisando muchos libros. Más te recomiendo que investigues como te dije un poquito de cada uno y una vez que sepas qué es lo que te gustaría aprender, es recién cuando deberías entrar al foro respectivo y preguntar por qué libros te pueden recomendar.

Y por el sistema operativo, en mi opinión te recomendaría que uses windows, mientras vayas ganando más experiencia, podrías pasarte a Linux.
156  Programación / Programación C/C++ / Re: Diferencias en el código fuente C y C++ en: 29 Enero 2012, 20:35 pm
Citar
Buenas:

A parte de lo que te ha comentado rir3760 deberías, sobre lo del tamaño se debe a cómo incluyes las librerías, esto es, existen dos modos:

Librería estática: Se incluye en el ejecutable final todas las librerías que has usado en el programa.
Librería dinámica: No se incluyen las librerías sino que se añade información sobre dónde están situadas en el PC y al procesar el ejecuta ble se buscan las librerías y para usar las funciones.

Lógicamente si compilas con el modo "librería estática" el ejecutabe pesará más ya que se incluye la librería completa, pero esto tiene la ventaja de que si llevas el programa a otro PC no tendrás problemas de que en dicho PC no estén las librerías ya que ya van dentro del ejecutable.

Fíjate si el compilador en C te pone por defecto librería dinámica y en C++ librería estática.

Sobre el tamaño de las variables eso es en tu caso, con tu procesador y compilador, son ellos dos los que deciden qué tamaño debe tener cada tipo, en otro PC serán otros tamaños, de lo único que se puede estar seguro es que el "short int" es de menor tamaño que el "int" y este a su vez menor que el "long int".

Discúlpame eleon, no te entendí mucho eso de las librerías estáticas y dinámicas, así que voy a documentarme más acerca de esto, y gracias. Ahora lo que quería preguntar era que en mi PC el "int" y el "long int" pesan ambos 4 bytes, pareciera como que si pesan lo mismo, entonces uno de ellos saldría sobrando?. Espero comentarios.

Para rir3760:
Hola, probé tu código y si funcionaba, lo que me pregunto es para el caso que i = 0 pareciera que tu código no debería funcionar pero sí lo hace. Por ejemplo en la parte que pones:
Citar
for (i = 0; i <= num; i++){
      fact = 1;
      for (j = i; j > 1; j--)
         fact *= j;
 
      printf("%2d! = %ld\n", i, fact);
   }
Si es que i=0, cuando entra al bucle for, asigna a j=i (osea cero) y luego dice hasta que j>1. Pero 0 no es mayor que 1, osea, ¿Cómo es que j puede retroceder desde 0 hasta mayor que 1? Esta parte me intriga un poco. Espero tu Ayuda.

Lo segundo es esto:
Citar
printf("%2d! = %ld\n", i, fact);
Aquí pones en la parte de la especificación de conversión a entero siguiente "%d", pones el 2 en medio, ¿Me pregunto que es lo que permite hacer esto?

Lo tercero es respecto al valor de devolución al final, en la sentencia return:

Citar
return EXIT_SUCCESS;

Siempre he visto que han devuelto el 0, y lo aplico siempre aunque nunca he comprendido el porqué. Por allí leí que indica que el programa termina con éxito. En otros lados e leído que para que el programa empiece a funcionar, el sistema operativo invoca a main, y a final, main le devuelve el número 0 al sistema operativo indicándole que el programa terminó con éxito. Pero hasta ahora nunca me he podido percatar que el programa falle o que termine sin éxito, siempre he visto que termina.  :rolleyes: :rolleyes: :rolleyes: :-(

Gracias por la ayuda!!!


157  Programación / Programación C/C++ / Re: C++ Problema propuesto usando estructuras repetitivas en: 27 Enero 2012, 23:45 pm
Acá está mi programa en donde aplico parte de lo que pides:

http://www.youtube.com/watch?v=_onYCBCYv-g&feature=youtu.be
158  Programación / Programación C/C++ / Re: C++ Problema propuesto usando estructuras repetitivas en: 27 Enero 2012, 22:56 pm
 :huh:
159  Programación / Programación C/C++ / Re: Diferencias en el código fuente C y C++ en: 27 Enero 2012, 22:50 pm
Me olvidaba, para los que me quieran criticar por el uso de fflush(stdin), ya leí las recomendaciones que hicieron en varias ocasiones sobre que no se debe usar con stdin sino exclusivamente con stdout. Para este ejemplo he obviado esto, pero sé que está mal usarlo. Y otra cosa, necesito saber si mi código está bien escrito en lenguaje C++ puro el primero y en lenguaje C puro el segundo, y algunas otras sugerencias, quiero desde el principio poder diferenciar ambos lenguajes para no mezclarlos demasiado.  Gracias.
160  Programación / Programación C/C++ / Diferencias en el código fuente C y C++ en: 27 Enero 2012, 22:46 pm
PRIMERA PREGUNTA:
Estaba practicando en Dev-C++ 4.9.9.2 y se me ocurrió implementar un mismo programa en diferentes lenguajes: C y C++. El programa consiste en calcular el factorial de un conjunto de números desde 0 hasta n, donde n lo da el usuario.

El código fuente en C++ para el programa lo guardé en un archivo con extensión .cpp y es el siguiente:

Código:

#include <iostream>

using namespace std;

int main(){
   int n;
   long F;
   do{
      cin>>n;
      if(n<0) cout<<"El numero es incorrecto!"<<endl;
   }while(n<0);
   for(int j=0; j<=n; ++j){
      F=1;
      if(j>1){
         for(int i=1;i<=j;++i){
            F*=i;
         }
      }
      cout<<j<<"! = "<<F<<endl;
   }
   return 0;
}


El código fuente en C para el mismo programa lo guardé en un archivo con extensión .c y es el siguiente:

Código:

#include <stdio.h>

int main(){
   int n, i, j;
   long F;
   do{
      scanf("%i", &n);
      fflush(stdin);
      if(n<0) printf("El numero es incorrecto!\n");
   }while(n<0);
   for(j=0; j<=n; ++j){
      F=1;
      if(j>1){
         for(i=1; i<=j; ++i){
            F=F*i;
         }
      }
      printf("%d! = %ld\n", j, F);
   }
   return 0;
}


Lo compilé y si me funcionó. Luego lo que hice fue revisar cuánto pesaba cada uno de los archivos ejecutables generados luego de compilarlos y me dio los siguientes resultados:

El primer ejecutable (del programa hecho en C++) pesaba 464 KB y el segundo ejecutable (del programa hecho en C) pesaba  15.4 KB. Me pregunto entonces:  ¿Tanto es la diferencia de 448.6 KB? ¿Alguien sabrá como explicar esto?

SEGUNDA PREGUNTA:

Quise averiguar el tamaño de los tipos de datos con los que trabajaba en mi compilador. Así que primero en un archivo .cpp escribí el código siguiente:

Código:
#include <iostream>

using namespace std;

int main(){
   cout<<sizeof(short)<<endl;
   cout<<sizeof(int)<<endl;
   cout<<sizeof(long)<<endl;
   cout<<sizeof(long long)<<endl;
   return 0;
}

Y me arrojó de salida lo siguiente:

Citar
2
4
4
8

Si es que el tipo int y el tipo long ocupan el mismo tamaño en la memoria, entonces ¿de qué me sirve el long si me basta el int?

Algo similar hice pero en un archivo .c

Código:
#include <stdio.h>

int main(){
   printf("%hd\n", sizeof(short));
   printf("%d\n", sizeof(int));
   printf("%ld\n", sizeof(long));
   printf("%ld\n", sizeof(long long));
   return 0;
}


Y me arrojó de salida lo siguiente:

Citar
2
4
4
8

Entonces mi pregunta aquí es la misma: ¿de qué me sirve el long si me basta el int?

Y otra: ¿No sabía que el tipo long long existía en C?

Espero sus comentarios, sus respuestas y sus críticas.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines