程序设计
coding-demo
喜欢编程是因为那种感觉
展开
-
工厂模式--C语言实现
工厂模式,其实就是C++中的类的继承,只不过用C语言中的函数指针来实现了。假设现在的需求是公司生产一系列产品,包括椅子,床等,要求先生产产品,然后将生产的产品销售出去。将来可能要增加新的产品,不希望修改现有的核心代码流程,满足开闭原则。/* 工厂模式,其实就是C++中的类的继承,只不过用C语言中的函数指针来实现了*//* 假设现在的需求是公司生产一系列产品,包括椅子,床等,要求先生产产品,然后将 生产的产品销售出去。 将来可能要增加新的产品,不希望修改现有的核原创 2022-05-30 20:43:50 · 833 阅读 · 0 评论 -
C语言状态机--MP3的事件驱动实现
有些场景下,状态机可以使得我们的程序代码变得简洁,可扩展,可维护。先看下状态迁移图。代码设计分为五个步骤完成状态机。#include <stdio.h>// 第一步:定义两个事件typedef enum { STOP, PLAY_PAUSE, EVE_MAX} EVENT;// 第二步:定义三种状态typedef enum { PLAY_STA, PAUSE_STA, STOP_SAT, STA_MAX}.原创 2022-05-29 22:38:47 · 880 阅读 · 2 评论 -
X_MACRO在架构设计中的应用
比如在代码中要设计一个消息处理模块,代码要尽量简洁,还要做到可扩展。不妨可以试试X_MACRO技巧吧。/* 设计一个消息处理的模块,收到消息调用对应的处理函数*/#include <stdio.h>// 消息表定义,后续增加消息类型,只需在这里增加一行,并增加对应的处理函数即可#define MACROS_TABLE \ X_MACROS(MSG1, msg1_process) \ X_MACROS(MSG2, msg2_p.原创 2022-05-29 20:11:45 · 404 阅读 · 0 评论 -
python openpyxl模块操作excel表格
在工作中难免会遇到要对excel文件做操作的场景,如果手工做一些重复的操作会特别的麻烦。虽然有时候可以用excel中的公式来解决,但是某些场景是公式不能解决的。下面是一位朋友工作中遇到的问题,找到我看看能不能用python解决。我给他写了一段程序,很简单的就将他的问题解决掉了,为他节省了1天的工作量。在写程序之前需要安装openpyxl模块,具体安装可以使用下面的命令:pip3 install openpyxl具体的代码如下:from openpyxl import load_wo.原创 2022-05-25 20:05:09 · 396 阅读 · 0 评论 -
人脸识别开源项目--insightface
1 insightface简介最近人脸识别等机器学习的项目很火,偶然间发现了一个开源的人脸识别的开源项目insightface。人脸识别技术可以准确识别出图像中的人脸和身份,具有丰富的应用场景,譬如金融场景下的刷脸支付、安防场景下的罪犯识别和医学场景下的新冠流行病学调查等等。人脸识别的算法演变经历了以 PCA 为代表的早期阶段,再到以“人工特征+分类器”为主的统计学习方法阶段,近几年,随着大数据及 GPU 算力的爆发,人脸识别进入到深度学习算法为绝对主角的阶段。InsightFace是基于 M.原创 2022-05-22 21:22:33 · 15763 阅读 · 7 评论 -
Flask入门
目录1 引言2 安装Flask框架3 部署网站3.1 建立项目目录3.2 编写server.py的代码3.3运行服务端程序3.4 浏览器访问网站1 引言作为一个通信软件工程师,一直对网站服务很感兴趣。通信软件做的是管道,最终都是为网站等应用来服务的。想着怎么自己能够完成一个网站的开发,找到了Flask框架。什么是Flask框架Flask是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Pyt..原创 2022-05-17 23:27:08 · 483 阅读 · 0 评论 -
C++语言程序调用C语言库
目录1 背景2 示例1 背景C语言和C++语言是项目开发中经常用到的语言,在开发过程中经常会遇到C++程序要调用C程序的场景。如果项目代码是C语言写的,而使用的代码测试框架是C++写的,为了测试C项目代码,自然而然就会在C++代码中调用C代码写的函数。在C++代码调用C代码写的函数过程中,遇到的最大问题就是找不到符号,具体原因是因为C语言和C++语言在生成函数符号是有差异的。2 示例比如在foo.c的文件中代码如下:int foo(int x, int y) { r原创 2022-05-16 21:04:56 · 1669 阅读 · 0 评论 -
反编译探寻汇编
目录1 概述2 反汇编3 反汇编工具3.1 objdump3.2 常用的参数3.3 命令示例4 反汇编示例1 概述前面有一篇博客讲了C语言总是从main函数执行的原由,其实我们还可以进一步通过反编译的手段来分析汇编代码来深入了解下。2 反汇编在传统软件开发模型中,程序员使用编译器,汇编器和链接器中的一个或者几个创建可执行程序。为了回溯编程过程(或对程序进行逆向工程),我们使用各种工具来撤销汇编和编译过程。3 反汇编工具3.1 objdumpobjd原创 2022-05-11 18:37:45 · 595 阅读 · 0 评论 -
coredump介绍和使用
1 什么是coredumpcoredump是程序崩溃时的内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里。2 如何开启coredump功能ulimit -c 可以设置core文件的大小,如果这个值为0.则不会产生core文件,这个值太小,则core文件也不会产生,因为core文件一般都比较大。2.1 设置core文件的大小的方法:1、ulimit -c unlimited暂时生效2、/etc原创 2022-05-10 01:00:06 · 4302 阅读 · 0 评论 -
神秘又熟悉的main函数
1 概述学习C语言的同学都知道main函数,并且这是我们接触的第一个函数,但是很少有人去深究C语言为什么都是从main函数执行的。今天我们就来深入了解下。2 程序编译C语言生成可执行文件分为3个阶段:编译、链接、运行。每个编辑单元(例如多个.c源文件)是各自独立编译成目标文件(例如.o),最后由链接器把这些目标文件链接成可执行程序。3 揭开最后的面纱实际上使用gcc进行链接时要调用下面的命令:ld /usr/lib/crt1.o /usr/lib/crti.o main.o -o原创 2022-05-09 12:27:45 · 874 阅读 · 0 评论 -
LeetCode 解码方法(DFS,递归,动态规划)
题目:一条包含字母A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释:它可以解码为 "AB"(1 2)或者 "L"(12)。示例2:输入: "226"输出: 3解释:它可以解码为 "BZ" (2 2...原创 2019-12-12 23:54:42 · 206 阅读 · 0 评论 -
最短路径算法——迪杰斯特拉算法(Dijkstra)
图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法。其中迪杰斯特拉算法(Dijkstra)实现如下:原理就是不断寻找当前的最优解:void main(){ int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity原创 2014-09-24 22:08:12 · 744 阅读 · 0 评论 -
c++中函数模板的使用
在程序设计中,经常要使用到函数体相同的函数,如果我们要根据所使用的参数表不同来决定调用具体哪个函数时,我们经常使用的方式是进行函数重载,但是当我们的函数很多的时候会发现实现起来很不方便。所以c++提供了函数模板的概念,这和类模板实现起来的方式是类似的。下面举个例子,我们经常要使用的冒泡排序算法,被排序的对象可能是double,int,char,float等等,下面是实现代码:templat原创 2014-09-13 11:41:12 · 538 阅读 · 0 评论 -
关于子函数中用new动态申请的空间的思考
当我们的程序在运行时才能决定数组空间的大小的情况下,我们会经常使用new或者malloc来在堆空间中动态的申请一片空间,这是相当的方便和实用的。最近经常使用自己也发现了一些问题以及自己对这些问题的思考:void main(){ int *B; cout<<*B; fun(&B); cout<<*B;}void fun(int **A){ *A=new int(10);}上面原创 2014-09-13 15:30:35 · 1274 阅读 · 0 评论 -
c++笔试复习
1. 请说出#define和const的区别,都有何优点?原创 2014-08-26 10:51:19 · 283 阅读 · 0 评论 -
字符串流的使用c++
坚持写博客——善于总结和记录学习的每一天今天简单的复习了下c++的标准IO库,c++的IO操作和c的IO操作原理是不一样的,c++是使用的强大的类库实现了IO的操作,而c只是使用了简单的库函数实现了IO操作。这就带来了一些本质的区别,首先c的IO操作是不进行类型检查的,而c++的进行类型检查的,若输入的类型不正确,那么对象的条件状态会置为false。c++的IO操作主要包括三大类:1、io原创 2014-08-25 11:12:21 · 423 阅读 · 0 评论 -
git版本控制工具如何回退上次commit中的某个文件
现在git版本控制工具是当下最流行的版本控制工具,git分为工作区,暂存区以及版本区,如果修改的文件在工作区或者在暂存区,可以使用命令git checkout -- <file>和git reset HEAD <file>进行回退。如果修改的文件已经commit,那如果进行回退呢?...原创 2019-06-27 22:09:38 · 1821 阅读 · 0 评论 -
最短路径——floyd算法
上一篇博文中讲了Dijkstra算法,这次博文要讲解的是floyd算法,其中Dijkstra算法是属于贪心算法,而floyd算法是动态规划的一个算法:具体的算法如下:其中一个矩阵是用来存放最短路径的,另外一个矩阵是用来存放前驱顶点的;#include using namespace std;#define Max 5#define Infinity 65535void ma原创 2014-09-25 09:54:16 · 781 阅读 · 0 评论 -
windows下如何配置实现命令行编译c++程序
大家知道在linux下编译c++代码的那种命令式的编译方式,想不想在windows下实现这样的功能?今天我就使用了我的windows台式电脑和笔记本电脑实现了这样的命令式的c++代码的编译。首先你需要的工具就是:1. 一台windows下的电脑(当然是安装了c++编译器的电脑)2. 下载安装一个文本编辑器的软件(比如notepad等等)下面是实现这样的功能的具体的步骤:原创 2014-12-03 15:36:24 · 685 阅读 · 0 评论 -
IP地址的转换
今天遇到一个题目:将十进制的IP地址转化成二进制,然后将二进制串起来成为32的数,再按照十进制将这个数读出来。这个问题有种解决方案:1. 可以用乘法操作;2. 可以用移位操作;3. 可以使用联合体定义解决;下面我就移位操作和利用联合体来进行代码的编写:#include using namespace std;#define COUNT 4union IP{ str原创 2014-12-24 14:45:22 · 519 阅读 · 0 评论 -
内存对齐总结
今天参加了入职前的小小的培训,培训中老师讲到了关于内存对齐的只是,以前接触过,但是没有深究,今天老师讲了,回来便查了查资料,下面便是我对内存对齐的理解。内存对齐对于大部分的软件工程师来说都可以说是透明的,内存对齐应该是编译器去管理的,C语言的特点就是强大灵活,他允许你对内存进行操作。如果你想对深层次的更加底层的东西要加以理解,就必须对内存对齐要有一定的了解。首先是为什么我们需要对内存对齐:原创 2014-12-15 21:34:43 · 479 阅读 · 0 评论 -
编写自动测试c语言程序的shell脚本
目前经常用vim编写一些c语言程序,写好了程序一般都得进行一些测试,当然我们可以进行一些常规的手动测试。心里一想,如果能够用shell脚本编写一个能自动测试c语言程序就好了。为了试一试这样的想法,找了一个c语言程序题目:[一球从 100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10 次落地时,共经过多少米?第10 次反弹多高? ]根据这样原创 2015-07-10 23:22:14 · 4735 阅读 · 0 评论 -
重载和重写
最近一直在研究设计模式,主要是针对面向对象的程序来讲的。因此必不可少的会接触面向对象语言的关键字,比如重载和重写,那么什么是重载和重写呢?重载(overload)是一个类中可以定义相同名称的方法,但是方法的入参是不同的,包括入参的顺序不同,这样在写程序的时候可以通过传入不同的参数调用不同的方法功能。最典型的应用场景就是一个类可以有多个构造函数,这些构造函数的名称是相同的,但是参数是不一样的。...原创 2019-06-27 23:12:31 · 401 阅读 · 0 评论 -
递归、迭代、动态规划的区别
递归的基本概念:程序调用自身的编程技巧,就是函数自己调用自己;一个函数在定义中直接或者间接调用自身的一种方法,它通常是将一个大型的复杂的问题分解为与之相似的小的问题,可以极大的减少代码量;递归有两个特点:1)函数自身调用自身;2)使用递归时必须要有一个明确的出口;递归分两个阶段:1)递推:把复杂的问题推到比原问题简单的子问题的求解;2)回归:当获取最简单的情况后,逐步返...原创 2019-09-14 23:48:20 · 727 阅读 · 0 评论 -
斐波那契数列新解(动态规划)
斐波那契数列大家都很熟悉了f(n) = f(n-1) + f(n-2)f(0) = 1f(1) = 1如果要用计算机程序来实现这个功能的话,根据上面的递推公式很容易想到使用递归的方式,使用递推的优点是程序员不用考虑具体的计算过程,只要找好递推的明确出口就可以了。int fib(int n){ if (n == 0 || n == 1) { retur...原创 2019-09-15 17:05:21 · 661 阅读 · 0 评论 -
快速排序算法
快速排序算法是冒泡排序算法的升级版,他的效率是极高的,基本思想使用了分治策略,通过一趟排序将数组分成两个小数组,其中一部分比另一部分的数据小,然后递归的对子序列进行排序,直到完成整个数据的排列。基本步骤是:将数组中的一个作为轴(一般选择第一个)然后从数组的最后一个开始和这个轴进行比较,如果比轴大,就放在原处不动,进行下个数据的比较,直到找到一个比轴小的数,然后进行替换;接下来从第一个数开始原创 2014-07-17 21:39:09 · 436 阅读 · 0 评论 -
链表队列的实现
队列也是数据结构中比较重要的一种,和栈相反的是,队列是先进先出的,先进队列的可以先出队,跟平时我们排队是一样的。在允许多通道程序运行的计算机系统中,同时几个作业运行。凡是申请输出的作业都从队尾进入队列。现在用链表实现队列,先定义一个链表结点:typedef struct QNode{ int data; QNode *next;}QNode,*QueuePtr;给队列定义一个头结点原创 2014-07-26 22:01:40 · 393 阅读 · 0 评论 -
排序二叉树的实现
在计算机科学中,二叉树是一种重要的非线性的数据结构。每个结点的度均小于等于2,通常子树称为左子树和右子树。而排序二叉树是二叉树中的一种,其满足:1. 如左子树不为空,那么左子树上的结点的值都小于其根上的值;2. 如右子树不为空,那么右子树上的结点的值都大于其根上的值; 3. 其子树也是一个排序二叉树。下面用递归的方式来插入一个结点来满足上述的要求:typedef struct Node{原创 2014-07-28 16:37:27 · 1038 阅读 · 0 评论 -
windows下怎么配置mygsl数值库的方…
如果你是做科学研究的话,现在很少的计算能够用解析的方式给出解答,在很多的情况下要进行数值计算解决手中的问题。数值计算的软件现在很多,包括MATLAB,mathmatic等等,这些软件的优点也是很明确的,这些软件很好上手,很容易学会进行一些简单的编程计算,但是如果你要进行一些复杂的大型运算的话,只用这些软件的话会感到很吃力,因为这些软件的方便使用的优点也恰恰限制了他们的运算速度。今天我就要向大家介绍原创 2014-06-03 16:54:22 · 807 阅读 · 0 评论 -
向量点乘最小值
两个n维的向量,向量的点乘是指将向量对应维度的乘积相加,但是我们可以将向量维度交换下可以得到更小的向量点乘,例如3维向量:【1, 3, −5】和【4, −2, −1】,最小向量点乘为-27,即将维度变为:[3,1,-5]和[-2,-1,4],程序设计要求:输入一个整数n为向量的维度,然后输入两个n维度的向量,用空格区别向量元素,输出为一行,包含一个整数,为最小的点乘。我写的代码为:#i原创 2014-06-08 22:16:28 · 3142 阅读 · 0 评论 -
堆排序
先看下堆的概念:堆是一种数据结构,逻辑上是一种完全的二叉树,在存储上是数组对象。堆分为小顶堆和大顶堆,顾名思义:小顶堆是指顶部的元素是最小的,大顶堆是指顶部的元素师最大的。这样只要我们能够得到这样的堆,每次将顶部的元素和数列的最后一个元素进行交换,然后再对剩下的元素进行建堆,接着以此类推这样的做法,便可以得到排好的数列了。根据上面所述,堆排序的关键是:建堆。建堆也分为调堆和建堆过程;原创 2014-07-18 21:50:45 · 389 阅读 · 0 评论 -
分治——合并排序
分治策略中有一个经典的算法就是合并排序,这个算法的精髓也是分治二字,分而治之。将一个大规模的问题分割成若干个同样的小问题,小问题的规模很小,很容易解决,解决了小的问题后再对这些小问题的结果进行合并得到大规模问题的解答。合并排序便是分治策略中比较经典的算法,首先是合并,两个排列有序的数列经过合并后成为有序的数组:代码如下:void _merge(int *A,int left,int mid原创 2014-07-18 14:52:08 · 650 阅读 · 0 评论 -
关于c++primer的一个代码错误
最近看c++primer第四版的标准容器vector,讲到对vector容器的插入删除元素会使得end()的迭代器失效的问题,所以不建议程序员对end()的存储。vector vec;vector::iterator first=vec.begin();while(first!=vec.end()){ first=vec.insert(first,12); first原创 2014-06-07 00:00:36 · 733 阅读 · 2 评论 -
坚持c++,真正掌握c++
我写这样的文章,当然是为了自己日后方便自己查看,当作看书的笔记,也是为了和广大喜欢c++语言的同仁交流。几天复习了c++primer的13章复制控制。从上一章中我们知道,如果我们不定义类的构造函数时,编译器就会很友好的帮我们合成一个,那么复制构造函数呢?首先复制构造函数的定义如class(const class&),复制构造函数和构造函数一样也没有返回值,但是复制构造函数具有一个该类类型的引用作为原创 2014-06-24 21:17:47 · 554 阅读 · 0 评论 -
坚持c++,真正掌握c++(2)
c++中的输入输出那些事儿原创 2014-06-05 10:26:14 · 580 阅读 · 0 评论 -
再谈MFC学习——模态对话框的数据传递
学习c++的目的就是为了使用封装好的类,而最最经典的封装类当然是微软的MFC窗口程序类。学习MFC编程之前要学习c++的主要知识,掌握c++的基本编程思想。下面就看下我学习的MFC模态对话框的数据传递。首先,什么叫做模态对话框呢?模态对话框指的是当弹出这样的对话框的时候,程序不能相应除了此对话框外其他的窗口的响应,直到关闭了这个对话框,程序才能响应其他的对话框的响应。非模态对话框即使弹出也能响原创 2014-06-24 10:07:23 · 1772 阅读 · 0 评论 -
坚持c++,真正掌握c++(4)
这几天复习了c++primer的第12章类的讲解,虽然之前这一章也看了几遍,但是我终究觉得书读百遍其义自现,现在我给出一些我学习的心得,欢迎大家一起探讨。首先,类可以说是c++的灵魂,正因为c++中有类的出现,提高了代码的复用率,实现了真正的面向对象的编程,我们可以使用别人编写设计的类,只要我们知道这个类的成员函数和成员数据,我们就可以使用这个类而不必去考虑这个类的实现方式。c++中就存在着很原创 2014-06-23 21:57:33 · 510 阅读 · 0 评论 -
坚持c++学习,真正掌握c++(1)
草根的c++学习心得原创 2014-06-03 21:33:57 · 564 阅读 · 0 评论 -
回文距离求解
基于上面一篇博文的代码设计求的某个数的回文距离,所谓回文距离就是给定一个数,求这个数离与他最近的那个回文数的距离,例如123的回文距离为2,因为离123最近的回文数为121,所以123的回文距离为2,代码如下:#include #include #include using namespace std;bool fun(int);void main(){ int val,val原创 2014-06-08 19:34:22 · 647 阅读 · 0 评论 -
windows下利用mpi并行库构建小型服…
这篇博文主要讲关于怎么在windows平台下建立一个小型的服务器,相信大家身边肯定可以找到几台windows系统的计算机,这样我们要做大型计算的话,一台机器很慢,我们可以将几台windows系统连接起来构建一个小型的并行计算的工作站,这样我们的计算就很方便了。硬件需求:n台win7系统的计算机 (我用了3台,一台为笔记本,其他两台为台式机)软件:安装MPI并行库 (下载地址,百度下很多,免费原创 2014-06-03 16:54:20 · 395 阅读 · 0 评论