如何让c语言使用结构体近似模拟c++中的类
如今统治市场的主流编程语言,如c++,java,大都是面向对象类型的编程语言。
而众所周知,c语言是面向过程的编程语言,但是它拥有一个类似于类的结构,叫做结构体,主要的区别在于结构体无法定义函数。
因此,为了c语言的结构体近似模拟类,我们可以在结构体中定义函数指针。
下面这个例子,是最常用的计算学生分数平均数的c++类模版:
#include <cstdio>
#include <iostream>
#include <cstdlib>
#define LINE for (i = 0 ; i < 60 ; i++) {printf("-");}printf("\n");
#define SPACE for (i = 0 ; i < 20 ; i++) printf(" ");
using namespace std;
class Student
{
public:
double stuAvg(double score[]);
int num;
char name[10];
double score[3];
double average;
};
double Student::stuAvg(double score[]){
double sum = 0.0;
double average = 0.0;
for (int i=0 ; i < 3 ; i++)
{
sum += score[i];
}
return average = sum/3;
}
int main(void){
Student stu1;
for (int i = 0 ; i < 3 ; i++)
{
scanf("%lf",&stu1.score[i]);
}
stu1.num = 1001;
memset(stu1.name,0,sizeof(stu1.name));
strcat(stu1.name,"Peter");
stu1.average = stu1.stuAvg(stu1.score);
//Output Part
printf("NUM");
SPACE;
printf("NAME");
SPACE;
printf("AVERAGE");
printf("\n");
LINE;
printf("%d",stu1.num);
SPACE;
printf("%s",stu1.name);
SPACE;
printf("%.2lf",stu1.average);
printf("\n");
LINE;
return 0;
}
接下来我们使用结构体模拟上例中类的作用:
#include <stdio.h>
#include <stdlib.h>
#define LINE for (i = 0 ; i < 60 ; i++) {printf("-");}printf("\n");
#define SPACE for (i = 0 ; i < 20 ; i++) printf(" ");
struct Student{
double (*stuAvg)(double score[]);
int num;
char name[10];
double score[3];
double average;
};
double Calc_Avg(double score[]){
int i = 0;
double sum = 0.0;
double average = 0.0;
for (i=0 ; i < 3 ; i++)
{
sum += score[i];
}
return average = sum/3;
}
void main(void){
int i = 0;
struct Student stu1;
for (i = 0 ; i < 3 ; i++)
{
scanf("%lf",&stu1.score[i]);
}
stu1.num = 1001;
memset(stu1.name,0,sizeof(stu1.name));
strcat(stu1.name,"Peter");
stu1.stuAvg = Calc_Avg;
stu1.average = stu1.stuAvg(stu1.score);
//Ouuput Part
printf("NUM");
SPACE;
printf("NAME");
SPACE;
printf("AVERAGE");
printf("\n");
LINE;
printf("%d",stu1.num);
SPACE;
printf("%s",stu1.name);
SPACE;
printf("%.2lf",stu1.average);
printf("\n");
LINE;
return;
}
如何让c语言使用结构体近似模拟c++中的类的更多相关文章
- C语言的结构体和C++结构体的区别
关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...
- 01.C语言关于结构体的学习笔记
我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...
- go语言学习-结构体
结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...
- 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...
- [日常] Go语言圣经--结构体,JSON习题
Go语言圣经-结构体 1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体 2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行 ...
- Go语言 6 结构体、方法和接口
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...
- C语言链表结构体(学习笔记)
#include <stdio.h> #define LENTEST 100 // 采取逐步删除的方法求的素数 //先假设1-100都是素数,然后剔除2的倍数, //3的倍数,直到剔除所有 ...
- C语言的结构体和 C++结构体的区别
C语言的结构体和 C++结构体的区别 关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不 ...
随机推荐
- 基于OpenSSL的PKI的PKI数字证书系统实现
本篇主要介绍了基于OpenSSL的PKI的PKI数字证书系统实现,利用OpenSSL建立一个CA中心的详细解决方案和建立的具体步骤. 1.PKI数字证书系统设计 PKI数字证书系统主要包括证书颁发机构 ...
- JDK的下载、安装与配置
一.JDK的下载 1.JDK下载地址:https://www.oracle.com/cn/java/technologies/javase-downloads.html 2.登录Oralce官网:ht ...
- Gym100923H Por Costel and the Match
题目链接:http://codeforces.com/gym/100923/problem/H 分析:并查集,用enemy储存x的敌人,用weight储存权重决定根节点 需用scanf和puts输入输 ...
- 基于4H-SIC的先进集成电路用n型LDMOS晶体管
基于4H-SIC的先进集成电路用n型LDMOS晶体管 摘要: 通过对具有不同的设计方式的具有减小的表面电场的横向4H-SIC-N型-横向扩散金属氧化物半导体(LDMOS)晶体管进行测量和模拟,得到了得 ...
- python基础学习之字符串的功能方法
字符串:str的功能记录(该类需要记忆) .isdecimal():意思是判断是否由数字构成,仅仅可以解析"123" a='123' d=a.isdecimal() p ...
- 利用kali系统制作最简单的OS
制作最简单的OS 一.生成.bin文件 1.创建Boot.asm文件,输入相应的汇编代码 org 07c00h ; mov ax, cs mov ds, ax mov es, ax call Disp ...
- 安装JDK步骤,配置环境变量
DK是Java语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具.所以今天教一 ...
- Python中树的遍历-堆排序
1.二叉树的遍历 遍历:迭代所有元素一遍. 树的遍历:对树中所有的元素不重复的访问一遍,也成扫描 广度优先遍历:层序遍历 深度优先遍历:前序.中序.后续遍历. 遍历序列:将树中所有元素遍历一遍后,得到 ...
- 你真的懂 i++ 和 ++i 吗?
对于 ++i 和 i++,许多人可能都知道,不就是先加1再取值,和先取值再加1嘛.然而,真的是这样吗?请先看以下4道题,能全部答对可以忽略这篇文章. 题目 // 示例1 int i = 1; i = ...
- 攻防世界 reverse 进阶 1-4
1.dmd-50 suctf-2016 md5后比较,在线解md5得到: md5(md5($pass)),所以将grape再进行MD5 b781cbb29054db12f88f08c6e161c199 ...