Suma triangulo superior matriz

Iniciado por Constantinoplero, 22 Enero 2012, 20:16 PM

0 Miembros y 1 Visitante están viendo este tema.

Constantinoplero

Buenas,

No entiendo porque este código me da siempre el último elemento de la diagonal principal de la matriz. Quizás el fallo esté en los 'for', pero llevo todo el día practicando y yo ya  no veo el error.

Lo que me tendría que dar en realidad es la suma de los elementos que están por encima de la diagonal principal de la matriz.

El código es éste:

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

void leer_matriz(unsigned v[][MAX], unsigned t);
void triangulo_superior(unsigned v[][MAX], unsigned t);

int main()
{
    unsigned t, v[MAX][MAX];
    int x;

    do
    {
        printf("Cuantos elementos va a tener la matriz?: ");
        scanf("%u", &t);
    }while(t<0 || t>MAX);

    leer_matriz(v, t);

triangulo_superior(v, t);


    return 0;

}

void leer_matriz(unsigned v[][MAX], unsigned t)
{
    unsigned i, j;

    for(i=0; i<t; i++)
        for(j=0; j<t; j++)
        {
            printf("Dame el elemento %u de la columna %u: ", j+1, i+1);
            scanf("%u", &v[i][j]);
        }

    for(i=0; i<t; i++)
    {
        for(j=0; j<t; j++)
            printf("%u  ", v[i][j]);

        printf("\n");
    }
}

void triangulo_superior(unsigned v[][MAX], unsigned t)
{
    unsigned i, j;
    int x=0;

    for(i=0; i<t; i++)
        for(j=1; j<=i; j++)
        x=x+v[i][j];

        printf("La suma es: %d", x);
}


Saludos!
Más que buenos principios prefiero mejores finales.

Akai

Podrías expresarte con más claridad?

Es un error de resultado o de ejecución?

Qué se supone debería hacer, y que hace en realidad?

Leyendo tu post no queda muy claro que se diga

Aun así, suponiendo que lo que quieres sumar es los elementos superiores a la diagonal, aquí tienes un problema:

   for(i=0; i<t; i++)
       for(j=1; j<=i; j++)


Con ese bucle estás sumando los elementos que hay entre el segundo elemento de cada columna y la diagonal, esta inclusive.

La corrección:
   for(i=0; i<t; i++)
       for(j=i+1; j<t; j++)



Constantinoplero

Sí, claro. Lo que el programa debería hacer es hallar la suma de todos los elementos de la matriz que estén por encima de la diagonal principal, sin incluirla.

Por ejemplo:

1 2 3
4 5 6
7 8 9

Sería: 2+6+3=11.

Lo que mi código hubiera hecho era darme como resultado el '9'.

Y digo hacía porque he cambiado mis for por los tuyos y ya va bien.

Gracias. Miaré porqué era.
Más que buenos principios prefiero mejores finales.

bdoX

#3
La verdad es que no le veo el grado de dificultad.

Esto es lo que hace toda la tarea.


   for(i=0; i<t; i++)
       for(j=0; j<t; j++)
           if ( j > i )
               x += v[i][j];


Acá dejo el code completo


#include <stdio.h>

#define MAX 5

void leer_matriz (unsigned v[][MAX], unsigned t);
void triangulo_superior (unsigned v[][MAX], unsigned t);

int main()
{
   unsigned t, v[MAX][MAX];
   
   do
   {
       printf ( "Cuantos elementos va a tener la matriz?: " );
       scanf ( "%u", &t );
   } while (t < 0 || t > MAX);

   leer_matriz (v, t);
   triangulo_superior (v, t);

   setbuf (stdin, NULL);
   getchar ();
   return 0;
}

void leer_matriz (unsigned v[][MAX], unsigned t)
{
   unsigned i, j;

   for (i = 0; i < t; i++)
   {
       for (j = 0; j < t; j++)
       {
           printf ( "Dame el elemento M[%u][%u]: ", (i + 1), (j + 1) );
           scanf ( "%u", &v[i][j] );
       }
   }

   for (i = 0; i < t; i++)
   {
       for (j = 0; j < t; j++)
           printf ( "%u\t", v[i][j] );

       printf ( "\n" );
   }
}

void triangulo_superior (unsigned v[][MAX], unsigned t)
{
   unsigned i, j;
   int x = 0;

   for (i = 0; i < t; i++)
       for (j = 0; j < t; j++)
           if (j > i)
               x += v[i][j];

   printf ( "La suma es: %d", x );
}



saludos!

Akai

Cita de: CarLiLlooo en 22 Enero 2012, 20:36 PM

Gracias. Miaré porqué era.

Te lo expliqué en mi post:

Cita de: Akai en 22 Enero 2012, 20:31 PM

Con ese bucle estás sumando los elementos que hay entre el segundo elemento de cada columna y la diagonal, esta inclusive.

Constantinoplero

Sí, pero que tú me lo digas y yo por tanto sepa la respuesta, no quiere decir que lo entienda  ;)

Gracias a los dos por ayudarme.
Más que buenos principios prefiero mejores finales.