以文本方式查看主题

-  课外天地 李树青  (http://www.njcie.com/bbs/index.asp)
--  清心茶舍  (http://www.njcie.com/bbs/list.asp?boardid=21)
----  关于结构体的第一次课件  (http://www.njcie.com/bbs/dispbbs.asp?boardid=21&id=612)

--  作者:admin
--  发布时间:2008/12/1 13:07:07
--  关于结构体的第一次课件

11 结构体
——“我们应该换种角度看世界”

1 为什么使用结构体
思考如何表达班级中的很多学生这个问题,利用数组是常见的方法,但是目前的数组只能支持单一数据类型
假设一个学生有这些需要表达的数据,如姓名、性别和年龄,再假设有三个学生
  char names[3][10]={"黎明","胡哥","白雪"};
  char sexs[3]={\'M\',\'M\',\'F\'};
  int ages[3]={18,19,16};

# include <stdio.h>

void main()
{
        char names[3][10]={"黎明","胡哥","白雪"};
        char sexs[3]={\'M\',\'M\',\'F\'};
        int ages[3]={18,19,16};
        int i;
        for(i=0;i<3;i++)
        {
                printf("第%d个学生的姓名是:%s,性别是%c,年龄是%d\\n",i+1,names[i],sexs[i],ages[i]);
        }
}

结构体的表达方法
然而,数组是一种将事物属性割裂开来的数据表达方法
能否有一种可以完整表达学生信息的独立成员实体?
结构体表达方法:
struct student{
        char name[10];
        char sex;
        int age;
};
struct student stus[3]={{"黎明",\'M\',18},{"胡哥",\'M\',19},{"白雪",\'F\',16}};

# include <stdio.h>

struct student{
        char name[10];
        char sex;
        int age;
};

void main()
{
        struct student stus[3]={{"黎明",\'M\',18},{"胡哥",\'M\',19},{"白雪",\'F\',16}};
        int i;
        for(i=0;i<3;i++)
        {
                struct student stu=stus[i];
                printf("第%d个学生的姓名是%s,性别是%c,年龄是%d\\n",i+1,stu.name,stu.sex,stu.age);
        }
}

2 结构体的定义
更为完整的学生例子
struct student
{
        int num;
        char name[20];
        char sex;
        int age;
        float score;
        char addr[30];
};

# include <stdio.h>

struct student
{
        int num;
        char name[20];
        char sex;
        int age;
        float score;
        char addr[30];
};

void main()
{
        struct student student1,student2;
}

三种定义方法
先声明结构体类型再定义变量名
在声明类型的同时定义变量
直接定义结构体类型变量

嵌套的定义方法
struct date
{
        int year;
        int month;
        int day;
};

# include <stdio.h>

struct date
{
        int year;
        int month;
        int day;
};

struct student
{
        int num;
        char name[20];
        char sex;
        int age;
        struct date birthday;
        float score;
        char addr[30];
};

void main()
{
        struct student student1;
        student1.num=1001;
        strcpy(student1.name,"黎明");
        student1.sex=\'M\';
        student1.age=18;
        student1.birthday.year=1990;
        student1.birthday.month=10;
        student1.birthday.day=1;
        student1.score=80;
        strcpy(student1.addr,"江苏");
        printf("学生的姓名是%s\\n",student1.name);
        printf("学生的生日是%d年%d月%d日\\n",student1.birthday.year,student1.birthday.month,student1.birthday.day);
}

3 例子
3.1 投票
直接从书上粘贴进行操作
#include <string.h>
#include <stdio.h>

struct person  
{    
        char name[20];
        int count;  
};

void main()
{
        struct person leader[3]={"Li",0, "Zhang",0, "Fun",0};
        int i,j;  
        char leader_name[20];  
        for(i=1;i<=10;i++)    
        {    
                scanf("%s",leader_name);        
                for(j=0;j<3;j++)
                        if(strcmp(leader_name,leader[j].name)==0)
                                leader[j].count++;
        }
        printf("\\n");
        for(i=0;i<3;i++)
                printf("%5s:%d\\n",leader[i].name,leader[i].count);
}

增加字符大小识别
#include <string.h>
#include <stdio.h>

struct person  
{    
        char name[20];
        int count;  
};

void main()
{
        struct person leader[3]={"li",0, "zhang",0, "fun",0};
        int i,j;  
        char leader_name[20];  
        for(i=1;i<=10;i++)    
        {    
                scanf("%s",leader_name);    
                
                for(j=0;j<strlen(leader_name);j++)
                {
                        leader_name[j]=tolower(leader_name[j]);
                }

                for(j=0;j<3;j++)
                        if(strcmp(leader_name,leader[j].name)==0)
                                leader[j].count++;
        }
        printf("\\n");
        for(i=0;i<3;i++)
                printf("%5s:%d\\n",leader[i].name,leader[i].count);
}

增加提示信息
#include <string.h>
#include <stdio.h>

struct person  
{    
        char name[20];
        int count;  
};

void main()
{
        struct person leader[3]={"li",0, "zhang",0, "fun",0};
        int i,j;  
        char leader_name[20];
        
        printf("请按序号投票\\n");
        for(i=0;i<3;i++)
                printf("%d号候选人:%s\\n",i+1,leader[i].name);

        for(i=1;i<=10;i++)    
        {
                scanf("%d",&j);
                leader[j-1].count++;
        }
        printf("\\n");
        for(i=0;i<3;i++)
                printf("%5s:%d\\n",leader[i].name,leader[i].count);
}

增加对无效票的重新统计
#include <string.h>
#include <stdio.h>

struct person  
{    
        char name[20];
        int count;  
};

void main()
{
        struct person leader[3]={"li",0, "zhang",0, "fun",0};
        int i,j;  
        char leader_name[20];
        
        printf("请按序号投票\\n");
        for(i=0;i<3;i++)
                printf("%d号候选人:%s\\n",i+1,leader[i].name);

        for(i=1;i<=4;i++)    
        {
                scanf("%d",&j);

                if(j>=1 && j<=3)
                        leader[j-1].count++;
                else
                        i--;
        }
        printf("\\n");
        for(i=0;i<3;i++)
                printf("%5s:%d\\n",leader[i].name,leader[i].count);
}

增加任意退出能力
#include <string.h>
#include <stdio.h>

struct person  
{    
        char name[20];
        int count;  
};

void main()
{
        struct person leader[3]={"li",0, "zhang",0, "fun",0};
        int i,j;  
        char leader_name[20];
        
        printf("请按序号投票\\n");
        for(i=0;i<3;i++)
                printf("%d号候选人:%s\\n",i+1,leader[i].name);

        while(1)  
        {
                scanf("%d",&j);

                if(j==0)
                        break;

                if(j>=1 && j<=3)
                        leader[j-1].count++;
                else
                        i--;
        }
        printf("\\n");
        for(i=0;i<3;i++)
                printf("%5s:%d\\n",leader[i].name,leader[i].count);
}

[此贴子已经被作者于2010-12-13 20:05:32编辑过]