elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:42  


Tema destacado: ¡Aprende hacking con práctica! - WarZone, el wargame de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  [C++ Linux] Explicación de codigo [Principiante]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C++ Linux] Explicación de codigo [Principiante]  (Leído 436 veces)
EAX_

Desconectado Desconectado

Mensajes: 21


inside myself..


Ver Perfil
[C++ Linux] Explicación de codigo [Principiante]
« en: 28 Enero 2012, 16:56 »

Hola a todos,
               Les cuento. Este año voy a estudiar Ingeniería en informática y estoy repasando y practicando antes de entrar para llegar con algo y se me haga más fácil. Bueno, he estado estudiando este código que es bastante simple pero hay algunas cosas que aún me complican y quisiera pedirle que me expliquen. He buscado información y leído para responder muchas de mis preguntas pero hay unas que aún no logro responder.

Bueno acá va.

Código
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<iomanip>
using namespace std;
 
int f;
 
bool checkrep(int n, int num[])
{
   for(int i = 0; i < f; i++)
       if(n == num[i])
           return true;
   return false;
}
 
int main()
{
 
cout << "f = ";
cin >> f;
 
   srand(time(NULL));
   int n, i, num[f];
   for(i = 0; i < f; i++)
   {
      do  // porque este do acá?
       n = 1 + rand() % 10;  //especificamente qué hace el simbolo % acá?
       while(checkrep(n, num)); // tenia entendido que luego de while se abrian llaves, por qué acá no hay?
 
       num[i] = n;
       cout << num[i] << " - ";
}
 
float prom, sum = 0; // esto está bien? debe ser float?
int k;
int nmayor = num[0];
 
for(i = 0; i < f; i++) {
 sum = sum + num[i];
 if(nmayor < num[i]) {
 nmayor = num[i];
}
}
prom = sum/f;
 
       cout << endl << "El mayor de los numeros es: " << nmayor << endl;
       cout << "La suma de los numeros es: " << sum << endl;
cout << "El promedio de los numeros es: " << setprecision(3) << prom << endl;
 
}
 

He dejado las notas en el mismo código para que las vean y entiendan. Espero obtener la ayuda que necesito.

Gracias de antemano.



EDITO:

Ese código es un mezcla de algunos ejercicios de elhacker.net y modificaciones mías. Funciona, pero quiero saber la forma correcta de programarlo.

Estoy compilando con g++ en Debian Squeeze.


« Última modificación: 28 Enero 2012, 17:03 por EAX_ » En línea

"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #1 en: 28 Enero 2012, 17:15 »

Cito la parte donde tienes problemas:

Código
 srand(time(NULL));
   int n, i, num[f];
   for(i = 0; i < f; i++)
   {
      do  // porque este do acá?
       n = 1 + rand() % 10;  //especificamente qué hace el simbolo % acá?
       while(checkrep(n, num)); // tenia entendido que luego de while se abrian llaves, por qué acá no hay?

Ese do va con el while de debajo (es un bucle do-while). Entonces, hace
 n = 1 + rand() % 10;

mientras (checkrep(n, num));

El % va ahí porque forma parte de la función rand en ese caso. Si pusieras
n=rand(), te calcularía cualquier número aleatoriamente. Poniendo detrás de rand() un signo de % y posteriormente un número, el ordenador piensa un número  desde el 0 hasta el número que has introducido.

En el while no van las llaves, porque, como dije antes, es un bucle do-while. Si fuera un bucle while, sí sería con llaves (Ojo, que el bucle do-while también puede llevar llaves, pero en este caso, como no tiene que ejecutar muchas sentencias, no hacen falta).

Espero haberte ayudado.

Saludos.



« Última modificación: 28 Enero 2012, 17:22 por DickGumshoe » En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #2 en: 28 Enero 2012, 18:09 »

Hola

El % va ahí porque forma parte de la función rand en ese caso. Si pusieras
n=rand(), te calcularía cualquier número aleatoriamente. Poniendo detrás de rand() un signo de % y posteriormente un número, el ordenador piensa un número  desde el 0 hasta el número que has introducido.

En realidad el signo % es un operador y se llama "módulo". Igual que + se utiliza para sumar y - para restar, el operador % calcula el resto de una división entera. Por ejemplo:

10 % 2 es igual a 0, porque 10 / 2 = 5 y resto 0
10 % 3 es igual a 1, porque 10 / 3 = 3 y resto 1

Código
n = 1 + rand() % 10;
 
lo que hace es buscar un número aleatorio (rand), lo divide entre 10 y se queda con el resto (que será un número entre 0 y 9) y a ese resto le suma 1 y guarda ese valor en la variable n, con lo que n valdrá entre 1 y 10.

Si por ejemplo rand() devuelve 53, n será 4, ya que 53 % 10 es 3, le sumamos 1 y n vale 4.

Lo has entendido??

Si tienes más dudas pregunta sin problema.

Saludos
En línea

Breakbeat como forma de vida
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #3 en: 28 Enero 2012, 18:11 »

Ah, satu, si está mal lo que dije creo que voy a cambiar de manual. En el que estoy usando viene así, y, sin embargo, me acabo de fijar que en otros viene igual que como lo has dicho...
En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #4 en: 28 Enero 2012, 18:22 »

Hola

No está mal como lo has dicho, solo que yo le he explicado la función de % independientemente de si se usa con rand() o no. En este caso, como va con rand() hace lo que tú has dicho pero su uso (general) es el que le he dicho yo.

Saludos
En línea

Breakbeat como forma de vida
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #5 en: 28 Enero 2012, 18:24 »

Ah, vale, gracias. Ya me había asustado y creía que estaba leyendo un manual malo.

Saludos.
En línea
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #6 en: 28 Enero 2012, 18:40 »

Estoy viendo otra cosa muy horrorosa...

Código
int n, i, num[f] // es la parte de int num[f] la que esta mal

No, no y no. Tal vez el compilador no se haya quejado, pero eso no quiere decir que sea correcto (rotundamente, NO lo es). ¿Por qué? Porque un array se ha de inicializar con un tamaño no decidido en tiempo de ejecución (el compilador tiene que saber el tamaño). ¿La forma correcta de hacerlo? Reservando memoria dinámica.

Código
int* num = new int[f];

O, alternativamente:

Código
int* num = malloc(f); // hay que incluir cstdlib primero 

Por otro lado... ¡estás en C++! ¡Aquí tienes vectores! Tienes esta otra opción:

Código
vector<int> num(f); // hay que incluir vector primero 

Respecto a la pregunta "¿Debe ser float?", que nadie te ha contestado aun.

¿Debe? Hombre, deber, deber... ¿Poder? Claro, puedes usar float. O int, o char, o double. Depende de tus necesidades. ¿Quieres precisión decimal normalita? Usa float. ¿Sólo te interesa la parte entera de la división? Usa int. ¿Gran precisión decimal? Usa double. Como he dicho. no debe ser ni una cosa ni otra. Depende de qué es lo que te hace falta.

Saludos

P.S. Por curiosidad, ¿a qué universidad piensas ir :-) ?
« Última modificación: 28 Enero 2012, 18:45 por Xandrete » En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #7 en: 28 Enero 2012, 18:44 »

No me había fijado en eso, muchas gracias Xandrete por decirlo, se me pasó.

Saludos
En línea

Breakbeat como forma de vida
EAX_

Desconectado Desconectado

Mensajes: 21


inside myself..


Ver Perfil
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #8 en: 28 Enero 2012, 18:50 »

Antes que algo, gracias a todos por responder.

Cito:

10 % 2 es igual a 0, porque 10 / 2 = 5 y resto 0
10 % 3 es igual a 1, porque 10 / 3 = 3 y resto 1

No logro entender eso.

10 / 2 = 5... y ¿Resto 0? Eso es lo que no comprendo.

Encontré algo parecido por acá:

Código
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
int main ()
{
   clrscr();
   for (int i=1;i<=20;i++)
   {
cout<<i;
if (i%3==0) cout<<" Es multiplo de 3" <<endl;
else cout<<" No es multiplo de 3"<<endl;
   }
   getch();
   return 0;
}

No entiendo por qué i % 3 es igual a 0 o a 1. Si pudieras explicarlo con manzanas te lo agradecería... estoy confundido.

Saludos y gracias de antemano.

PD:

Xandrete, gracias por la aclaración. Aunque el compilador nunca se quejó de eso, voy a tener cuidado con lo que me dices. Y supongo que puedo prescindir de la palabra new al crear el array ¿O no?

En cuanto a donde estudiaré... pretendo estudiar en un instituto y luego saltar a la universidad, desde AIEP a Universidad Andres Bello.
En línea

"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #9 en: 28 Enero 2012, 18:59 »

En el ejemplo que acabas de poner, si el resto de dividir i entre 3 es 0, imprimes por pantalla que es múltiplo de 3, y, sino, dirá que no lo es.

Por si acaso no has caído en este momento, con el resto se refiere a la forma en la que hacemos las divisiones normalmente sin calculadora y sin usar decimales.

Por ejemplo: 6:3 (diríamos que 3x2 es 6, por lo que, al ser exacto, el resto es 0) --> Imprime por pantalla que es múltiplo de 3.
7:3 (si cogemos 3x3, que es igual a 9, se pasa de 7. Entonces cogemos el 2. 3x2=6. Del 6 al 7, 1. El resto es 1) --> Imprime por pantalla que no es múltiplo de 3.

Saludos.
En línea
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #10 en: 28 Enero 2012, 19:06 »

10 / 2 = 5... y ¿Resto 0? Eso es lo que no comprendo.

Sí, a ver. En la división de toda la vida identificas al dividendo, al divisor, al cociente y al resto. Si el dividendo es 10 y el divisor es 5, el cociente es 2 y el resto es 0. ¿Con manzanas? Mamá cerdita quiere repartir 5 manzanas entre sus 2 cerditos. Le da 2 a cada hijito y le sobra 1 manzana (el resto). Se come ella esa última manzanita ^^

Si el dividendo es 15 y el divisor 4, el cociente es 3 y el resto es 3 (15 = 4*3 + 3). El resto es lo que te sobra de una división entera.

Xandrete, gracias por la aclaración. Aunque el compilador nunca se quejó de eso, voy a tener cuidado con lo que me dices. Y supongo que puedo prescindir de la palabra new al crear el array ¿O no?

No, el operador new no es prescindible. Es, de hecho, lo más importante. Sirve para reservar espacio en la memoria dinámica. Ha de estar ahí (si no lo has visto aun, te dejo un link).

Por cierto, DickGumshoe, ya veo que eres el sheriff más rápido del oeste. Ya vi tu mensaje, pero como ya tenía escrito el mío, lo mando igualmente, xD.

Saludos  ;D

EDITO: quiero decir, el operador new es imprescindible si quieres que el tamaño del array se pueda decidir en tiempo de ejecución. Si no, siempre puedes hacer el truco del almendruco, que es fijar un tamaño máximo. Haces el array de ese tamaño y le preguntas al usuario el número de elementos que va a necesitar.
« Última modificación: 28 Enero 2012, 19:21 por Xandrete » En línea
satu

Desconectado Desconectado

Mensajes: 263

Siempre aprendiendo


Ver Perfil WWW
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #11 en: 28 Enero 2012, 19:10 »

Hola

Te lo voy a explicar con manzanas. Si tienes 10 manzanas y las divides entre 3 personas, cada persona recibe 3 manzanas y sobra 1 (recuerda que son divisiones enteras), pues esa manzana que sobra es el resto.

Cuando te enseñaron a dividir no te dijeron Dividendo/divisor = cociente+resto?? pues ese resto.

En cuanto al código que has puesto ahora: i%3 puede tener 3 valores (divide cualquier número entre 3, verás que el resto siempre es 0, 1 o 2), pues cuando i%3 es 0 quiere decir que ese número es múltiplo de 3. Por ejemplo:

1%3 es 1 porque 1/3 = 0 y de resto 1, luego 1 NO es múltiplo de 3
2%3 es 2 porque 2/3 = 0 y de resto 2, luego 2 NO es múltiplo de 3
3%3 es 0 porque 3/3 = 1 y de resto 0, luego 3 es múltiplo de 3
4%3 es 1 porque 4/3 = 1 y de resto 1, luego 4 NO es múltiplo de 3
5%3 es 2 porque 5/3 = 1 y de resto 2, luego 5 NO es múltiplo de 3
6%3 es 0 porque 6/3 = 2 y de resto 0, luego 6 es múltiplo de 3
.
.
.

En cuanto a lo de si puedes prescindir de la palabra new sí que puedes, siempre y cuando crees el array con un tamaño especificado en tiempo de compilación y no en tiempo de ejecución como dijo Xandrete. Si vas a reservar memoria dinámica sí que lo necesitas.

Saludos

Advertencia - mientras estabas escribiendo, fueron publicadas 2 respuestas. Probablemente desees revisar tu mensaje.
« Última modificación: 28 Enero 2012, 19:14 por satu » En línea

Breakbeat como forma de vida
EAX_

Desconectado Desconectado

Mensajes: 21


inside myself..


Ver Perfil
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #12 en: 28 Enero 2012, 19:17 »

Una vez más gracias por sus respuestas. Imaginé que iba a ser algo tan simple como el resto de la división (Acostumbraba llamarlo "lo que sobra").

Bien, creo haber entendido. Por último les dejo nuevamente el código para que lo vean y agradecería que me dijeran si el orden está correcto.

Código
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<iomanip>
using namespace std;
 
int f;
int* num = new int[f];
 
bool checkrep(int n, int num[])
{
   for(int i = 0; i < f; i++)
       if(n == num[i])
           return true;
   return false;
}
 
int main()
{
 
cout << "f = ";
cin >> f;
 
   srand(time(NULL));
   int n, i;
   for(i = 0; i < f; i++)
   {
      do  
       n = 1 + rand() % f;
       while(checkrep(n, num));
       num[i] = n;
       cout << num[i] << " - ";
}
 
float prom, sum = 0;
int nmayor = num[0];
 
for(i = 0; i < f; i++) {
 sum = sum + num[i];
 if(nmayor < num[i])
 nmayor = num[i];
}
 
prom = sum/f;
 
       cout << endl << "El mayor de los numeros es: " << nmayor << endl;
       cout << "La suma de los numeros es: " << sum << endl;
cout << "El promedio de los numeros es: " << setprecision(3) << prom << endl;
 
}
 

Ahora intentaré validar "f" para que solo se puedan introducir números y en un rango determinado.

Saludos.
En línea

"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #13 en: 28 Enero 2012, 19:30 »

¡¡¡NOOOOOOOO (grito desvaneciéndose en la inmensidad  ;D) !!!

Fíjate:
 
Código
int f;
int* num = new int[f];

Dos cosas: new es un operador. Es decir, es como el +, o como el -, o como el =. ¿Y qué es un operador? Un operador, en el fondo, es una función (de hecho, la suma de dos enteros a,b, se puede efectuar haciento tanto a+b como operator+(a,b)). Por tanto, el new int[f] no puede estar "en el aire", lo tiene que ejecutar alguien (el main o alguna función referenciada por el main). La otra cosa es... si se pudiera hacer lo que pretendes... ¿que espacio se reservaría en memoria si a f no se le ha dado aún ningún valor explícitamente ;)? f contiene lo que se viene a llamar, entre amigos, basura. Esta basura puede ser desde un 0 hasta un 7515 (por poner un número, puede ser cualquier valor que entre en el rango de representación de un entero).
« Última modificación: 28 Enero 2012, 19:34 por Xandrete » En línea
EAX_

Desconectado Desconectado

Mensajes: 21


inside myself..


Ver Perfil
Re: [C++ Linux] Explicación de codigo [Principiante]
« Respuesta #14 en: 28 Enero 2012, 19:39 »

Ooops, tienes razón. Entonces, estaría correcto ponerlo justo debajo de

Código
cout << "f = ";
cin >> f;

Y no habría problema.

Gracias denuevo (:
En línea

"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Explicacion de un Codigo.
Programación C/C++
^Tifa^ 0 286 Último mensaje 13 Mayo 2008, 23:38
por ^Tifa^
Explicacion de un Codigo. « 1 2 »
Programación C/C++
^Tifa^ 21 1,879 Último mensaje 21 Mayo 2008, 20:23
por ^Tifa^
Ayuda, explicacion de codigo
Programación C/C++
negux 1 464 Último mensaje 28 Abril 2010, 08:12
por Akai
ayuda con explicacion de codigo
Programación C/C++
Fatmf44 1 579 Último mensaje 24 Junio 2010, 00:10
por Littlehorse
explicacion de codigo
Programación C/C++
flony 3 645 Último mensaje 12 Octubre 2010, 14:06
por flony
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines