
程序人生
*空白*
这个作者很懒,什么都没留下…
展开
-
暴走图片
一、项目描述:1.Vs2013+Duilib 库进行窗口绘制,使用 XML 描述界面风格2.在 DuiDesigner_d.exe 中创建 Gif 动图程序窗口3.借助 ffmpeg 工具用窗口响应图片或视频进行动图制作4.运行程序,用户选择图片/视频生成三、环境:VS2017Duilib 库Win32XMLffmpeg 工具三、测试结果:绘画出一个可以生成动态图的软件的界面图片生成:选择图片文件,图片快速切换达到 Gif 效果视频生成:选择视频目录,截取片断并原创 2020-05-25 01:25:18 · 634 阅读 · 0 评论 -
在线计算器
一、项目描述:· 使用 socket 编程实现 TCP 通讯,支持 C/S 模式· 维护一个线程池,实现一对多处理响应请求· 设计请求报文处理方法,及 POST GET 两种访问方式的响应方法· 服务器接收并分析客户端的请求方法和资源路径· 服务器将资源 html 页面响应给客户端二、环境:centos 6.5 +vim/g++;三、测试结果:实现一个简单的在线计算器功能:四、服务器的具体实现1.基于HTTP的自主Web服务器当然要先了解HTTP的基本框架关于HTTP协议2.服原创 2020-05-20 02:57:03 · 1474 阅读 · 1 评论 -
HTTP协议
一、认识HTTP协议HTTP协议是超文本传输协议,是互联网上应用最广泛的网络协议。它是应用层的协议,底层是基于TCP通信的。HTTP协议的工作过程:客户通过浏览器向服务器发送文档请求,浏览器将请求的资源回应给浏览器,然后关闭连接。即:连接->请求->响应->关闭连接。二、关于URLURL是统一资源定位符,每个网页都对应一个URL地址(俗称网址),具有全球唯一性。三、HTTP协议格式HTTP请求 :首行: [方法] + [url] + [版本]Header: 请求的属性,原创 2020-05-17 23:35:25 · 149 阅读 · 0 评论 -
堆排序
排序算法目录:1.插入排序2.希尔排序3.冒泡排序4.快速排序5.计数排序6.选择排序图解冒泡排序:代码实现:void HeapSort(int* array, int size)//堆排序{ for (; size > 0; --size) { int i = (size - 2) / 2; for (; i >= 0; --i) { Hea...原创 2020-01-23 17:03:00 · 131 阅读 · 0 评论 -
计数排序
排序算法目录:1.插入排序2.希尔排序3.选择排序4.冒泡排序5.快速排序6.计数排序7.堆排序图解计数排序:代码实现:void CountSort(int* array, int size)//计数排序{ int i = 0; int a[10]; int b[20]; for (i = 0; i < 20; i++) { b[i] = 0; } f...原创 2020-01-22 23:51:17 · 140 阅读 · 0 评论 -
快速排序
排序算法目录:1.插入排序2.希尔排序3.选择排序4.冒泡排序5.快速排序6.计数排序7.堆排序图解冒泡排序:代码实现:void QuickSort(int* array, int left, int right)//快速排序{ int i = left; int j = right; int key = array[left]; if (left >= rig...原创 2020-01-21 21:32:11 · 184 阅读 · 0 评论 -
选择排序
排序算法目录:1.插入排序2.希尔排序3.冒泡排序4.快速排序5.计数排序6.堆排序图解冒泡排序:代码实现:void SelectSort(int* array, int size)//选择排序{ int i = 0; int j = 0; int min = 0; for (i = 0; i < 10; i++) { min = i; for (j =...原创 2020-01-19 22:59:07 · 151 阅读 · 0 评论 -
希尔排序
排序算法目录:1.冒泡排序2.插入排序3.选择排序4.快速排序5.计数排序6.堆排序图解插入排序:代码实现:void ShellSort(int* array, int size)//希尔排序{ int i = 0; int j = 0; int n = 0; int gap = 0; for (gap = size / 2; gap > 0; gap /= 2...原创 2020-01-19 21:35:35 · 193 阅读 · 0 评论 -
冒泡排序
排序算法目录:1.插入排序2.希尔排序3.选择排序4.快速排序5.计数排序6.堆排序图解冒泡排序:代码实现:void BubbleSort(int* array, int size) int i = 0; int j = 0; for (j = 0; j < size - 1; j++) { for (i = 0; i < size - 1 - j; i+...原创 2020-01-18 21:23:40 · 130 阅读 · 0 评论 -
插入排序
排序算法目录:1.冒泡排序2.希尔排序3.选择排序4.快速排序5.计数排序6.堆排序图解插入排序:代码实现:void InsertSort(int* array, int size)//插入排序{ int i = 0; int j = 0; int n = 0; for (i = 1; i < size; i++) { n = array[i]; j =...原创 2020-01-18 20:52:39 · 126 阅读 · 0 评论 -
线程池和设计模式
线程池线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个 线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。应 用:需要大量的线程来完成任务,且完成任务的时间比较短。对...原创 2019-12-27 22:20:21 · 1219 阅读 · 1 评论 -
线程安全:互斥与同步
线程安全多个执行流对同一临界资源进行争夺,但是不会造成数据二义互斥同一时间只能由一个执行流能访问临界资源同步通过条件判断实现对临界资源访问的时序合理+++...原创 2019-12-17 18:27:34 · 151 阅读 · 0 评论 -
同步:生产者消费者模型(条件变量与信号量)
同步通过条件判断实现对临界资源访问的时序合理性原创 2019-12-17 18:26:37 · 258 阅读 · 0 评论 -
文件系统
block文件存储在硬盘上,硬盘的最小存储单位是扇区,每个扇区存储512字节,操作系统读取硬盘时,不会一个一个扇区读取,效率太慢,所以一次读取多个扇区,也就是读一个块(block),块是文件存取的最小单位。一个block的大小是由格式化的时候确定的,并且不可以更改。文件系统通常把实际数据放到 data block 中。block由一个或多个sector组成,文件系统中最小的操作单位;OS的虚拟...原创 2019-12-10 11:46:06 · 306 阅读 · 0 评论 -
线程
什么是线程线程是在进程内部运行的一个执行流linux下没有真正意义上的线程,是用进程模拟的优点创建一个新线程的代价要比创建一个新进程的代价小与进程间切换比,线程切换操作系统做的工作少线程占用的资源少能充分利用多处理器的可并行数量在等待慢速I/O结束的同时,可以执行其他计算任务计算密集型应用,为了能在多个处理器系统上运行,将计算分解到多个线程中实现I/O密集型应用,可以同...原创 2019-12-09 11:58:20 · 126 阅读 · 0 评论 -
信号
什么是信号生活当中有很多信号,例如:红绿灯,上课铃声。在Linux下,信号是一个软中断,其实也可以代表事件,通知进程发生了某个事件,中断当前事件,去处理这个事件。kill -l查看信号信号种类 — 62种两大类:非可靠信号: 1~31 有可能造成事件丢失(如果进程对某个信号进行处理时,这个信号发生多次,但是进程只处理了一次)可靠信号: 34 ~64 不会造成事件丢失...原创 2019-12-06 15:45:19 · 111 阅读 · 0 评论 -
共享内存
共享内存的创建步骤:创建共享内存映射进各自的地址空间。函数shmget//创建共享内存 int shmget(key_t key, size_t size, int shmflg); key:唯一标识符,在操作系统内部,保证找到同一份资源,必定唯一 size:大小,单位是页 shmflg:权限 返回值:成功共享内存标识符,失败-1,在应用层标识资源ftok...原创 2019-11-13 18:17:23 · 282 阅读 · 0 评论 -
管道
什么是管道管道只能单向通信匿名管道#include<unistd.h>//头文件int pipe(int fd[2]);//创建一个匿名管道f[0]为读文件描述符,f[1]为写文件描述符#include<stdio.h> 2 #include<unistd.h> 3 #include<stdlib.h> 4 #incl...原创 2019-11-12 13:23:34 · 226 阅读 · 0 评论 -
文件描述符
open函数open()//头文件#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>//功能打开或创建文件(建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取和写入的操作)//原型int open(const char*pathname,int flags);...原创 2019-11-04 15:09:01 · 176 阅读 · 0 评论 -
进程的等待,退出与替换
进程退出1.进程退出的场景①代码运行完毕正常退出,结果正确②代码运行完毕正常退出,结果不正确③异常退出常见退出方法正常退出从main() 函数中返回return退出调用exit()函数退出exit:#include <unistd.h>void exit(int status);参数:status 定义了进程的终止状态,父进程通过wait来获取该值调用...原创 2019-11-01 15:36:41 · 175 阅读 · 0 评论 -
fork
fork函数fork函数从已经存在的进程中创建一个新的进程,新进程为子进程,原进程为父进程。子进程返回0,父进程返回子进程的pid。原创 2019-10-27 15:38:49 · 1262 阅读 · 0 评论 -
进程地址空间
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!...原创 2019-10-25 15:50:10 · 100 阅读 · 0 评论 -
环境变量
环境变量环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数, 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。常见环境变量①PATH : 指定命令的搜索路径②HOME : 指定用户的主工作目录...原创 2019-10-25 14:34:00 · 325 阅读 · 0 评论 -
进程
概念:什么是进程:正在执行的程序就叫做进程,担当分配系统资源(CPU时间,内存)的实体。PCB:Linux操作系统下的PCB是: task_struct。进程信息被放在进程控制块的数据结构中。task_struct内容:标示符: 描述本进程的唯一标示符,用来区别其他进程。状态: 任务状态,退出代码,退出信号等。优先级: 相对于其他进程的优先级。程序计数器: 程序中即将被执行的下一...原创 2019-10-25 13:31:23 · 146 阅读 · 0 评论 -
make与makefile
make与makefilemake是一条命令,makefile是一个文件, 搭配使用可以完成项目的自动化构建。makefile中的描述用于指导make程序如何完成工作;make根据makefile中的规则执行命令,最后完成编译输出。Makefile里面放的是依赖关系和依赖方法,举个例子新建一个makefile的文件:test:test.c gcc -o $@ $^ //...原创 2019-10-14 17:29:55 · 156 阅读 · 0 评论 -
gcc/g++
gcc概念GCC(GNU Compiler Collection,GNU编译器套件),是由GNU开发的编程语言编译器。gcc如何完成预处理预处理功能主要包括宏定义,文件包含,条件编译,去注释等。编译在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。汇编连接...原创 2019-10-14 16:57:03 · 84 阅读 · 0 评论 -
vim
vimvim基本概念vim是多模式的编辑器vim基本操作进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:特别注意,进入vim之后,是处于[正常模式],要切换到[插入模式]才能够输入文字。①[正常模式]切换至[插入模式]输入a输入i输入o②[插入模式]切换至[正常模式]目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往...原创 2019-10-14 16:35:14 · 408 阅读 · 0 评论 -
C语言总结
写了一个思维导图,总结了C语言的重点,希望能给大家帮助原创 2019-01-17 21:23:14 · 365 阅读 · 0 评论 -
三子棋
头文件#define _CRT_SECURE_NO_WARNINGS 1#include&lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;time.h&gt;#define ROW 3#define COL 3void InitBoard(int row, int col, char board[ROW][COL]);原创 2018-12-09 14:11:12 · 139 阅读 · 0 评论 -
猜数字游戏
今天学习到了随机值生成的方法在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数。#def...原创 2018-12-06 23:30:17 · 273 阅读 · 0 评论 -
找凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。A说:不是我。B说:是C。C说:是D。D说:C在胡说已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。#include<stdio.h>#include<stdlib.h>int main(){ char Murder...原创 2018-12-13 13:59:18 · 329 阅读 · 0 评论 -
杨辉三角
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#define N 5int main(){ int arr[N][N] = { 0 }; int i, j; for (i = 0; i < N; i++) { arr[i][0] = arr[i][i] = 1; } for (i = 2; i <...原创 2018-12-13 13:55:30 · 120 阅读 · 0 评论 -
操作符
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?要想实现此函数,首先要获取整数二进制的每一位,在进行比较1的二进制序列为 00000000 00000000 00000000 00000001(m >> i) & 1& 按位与 有0为0 两个1为1 所以和1 & 可以获得m的最后一位》有一操作符 m二进制序列整体右移...原创 2018-12-13 13:52:41 · 101 阅读 · 0 评论 -
momcpy和mommove
memcpy和memmove都是C语言中的库函数,在头文件string.h中,作用都是内存拷贝,但是memcpy的功能要小于memmove,mommove可以保证重叠拷贝时的正确性。如图 ,memcpy(arr+2,arr,16) 会输出12121212789,拷贝时前边会把后面覆盖掉,memmove就能解决这个问题 ,分情况处理 ,如果 dst 大于 src就要从后往前拷贝,其他从前往后拷贝...原创 2019-01-08 17:31:07 · 786 阅读 · 0 评论 -
冒泡排序与qsort
冒泡排序,比较相邻数字的大小,若第一个数比第二个数大(小),则相互交换,如图arr[10]={9,8,7,6,5,4,3,2,1}第一趟:8 9 7 6 5 4 3 2 1第二趟:8 7 9 6 5 4 3 2 1..第N趟:1 2 3 4 5 6 7 8 9qsort,由于我们不知道别人传来的类型,所以我们可以用void来接收,然后强制类型转化为char,再知道宽度,就可以进行比较...原创 2019-01-08 18:06:55 · 290 阅读 · 0 评论 -
斐波那契数与时间复杂度
斐波那契数列:经典数学问题之一:斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……第一项,第二项的值为1,第三项开始,它的值为前两项之和。代码实现非常简单:int fab_1(int n){ if (n < 3) { return 1; } return fab_1(n - 1) + fab_1(n - 2);}简单的看看这个...原创 2019-01-20 23:03:45 · 1062 阅读 · 0 评论 -
单链表
创建两个结构体是为了简单,避免二级指针。// 节点结构 typedef struct SListNode{ SData data; struct SListNode* pNext;}Node;// 给一个链表结构 typedef struct SList{ Node* pHead;}SList;创造一个新结点SData* MakeNewNode(SData d){ ...原创 2019-01-20 23:21:45 · 106 阅读 · 0 评论 -
C和C++的内存管理
C和C++的内存管理1.内存分布(1) 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。(2) 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(3)堆用于程序运行时动态内存分配,堆是可以上增长的。(4)数据段–存储全局数据和静态数据。(5) 代码段–可执行的代码/只读常量。2.c语言动态内存管理m...原创 2019-06-26 10:59:33 · 176 阅读 · 0 评论 -
模板
模板1.函数模板:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。template<typename T1, typename T2,......,typename Tn>返回值类型 函数名(参数列表){}...原创 2019-06-27 15:23:47 · 84 阅读 · 0 评论 -
string类
string类string是表示字符串的字符串类string类对象的常见构造void TestString(){string s1; // 构造空的string类对象s1string s2("hello bit"); // 用C格式字符串构造string类对象s2string s3(10, 'a'); // 用10个字符'a'构造string类对象s3string s4(s2); ...原创 2019-07-17 15:45:59 · 389 阅读 · 0 评论