Yanyg - SAN Software Engineer

大学时一份作业代码备案

这是大学的一份作业,最近整理时在网上搜到,备份到这里。用TurboC编译,运行显示一个柱状图。还记得当时这个作业是拷贝在3.5寸软盘里执行的。临交作业前软盘损坏,紧急的重新输入了一次。当时对C语言是多么的有兴趣。

#include<stdio.h>

#define SC scanf
#define PR printf

struct person
{
        char name[20];
        int count,code;
        float pec;
} leader[20];

int main()
{
        int n,i;
        char c;
        void scan(struct person leader[],int n);
        void arith(struct person leader[],int n);
        void diagram(struct person leader[],int n);
        PR("The Course Is Made By Tongxin'Yiban Yan Yonggang.\nNow Press Enter For Running The Course.\n");
        while(getchar()!='\n');
        while(1)
                {PR("\nInput the number of candidates:");
                        do
                                {SC("%d",&n);
                                        if(n>1&&n<=20)break;
                                        else if(n<=1)PR("The candidates'number is too small.Input again!");
                                        else if(n>20)PR("The candidates'number is too large.Input again!");
                                }while(1);
                        scan(leader,n);
                        arith(leader,n);
                        PR("\nNow press any key for looking diagram.");
                        getchar();
                        getchar();
                        diagram(leader,n);
                        for(;;)
                                {
                                        PR("\nContinued(Y/N)?");
                                        c=getchar();
                                        getchar();
                                        if(c=='Y'||c=='y'||c=='N'||c=='n')break;
                                }
                        if(c=='y'||c=='Y'){for(i=0;i<20;i++)leader[i].count=0;continue;}
                        else break;
                }
}
void scan(struct person leader[],int n)
{
        int i,j,k,flag=1;
        static char a1[67][35];
        char c;
        for(j=0;j<34;j++)
                for(i=0;i<67;i+=3)
                        a1[i][j]=196;
        for(i=0;i<67;i++)
                {
                        a1[i][0]=179;a1[i][20]=179;a1[i][34]=179;
                }
        for(i=3;i<=3*n;i+=3)
                {
                        a1[i][0]=195;a1[i][20]=197;a1[i][34]=180;
                }
        a1[0][0]=218;a1[0][20]=194;a1[0][34]=191;a1[3*n+3][0]=192;a1[3*n+3][20]=193;a1[3*n+3][34]=190;
        while(flag)
                {
                        PR("\nInput the candidates name and code.If only input name,system will \ngive code one by one.\n");
                        PR("If only input name,press S,else press others.");
                        getchar();
                        c=getchar();
                        if(c=='s'||c=='S')
                                {
                                        PR("Input name:");
                                        for(i=0;i<n;i++){SC("%s",&leader[i].name);leader[i].code=i+1;}
                                }
                        else
                                {PR("Input name and code:");
                                        for(i=0;i<n;i++)SC("%s%d",&leader[i].name,&leader[i].code);}
                        PR("This is candidates'name and code:");
                        a1[1][9]='N';a1[1][10]='a';a1[1][11]='m';a1[1][12]='e';
                        a1[1][27]='C';a1[1][28]='o';a1[1][29]='d';a1[1][30]='e';
                        for(i=0;i<2;i++)
                                {PR("\n\t\t");
                                        for(j=0;j<35;j++)PR("%c",a1[i][j]);}
                        for(i=0;i<4;i++){a1[1][i+9]=0;a1[1][i+27]=0;}
                        for(i=3;i<=3*n+3;i+=3)
                                for(j=0;leader[i/3-1].name[j]!='\0';j++)a1[i+1][j+1]=leader[i/3-1].name[j];
                        for(i=3;i<=3*n+3;i++)
                                {PR("\n\t\t");
                                        if((i+2)%3!=0||i<3)for(j=0;j<35;j++)PR("%c",a1[i][j]);
                                        else PR("%c%-19s%c%10d %c",a1[i][0],leader[i/3-1].name,a1[i][20],leader[i/3-1].code,a1[i][34]);
                                }
                        for(;;)
                                {
                                        PR("\nRight(Y/N)?");
                                        getchar();
                                        c=getchar();
                                        if(c=='Y'||c=='y'){flag=0;break;}
                                        else if(c=='N'||c=='n')break;
                                }
                }
}
void arith(struct person leader[],int n)
{
        int i,j,k,s=0,x,flag=1;
        float m,p;
        static char c,a1[67][55];
        for(j=0;j<55;j++)
                for(i=0;i<67;i+=3)
                        a1[i][j]=196;
        for(i=0;i<67;i++)
                {
                        a1[i][0]=179;a1[i][20]=179;a1[i][34]=179;a1[i][44]=179;a1[i][54]=179;
                }
        for(i=3;i<=3*n;i+=3)
                {
                        a1[i][0]=195;a1[i][20]=197;a1[i][34]=197;a1[i][44]=197;a1[i][54]=180;
                }
        a1[0][0]=218;a1[0][20]=194;a1[0][34]=194;a1[0][44]=194;a1[0][54]=191;a1[3*n+3][0]=192;a1[3*n+3][20]=193;a1[3*n+3][34]=193;a1[3*n+3][44]=193;a1[3*n+3][54]=190;
        while(flag)
                {
                        PR("Input the total of vote(an integar):");
                        SC("%d",&k);
                        PR("Input the needed revery(a persontage):");
                        SC("%f%c",&m,&c);
                        PR("Now beginning vote:\n");
                        for(;;)
                                {SC("%d",&x);
                                        if(x==0)break;
                                        for(j=0;j<n;j++)
                                                if(x==leader[j].code){leader[j].count++;break;}
                                        s++;
                                        if(s>=k)break;
                                }
                        p=(float)s/k*100;
                        if(p>=m)
                                {
                                        for(i=0;i<n;i++)leader[i].pec=(float)leader[i].count/s*100;
                                        a1[1][5]='N';a1[1][6]='a';a1[1][7]='m';a1[1][8]='e';
                                        a1[1][24]='C';a1[1][25]='o';a1[1][26]='d';a1[1][27]='e';
                                        a1[1][37]='C';a1[1][38]='o';a1[1][39]='u';a1[1][40]='n';a1[1][41]='t';
                                        a1[1][46]='P';a1[1][47]='e';a1[1][48]='r';a1[1][49]='c';a1[1][50]='e';a1[1][51]='e';a1[1][52]='n';a1[1][53]='t';
                                        for(i=3;i<=3*n+3;i+=3)
                                                for(j=0;leader[i/3-1].name[j]!='\0';j++)a1[i+1][j+1]=leader[i/3-1].name[j];
                                        for(i=0;i<=3*n+3;i++)
                                                {PR("\n\t");
                                                        if((i+2)%3!=0||i<3)for(j=0;j<55;j++)PR("%c",a1[i][j]);
                                                        else PR("%c%-19s%c%10d %c%7d %c%8.2f%%%c ",a1[i][0],leader[i/3-1].name,a1[i][20],leader[i/3-1].code,a1[i][34],leader[i/3-1].count,a1[i][44],leader[i/3-1].pec,a1[i][54]);
                                                }
                                }
                        else
                                {PR("Less of needed revery,It's a invalid vote,input again!\n");
                                        for(i=0;i<20;i++)leader[i].count=0;s=0;continue;}
                        break;
                }
}
void diagram(struct person leader[],int n)
{
        int i,j,k=0;
        static char a[21][66],*p1,*p2;
        p1="Percent";
        p2="Code";
        a[0][0]=24;a[20][65]=62;
        for(i=1;i<21;i++)a[i][0]=179;
        for(i=1;i<65;i++)a[20][i]=196;
        for(j=5;j<=5*n;j+=5)
                {for(i=20-(int)leader[k].pec/5;i<20;i++)
                                a[i][j]=219;k++;}
        a[20][0]=192;
        PR(" %s\n",p1);
        for(i=0;i<21;i++)
                {
                        if(i%2==0)PR(" ");
                        else PR("%6.2f%%",(float)(20-i)*5);
                        for(j=0;j<66;j++)
                                PR("%c",a[i][j]);
                        if(i==20)PR("%s",p2);
                        PR("\n");
                }
        PR(" ");
        for(i=0;i<5*n;i+=5)PR("%5d",leader[i/5].code);
        for(j=5;j<=5*n;j+=5)
                for(i=1;i<20;i++)
                        a[i][j]=0;
        PR("\n");
}