模块化编程结构
函数头文件
c语言头文件代码
#ifndef __Object_H_
#define __Object_H_
// 继承
struct person {
int id;
char name[20];
int gender;
const char* (*getGender)(struct person* s);
void (*setGender)(struct person* s, const char* strGender);
};
struct teacher {
struct person super;
char subject[20];
};
struct student {
struct person super;
int mark;
void (*setStudentId)(struct student* s, int year, int classNum, int serialNum);
};
void initPerson(struct person* p);
void initStudent(struct student* s);
void initTeacher(struct teacher* t);
void setStudentId(struct student* s, int year, int classNum, int serialNum);
const char* getGender(struct person* s);
void setGender(struct person* s, const char* strGender);
#endif
函数util文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include "Object.h"
// 初始化函数指针
void initPerson(struct person* p) {
p->getGender = getGender;
p->setGender = setGender;
}
// 初始化函数
void initStudent(struct student* s) {
initPerson(&(s->super));
s->setStudentId = setStudentId;
}
// 初始化函数
void initTeacher(struct teacher* t) {
initPerson(&(t->super));
}
// 学生的学号
void setStudentId(struct student* s, int year, int classNum, int serialNum) {
char buffer[20];
// sprintf的作用是字符拼接,将结构传入第一个参数buffer指示的字符当中
sprintf(buffer, "%d%d%d", year, classNum, serialNum);
// 函数atoi将指示的字符串转换为整型并返回结果
int id = atoi(buffer);
// 使用面向对象的方式直接给结构体中的成员id赋值
s->super.id = id;
}
const char* getGender(struct person* s) {
if (s->gender == 0) {
return "女";
}
else if (s->gender == 1) {
return "男";
}
return "佚名";
}
// 将字符串表示的性别转换为整型表示的性别进行处理
void setGender(struct person* s, const char* strGender) {
int numGender;
if (strcmp("男", strGender) == 0) {
numGender = 1;
}
else if (strcmp("女", strGender) == 0) {
numGender = 0;
}
else {
numGender = -1;
}
s->gender = numGender;
}
c语言函数main文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "Object.h"
int main() {
// 结构体的声明
struct student stu;
// 函数体在使用过程中需要调用initStudent函数设置正确的指向
initStudent(&stu);
// 直接调用函数传入结构体指针
setStudentId(&stu, 2023, 607, 12);
strcpy(stu.super.name, "小明");
stu.super.setGender(&stu.super, "男");
stu.mark = 98;
// 使用printf打印输出相关数据,采用点的方式对函数进行调用
printf("学号:%d\n", stu.super.id);
printf("姓名:%s\n", stu.super.name);
// 将数字1和0转换为字符串男和女
const char* gender = stu.super.getGender(&stu.super);
printf("性别%s\n", gender);
printf("分数%d\n", stu.mark);
putchar('\n');
struct teacher t;
// 初始化teacher
initTeacher(&t);
t.super.id = 12345;
strcpy(t.super.name, "林老师");
t.super.setGender(&t.super, "男");
strcpy(t.subject, "C语言");
// 打印这些数值
printf("学号:%d\n", t.super.id);
printf("姓名:%s\n", t.super.name);
gender = t.super.getGender(&t.super);
printf("性别:%s\n", gender);
printf("科目:%s\n", t.subject);
return 0;
}
程序运行结果展示