C语言结构体
结构
在学习之前还是先回顾一下C语言的数据类型,如上图所示,除基本的数据类型外C语言还提供了构造数据类型,主要有数组、结构、联合。那么结构这个数据类型是干嘛的?众所周知,所有强类型语言的数组都规定元素必须都是统一的数据类型,那如果我又想用数组,又想元素是多种数据类型的咋整?结构就可以解决这个问题,所以在基本理解C语言中的结构之前我暂时可以将结构看作是这样的数据类型:和数组的作用类似,但不要求其中的是每个元素的数据类型都必须完全一致。
/ 例9-1 构建学生信息库 实现建立、查询、输出功能 /#include
struct student //定义学习信息结构{ int num; // 学号 char name[10]; // 姓名 int computer, english, math; // 三门课程的成绩 double average; // 平均成绩};
int Count = 0; // 全局变量,记录当前学生总数
// 函数声明,新增学生void new_student(struct student students[]);
// 函数声明,查询学生信息void search_student(struct student students[], int number);
// 函数声明,输出学生信息void output_student(struct student students[]);
int main(void){ int choice, num; struct student students[MaxSize]; // 定义结构数组
do { printf(“choice : 1.new 2.search 3.output 0.exit \n”); scanf(“%d”, &choice); switch (choice) { case 1: new_student(students); break; case 2: printf(“Please input student’s number : \n”); scanf(“%d”, &num); search_student(students, num); break; case 3: output_student(students); break; case 0: break; } } while (choice != 0);
printf(“END!\n”);
return 0;}
// 新建学生信息void new_student(struct student students[]){ struct student s; if (Count == MaxSize) { printf(“The array is full! \n”); return; }
printf(“Input the student’s num: “); scanf(“%d”, &s.num);
printf(“Input the student’s name: “); scanf(“%s”, &s.name);
printf(“Input the student’s math score: “); scanf(“%d”, &s.math);
printf(“Input the student’s english score: “); scanf(“%d”, &s.english);
printf(“Input the student’s computer score: “); scanf(“%d”, &s.computer);
printf(“build a record ok ~! \n”); s.average = (s.math + s.english + s.computer) / 3.0; // 计算平均成绩 students[Count] = s; // 将输入数据复制给结构数组成员变量 Count++;}
// 查询学生信息void search_student(struct student students[], int num){
int i, flag = 0; if (Count == 0) { printf(“Count of student is zero!\n”); return; } for (i = 0; i < Count; i++) { if (students[i].num == num) { flag = 1; break; } }
if (flag == 1) { printf(“num:%d \n”, students[i].num); printf(“name:%s \n”, students[i].name); printf(“math:%d \n”, students[i].math); printf(“english:%d \n”, students[i].english); printf(“computer:%d \n”, students[i].computer); printf(“average:%.2lf \n”, students[i].average); printf(“\n”); } else { printf(“Not Found! \n”); }}
// 输出学生信息void output_student(struct student students[]){
int i; if (Count == 0) { printf(“Count of student is zero ! \n”); return; } printf(“num\t name\t math\t englisg\t computer\t average\n”); for (i = 0; i < Count; i++) { printf(“%d\t”, students[i].num); printf(“%s\t”, students[i].name); printf(“%d\t”, students[i].math); printf(“%d\t”, students[i].english); printf(“%d\t”, students[i].computer); printf(“%.2lf”, students[i].average); printf(“\n”); } printf(“\n”);}
敲完,感觉struct怎么就像是把它一个class再使用,. 啥的,但这个明显不是类,更像是一个数组,里面元素的数据类型可以不一致!
结构体的定义
struct 结构名称 { 类型名 结构成员名1; 类型名 结构成员名2; … 类型名 结构成员名n;}
结构的嵌套定义
简单讲就是结构中的某个结构成员是一个结构,就像是一个数组的某个元素它本身就是一个数组。结构就是变量的集合,为了方便用户,它每个数据的数据类型都不一样。
结构变量的定义和初始化
结构变量的引用
s1.num = 101;strcpy(s1.name, “zhang”);
定义:
// 学生成绩排序 (n < 50)平均成绩从高到低,输出他们的信息
#include
struct student{ int num; char name[10]; int computer, english, math; double average;};
double count_average(struct student s); / 函数声明: 计算学生的平均成绩/
int main(void){ int i, index, j, n; struct student stu[50], temp;
printf(“input n:”); scanf(“%d”, &n);
for (i = 0; i < n; i++) { printf(“No.%d : \n”, i + 1); printf(“num: \n”); scanf(“%d”, &stu[i].num); printf(“name: \n”); scanf(“%s”, &stu[i].name); printf(“computer score: \n”); scanf(“%d”, &stu[i].computer); printf(“english score: \n”); scanf(“%d”, &stu[i].english); printf(“math score: \n”); scanf(“%d”, &stu[i].math); stu[i].average = count_average(stu[i]); }
for (i = 0; i < n - 1; i++) { index = i; for (j = i + 1; j < n; j++) { if (stu[j].average > stu[index].average) { index = j; } } temp = stu[index]; stu[index] = stu[i]; stu[i] = temp; }
for (i = 0; i < n; i++) { printf(“%d\t%s\t%.2lf \n”, stu[i].num, stu[i].name, stu[i].average); }
return 0;}
struct student s1 = {101 , “zhang”, 100, 100, 100}, *p;p = &s1;
(p).num = 101;
p->num = 101;
s1.num = 101;(p).num = 101;p->num= 101;
int update_score(struct student *p, int n, int num, int course, int score);
