Avatar billede suppai Nybegynder
21. januar 2005 - 13:31 Der er 2 kommentarer og
1 løsning

værdibestemt feltstørrelse ved visning af værdier i 2-dim. array

Hej,

Jeg er igang med at skrive et program til løsning af lineære ligningssystemer og der er en kosmetisk detalje jeg gerne vil have ordnet. I forbindelse med beregningerne taster brugeren nogle værdier ind i et 2 dimensionalt array, der derefter vises som en matrix, hvor størrelsen af hvert felt afgøres af værdiens udformning (1 = 1, 245 = 3, 1.2 = 3 osv.), hvilket vil sige at, matrix værdierne ikke vil placeres over hinanden, hvis felternes størrelser varierer meget. Jeg ved at felternes størrelse kan fastsættes ved setw(),som jeg bruger nu, men er interesseret i at felternes størrelse er lig feltstørrelsen for den værdi der fylder mest. Jeg er lidt n00b, så håber det er til at forstå. 

Her er det for loop, der styrer visningen pt. med setw(3):

for(i=0;i<n;i++)
    {
    cout<<"  [ ";
    for(j=0;j<n+1;j++)
        {   
        cout<<setw(3);
        cout.setf(ios::left);
        cout<<A[i][j]<<" ";
        if(j==n-1)cout<<"| ";
           
        }
    cout<<"]\n";   
    }
Avatar billede arne_v Ekspert
21. januar 2005 - 20:49 #1
Det er faktisk ikke helt simpelt.

Men her er noget kode til inspiration:

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

void print1(int *ia, int rows, int cols)
{
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        {
            if(j > 0)
            {
                cout << " ";
            }
            cout << ia[i * cols + j];
        }
        cout << endl;
    }
}

int calcwid(int *ia, int rows, int cols,int *colwid)
{
    for(int j = 0; j < cols; j++)
    {
        colwid[j] = 0;
    }
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        {
            int wid;
            if(ia[i * cols + j] == 0)
            {
                wid = 1;
            }
            else if(ia[i * cols + j] > 0)
            {
                wid = (int)(log10((double)ia[i * cols + j]) + 1);
            }
            else
            {
                wid = (int)(log10((double)ia[i * cols + j]) + 2);
            }
            if(wid > colwid[j])
            {
                colwid[j] = wid;
            }
        }
    }
}

void print2(int *ia, int rows, int cols)
{
    int *colwid = new int[cols];
    calcwid(ia, rows, cols, colwid);
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        {
            if(j > 0)
            {
                cout << " ";
            }
            cout << setw(colwid[j]);
            cout << ia[i * cols + j];
            cout << setw(0);
        }
        cout << endl;
    }
    delete[] colwid;
}

void print1(double *xa, int rows, int cols)
{
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        {
            if(j > 0)
            {
                cout << " ";
            }
            cout << xa[i * cols + j];
        }
        cout << endl;
    }
}

int calcwid(double *xa, int rows, int cols,int *colwid1, int *colwid2)
{
    for(int j = 0; j < cols; j++)
    {
        colwid1[j] = 0;
        colwid2[j] = 1;
    }
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        {
            int wid1;
            if(xa[i * cols + j] == 0)
            {
                wid1 = 1;
            }
            else if(xa[i * cols + j] > 0)
            {
                wid1 = (int)(log10(xa[i * cols + j]) + 1);
            }
            else
            {
                wid1 = (int)(log10(xa[i * cols + j]) + 2);
            }
            if(wid1 > colwid1[j])
            {
                colwid1[j] = wid1;
            }
            int wid2 = 0;
            double tmp = xa[i * cols + j] - (int)xa[i * cols + j];
            while(wid2 < 10 && tmp > 0.00001 && tmp < 0.99999)
            {
                wid2++;
                tmp = 10 * tmp;
                tmp = tmp - (int)tmp;
            }
            if(wid2 > colwid2[j])
            {
                colwid2[j] = wid2;
            }
        }
    }
}

void print2(double *xa, int rows, int cols)
{
    cout.setf(ios::fixed);
    cout << setprecision(1);
    int *colwid1 = new int[cols];
    int *colwid2 = new int[cols];
    calcwid(xa, rows, cols, colwid1, colwid2);
    for(int i = 0; i < rows; i++)
    {
        for(int j = 0; j < cols; j++)
        {
            if(j > 0)
            {
                cout << " ";
            }
            cout << setw(colwid1[j] + 1 + colwid2[j]) << setprecision(colwid2[j]);
            cout << xa[i * cols + j];
            cout << setw(0);
        }
        cout << endl;
    }
    delete[] colwid1;
    delete[] colwid2;
}

int main()
{
    int ia[2][4] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000 };
    print1(&ia[0][0], 2, 4);
    print2(&ia[0][0], 2, 4);
    double xa[2][4] = { 1.001, 10.01, 100.1, 1000, 10000, 100000, 1000000, 10000000.99 };
    print1(&xa[0][0], 2, 4);
    print2(&xa[0][0], 2, 4);
    return 0;
}
Avatar billede suppai Nybegynder
23. januar 2005 - 16:33 #2
Tak for indsatsen. det er lidt mere avanceret end jeg havde håbet på, men såvidt jeg lige kan se ved et hurtigt blik på det, ser det ikke helt umuligt ud. Jeg havde lidt håbet på, at der var en indbygget funktion til formålet, da man umiddelbart sq mene, at det var noget, som er brugt hyppigt. men læg et svar ud, så du ka få point.
Avatar billede arne_v Ekspert
23. januar 2005 - 16:52 #3
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester