天天看點

第十一周課後練習題(一)

實作一個成績管理程式:

PPT裡面說給學号、姓名占用的記憶體要求動态配置設定,既然如此不如直接給所有的結構體都動态配置設定

當然在看之前希望你們先看下我上一篇的代碼不然typedef不太好了解,當然也可以不用typedef,畢竟這隻是簡化輸出

#include<stdio.h>
#include<stdlib.h>

 typedef struct student
{
    char name[10]; 
    char xuehao[10];
    double yuwen;
    double math;
    double english;
    double sum;
    double average;
    
    
}cj;
int n;
double y_average,m_average,e_average;

void s_average(cj s[]);
void sum(cj s[]);
void meike_average(cj s[]);
void paixu(cj s[]);
void paixu(cj s[]);
int main()
{
    cj *s=(cj *)malloc(sizeof(cj)*10);
    int i,j;
    printf("請輸入學生人數:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("請輸入%d個學生的資訊---姓名---學号---國文成績---數學成績---英語成績\n",i+1);
        scanf("%s%s%lf%lf%lf",&s[i].name,&s[i].xuehao,&s[i].yuwen,&s[i].math,&s[i].english);
        
    } 
    sum(s);
    s_average(s);
    meike_average(s);
    puts("");
    for(i=0;i<n;i++)
    {
        printf("學生%s的總分為%.f\t各科平均分為%.2f\n",s[i].name,s[i].sum,s[i].average);
    }
        printf("\n");
        printf("各科平均分\n");
        printf("  \t平均分\n語 文\t  %.2f\n數 學\t  %.2f\n英 語\t  %.2f\n",y_average,m_average,e_average);
        
    paixu(s);
    puts("");
    printf("姓名\t學号\t國文\t英語\t數學\t總分\t平均分\t名次\n");
    for(i=0;i<n;i++)
    {
        
        printf("%s\t%s\t%.f\t%.f\t%.f\t%.f\t%.f\t%d\n",s[i].name,s[i].xuehao,s[i].yuwen,s[i].english,s[i].math,s[i].sum,s[i].average,i+1);
    }
    free(s);
    s = NULL;
}

void sum(cj s[])
{
    int i;
    
    for(i=0;i<n;i++)
    {
        s[i].sum=s[i].math+s[i].english+s[i].yuwen;
    }
}

void s_average(cj s[])
{
    int i;
    
    for(i=0;i<n;i++)
    {
        s[i].average=(s[i].math+s[i].english+s[i].yuwen)/3;
    }
     
}

void meike_average(cj s[]) 
{
    int i;
    double sum1=0,sum2=0,sum3=0;
    for(i=0;i<n;i++)
    {
            sum1+=s[i].yuwen;
            sum2+=s[i].math;
            sum3+=s[i].english;
    } 
    y_average=sum1/n;
    m_average=sum2/n;
    e_average=sum3/n;
}


void paixu(cj s[])
{
    int i,j,t,flag;
    struct student temp;
    for (i = 0; i < n-1; i++)       //輪次,共NUM-1次
    {
       flag = 0;
       for (j = 0; j < n - i-1; j++)  //實作一次冒泡操作
           if (s[j].sum < s[j+1].sum)                  //交換a[j]和a[j+1]
           {   temp = s[j];   s[j] = s[j+1];  s[j+1] = temp;  
                
                   flag = 1;  
            }
       if (flag == 0)  break;
    }
}      
1.C
 2.D
 3.A
 4.A
 5.D
 6.C
 7.A
 8.D
 9.A
 10.C
 11.D
 12.A
 13.C
 14.C
 15.D 00001000 00000000
 11000101 11110000
 16.A
 17.A
 18.A
 19.C
 20.A