对齐结构数组以制作表格

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对齐结构数组以制作表格相关的知识,希望对你有一定的参考价值。

我需要使用一组结构创建一个表,但是我遇到了一个问题,除了在windows.h库中使用gotoxy之外我没有找到解决方案。这是我制作的代码,但列中的文本和数字与第一行中的字段不对齐:

#include <stdio.h>
#include <stdlib.h>
struct  student
  {
    int broj_indeksa ;
    int godina_upisa ;
    char ime_studenta [20] ;
    char prezime_studenta [30] ;
    float prosecna_ocena_I ;
    float prosecna_ocena_II ;
    float prosecna_ocena_III ;

 } ISPIT [5000] ;

int main()
    {
    struct student ISPIT[5000] ;
    int n, i, j ;
    printf("Uneti broj studenata :");
    scanf("%d", &n) ;
    printf("
");

    for( i= 0 ; i < n ; i++)
    {
        printf("Uneti podatke za studenta broj %d
 
" ,  i+1) ;
        printf("Broj indeksa : 
") ;
        scanf("%d", &ISPIT[ i ].broj_indeksa) ;
        printf("Godina upisa : 
") ;
        scanf("%d" , &ISPIT[ i ].godina_upisa) ;
        printf("Ime : 
") ;
        scanf("%s", &ISPIT[ i ].ime_studenta) ;
        printf("Prezime : 
") ;
        scanf("%s" ,  &ISPIT[ i ].prezime_studenta );
        printf("Prosecna ocena u prvoj godini : 
") ;
        scanf("%f" ,  &ISPIT[ i ].prosecna_ocena_I  );
        printf("Prosecna ocena u drugoj godini : 
") ;
        scanf("%f" ,  &ISPIT[ i ].prosecna_ocena_II  );
        printf("Prosecna ocena u trecoj godini : 
") ;
        scanf("%f" ,  &ISPIT[ i ].prosecna_ocena_III  );
        system("cls");
    }
    printf ("Broj indeksa   Godina upisa    Ime    Prezime    Prosek I    Prosek II    Prosek III");   // HOW CAN I ALIGN THIS FOR LOOP BELOW ?
    printf("

");

    for(i=0;i<n;i++)
    {
    printf("%d  ",ISPIT [ i ].broj_indeksa );
    printf("%d  ",ISPIT [ i ].godina_upisa );
    printf("%s  ",ISPIT [ i ].ime_studenta );
    printf("%s  ",ISPIT [ i ].prezime_studenta );
    printf("%.1f    ",ISPIT [ i ].prosecna_ocena_I );
    printf("%.1f    ",ISPIT [ i ].prosecna_ocena_II );
    printf("%.1f    ",ISPIT [ i ].prosecna_ocena_III );
    printf("
");
    }
return 0;
}

我的问题是:如何在不使用除标准库之外的任何库的情况下使用表格查看结构数组?

答案

您可以将printf与left-justify标志( - )一起使用。

 printf("%-25s%-20s%-15s%-15s%-15s%-15s%-15s
", "Broj Indeksa", "Godina Upisa", "Ime", "Prezime", "Ocena1", "Ocena2", "Ocena3");
 for(i=0;i<n;i++)
 {
    printf("%-25d%-20d%-15s%-15s%-15.2f%-15.2f%-15.2f
", ISPIT [ i ].broj_indeksa,
                                                          ISPIT [ i ].godina_upisa,
                                                          ISPIT [ i ].ime_studenta,
                                                          ISPIT [ i ].prezime_studenta,
                                                          ISPIT [ i ].prosecna_ocena_I,
                                                          ISPIT [ i ].prosecna_ocena_II,
                                                          ISPIT [ i ].prosecna_ocena_III);
 }
另一答案
#include <stdio.h>
#include <stdlib.h>
struct  student
{
    int broj_indeksa ;
    int godina_upisa ;
    char ime_studenta [15] ;
    char prezime_studenta [25] ;
    float prosecna_ocena_I ;
    float prosecna_ocena_II;
    float prosecna_ocena_III ;

} ISPIT [5000] , a;

int main()
{
    struct student ISPIT[5000] ;
    int n, i, j;
    //      UCITAVANJE BROJA STUDENATA
    printf("Uneti broj studenata :");
    scanf("%d", &n) ;
    printf("
");
    //      UCITAVANJE POJEDINACNIH PODATAKA ZA STUDENTA
    for( i= 0 ; i < n ; i++)
        {
            printf("Uneti podatke za studenta broj %d
 
" ,  i+1) ;
            printf("Broj indeksa : 
") ;
            scanf("%d", &ISPIT[ i ].broj_indeksa) ;
            printf("Godina upisa : 
") ;
            scanf("%d" , &ISPIT[ i ].godina_upisa) ;
            printf("Ime : 
") ;
            scanf("%s", &ISPIT[ i ].ime_studenta) ;
            printf("Prezime : 
") ;
            scanf("%s" ,  &ISPIT[ i ].prezime_studenta );
            printf("Prosecna ocena u prvoj godini : 
") ;
            scanf("%f" ,  &ISPIT[ i ].prosecna_ocena_I  );
            printf("Prosecna ocena u drugoj godini : 
") ;
            scanf("%f" ,  &ISPIT[ i ].prosecna_ocena_II  );
            printf("Prosecna ocena u trecoj godini : 
") ;
            scanf("%f" ,  &ISPIT[ i ].prosecna_ocena_III  );
            system("cls");
        }

        //      PRIKAZIVANJE
    float prosecna_ocena_I ;
    float prosecna_ocena_II;
    float prosecna_ocena_III;
    int k ;

    printf("



");
    for( k = 0 ; k < 137; k++) { printf("=") ; } printf("
");
    printf("| %-15s | %-15s | %-15.15s | %-25.25s | %-15s | %-15s | %-15s |
", "Broj Indeksa", "Godina Upisa", "Ime", "Prezime", "Ocena I", "Ocena II", "Ocena III");
    for( k = 0 ; k < 137; k++) { printf("=") ; }
    printf("
");
    for(i=0;i<n;i++)
        {
            printf("
");
            printf("| %-15d | %-15d | %-15.15s | %-25.25s | %-15.1f | %-15.1f | %-15.1f |
",
                                                      ISPIT [ i ].broj_indeksa,
                                                      ISPIT [ i ].godina_upisa,
                                                      ISPIT [ i ].ime_studenta,
                                                      ISPIT [ i ].prezime_studenta,
                                                      ISPIT [ i ].prosecna_ocena_I,
                                                      ISPIT [ i ].prosecna_ocena_II  = (ISPIT [ i ].prosecna_ocena_I +ISPIT [ i ].prosecna_ocena_II ) / 2,
                                                      ISPIT [ i ].prosecna_ocena_III = (ISPIT [ i ].prosecna_ocena_I +ISPIT [ i ].prosecna_ocena_II +ISPIT [ i ].prosecna_ocena_III ) / 3);

                                                        for( k = 0 ; k< 137; k++) { printf("_"); }
                                                        printf("
");
        }
    system("pause");
    system("cls");

    // SORTIRANJE PREMA GODINI UPISA U OPADAJUCEM PORETKU
    for ( i = 1 ; i < n ; i++)
        {
            for ( j =0 ; j < n-i ; j++)
                {
                    if ( ISPIT [ j ].godina_upisa < ISPIT [ j+1 ].godina_upisa)
                        {
                            a= ISPIT [ j ] ;
                            ISPIT [ j ] = ISPIT [ j+1 ] ;
                            ISPIT [ j+1 ] = a ;
                        }
                }
        }

    printf("

") ;
    printf("Posle sortiranja po godini upisa u opadajucem poretku 

");
    for( k = 0 ; k < 137; k++) { printf("=") ; } printf("
");
    printf("| %-15s | %-15s | %-15.15s | %-25.25s | %-15s | %-15s | %-15s |
", "Broj Indeksa", "Godina Upisa", "Ime", "Prezime", "Ocena I", "Ocena II", "Ocena III");
    for( k = 0 ; k < 137; k++) { printf("=") ; }
    printf("
");

    for(i=0;i<n;i++)
        {
            printf("
");
            printf("| %-15d | %-15d | %-15.15s | %-25.25s | %-15.1f | %-15.1f | %-15.1f |
",
                                                      ISPIT [ i ].broj_indeksa,
                                                      ISPIT [ i ].godina_upisa,
                                                      ISPIT [ i ].ime_studenta,
                                                      ISPIT [ i ].prezime_studenta,
                                                      ISPIT [ i ].prosecna_ocena_I,
                                                      ISPIT [ i ].prosecna_ocena_II ,
                                                      ISPIT [ i ].prosecna_ocena_III );

                                                        for( k = 0 ; k< 137; k++) { printf("_"); }
                                                        printf("
");
        }
    for ( i = 1 ; i < n ; i++)
            {
                for ( j = 0 ; j < n-i ; j++)
                    {
                        if ( ISPIT [ j ].prosecna_ocena_III < ISPIT [ j+1 ].prosecna_ocena_III && ISPIT [ j ].godina_upisa == ISPIT [ j+1 ].godina_upisa)
                            {
                                a= ISPIT [ j ] ;
                                ISPIT [ j ] = ISPIT [ j+1 ] ;
                                ISPIT [ j+1 ] = a ;
                            }
                    }
            }

    system("pause");
    system("cls");

    printf("

") ;
    printf("Posle sortiranja po prosecnoj oceni u opadajucem poretku 

");
    for( k = 0 ; k < 137; k++) { printf("=") ; } printf("
");
    printf("| %-15s | %-15s | %-15.15s | %-25.25s | %-15s | %-15s | %-15s |
", "Broj Indeksa", "Godina Upisa", "Ime", "Prezime", "Ocena I", "Ocena II", "Ocena III");
    for( k = 0 ; k < 137; k++) { printf("=") ; }
    printf("
");

    for(i=0;i<n;i++)
        {
            printf("
");
            printf("| %-15d | %-15d | %-15.15s | %-25.25s | %-15.1f | %-15.1f | %-15.1f |
",
                                                      ISPIT [ i ].broj_indeksa,
                                                      ISPIT [ i ].godina_upisa,
                                                      ISPIT [ i ].ime_studenta,
                                                      ISPIT [ i ].prezime_studenta,
                                                      ISPIT [ i ].prosecna_ocena_I,
                                                      ISPIT [ i ].prosecna_ocena_II ,
                                                      ISPIT [ i ].prosecna_ocena_III );

                                                        for( k = 0 ; k< 137; k++) { printf("_"); }
                                                        printf("
");
        }
system("pause");
return 0;
}

我终于做到了!尼克S,你的回答对我很有帮助。这是想要做的。

以上是关于对齐结构数组以制作表格的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何将文本视图与另一个文本视图垂直对齐,以制作类似于正确对齐的表格?

GLSL 结构数组 - 内存分配/对齐

为啥此代码片段返回意外结果?

以 1 的结构成员对齐方式编译 Qt

Latex 排版技巧 1——数学公式对齐

excel表格基本操作教程 Excel表格怎么操作