c语言基础回顾-结构体

定义结构体变量


/*
 结构体
 自定义的一种类型称为构造类型,在C语言中称为结构体
 定义结构体:
    struct [结构体名]
    { 
        [成员列表;]
    };

 定义结构体变量
  1.struct 结构体名 变量名;
 {

 }

 引用结构体成员  (运算符.)
    结构体变量.成员

 定义结构体变量并初始化
    struct 结构体名 变量名={成员1初始化,成员2初始化....};
 结构体与数组类似,定义之后不能直接整体赋值,不能直接整体引用

 */
#include <stdio.h>
#include <string.h>
int main(void)
{
    struct student {
        char name[20]; //instance variables
        int age;
        char sex[10];
        float score[4];
    };  //结构体类型定义结束

    //定义结构体变量
    struct student tom;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

   // strcpy(tom.name,"tom");
   // printf("姓名: %s\n",tom.name);

    //定义结构体变量并初始化
    //struct  student jack={"jack",32,{56,67,78}};

    printf("输入姓名:\n");
    gets(tom.name);
    printf("输入性别:\n");
    gets(tom.sex);
    printf("输入年龄:\n");
    scanf("%d",&tom.age);

    printf("输入分数:\n");

    for (int i=0; i<4; i++) {
        scanf("%f",&tom.score[i]);
    }

    printf("姓名: %s\n",tom.name);
    printf("性别: %s\n",tom.sex);
    printf("年龄: %d\n",tom.age);
    //遍历输出
    for (int i=0; i<4; i++) {
        printf("分数: %f\n",tom.score[i]);
    }


    return 0;
}

1.定义结构体的同时定义结构体变量
struct [结构体名]
{

}
变量名[={初始化值}];
2.定义省略结构体
省略结构体名定义类型时必须在定义时指定所需的所有变量

  /*struct
  {

  }name1,name2,name3[4];
 */

#include <stdio.h>
int main(void)
{
    //定义结构体的同时定义结构体变量并赋初值
    struct birthday {
        int year;
        int month;
        int day;
    }Bri={1990,10,4};
    printf("出生日期为: %d %d %d \n",Bri.year,Bri.month,Bri.day);
    return 0;
}
/*
 在结构体类型中使用其他的结构体类型定义结构体变量,需要先定义内部结构体变量的类型方可使用

 */

#include <stdio.h>
struct birthday {
    int year;
    int month;
    int day;
};
struct student {
    char name[20];
    struct birthday bir;
    float score[4];
};

int main(void)
{
    //结构体的初始化
    struct student Alice={"Alice",{1990,10,4},{7,8,9,10}};
    printf("%s: %d-%d-%d\n",Alice.name,Alice.bir.year,Alice.bir.month,Alice.bir.day);

    int len =sizeof(Alice.score)/sizeof(Alice.score[0]);
    for (int i=0; i<len; i++) {
        printf("%f ",Alice.score[i]);
    }
    printf("\n");
    return 0;
}

结构体数组

/*
 结构体数组
 */

#include <stdio.h>

struct birthday {
    int year;
    int month;
    int day;
};
struct student {
    char name[20];
    struct birthday bir;
    float score[4];
};


int main(void)
{

    //定义结构体数组
    struct student arr[3];
    int len =sizeof(arr)/sizeof(arr[0]);
    for (int i=0; i<len; i++) {
        scanf("%s:",arr[i].name);
        scanf("%d-%d-%d",&arr[i].bir.year,
                          &arr[i].bir.month,
                          &arr[i].bir.day);
        scanf("%f %f %f %f",&arr[i].score[0],
                             &arr[i].score[1],
                             &arr[i].score[2],
                             &arr[i].score[3]);
    }
    printf("输出结果为:\n");
    for (int i=0; i<len; i++) {
        printf("%s ",arr[i].name);
        printf("%d-%d-%d ",arr[i].bir.year,
                           arr[i].bir.month,
                           arr[i].bir.day);
        printf("%f %f %f %f ",arr[i].score[0],
                              arr[i].score[1],
                              arr[i].score[2],
                              arr[i].score[3]);
        printf("\n");
    }
    printf("\n");
    return 0;
}

结构体变量之间可以直接赋值

 */
/*
#include <stdio.h>
struct student
{
    char name[20];
    int i;
};


int main(void)
{
    struct student a={"hello",12};
    struct student b;
    b=a;
    printf("b.name=%s b.i=%d\n",b.name,b.i);
    return 0;
}

*/

//交换结构体内容并输出

#include <stdio.h>
struct student
{
    char name[20];
    int age;
};


int main(void)
{
    struct student temp;
    struct student a={"hello tom",22};
    struct student b={"hello jack",25};
    temp=a;
    a=b;
    b=temp;
    printf("b.name=%s b.age=%d\n",b.name,b.age);
    printf("a.name=%s a.age=%d\n",a.name,a.age);

    //结构体数组排序原理
    /*
    for (int i=0; i<len-1; i++) {
        min=i;
        for (int j=i+1; j<len; j++) {
            if (strcmp(arr[min].name,arr[j].name)>0) {
                min=j;
            }
        }
        t=arr[min];
        arr[min]=arr[i];
        arr[i]=t;
    }
     */

    return 0;
}

结构体做函数参数,值是单项传递的

/*

 结构体做函数参数,值是单项传递的

 */

#include <stdio.h>
#include <string.h>
struct student
{
    char name[20];
    int age;
};
void output(struct student);

int main(void)
{
    struct student a={"xioaming",25};
    output(a);
    printf("a:%s %d\n",a.name,a.age);
    return 0;
}

void output(struct student m)
{
    printf("m:%s %d\n",m.name,m.age);
    strcpy(m.name,"xiaohua");
}

指向结构体变量的指针变量

//指向结构体变量的指针变量 struct type *
//指针变量引用结构体成员运算符 ->
//引用成员的三种方法
1.a.i
2. p->i
3.(*p).i

#include <stdio.h>
struct type
{
    int i;
};
void input(struct type *);
void output(struct type *arr,int len);

int main(void)
{
    struct type a;
    input(&a);
    printf("a.i=%d\n",a.i);

    //数组结构体
    struct type arr[10]={{12},{22},{13},{34},{25},69,47,83,79,40};

    output(arr,10);
    return 0;
}

void input(struct type *p) //p=&a
{
   // p->i =12;  //a.i
    (*p).i=33;
}

void output(struct type *arr,int len)//struct type arr[]
{
    for (int i=0; i<len; i++) {
        printf("arr[%d]=%d\n",i,arr->i);//arr[i].i
        arr++;
    }
}

练习:使用回调函数实现排序函数,使之能够处理任何类型的数组

//使用回调函数实现排序函数,使之能够处理任何类型的数组

//排序结构体数组

#include<stdio.h>
typedef void SORT(void*,int,void(*)(void*,int,int),int(*)(void *,int,int));
typedef void (*S)(void*,int,int);

void sort(void*,int,void(*swap)(void*,int,int),int(*cmp)(void*,int,int));
void swap(void*,int ,int);

int cmp( void *,int,int);

struct aa
{
    int i;
    char x;

};

void output(struct aa *,int);
int main()
{
    struct aa  a[5] = {{34,'a'},{53,'b'},{199,'c'},{32,'d'},{58,'e'}};
    output(a,5);
    //  struct aa *p = a;
    sort(a,5,swap,cmp);
    output(a,5);

    printf("a[0] = %d\n",a[0].i);
    return 0;
}
int cmp( void *a,int min,int j)
{
    struct aa  *p = (struct aa *)a;
    return (p+min)->i - (p+j)->i;

}

void swap(void *a,int i,int j)
{
    struct aa * p1 = (struct aa *)a;
    struct aa t;
    t = *(p1+i);
    *(p1+i) = *(p1+j);
    *(p1+j) = t;
}
void sort(void *a,int num,void (*swap)(void*,int,int),int (*cmp)(void *,int,int ))
{
    int min=0;//下标

    for(int i=0;i<num-1;i++)
    {
        min =i;
        for(int j=i+1;j<num;j++)
        {
            if(cmp(a,min,j)>0)
                min = j;
        }
        swap(a,min,i);
    }
}
void output(struct aa *a,int num)
{
    for(int i=0;i<num;i++)
    {
        printf("%d- %c\n ",a->i,a->x);
        a++;
    }
    printf("输出结束.\t");
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值