一、作业
1.定义一个学生结构体,包含结构体成员:身高,姓名,成绩;定义一个结构体数组有7个成员,要求终端输入结构体成员的值,根据学生成绩,进行冒泡排序。
#include <stdio.h>
#include <string.h>
typedef struct {int high;char name[10];float score;
}stu;
int main(int argc, const char *argv[])
{int i,j;stu temp; //其中的temp需要类型重定义stu arr[7]={{100,"1",95},{110,"2",84},{120,"3",70},{130,"4",42},{140,"5",99},{150,"5",77},{160,"6",66}};for(i=1;i<7;i++){for(j=0;j<7-i;j++){if(arr[j].score>arr[j+1].score){temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}for(i=0;i<7;i++){printf("%d %s %f\n",arr[i].high,arr[i].name,arr[i].score);}return 0;
}
二、知识回顾
1.申请一个10个int类型的堆区空间,并实现选择排序(需要导入头文件 #include <stdlib.h>)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//申请一个10个int类型的堆区空间,并实现选择排序
int main(int argc, const char *argv[]){int *p=(int *)malloc(sizeof(int)*10);int i,j,index,temp;for(i=0;i<10;i++){printf("请输入数字\n");scanf("%d",(p+i));}for(i=0;i<10;i++){index=i;for(j=i;j<10;j++){if(*(p+j)>*(p+index))index=j;}temp=*(p+i);*(p+i)=*(p+index);*(p+index)=temp;}for(i=0;i<10;i++){printf("%d\n",*(p+i));}free(p);return 0;
}
2.用##拼接带参宏的参数
#include <stdio.h>
#include <string.h>
//用##实现字符串的拼接
#define unit_32 unsigned int
#define TYPE(a,b) a##b
int main(int argc, const char *argv[])
{TYPE(unit,_32) a=100;//unit_32 a=100//unsigned int a=100printf("%d\n",a);return 0;
}
3.宏函数(最后一行作为返回值,不需要return)
#include <stdio.h>
#include <string.h>
#define MAX(a,b) ({if(a>b) ret = a; else ret=b; ret;})int main(int argc, const char *argv[])
{int ret;printf("%d\n",MAX(90,78));return 0;
}
4.访问结构体成员
4.1通过结构体变量访问
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {char name[100];char sex;int high;int score;
}stu,*stu_p;int main(int argc, const char *argv[])
{ //指针指向桟区申请的空间stu s1;//strcpy(s1.name,"lisi");//s1.name="lisi"; 这是错误的,不能给数组赋值,数组名代表的是数组首地址,是一个常量,不能给常量赋值scanf("%s",s1.name);s1.sex='m';printf("%s\n",s1.name);return 0;
}
4.2通过结构体指针间接访问结构体成员
法一:用指针指向栈区申请的空间
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {char name[100];char sex;int high;int score;
}stu,*stu_p;int main(int argc, const char *argv[])
{ //指针指向桟区申请的空间stu s1;stu_p p=&s1;(*p).high=100;//strcpy(p->name,"lisi");//s1.name="lisi"; 这是错误的,不能给数组赋值,数组名代表的是数组首地址,是一个常量,不能给常量赋值scanf("%s",p->name);p->sex='m';printf("%s\n",s1.name);return 0;
}
法二:指针指向堆区申请的空间
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {char name[100];char sex;int high;int score;
}stu,*stu_p;int main(int argc, const char *argv[])
{ //指针指向堆区申请的空间stu_p p=(stu_p)malloc(sizeof(stu));gets(p->name);p->high=100;p->sex='m';printf("%s\n",p->name);free(p);p=NULL;return 0;
}
5.结构体数组
#include <stdio.h>
#include <string.h>
typedef struct{char name[100];int high;char sex;
}stu;int main(int argc, const char *argv[])
{stu arr[3]={{"zhangsan",100,'m'},{"lisi",110,'m'}};for(int i=0;i<3;i++){printf("%s %d %c\n",(arr+i)->name,arr[i].high,arr[i].sex);}return 0;
}