c语言求助 输入n个学生的考试成绩,求出其中最高分、最低分以及超过平均分的人数(使用动态分配)

求c语言 大神求助

你想输入多少输入多少,我就输入4个分数测试。

#include<stdio.h>
#include<malloc.h>
typedef struct stud
{
    int score;
    struct stud *next;
}STD;
STD *insertScore(STD *stdHead,STD *stdTail);//录入成绩
void printfSTD(STD *stdHead);//打印链表数据
int *tjSTD(STD *stdHead);//统计 返回[3]数组,分别表示最高分 最低分  超过平均分人数

int main()
{
    int *redata=NULL;
    STD *stdHead=(STD *)malloc(sizeof(STD));
    stdHead->next=NULL;
    STD *stdTail=NULL;

    do{
        stdTail=insertScore(stdHead,stdTail);
    }while(stdTail);

    printfSTD(stdHead);

    redata=tjSTD(stdHead);
    printf("最高分:%d,最低分:%d,超过平均分的人数:%d\n",redata[0],redata[1],redata[2]);
    return 0;
}

void printfSTD(STD *stdHead)//打印数据
{
    while(stdHead->next!=NULL)
    {
        printf("%d\n",stdHead->next->score);
        stdHead=stdHead->next;
    }

}
int *tjSTD(STD *stdHead)//统计 返回[3]数组,分别表示最高分 最低分  超过平均分人数
{
    int max=-1,min=-1,sum=0,count=0,*reData;
    float ave;
    STD *stdHeadSave=stdHead;
    reData=(int *)malloc(sizeof(int)*3);
    while(stdHead->next!=NULL)
    {
        if(max==-1 || max<stdHead->next->score)
            max=stdHead->next->score;
        if(min==-1 || min>stdHead->next->score)
            min=stdHead->next->score;
        sum=sum+stdHead->next->score;
        count++;
        stdHead=stdHead->next;
    }
    ave=(float)sum/count;
    printf("总人数:%d,平均分:%f\n",count,ave);
    count=0;
    stdHead=stdHeadSave;
    while(stdHead->next!=NULL)
    {
        if(stdHead->next->score>ave)
            count++;//大于平均分的人数
        stdHead=stdHead->next;
    }
    reData[0]=max;reData[1]=min;reData[2]=count;
    return reData;
}
STD *insertScore(STD *stdHead,STD *stdTail)//录入成绩
{
    int score;
    printf("输入成绩(输入-1结束录入):");
    scanf("%d",&score);
    if(score==-1)
        return NULL;
    STD *stdNew=(STD *)malloc(sizeof(STD));
    stdNew->score=score;
    stdNew->next=NULL;
    if(stdHead->next==NULL)
        stdHead->next=stdNew;
    else
        stdTail->next=stdNew;
    stdTail=stdNew;
    return stdTail;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-09-10
#include<stdio.h>
int main()
{
    int n,a[100],count=0,i;
    double avg;
    printf("请输入学生个数:");
    scanf("%d",&n);
    printf("请输入学生考试成绩:\n");
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    int max=a[0],min=a[0];
    int sum = 0;
    for(i=0;i<n;i++)
    {
        if(max<a[i])
            max = a[i];
        if(min>a[i])
            min = a[i];
        sum += a[i];
    }
    avg = sum / n;
    for(i=0;i<n;i++)
    {
        if(a[i]>avg)
            count++;
    }
    printf("最高分:%d\n",max);
    printf("最低分:%d\n",min);
    printf("超过平均分的人数:%d\n",count);
    return 0;
}

随便写的,没有经过测试。自己测试一下,然后修改一下!

本回答被提问者采纳
第2个回答  2018-02-25
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char * argv[]){

int n = 0,  x = 0;
int *p;
//n用于取输入的数值,x用于空间的数量创建


printf("输入数值,输入非数值即停止:\n");
while( scanf("%d",&n) == 1 ){

getchar(); //获取缓冲区回车 或者 空格,即清空缓存

x++;

if( x == 1 )
p = (int *)malloc( sizeof(int) * x ); //x是建立空间的数量,如果是1,就分配空间,如果大于1,就重新扩充分配
else
p = (int *)realloc(p, sizeof(int) * x);
//realloc自行百度解释

p[x-1] = n; //赋值

}

int i;
int temp_1 = p[0] , temp_2 = p[0] ,temp_3 = 0;
double average;

for( i=0;i<x;i++ ){

temp_1 = temp_1 > p[i] ? temp_1:p[i]; //temp_1永远是最大的
temp_2 = temp_2 < p[i] ? temp_2:p[i]; //temp_2永远是最小的

temp_3 = temp_3 + p[i]; //temp_3累加所有分数


}

n = i; //将数组数量赋值给其他变量,用于记录数组长度

average = (double)temp_3 / n; //计算平均分


printf("最高分:%d   最低分:%d   平均分:%lf\n",temp_1,temp_2,average);
printf("超过或等于平均分的分数为:\n");



for( i=0;i<n;i++ ){

if( p[i] >= average ) //大于或等于平均分就输出
printf("%d ",p[i]);

}
printf("\n");

free(p); //释放空间
p = NULL; //将指针指向空指针

return 0;
}

第3个回答  2018-02-24
#include <stdio.h>
#include <malloc.h>
#include <memory.h>

typedef struct sss 
{
float score;
struct sss  *next;
}SC;

int main()
{
int count=0,above=0,i=0;
float tmp,maxs=0,mins=0,total=0,avr=0;
SC *Head=NULL,*r=NULL,*p=NULL;
Head = (SC*)malloc(sizeof(SC));
r=p=Head;
printf("please input score(end with -1 ):\n");

while(1) 
{
scanf("%f",&tmp);
if(tmp==-1)
{
break;
}
p = (SC*)malloc(sizeof(SC));
p->score = tmp;
p->next = NULL;
r->next = p;
r=p;
total+=tmp;
if (count==0)
{
maxs =mins = tmp;
}
if (tmp>maxs)
{
maxs=tmp;
}
if (tmp<mins)
{
mins =tmp;
}
count++;

r = Head->next;
while (r)
{
if (r->score>avr)
{
above++;
}
r = r->next;
}

printf("Max Score [%.2f],Min Score [%.2f],above aver [%d]students\n",maxs,mins,above);
return 0;
}
please input score(end with -1 ):
60
56
76
78
89
76
89
67
-1
Max Score [89.00],Min Score [56.00],above aver [8]students
Press any key to continue

相似回答