Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jay en 2 Abril 2019, 08:21 am



Título: TENGO VARIAS DUDAS CON MI CODIGO
Publicado por: Jay en 2 Abril 2019, 08:21 am
TENGO VARIAS DUDAS CON MI CODIGO
1- NO SE POR QUE CUANDO ME IMPRIME LA POSICION EN LA QUE ESTA EL NUMERO MAYOR Y EL MENOR ME DA LA MISMA POSICION DEBERIA SER DIFERENTE

2- COMO PUEDO CONTAR LA CANTIDAD DE NUMERO POSITIVOS QUE SON Y CUALES SON, YA CONSIGO QUE ME HAGA LA SUMA DE LOS NUMEROS POSITIVOS Y NEGATIVOS PERO NO CONSIGO SABER COMO IMPRIMIR CUALES SON Y CUANTOS SON



#include <stdio.h>


int main()
{
        int arreglo[50],i, numero=10, positivos=0, negativos=0, ceros=0, mayor=0, menor=0, posicion=0;



        for (i = 0; i<numero; i++)//Se llena el arreglo con los 10 elementos que le pones
        {
        printf("Introduzca numero: \n");
        scanf("%d",&arreglo);

        }

        for(i=0; i<numero; i++){

            if(arreglo > mayor){
          mayor = arreglo;
          posicion = i;

        }

        if(arreglo < menor){
          menor = arreglo;
          posicion = i;

        }
        }

      for(i = 0; i<numero; i++)
        {
        if(arreglo > 0)
            positivos+=arreglo;

        }


      for(i = 0; i<numero; i++)
        {
        if(arreglo < 0)
            negativos+=arreglo;

        }




      printf("\nSuma de numeros positivos: %d", positivos);
      printf("\nSuma de numeros negativos: %d", negativos);
      printf("\nEl numero mayor es: %d y se encuentra en la posicion: %d", mayor,posicion);
      printf("\nEl numero menor es: %d y se encuentra en la posicion: %d", menor,posicion);



    return 0;
}


Título: Re: TENGO VARIAS DUDAS CON MI CODIGO
Publicado por: K-YreX en 2 Abril 2019, 10:41 am
Para la próxima el código del programa entre etiquetas de Código GeSHi (puedes seleccionar el lenguaje de programación apropiado en un desplegable que hay encima del cuadro de texto)

Ese código tiene un problema. Si introduces todos los elementos positivos, el mínimo va a ser incorrecto y si introduces todos los elementos negativos, el máximo va a ser incorrecto... :rolleyes: :rolleyes:
Además tienes una variable que parece que es para contar los 0, pero no la estás usando...

Citar
1- NO SE POR QUE CUANDO ME IMPRIME LA POSICION EN LA QUE ESTA EL NUMERO MAYOR Y EL MENOR ME DA LA MISMA POSICION DEBERIA SER DIFERENTE
La posición es la misma porque lo estás guardando en la misma variable <posicion>... Por eso se sobreescribe la primera asignación que es la posición del número mayor y se guarda la última asignación que haces que es la posición del menor número del array.

Citar
2- COMO PUEDO CONTAR LA CANTIDAD DE NUMERO POSITIVOS QUE SON Y CUALES SON, YA CONSIGO QUE ME HAGA LA SUMA DE LOS NUMEROS POSITIVOS Y NEGATIVOS PERO NO CONSIGO SABER COMO IMPRIMIR CUALES SON Y CUANTOS SON
Para contar los números positivos y los negativos, crea dos variables <cantidad_positivos> y <cantidad_negativos> y como ya tienes una condición para detectar cuándo un número es positivo o negativo, sólo tienes que incrementar la variable correspondiente en cada caso.
Para saber cuáles son puedes:
  • Obtenerlo al momento que recorres el array.
Código:
Numeros positivos:
Desde i := 0 hasta elementos-1
    si v[i] > 0
        mostrar v[i]
    fin si

Numeros negativos:
Desde i := 0 hasta elementos-1
    si v[i] < 0
        mostrar v[i]
    fin si
También puedes recorrer el array una sola vez y mostrar cada elemento en una línea seguido de "positivo" o "negativo" según el caso.

  • Guardarlos en otro array auxiliar
Código:
Desde i := 0 hasta elementos-1
    si v[i] > 0
        guardar v[i] en array_positivos
    sino
        guardar v[i] en array_negativos
    fin si

  • Guardar los índices en otro array auxiliar. En este caso es un poco lío pero si trabajas con objetos más grandes es una forma de ahorrar espacio.
Código:
Desde i := 0 hasta elementos-1
    si v[i] > 0
        guardar i en indices positivos
    sino
        guardar i en indices negativos
    fin si


Título: Re: TENGO VARIAS DUDAS CON MI CODIGO
Publicado por: Phoiinex en 2 Abril 2019, 20:16 pm
Hola,

Soy nuevo en esto de la programación, vi tu duda y me pareció un buen reto el  poder encontrar solución tanto al programa, como a tus dudas, espero haber ayudado.

Código:
#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
int arreglo[5], i, numero = 5, positivos = 0, negativos = 0,  mayor = 0, menor = 0, posicion = 0, posicion1 = 0,x;
int pos[5] = {}, neg[5] = {};//inicializamos todas las posiciones en 0, ya que por defecto el compilador inicializa los elementos que no tienen un valor específico.



for (i = 0; i < numero; i++)//Se llena el arreglo con los 10 elementos que le pones
{
printf("Introduzca numero: \n");
cin >>arreglo[i];

     //vamos guardando en nuestros array auxiliares los valor negativos y positivos
if (arreglo[i] > 0) {
pos[i] = arreglo[i];


}else {
neg[i] = arreglo[i];
}

}

for (i = 0; i < numero; i++) {

if (arreglo[i] > mayor) {
mayor = arreglo[i];
posicion = i;

}

if (arreglo[i] < menor) {
menor = arreglo[i];
posicion1 = i;

}
}

for (i = 0; i < numero; i++)
{
if (arreglo[i] > 0)
positivos += arreglo[i];

}


for (i = 0; i < numero; i++)
{
if (arreglo[i] < 0)
negativos += arreglo[i];

}


//Salidas por pantalla
cout << "Los numero positivos son: ";
for (i = 0; i < numero; i++) //bucle que nos permitira imprimir todos los numero positivos como negativos
{
if (pos[i] > 0)   
{
cout << (pos[i]) << "  ";
}
}
printf("\nSuma de numeros positivos: %d", positivos);
printf("\nEl numero mayor es: %d y se encuentra en la posicion: %d", mayor, posicion);

cout << "\nLos numero negativos son: ";
for (i = 0; i < numero; i++) //bucle que nos permitira imprimir todos los numero positivos como negativos
{
if (neg[i] < 0)
{
cout << (neg[i]) << "  ";
}

}
printf("\nSuma de numeros negativos: %d", negativos);
printf("\nEl numero menor es: %d y se encuentra en la posicion: %d", menor, posicion1);

return 0;
}

 

YreX-DwX gracias por tus opciones me guié por ellas.



Título: Re: TENGO VARIAS DUDAS CON MI CODIGO
Publicado por: K-YreX en 2 Abril 2019, 21:08 pm
Hola,
Soy nuevo en esto de la programación, vi tu duda y me pareció un buen reto el  poder encontrar solución tanto al programa, como a tus dudas, espero haber ayudado.
Código
  1. #include <iostream>
  2. #include <conio.h>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. int arreglo[5], i, numero = 5, positivos = 0, negativos = 0,  mayor = 0, menor = 0, posicion = 0, posicion1 = 0,x;
  8. int pos[5] = {}, neg[5] = {};//inicializamos todas las posiciones en 0, ya que por defecto el compilador inicializa los elementos que no tienen un valor específico.
  9.  
  10.  
  11.  
  12. for (i = 0; i < numero; i++)//Se llena el arreglo con los 10 elementos que le pones
  13. {
  14. printf("Introduzca numero: \n");
  15. cin >>arreglo[i];
  16.  
  17.     //vamos guardando en nuestros array auxiliares los valor negativos y positivos
  18. if (arreglo[i] > 0) {
  19. pos[i] = arreglo[i];
  20.  
  21.  
  22. }else {
  23. neg[i] = arreglo[i];
  24. }
  25.  
  26. }
  27.  
  28. for (i = 0; i < numero; i++) {
  29.  
  30. if (arreglo[i] > mayor) {
  31. mayor = arreglo[i];
  32. posicion = i;
  33.  
  34. }
  35.  
  36. if (arreglo[i] < menor) {
  37. menor = arreglo[i];
  38. posicion1 = i;
  39.  
  40. }
  41. }
  42.  
  43. for (i = 0; i < numero; i++)
  44. {
  45. if (arreglo[i] > 0)
  46. positivos += arreglo[i];
  47.  
  48. }
  49.  
  50.  
  51. for (i = 0; i < numero; i++)
  52. {
  53. if (arreglo[i] < 0)
  54. negativos += arreglo[i];
  55.  
  56. }
  57.  
  58.  
  59. //Salidas por pantalla
  60. cout << "Los numero positivos son: ";
  61. for (i = 0; i < numero; i++) //bucle que nos permitira imprimir todos los numero positivos como negativos
  62. {
  63. if (pos[i] > 0)  
  64. {
  65. cout << (pos[i]) << "  ";
  66. }
  67. }
  68. printf("\nSuma de numeros positivos: %d", positivos);
  69. printf("\nEl numero mayor es: %d y se encuentra en la posicion: %d", mayor, posicion);
  70.  
  71. cout << "\nLos numero negativos son: ";
  72. for (i = 0; i < numero; i++) //bucle que nos permitira imprimir todos los numero positivos como negativos
  73. {
  74. if (neg[i] < 0)
  75. {
  76. cout << (neg[i]) << "  ";
  77. }
  78.  
  79. }
  80. printf("\nSuma de numeros negativos: %d", negativos);
  81. printf("\nEl numero menor es: %d y se encuentra en la posicion: %d", menor, posicion1);
  82.  
  83. return 0;
  84. }
  85.  
 
Ya que estás empezando vamos a comentar el programa aunque he de decir que no se hacen tareas por lo que no deberías haber puesto tu código tan pronto. De todos modos tiene algunos fallos así que vamos a verlos. Al final dejo otras correcciones aunque no son errores como tal está bien corregirlos también:
  • ¿Has probado a ejecutarlo?
Cuando muestras los negativos y los positivos, seguro que no aparecen como esperarías. Estás guardando valores en dos arrays/arreglos distintos por lo que cada uno va  a su "ritmo". No puedes usar sólo el contador <i>. Piénsalo a ver.
  • Problema si todos los valores son positivos o si todos los valores son negativos
Estás igual que al principio. Si ponemos <maximo = 0> y <minimo = 0>, si introducimos todo números positivos nos va a dar como resultado que el más pequeño es 0 cuando no lo es y si introducimos todo números negativos, nos va a dar que el máximo es 0 cuando tampoco lo es.

No sé si me he dejado algún error más, pero los más visibles son esos.

Ahora vamos a ver algunos detalles:
  • La librería <conio.h>
Esa librería no es estándar por lo que no todos los compiladores pueden usarla y es una librería que no es necesaria. La función más común de esa librería suele ser <getch()> que podemos sustituir por <getchar()> que se encuentra en <stdio.h> (en C) o <cstdio> (en C++) o por <cin.get()> que se encuentra en <iostream> en C++.
  • Mezcla de <printf()> y <cout>
<printf()> es una función incluida en <stdio.h> (en C) y <cstdio> (en C++). Sin embargo es más típica de C ya que en C++ se suele optar por usar <cin> y <cout> (incluído en <iostream>) para entrada y salida sustituyendo a <printf()> y <scanf()> de C.
  • Uso de constantes
No se recomienda usar "números mágicos", es decir, números literales que aparecen de repente y no sabes por qué tienen ese valor. ¿Por qué un 5? Imagina que tienes un programa muy grande y tienes muchos arrays/arreglos de tamaño 5 y un día dices "voy a aumentar la capacidad a 10", tendrías que sustituir todos los "5" por "10" con cuidado de que haya algún 5 que no tengas que cambiar. Para ello usa constantes y sólo tendrás que cambiar el valor de la constante una vez para que cambie en todo el programa.
Código
  1. const int MAX_SIZE = 5;
  2. int main(){
  3.    int array[MAX_SIZE];
  4.    // ...
  5. }
PD: La variable <numeros = 5> es lo que hace en tu caso de constante pero no lo aprovechas tanto como podrías/deberías (además constante mejor para asegurarte de que no vas a cambiar su valor por error).
  • Nombres de las variables
Asegúrate de que puedes saber qué indica una variable leyendo únicamente su nombre y no porque lo hayas programado tú y te acuerdes que "x" es tal cosa.
PD: Tienes una variable <x> que no usas en todo el programa me parece.
Por ejemplo el array de <pos> podría dar lugar a equivocación ya que "posiciones" se suele abreviar como "pos" en muchos sitios. Igual que <posicion> y <posicion1>; mejor que sean algo como <posicion_maximo> y <posicion_minimo>.
  • Sentencias innecesarias
A partir de la línea 60, cuando quieres mostrar los positivos y los negativos. Recorres los vectores/arrays/arreglos :xD donde has guardado por un lado los positivos y por otro los negativos. No tienes que comprobar otra vez que el valor que hay guardado sea positivo o negativo respectivamente. Además usa dos contadores para saber cuántos positivos hay (esos serán los que tienes que recorrer cuando los quieras mostrar) y otro igual pero para los negativos. (Si tienes 3 positivos y 2 negativos, no muestres 5 posiciones porque las últimas contendrán basura o 0).

Creo que no me dejo nada más. Suerte y ya me comentarás lo que consigas avanzar... O lo que no. :-X :-X