c语言学习笔记——结构体

来源:互联网 发布:ubuntu 命令提示符 编辑:程序博客网 时间:2024/06/05 15:34
1.结构体是一种自定义的数据类型
   struct 结构体名
{
      类型说明符       成员名;
      。。。。。。。。。。。
      类型说明符       成员名;

};
2.结构体变量通过 ‘ . ’ 语法来访问结构体成员变量
3.可以直接赋值

例如:stu1 = stu2;

注意:数组不可以直接赋值⼩小技巧:可以通过把数组放在结构体内实现数组的直接赋值
4.以最⼤大成员变量类型所占空间为分配单位,!按结构体成员声明顺序⾃自上⽽而下分配。

注:分配空间不⾜足以存储成员变量时,分配新的空间单位

5.作业:

typedef struct date
{
    int year;
    int mouth;
    int day;
}Date;


typedef struct keCheng
{
    char*lname;
    int score;
    
}KeC;
typedef struct stu
{
    int num;
    char*name;
    KeC lan;
    KeC math;
    KeC engl;
}Stu;
typedef struct person
{
    int num;
    char *name;
    int sum;
    
}Per ;
typedef struct point
{
    float abscissa;//横坐标
    float  ordinate;//纵坐标
    
}Point;
typedef struct size
{
    float weith;//宽
    float  height;//高
    
}Size;
typedef struct rect
{
    Point origin;
    Size size;
    
}Rect;

int days(int year,int mouth,int day)
{
    int sumDays;
    int run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int unrun[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if (year%400==0||(year%4==0&&year%100!=0)) {
        for (int i=0; i<mouth-1; i++) {
            sumDays=day+run[i];
        }
    }else{
        for (int i=0; i<mouth-1; i++) {
            sumDays=day+unrun[i];
        }
    }
    return sumDays;
}
void avg( Stu *p,int i)
{
    
    float suml=0,summ=0,sume=0;
    for (int j =0; j<i; j++) {
        suml+=(p->lan.score);
        summ+=(p->math.score);
        sume+=(p->engl.score);
        p++;
    }
    printf("%.2f\t%.2f\t%.2f\t",suml/i,summ/i,sume/i);
}
void getFail( Stu *p,int i)
{
    int center=0;
    for (int j=0; j<i; j++) {
         center =(p->lan.score)>(p->math.score)?((p->lan.score)<(p->engl.score)?(p->lan.score):((p->math.score)<(p->engl.score)?(p->engl.score):(p->math.score))):((p->lan.score)>(p->engl.score)?(p->lan.score):((p->math.score)>(p->engl.score)?(p->engl.score):(p->math.score)));
        if (center<60) {
            if ((p->lan.score)<60) {
                printf("%d\t%s\t%d\n",p->num,p->lan.lname,p->lan.score);
            }
            if ((p->math.score)<60) {
                printf("%d\t%s\t%d\n",p->num,p->math.lname,p->math.score);
            }
            if ((p->engl.score)<60) {
                printf("%d\t%s\t%d\n",p->num,p->engl.lname,p->engl.score);
            }
        }
        
        
        p++;
    }
}
void getYou( Stu *p,int i)
{
    int avges=0;
    for (int j=0; j<i; j++) {
        avges =((p->lan.score)+(p->math.score)+(p->engl.score))/3;
        if (avges>=85&&avges<=90) {
            printf("%d\t%s\n",p->num,p->name);
        }
        p++;
    }
}
void judgeZhiXian(Point x,Point y)
{
    if (x.ordinate==y.ordinate) {
        printf("两个点是在一条水平线上。\n");
    }else
    printf("两个点不是在一条水平线上。\n");
}
void judgeChuiXian(Point x,Point y)
{
    if (x.abscissa==y.abscissa) {
        printf("两个点是在一条垂直线上\n");
    }else
        printf("两个点不是在一条垂直线上\n");
}
void judgeEq(Point x,Point y)
{
    if ((x.abscissa==y.abscissa)&&(x.ordinate==y.ordinate) ) {
        printf("两个点相等\n");
    }else
        printf("两个点不相等\n");
}




void judgeEqWeith(Size x,Size y)
{
    if (x.weith==y.weith) {
        printf("两个size等宽。\n");
    }else
        printf("两个size不等宽。\n");
}
void judgeEqheighe(Size x,Size y)
{
    if (x.height==y.height) {
        printf("两个size等高。\n");
    }else
        printf("两个size不等高\n");
}
void judgeEqSize(Size x,Size y)
{
    if ((x.weith==y.weith)&&(x.height==y.height) ) {
        printf("两个size相等\n");
    }else
        printf("两个size不相等\n");
}



void judgeXiangJiao(Rect rect1,Rect rect2)
{
    //什么时候不想交
    //1、矩形1的最大x小于矩形2的最小x
    //2、矩形1的最小x大于矩形2的最大x
    //3、矩形1的最大y小于矩形2的最小y
    //4、矩形1的最小y大于矩形2的最大y
    float maxx1=rect1.origin.abscissa+rect1.size.weith;
    float minx1=rect1.origin.abscissa;
    float maxy1=rect1.origin.ordinate+rect1.size.height;
    float miny1=rect1.origin.ordinate;
    
    
    float maxx2=rect2.origin.abscissa+rect2.size.weith;
    float minx2=rect2.origin.abscissa;
    float maxy2=rect2.origin.ordinate+rect2.size.height;
    float miny2=rect2.origin.ordinate;
    if (maxx1<minx2||minx1>maxx2||maxy1<miny2||miny1>maxy2) {
        printf("两个Rect不相交。\n");
    }else
    {printf("两个Rect相交。\n");}
}


void judgeIncludeP(Rect rect1,Rect rect2,Point p)
{
   //点的x要在rect1  x的最大与最小之间
  //点的y要在rect1  y的最大与最小之间
    float maxx1=rect1.origin.abscissa+rect1.size.weith;
    float minx1=rect1.origin.abscissa;
    float maxy1=rect1.origin.ordinate+rect1.size.height;
    float miny1=rect1.origin.ordinate;
    
    float maxx2=rect2.origin.abscissa+rect2.size.weith;
    float minx2=rect2.origin.abscissa;
    float maxy2=rect2.origin.ordinate+rect2.size.height;
    float miny2=rect2.origin.ordinate;

    if ((p.abscissa>minx1&&p.abscissa<maxx1&&p.ordinate>miny1&&p.ordinate<maxy1)&&((p.abscissa>minx2&&p.abscissa<maxx2&&p.ordinate>miny2&&p.ordinate<maxy2))) {
        printf("两个Rect包含这个Point。\n");
    }else{
       printf("两个Rect不包含这个Point。\n");
        
    }
}



void judgeIncludeR(Rect rect1,Rect rect2)
{
    //1、矩形1的最xiaox<=矩形2的最小x
    //2、矩形1的最dax>=矩形2的最大x
    //3、矩形1的最大y>=矩形2的最day
    //4、矩形1的最小y<=矩形2的最xiaoy
    float maxx1=rect1.origin.abscissa+rect1.size.weith;
    float minx1=rect1.origin.abscissa;
    float maxy1=rect1.origin.ordinate+rect1.size.height;
    float miny1=rect1.origin.ordinate;
    
    
    float maxx2=rect2.origin.abscissa+rect2.size.weith;
    float minx2=rect2.origin.abscissa;
    float maxy2=rect2.origin.ordinate+rect2.size.height;
    float miny2=rect2.origin.ordinate;
    if (minx1<=minx2&&maxx1>=maxx2&&miny1<=miny2&&maxy1>=maxy2) {
        printf("Rect2在Rect1中\n");
    }else
    {printf("Rect2不在Rect1中\n");}
}
int main(int argc, const char * argv[])
{
/*1.    (**)定义一个结构体变量(包括年、月、日),计算该日在本年中为第几天?(注意考虑闰年问题),要求写一个函数days,实现上面的计算。由主函数将年月日传递给days函数,计算后将日子传递回主函数输出。*/
//    Date birthday;
//    printf("请输入正确的日期格式:");
//    scanf("%d%d%d",&birthday.year,&birthday.mouth,&birthday.day );
//    int sunDays = days(birthday.year, birthday.mouth, birthday.day );
//    printf("这一年的第 %d天\n",sunDays);
    // insert code here...
    //printf("Hello, World!\n");
    /*2. (***)某班有5个学生,三门课。分别编写3个函数实现以下要求:
     (1) 求各门课的平均分;
     (2) 找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩;
     (3) 找出三门课平均成绩在85-90分的学生,并输出其学号和姓名
     */
//    Stu student[5]={
//        {1,"jack",{"languages",80},{"math",85},{"English",67}},
//        {2,"rose",{"languages",73},{"math",87},{"English",96}},
//        {3,"lucy",{"languages",56},{"math",45},{"English",36}},
//        {4,"jassink",{"languages",78},{"math",36},{"English",93}},
//        {5,"mima",{"languages",57},{"math",98},{"English",86}}};
//    Stu*p;
//    p=student;
//    avg(p, 5);
//    getFail(p, 5);
//    getYou(p,5);
    
    
    /*3. (***)模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A、B、C、D表示,当选某候选人时直接输入其编号(编号由计算机随机产生),若输入的不是A、B、C、D则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数。 */
 /*
    Per Hper[4];
    Per *p=Hper;
    p->name="A";
    (p+1)->name="B";
    (p+2)->name="C";
    (p+3)->name="D";
    p->sum=0;
    (p+1)->sum=0;
    (p+2)->sum=0;
    (p+3)->sum=0;
    
    
    for (int i = 0; i<4; i++) {
        
        (p->num)=arc4random()%9001+1000;
        printf("第%d个人的编号是%d\n",i+1,p->num);
        p++;
    }
    printf("请严格按照正确对应的数字输入!!!");
    int n;
    printf("请输入投票的人数!");
    scanf("%d",&n);
    
    
    
    p=Hper;
    for (int i = 0 ; i<n; i++) {
        int number=0;
        printf("请输入候选人的编号:");
        scanf("%d",&number);
        if (p->num==number) {
            p->sum+=1;
        }else if ((p+1)->num==number){
            (p+1)->sum+=1;
        }else if ((p+2)->num==number){
            (p+2)->sum++;
        }else  if((p+3)->num==number){
            (p+3)->sum++;
        }
        }
    Per temp={0};
 
    for (int i = 0; i< 4; i++) {
        
        for (int j = 0; j<3-i; j++) {
          
            if ((p+j)->sum<(p+j+1)->sum) {
                temp=Hper[j];
                Hper[j]=Hper[j+1];
                Hper[j+1]=temp;
            }
        }
    }
      p=Hper;
    for (int i = 0; i< 4; i++) {
        printf("%s编号:%d\t票数:%d\n",p->name,p->num,p->sum) ;
        p++;
    }


    
    */
    /* 4.(***)创建一个Point结构体,包含x,y两个变量。
     并写以下函数:
     函数1,判断两个点是否在一条水平线上。
     函数2,判断两个点是否在一条垂直线上。
     函数3,判断两个点是否相等。
     
     */
  /*
    Point x;
    Point y;
    printf("请输入第一个点的坐标:");
    scanf("%f%f",&x.abscissa,&x.ordinate);
    printf("请输入第二个点的坐标:");
    scanf("%f%f",&y.abscissa,&y.ordinate);

    judgeZhiXian(x, y);
    judgeChuiXian(x, y);
    judgeEq(x, y);
    
    */
    /*5.(***)创建一个Size结构体,包含width,height两个变量。
     并写以下函数:
     函数1,判断两个size是否等宽。
     函数2,判断两个size是否在等高。
     函数3,判断两个size是否相等
     */
    
    
    /*
    Size size1,size2;
    printf("请输入第一个Size的坐标:");
    scanf("%f%f",&size1.weith,&size1.height);
    printf("请输入第二个Size的坐标:");
    scanf("%f%f",&size2.weith,&size2.height);
    
    judgeEqheighe(size1, size2);
    judgeEqWeith(size1, size2);
    judgeEqSize(size1, size2);
    

    
    */
    
    
    /* 6.(***)创建一个Rect结构体,包含origin,size两个变量。其中origin是Point类型的,size是Size类型的。
     并写以下函数:
     函数1,判断两个Rect是否相交。
     函数2,判断两个Rect是否包含某个Point。
     函数3,判断一个Rect是否在另外一个Rect中
     */
   
//    Rect  rect1={{3,5},{6,10}};
//    Rect rect2={{3,8},{5,20}};
//    Point p={4,8};
    
    
    /*
    Rect rect1,rect2;
    Point p;
    printf("请设置rect1:");
    scanf("%f%f%f%f",&rect1.origin.abscissa,&rect1.origin.ordinate,&rect1.size.weith,&rect1.size.height);
    printf("请设置rect2:");
    scanf("%f%f%f%f",&rect2.origin.abscissa,&rect2.origin.ordinate,&rect2.size.weith,&rect2.size.height);
    printf("请输入一个点的坐标:");
        scanf("%f%f",&p.abscissa,&p.ordinate);

    judgeXiangJiao(rect1, rect2);
    judgeIncludeP(rect1, rect2,p);
    judgeIncludeR(rect1, rect2);
   
*/
    return 0;
}


0 0