学生成绩管理,不及格统计,信息查找

设有一组学生的成绩数据已经放在结构体数组stu中
struct student 
{  int num; 
   char name[20]; 
   char sex; 
   float score; 
}stu[5]={{101,"li ping",'m',45}, 
        {102 ,"zhang ping",'m',62.5}, 
        {103 ,"he fang",'m',92.5}, 
        {104 ,"cheng ling",'f',87}, 
        {105 ,"wang ming",'m',58}}; 
1)子函数实现 :不及格人数统计。要求:使用结构体指针变量作为函数参数编程,主函数中输出结果。
2)子函数实现: 根据学号在结构体数组中查找学生信息,返回该学生所在的数组下标,若没找到则返回-1。主函数中输出该学生信息。要求:使用学号、结构体指针变量作为函数参数编程。
3)子函数实现:根据姓名在结构体数组中查找学生信息,返回该学生所在的数组下标,若没找到则返回-1。主函数中输出该学生信息。要求:使用字符数组或字符指针变量(为了传递姓名)、结构体指针变量作为函数参数编程。


 
#include <stdio.h>
#include <string.h>
struct student 
{  int num; 
   char name[20]; 
   char sex; 
   float score; 
}stu[5]={{101,"li ping",'m',45}, 
        {102 ,"zhang ping",'m',62.5}, 
        {103 ,"he fang",'m',92.5}, 
        {104 ,"cheng ling",'f',87}, 
        {105 ,"wang ming",'m',58}}; 

int failed(struct student *s);
int search1(int num, struct student *s);
int search2(char *name, struct student *s);
int main()
{
    printf("不及格人数共有%d个\n",failed(stu));
    int num;
    printf("请输入一个学号:");
    scanf("%d",&num);
    int a = search1(num,stu);
    if(a != -1){
        printf("%d,%s,%c,%.2f\n",stu[a].num,stu[a].name,stu[a].sex,stu[a].score);
    }else{
        printf("没有找到!\n");
    }
    char name[20];
    printf("请输入一个姓名:");
    getchar();
    gets(name);
    int b = search2(name,stu);
    if(b != -1){
        printf("%d,%s,%c,%.2f\n",stu[b].num,stu[b].name,stu[b].sex,stu[b].score);
    }else{
        printf("没有找到!");
    }
    return 0;
    
}
int failed(struct student *s){
    int cnt = 0;
    for(int i = 0;i < 5;i++){
        if(s[i].score < 60){
            cnt ++;
        }
    }
    return cnt;
}

int search1(int num, struct student *s){
    for(int i = 0;i < 5;i++){
        if(s[i].num == num){
            return i;
        }
    }
    return -1;
}
int search2(char *name, struct student *s){
    for(int i = 0;i < 5;i++){
        if(!strcmp(s[i].name,name)){
            return i;
        }
    }
    return -1;
}


#include<cstdio>
#include<cstring>

struct StrStudent
{
    int num;
    char name[20];
    char sex;
    float score;    
};

int failGradeCount(const struct StrStudent* stu,int studentNum);
int getStudentPos(const struct StrStudent* stu,int studentNum,int findNum);
int getStudentPos2(const struct StrStudent* stu,int studentNum,const char* studentName);

int main(int args,char* argv[])
{
    struct StrStudent stu[5] = {{101,"li ping",'m',45},
                                {102,"zhang ping",'m',62.5},
                                {103,"he fang",'m',92.5},
                                {104,"cheng ling",'f',87},
                                {105,"wang ming",'m',58}};
    
    
    int failGradeNum = failGradeCount(stu,sizeof(stu)/sizeof(struct StrStudent));
    printf("fail grade student num:%d\n",failGradeNum);

    printf("please input seek student num:");
    int studentNum = 0;
    scanf("%d",&studentNum);
    int studentPos = getStudentPos(stu,sizeof(stu)/sizeof(struct StrStudent),studentNum);
    if(studentPos >= 0)
        printf("name:%s num:%d sex:%c score:%f\n",stu[studentPos].name,
                stu[studentPos].num,stu[studentPos].sex,stu[studentPos].score);


    printf("please input seek student name:");
    char studentName[20];
    getchar();
    gets(studentName);
    
    studentPos = getStudentPos2(stu,sizeof(stu)/sizeof(struct StrStudent),studentName);
    if(studentPos >= 0)
        printf("name:%s num:%d sex:%c score:%f\n",stu[studentPos].name,
                stu[studentPos].num,stu[studentPos].sex,stu[studentPos].score);
    
    return 0;
}


int failGradeCount(const struct StrStudent* stu,int studentNum)
{
    if(!stu || studentNum <= 0)
        return -1;
    
    int countNum = 0;
    
    for(int i = 0; i < studentNum;++i)
    {
        if(stu[i].score < 0)
            printf("%s score %f abnormal\n",stu[i].name,stu[i].score);
        else if(stu[i].score < 60)
            countNum++;
    }
    return countNum;
}



int getStudentPos(const struct StrStudent* stu,int studentNum,int findNum)
{
    if(!stu || studentNum <= 0)
        return -1;
    
    for(int i = 0; i < studentNum;++i)
    {
        if(stu[i].num == findNum)
            return i;
    }
    
    return -1;
}

int getStudentPos2(const struct StrStudent* stu,int studentNum,const char* studentName)
{
    if(!stu || studentNum <= 0)
        return -1;
    
    for(int i = 0; i < studentNum;++i)
    {
        if(strcmp(stu[i].name,studentName) == 0)
            return i;
    }
    
    return -1;    
    
}