Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: fernando1122 en 22 Noviembre 2017, 02:26 am



Título: Imprimir matrices alineadas a la derecha C
Publicado por: fernando1122 en 22 Noviembre 2017, 02:26 am
hola mi programa debería imprimir la matriz alineada a la derecha pero con solo 1 espacio entre columna, logre que imprima alineada a la derecha pero necesito que solo tenga 1 espacio entre columna.
codigo;
Código:
#include <stdio.h>

int len(int n)
{
    int contador = 1;
    while (n/10 > 0) {
        n = n/10;
        contador ++;
    }
    return contador;
}
int max(int h, int arr[])
{
    int ans = arr[0];
    for(int i = 1; i < h; i++)
        if(ans < arr[i])
            ans = arr[i];
    return ans;
}

void pretty_print(int h, int w, int mtx[h][w])
{
    for(int j = 0; j < h; j++) {
        for(int i = 0; i < w; i++) {
            int n;
            int l;
            int ans;
            n = max(j, mtx[h]);
            l = len(n);
            ans = l + 1;
            char str[l + 1];
            sprintf(str, "%%%ii", ans);
            printf(str,mtx[j][i]);
        }
        printf("\n");
    }
}

int main()
{
    int mtx[4][3] = {{20,34,474},{2,433, 1},{563,1,65},{43,56,789}};
    pretty_print(4, 3, mtx);
    return 0;
}



Título: Re: Imprimir matrices alineadas a la derecha C
Publicado por: do-while en 22 Noviembre 2017, 06:14 am
Hay varios errores lógicos en tu código. Por ejemplo, si una fila contienes un valor positivo, por ejemplo 1, y el resto son valores negativos de más de una cifra max devolverá 1...

Cúrate en salud y trabaja con cadenas. printf puede trabajar con anchos de campo variables si utilizas cadenas:
Código
  1. printf("%*s",10,"Hola");
  2.  
Con el asterisco estas diciendo que el ancho de campo que hay que utilizar está contenido en una variable, y en la lista de parámetros primero indicas el ancho de campo y luego la cadena que quieres imprimir, así que el código anterior imprime "Hola" en 10 espacios (rellena el resto con espacios en blanco). No recuerdo si por defecto lo alineaba a la derecha o a la izquierda, si no lo alinea hacia el lado que quieras pon un signo negativo antes del asterisco.

Ahora tendrás que imprimir los números en una cadena. No se cual es el valor del entero más alto usando 64 bits, me parece que anda por el orden de 10^20, así que con una cadena de 25 caracteres te debería de bastar. Para imprimir un entero en una cadena se usa sprintf:
Código
  1. sprintf(una_cadena,"%d",un_entero);
  2.  

sprintf funciona como printf, pero su primer parámetro siempre es una cadena sobre la que se imprimirán los datos de la cadena de formato.

Ahora que sabes esto, puedes ir imprimiendo los valores en una cadena, usar strlen para saber cual es la longitud máxima de los números que tienes, almacenar el valor en una variable long_max, e imprimir cada valor, pasándolo a una cadena str_valor en un bucle:
Código
  1. printf("%*s ",long_max,str_valor);
  2.  

¡Saludos!

Estoy tonto. El ancho de campo variable, usando el asterisco, puedes aplicarlo a cualquier formato en el que se pueda definir un ancho de campo, cadenas, enteros y reales.

Lo único que tendrías que hacer sería calcular la longitud de cada número modificando la función que ya tienes. Si el número es positivo ya tienes la solución, sino, tendrás que añadirle uno a la longitud. Así que iteras sobre las columnas para saber cual es el número de mayor longitud y usas ese valor, como antes, para imprimir los valores usando la longitud máxima como ancho de campo.

Yo añadiría un vector más para almacenar la mayor longitud de cada columna. Así podrás imprimir los valores de cada fila con el ancho correcto sin tener que dar demasiadas vueltas.

Lo anterior lo dejo, así ves alguna funcion nueva (ya he visto que  tu ya la conocías, pero seguro que no todos los que entren la conocen XD).