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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 26
21  Programación / Programación C/C++ / Re: Duda tonta de parámetros en: 18 Enero 2016, 16:27 pm
De todas formas tampoco tiene claro como funciona el paso de parámetros a una función.
Ya son unos cuántos que confunden parámetros de función con declaración de variables locales. Si su estudio viene del mismo sitio en dónde sea que lo hagan dan las clases muy mal.

Mafus, por eso dije le dije a Orb que tenía que modificar el cuerpo de operacion() de modo que pidiera los valores por teclado en lugar que establacerlos él mismo como valores fijos.

Y de acuerdo contigo en que si definió la función con retorno int, entonces es necesario poner el return.
Aunque la verdad lo veo innecesario, si fuera por mí la hubiera declarado void y no se requeriría retornar nada, lo cual por cierto estaría más de acuerdo con el propósito original del ejercicio que es devolver los datos por pantalla.

Saludos, Yoel.
22  Programación / Programación C/C++ / Re: Duda tonta de parámetros en: 18 Enero 2016, 16:19 pm
Le estais dando una respuesta erronea (..)

Fair, ¿por qué es errónea? En todo caso no eres quién mandó el ejercicio, así que no conoces el criterio de lo que se está pidiendo o como se espera hacerlo.

Yo trato de dar la respuesta más amplia posible, no sólo la que encuadra con mi preferencia personal, o la forma como YO lo haría.

Se trata de pedir dos números, y devolver su suma y su resta. Es mi opinión se pueden pedir como argumentos de main(), o de cualquier función auxiliar dentro del programa.

En términos de eficiencia e implementación es diferente, pero estoy tratando de dar una respuesta EN LA MISMA LÍNEA QUE PLANTEÓ ORIGINALMENTE EL USUARIO, es decir, respetando su esfuerzo y criterio original, para que mi respuesta pueda ser realmente útil a él.

En vez de lucirme explicando la manera sensacional COMO YO LO HARÍA, en cuyo caso me estaría respondiendo a mí mismo y no a él.

Saludos, Yoel.
23  Programación / Programación C/C++ / Re: Contar elementos de un vector en: 18 Enero 2016, 15:58 pm
Bueno, la solución de crack81 me parece excelente, casi no tendría nada que añadir.

Existen otras formas de poder hacerlo, pero serían más complicadas. Sólo por ocio me puse a pensar en lo siguiente, en aras de optimizar un poco la velocidad el código.

  • Repasamos el primer elemento del vector, y lo marcamos una vez.
  • Para el segundo elemento y posteriores, repasamos sólo para los elementos que le anteceden, por ejemplo para el quinto elemento, buscamos para el primero, segundo, tercero y cuarto. Si alguno es igual, aumentamos en uno la cantidad de apariciones tanto para el elemento que estamos revisando como para todos los que son iguales a él.
  • De esta manera, no se realizan 10x10 = 100 búsquedas, sino 1 + 2 + 3 + ... + 9 = 45 búsquedas. Claro que la diferencia en tiempo no la notarás aquí, pero si fuera por ejemplo un vector con 1000 elementos quizá la diferencia fuera significativa.

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. /* escribe en cantidad la cantidad de veces que se repite
  6.  * cada elemento respectivo en arreglo, i.e., cantidad[i]
  7.  * representa la cantidad de veces que se repite arreglo[i]
  8.  * en el vector arreglo[]
  9.  */
  10. void vecesRepetidas(int arreglo[10], int cantidad[10]){
  11.  
  12.    int i, j, count;
  13.  
  14. cantidad[0] = 1; /* primer elemento solo aparece una vez */
  15. for ( i = 1; i < 10; i++ ) {
  16. count = 1;
  17. /* busca hacia atras los elementos del vector, y si encuentra repetidos,
  18. * incrementa en uno la cantidad de cada uno */
  19. for ( j = 0; j < i; j++ )
  20. if ( arreglo[j] == arreglo[i] ) {
  21. if ( count == 1 ) count = cantidad[j] + 1;
  22. cantidad[j] = count;
  23.     }
  24.    cantidad[i] = count;
  25. }
  26. }
  27.  
  28.  
  29. int main()
  30. {
  31.    const int tamano=10;
  32.    int arreglo[tamano]={2,3,3,4,2,42,34,1,2,5};
  33.    int cantidad[10];
  34.    string expresiones[tamano]={"primer","segundo","tercero","cuarto","quinto","sexto","septimo","octavo","noveno","decimo"};
  35.  
  36.  
  37.    vecesRepetidas( arreglo, cantidad);
  38.  
  39.    for(int i=0; i<tamano; i++){
  40.        cout<<"El elemento: " << arreglo[i] << ", esta repetido: "<<cantidad[i]<<" veces"<<endl;
  41.    }
  42.  
  43.    return 0;
  44. }

Salida en pantalla:

El elemento: 2, esta repetido: 3 veces
El elemento: 3, esta repetido: 2 veces
El elemento: 3, esta repetido: 2 veces
El elemento: 4, esta repetido: 1 veces
El elemento: 2, esta repetido: 3 veces
El elemento: 42, esta repetido: 1 veces
El elemento: 34, esta repetido: 1 veces
El elemento: 1, esta repetido: 1 veces
El elemento: 2, esta repetido: 3 veces
El elemento: 5, esta repetido: 1 veces


Saludos, Yoel.
P.D.- Sí acepto M.P.
24  Programación / Programación C/C++ / Re: Duda tonta de parámetros en: 18 Enero 2016, 15:19 pm
El problema que tienes es que en el cuerpo de la función operacion() no estás pidiendo los valores al usuario final, sino que los estás estableciendo tú mismo como a=2 y b=3.

Usando la función de entrada scanf() para pedir los valores, el programa quedaría como:

Código
  1. #include <stdio.h>
  2. int operacion(int a, int b) {
  3.  
  4. int s,r;
  5.  
  6. s=a+b;
  7. r=a-b;
  8.  
  9. printf("a = %d, b = %d\n", a, b);
  10.  
  11. printf("\nLa suma es: %d\n", s);
  12. printf("\nLa resta es: %d\n", r);
  13.  
  14. return 0;
  15. }
  16.  
  17. int main(void){
  18.  
  19. int x,y;
  20.  
  21. printf("Intro primer valor: ");
  22. scanf("%d", &x);
  23. printf("Intro segundo valor: ");
  24. scanf("%d", &y);
  25.  
  26. operacion(x,y);
  27. }
  28.  

Otro detalle, no se si lo notaste es que faltó el valor de retorno de operacion() el cual se declaró como int. Por eso debes añadir la instrucción "return 0" al final del cuerpo de la función.

La salida en pantalla queda como
Citar
Intro primer valor: 3
Intro segundo valor: 5
a = 3, b = 5

La suma es: 8

La resta es: -2

----------------------------------
Saludos, Yoel



0xFer dijo:

Lo correcto es inicializar los valores del parámetro antes de invocar a la función:

Bueno 0xFer, yo diría antes de invocar a la función operacion(), o también sería válido dentro del cuerpo de ella.

Una tercera alternativa sería usando los argc y argv[] que sugirió fary.

Saludos, Yoel.
25  Programación / Programación C/C++ / Re: Eclipse no me reconoce las funciones getch() y cls() en: 13 Enero 2015, 02:48 am
Lo que pasa es que getch() y cls() son de la biblioteca conio.h, la cual a su vez es propiedad intelectual de Borland (lo que ya explicó engelx). Por lo tanto sólo son admitidas por compiladores compatibles con Borland, y generalmente bajo sistema operativo Windows (se puede emular en Linux también).

Por ello, para asegurar que tu programa funcione todas las plataformas, debes recurrir a funciones estándares, como gecthar() en lugar de getch(), y en el caso de cls() reemplazar como dijo sabee por una orden system equivalente, aunque caemos en el mismo problema de dependencia del Sistema Operativo. Una alternativa siempre compatible es imprimir tantos '\n' como sea necesario para "borrar" la pantalla, que es de hecho lo que hacen cls y clear.

26  Programación / Programación C/C++ / Re: [AYUDA] Ejercicio concatenar en: 11 Enero 2015, 17:31 pm
Pues, la liberación de memoria la veo bien, habría que ver qué opinan lo otros foristas ......

Excepto la cadena "todo" cuya asignación de memoria ocurre dentro de la ejecución del primer do-while, por lo que no está garantizada en todos los casos.

Una sentencia más segura preguntaría primero si el malloc() se ejecutó primero, esto es:
Código
  1. if ( todo != NULL) {
  2.    free( todo );
  3.    todo = NULL;
  4. }

prueba de esta manera y me comentas.
27  Programación / Programación C/C++ / Re: Duda bucle do while en: 11 Enero 2015, 17:11 pm
Acabo de revisar, el error está en la ubicación del return, que lo haces dentro del while. Si el while no se ejecuta, entonces la instrucción return tampoco, por lo que función devuelve un valor por defecto 0.

La solución está en colocar el return fuera del while

Con la correción, aquí el programa que compuse para la prueba:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int lector_de_enteros();
  6. int lector_de_opciones( int );
  7.  
  8. int main () {
  9.  
  10. int numero;
  11. int maximo = 4;
  12.  
  13. numero = lector_de_opciones( maximo );
  14. cout << endl << " Numero fue: " << numero << endl;
  15.  
  16. return 0;
  17. }
  18.  
  19. int lector_de_enteros()
  20. {
  21. int numero = 0;
  22. cin >> numero;
  23. return numero;
  24. }
  25.  
  26. int lector_de_opciones(int valor_maximo)
  27. {
  28. int valor_elegido = 0;
  29.  
  30. cout << " Introduce un numero entre 1 y " << valor_maximo << ": ";
  31. valor_elegido = lector_de_enteros();
  32.  
  33. while ( valor_elegido < 1 || valor_elegido > valor_maximo ) {   // <-- correci'on aqu'i
  34. {
  35. cout << endl << "Vuelve a introducir un numero que este dentro del rango, por favor: ";
  36. valor_elegido = lector_de_enteros();     // <-- correccion
  37. }
  38. }
  39.  
  40. return valor_elegido;       // <-- mover a este lugar
  41. }

y parece funcionar bien (pruébalo tú y me dices:)

Código:
yoel@yoel-pc:~/Documentos/C/test$ ./test
 Introduce un numero entre 1 y 4: 2

 Numero fue: 2
yoel@yoel-pc:~/Documentos/C/test$ ./test
 Introduce un numero entre 1 y 4: 1

 Numero fue: 1
yoel@yoel-pc:~/Documentos/C/test$ ./test
 Introduce un numero entre 1 y 4: 4

 Numero fue: 4
yoel@yoel-pc:~/Documentos/C/test$ ./test
 Introduce un numero entre 1 y 4: 0

Vuelve a introducir un numero que este dentro del rango, por favor: 2

 Numero fue: 2
28  Programación / Programación C/C++ / Re: Duda bucle do while en: 11 Enero 2015, 16:46 pm
Ups, .... gracias rir3760, faltaba eso.

Claro que sí permitiría el 1 y el 4, pues la condición sólo fallaría para un número menor a 1 o mayor a 4, es decir un número como 0, o como 5.

Pruébalo y verás que funciona, reemplazando antes el "&&" por "||"
29  Programación / Programación C/C++ / Re: [AYUDA] Ejercicio concatenar en: 11 Enero 2015, 16:44 pm
Hola joraloma, el problema es que la función de entrada fgets() coge el carácter de nueva línea o ENTER y lo agrega al final de las cadenas ap1, ap2, por eso al concatenar e imprimir, se imprime dicho salto de línea pareciendo como si fueran dos cadenas distintas

Una solución es depurar la cadena recibida para eliminar el salto de línea hallado al final de la misma, reemplazándolo por el carácter nulo de terminación:

Código
  1. size_t n;
  2.  
  3. n = strlen( ap1 );
  4. if ( n > 0 && ap1[n-1] == '\n' ) ap1[n-1] = '\0';

y luego haces lo mismo para ap2, con lo cual debería solucionarse el problema.
30  Programación / Programación C/C++ / Re: Duda bucle do while en: 11 Enero 2015, 16:26 pm
Jejeje, claro ahora lo veo y creo que la razón era muy tonta. En la condición del while, debe ser "menor que 1" en lugar de "menor o igual que 1", a fin que el ciclo se active sólo cuando el número está fuera de rango.

Quedaría de este modo (pruébalo y me dices)

Código
  1.    int lector_de_opciones(int valor_maximo)
  2.    {
  3.       int valor_elegido=0;
  4.       cout << " Introduce un numero entre 1 y " << valor_maximo;
  5.       valor_elegido = lector_de_enteros();
  6.  
  7.       while ( valor_elegido < 1 && valor_elegido > valor_maximo ) {   // <-- correci'on aqu'i
  8.       {
  9.           cout << endl << "Vuelve a introducir un numero que este dentro del rango, por favor:" << endl;
  10.           valor_elegido = lector_de_enteros();     // <-- correccion
  11.       }
  12.  
  13.       return valor_elegido;
  14.    }

.... Y por cierto, introduje un endl antes de la frase "Vuelve a introducir un numero que este dentro del rango, por favor:", para producir el salto de línea respectivo antes de la misma y se vea más estético
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines