一、作业
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=100
printf("%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;
}