20251期《C语言程序设计B》专项训练04-结构体01部分-程序P832.C

26 阅读3分钟

题面

请根据程序中的要求完善程序——注意,**除指定位置外,不能对程序中已有部分作任何修改或重新编写一个程序,否则作0分处理**。  
  程序的功能是:已知5名学生信息,从键盘输入学生姓名,根据姓名查找该学生是否存在,如果存在则输出学生信息,否则输出不存在提示。  
  程序的运行效果应类似地如图1所示,图1中的红色部分是从键盘输入的内容。  


请输入你要查找的学生姓名: 李云龙  

查找的学生信息为: 1002 李云龙 92.5 67.5 81.5

原码

#include <stdio.h>  
#include <string.h>  
  
/* User Code Begin(考生可在本行后添加代码,例如结构体类型的定义、函数原型声明等,行数不限) */  
  
  
  
  
  
  
  
  
/* User Code End(考生添加代码结束) */  
  
int main(void)  
{  
    STUD sTranscript[] = { {1001"张三丰"69.561.591.5},  {1002"李云龙"92.567.581.5},   
        {1003"郭 靖",  79.567.586.5 },  {1004"苗翠花"83.075.584.0},   
        {1005"张无忌"65.581.571.0} };  
    STUD *stu;  
    char name[16];  
      
    printf("请输入你要查找的学生姓名: ");  
    gets(name);  
  
    stu = FindByName(sTranscript, 5, name);  //调用函数查找信息  
    if (stu)  
    {  
        printf("\n查找的学生信息为: ");  
        printf("%d %s %.1f %.1f %.1f\n", stu->iNum, stu->cName, stu->fCh, stu->fMath, stu->fEng);  
    }  
    else  
    {  
        printf("\n你要查找的学生不存在!\n");  
    }  
  
    return 0;  
}  
  
/* User Code Begin:考生在此后完成自定义函数的设计,行数不限 */

改后

#include <stdio.h>  
#include <string.h>  
  
/* User Code Begin(考生可在本行后添加代码,例如结构体类型的定义、函数原型声明等,行数不限) */  
typedef struct STUD  
{  
    //stu->iNum, stu->cName, stu->fCh, stu->fMath, stu->fEng  
    int iNum;  
    char cName[7];  
    float fCh;  
    float fMath;  
    float fEng;  
} STUD;  
  
// stu = FindByName(sTranscript, 5, name);  
STUD *FindByName(STUD *stu, int N, char *name);  
/* User Code End(考生添加代码结束) */  
  
int main(void)  
{  
    STUD sTranscript[] = { {1001"张三丰"69.561.591.5},  {1002"李云龙"92.567.581.5},   
        {1003"郭 靖",  79.567.586.5 },  {1004"苗翠花"83.075.584.0},   
        {1005"张无忌"65.581.571.0} };  
    STUD *stu;  
    char name[16];  
      
    printf("请输入你要查找的学生姓名: ");  
    gets(name);  
  
    stu = FindByName(sTranscript, 5, name);  //调用函数查找信息  
    if (stu)  
    {  
        printf("\n查找的学生信息为: ");  
        printf("%d %s %.1f %.1f %.1f\n", stu->iNum, stu->cName, stu->fCh, stu->fMath, stu->fEng);  
    }  
    else  
    {  
        printf("\n你要查找的学生不存在!\n");  
    }  
  
    return 0;  
}  
  
/* User Code Begin:考生在此后完成自定义函数的设计,行数不限 */  
STUD *FindByName(STUD *stu, int N, char *name)  
{  
    int i;  
    for(i=0;i<N;i++)  
    {  
        if(strcmp(stu[i].cName,name)==0)  
        {  
            return stu+i;  
        }  
    }  
    return NULL;  
}

知识点

  • 按变量和数组的情况,反推结构体的定义,注意typedef的别名使用
  • 按FindByName函数调用,反推函数声明和函数定义
    • 注意,函数这里返回是一个地址,也就是一个结构指针
  • 按printf格式化打印,反推结构体里的成员的类型和精度,长度等,主要是结构体的成员命名
  • 按测试数据,姓名最多三个汉字,7个字节即可
  • 按姓名查找,姓名是字符串,比较时,需要用库函数strcmp(name1,name2)来进行,而不是==
    • 找到了,返回该学生结构的指针
    • 未找到,返回NULL
  • 测试时,要注意,“李云龙”前后,不要有空格