课外天地 李树青学习天地清心茶舍 → 关于结构体的第一次课件


  共有16847人关注过本帖树形打印复制链接

主题:关于结构体的第一次课件

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1940 积分:26616 威望:0 精华:34 注册:2003/12/30 16:34:32
关于结构体的第一次课件  发帖心情 Post By: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编辑过]

 回到顶部