c语言一维数组

学生成绩统计
从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能:
(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;
(3)统计各分数段的学生人数及所占的百分比。
(4)用一维数组和指针变量作为函数参数,编程打印某班一门课成绩的最高分及其学号。

#include<stdio.h>
#include<malloc.h>
#include<string.h>

typedef char* string;   //字符串
//学生结构体
typedef struct Student{
    char    name[16];   //姓名
    int     id;         //学号
    float   grade;      //成绩
    struct Student *next;//下一个学生节点
}Student,*student;

//班级结构体
typedef struct Class{
    student list;   //学生列表
    int     num;    //学生人数
}Class,*class;

//创建一个新班级
class newClass();
//销毁一个班级
void destroyClass(class c);
//创建一个新学生
student newStudent(string name,int id,float grade);
//向班级中加入一个学生
void append(class c,student stu);
//统计不及格人数,并打印名单
void showNotPass(class c);
//统计全班平均分及以上的学生人数并打印名单
void showGreaterThanAvg(class c);
//统计各分数段的学生人数及所占百分比
void showGradeRange(class c);
//输出最高分及学号
void showFirst(class c);
//输出班里的所有成员
void output(class c);

int main(){
    char    name[16];
    int     id;
    float   grade;
    class   myClass = newClass();   //创建一个班级
    printf("输入学生信息\n");
    puts("姓名\t学号\t成绩");
    while(~scanf("%s%d%f",name,&id,&grade) && grade >= 0){  //grade<0结束
        append(myClass,newStudent(name,id,grade));  //向班级中加入一名新学生
    }
    //不及格信息
    showNotPass(myClass);
    //超过平均分的信息
    showGreaterThanAvg(myClass);
    //区间信息
    showGradeRange(myClass);
    //第一名
    showFirst(myClass);

    return 0;
}

//创建一个新班级
class newClass(){
    class tmp = (class)malloc(sizeof(Class));
    tmp->num = 0;
    tmp->list = NULL;
    return tmp;
}

//销毁一个班级
void destroyClass(class c){
    if(c == NULL) return;
    student list = c->list;
    student next = NULL;
    while(list!=NULL){
        next = list->next;
        free(list); //释放当前节点
        list = next;
    }
    free(c);
    c = NULL;
}

//创建一个新学生
student newStudent(string name,int id,float grade){
    student tmp = (student)malloc(sizeof(Student));
    strcpy(tmp->name,name);
    tmp->id = id;
    tmp->grade = grade;
    tmp->next = NULL;
    return tmp;
}
//向班级中加入一个学生
void append(class c,student stu){
    if(c == NULL || stu == NULL) return;
    stu->next = c->list;
    c->list = stu;
    c->num++;
}
//统计不及格人数,并打印名单
void showNotPass(class c){
    if(c == NULL) return;
    class tmpClass = newClass();
    student tmp = c->list;
    for(;tmp != NULL;tmp = tmp->next){
        if(tmp->grade < 60){
            student tmpStu = (student)malloc(sizeof(Student));
            memcpy(tmpStu,tmp,sizeof(Student));
            append(tmpClass,tmpStu);
        }
    }
    printf("不及格人数:%d\n",tmpClass->num);
    output(tmpClass);
    destroyClass(tmpClass);
}

//统计全班平均分及以上的学生人数并打印名单
void showGreaterThanAvg(class c){
    if(c == NULL || c->num == 0){
        puts("班级没有人");
        return;
    }
    student tmp = c->list;
    float sum = 0;
    for(;tmp != NULL;tmp = tmp->next){
        sum+=tmp->grade;
    }//统计总分
    float avg = sum / c->num;//平均分
    class tmpClass = newClass();
    for(tmp=c->list;tmp != NULL; tmp = tmp->next){
        if(tmp->grade >= avg){
            student tmpNode = (student)malloc(sizeof(Student)); //一个临时学生节点
            memcpy(tmpNode,tmp,sizeof(Student));
            append(tmpClass,tmpNode);
        }
    }
    printf("平均分及以上的学生人数为:%d\n",tmpClass->num);
    output(tmpClass);
    destroyClass(tmpClass);
}
//统计各分数段的学生人数及所占百分比
void showGradeRange(class c){
    if(c == NULL){
        puts("班级没有人");
        return;
    }
    int i;
    class container[10];
    for(i = 0; i < 10; i++){    //初始化分数段班级容器
        container[i] = newClass();
    }

    student tmp = c->list;
    for(; tmp != NULL; tmp = tmp->next){
        int index = (int)tmp->grade % 10;   //区间
        if(index > 9) index = 9;    //大于90的算成一个区间
        student tmpStu = (student)malloc(sizeof(Student));
        memcpy(tmpStu,tmp,sizeof(Student));
        append(container[index],tmpStu);
    }

    for(i = 0; i < 10; i++){
        int num = container[i]->num;
        printf("%d~%d的人数:%d,占比:%.6g%%\n",i*10,(i+1)*10,num,(float)(num*100)/c->num);
        destroyClass(container[i]);
    }
    puts("");
}
//输出最高分及学号
void showFirst(class c){
    if(c == NULL || c->list == NULL) return;
    student max = c->list;
    student tmp = max->next;
    for(;tmp != NULL;tmp = tmp->next){
        if(tmp->grade > max->grade) max = tmp;
    }
    printf("最高分:%.2g,学号:%d\n",max->grade,max->id);
}

void output(class c){
    if(c == NULL) return;
    puts("名单:");
    student tmp = c->list;
    for(;tmp!=NULL;tmp = tmp->next){
        printf("%s\n",tmp->name);
    }
    puts("");
}

代码有点长....

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-01-17
#include "stdio.h"
#define N 30
void main()
{
int grades[N]; //所有人的分数
int upAverage[N]; //超过平均分的学生序号
int unPass[N]; //不及格的学生序号
int nNum = 0; //学生总人数
int nUpAve = 0; //超过平均分的人数
int totGrade = 0; //总分
int n50,n60,n70,n80,n90; //各个分数段人数
double average; //平均分
int i;
//读入成绩
while (1){
scanf("%d",&grades[nNum]);
if (grades[nNum]<0) break;
totGrade += grades[nNum];
nNum++;
}
average = totGrade*1.0/nNum;
//统计各个分数段人数
n50 = n60 = n70 = n80 = n90 = 0;
for (i=0; i if (grades[i] >= average) upAverage[nUpAve++] = i;
if (grades[i] < 60) unPass[n50++] = i;
else if (grades[i] < 70) n60++;
else if (grades[i] < 80) n70++;
else if (grades[i] < 90) n80++;
else n90++;
}

//结果输出
printf("不及格人数: %d\n",n50);
printf("不及格学生序号:");
for (i=0; i printf("\n成绩在全班平均分及平均分之上的学生人数: %d\n",nUpAve);
printf("这些学生序号:");
for (i=0; i printf("\n以直方图方式统计各分数段的学生人数及所占的百分比\n");
printf("\n分数段 \t 学生人数\t图形");
printf("\n <60 \t %2d(%.0lf%%) \t", n50, n50*100.0/nNum); for (i=0; i printf("\n 60-69 \t %2d(%.0lf%%) \t", n60, n60*100.0/nNum); for (i=0; i printf("\n 70-79 \t %2d(%.0lf%%) \t", n70, n70*100.0/nNum); for (i=0; i printf("\n 80-89 \t %2d(%.0lf%%) \t", n80, n80*100.0/nNum); for (i=0; i printf("\n >=90 \t %2d(%.0lf%%) \t", n90, n90*100.0/nNum); for (i=0; i printf("\n");
}本回答被提问者和网友采纳
第2个回答  2020-06-22
第3个回答  2019-01-16
语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

中文名
C语言
外文名
The C Programming Language
类别
计算机通用程序设计语言
创始人
Dennis MacAlistair Ritchie
创始时间
1972年
发源
BCPL语言
主要编译器
Clang、GCC、MSVC、Turbo C等
启发语言
B语言、汇编、ALGOL68
操作系统
多平台