随笔分类 -  【01】C/C++

摘要:实用排序算法(复杂度小于等于O(n^2))中效率最低但实现并不是最简单的的两个,C、C++教材却总喜欢拿来大讲特讲,非常不利于初学者养成“程序效率”的思维。实际上,各种排序算法里,除了堆排序实现较为复杂外,从代码量的角度,大多数算法都不比冒泡、选择算法复杂多少。举几个高速的排序算法的例子,这些才适合进入教材鸽巢排序,排序字节串、宽字节串最快的排序算法,计数排序的变种(将计数缓冲区大小固定,少一次遍历开销),速度是STL中std::sort的20多倍,更重要的是实现极其简单!缺点是需要一个size至少等于待排序数组取值范围的缓冲区,不适合int等大范围数据C/C++ codevoid Pigeo 阅读全文
posted @ 2011-07-07 10:29 ACE封印 阅读(272) 评论(0) 推荐(0) 编辑
摘要:目录C代码优化方案1、选择合适的算法和数据结构2、使用尽量小的数据类型3、减少运算的强度(1)、查表(游戏程序员必修课)(2)、求余运算(3)、平方运算(4)、用移位实现乘除法运算(5)、避免不必要的整数除法(6)、使用增量和减量操作符(7)、使用复合赋值表达式(8)、提取公共的子表达式4、结构体成员的布局(1)按数据类型的长度排序(2)把结构体填充成最长类型长度的整倍数(3)按数据类型的长度排序本地变量(4)把频繁使用的指针型参数拷贝到本地变量5、循环优化(1)、充分分解小的循环(2)、提取公共部分(3)、延时函数(4)、while循环和do…while循环(6)、循环展开(6)、循环嵌套( 阅读全文
posted @ 2011-06-30 15:10 ACE封印 阅读(354) 评论(2) 推荐(1) 编辑
摘要:1. C++面向对象程序设计的重要概念 早期革命影片里有这样一个角色,他说:“我是党代表,我代表党,我就是党。”后来他给同志们带来了灾难。 会用C++的程序员一定懂得面向对象程序设计吗? 不会用C++的程序员一定不懂得面向对象程序设计吗? 两者都未必。就象坏蛋入党后未必能成为好人,好人不入党未必变成坏蛋那样。 我不怕触犯众怒地说句大话:“C++没有高手,C 语言才有高手。”在用C 和C++编程8年之后,我深深地遗憾自己不是C 语言的高手,更遗憾没有人点拨我如何进行面向对象程序设计。我和很多C++程序员一样,在享用到C++语法的好处时便以为自己已经明白了面向对象程序设计。就象挤掉牙膏卖牙膏皮那样 阅读全文
posted @ 2011-06-30 14:50 ACE封印 阅读(242) 评论(0) 推荐(0) 编辑
摘要:优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号(表达式)/函数名(形参表).成员选择(对象)对象.成员名->成员选择(指针)对象指针->成员名2-负号运算符-表达式右到左单目运算符(类型)强制类型转换(数据类型)表达式++自增运算符++变量名/变量名++单目运算符--自减运算符--变量名/变量名--单目运算符*取值运算符*指针变量单目运算符&取地址运算符&变量名单目运算符!逻辑非运算符!表达式单目运算符~按位取反运算符~表达式单目运算符sizeof长度运算符sizeof(表达式)3/除表达式/表达式左到右双目运算符*乘表 阅读全文
posted @ 2011-06-24 09:40 ACE封印 阅读(300) 评论(0) 推荐(0) 编辑
摘要:在程序设计当中经常会出现使用同种数据结构的不同实例的情况。例如:在一个程序中 可以使用多个队列、树、图等结构来组织数据。同种结构的不同实例,也许只在数据元素 的类型或数量上略有差异,如果对每个实例都重新定义,则非常麻烦且容易出错。那么能 否对同种类型数据结构仅定义一次呢?答案是肯定的,C++提供的类模板(Class Template )就可以实现该功能。 一、类模板 类模板是C++提供的一种特殊机制,通过它我们可以定义一种特殊的类(称为模板类),在类 的定义中可以包含待定的类型参数,在声明类的实例时,系统会自动根据传递的类型生成 用户想要生成的类实例。下面是用C++实现的一个简单的模板类Cli 阅读全文
posted @ 2011-06-22 19:56 ACE封印 阅读(829) 评论(0) 推荐(0) 编辑
摘要:[问题描述] 找出由n个元素组成的序列的最长有序子序列长度及其中一个最长有序子序列(注:这里有序指非递减顺序,且不要求子序列连续)。例如,对于序列[3, 7, 1, 5, 9, 3],其中最长有序子序列长度为3,这样的子序列有:[3, 7, 9]、[1, 5, 9]、[3, 5, 9]。[算法思想] 利用动态规划的思想,依次处理序列中每个元素,并记录当前已处理序列的结果。[算法分析与实现] 设数组X的所有元素X[0]、X[1]、…、X[n-1]为目标序列(为了与C/C++语言统一,我们这里下标以0开始)。算法依次处理序列中每个元素X[i](i=0..n-1):> 当处理完元素X[i]时( 阅读全文
posted @ 2011-06-22 14:15 ACE封印 阅读(2114) 评论(0) 推荐(0) 编辑
摘要:1.memmove函数原型:void *memmove(void *dest, const void *source, size_t count)返回值说明:返回指向dest的void *指针参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。2.memcpy函数原型:void *memcpy(void *dest,const void *source,size_tcount);返 阅读全文
posted @ 2011-06-15 21:28 ACE封印 阅读(1385) 评论(0) 推荐(1) 编辑
摘要:内存分配方式有三种:(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器 的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。7.2常见的内存错误及其对策 发生内存错误是件非常麻烦的事情 阅读全文
posted @ 2011-06-15 20:49 ACE封印 阅读(217) 评论(0) 推荐(0) 编辑
摘要:/*输入一个英文句子,翻转句子中的单词顺序。但单词内的顺序不变。句子中单词空格隔开。为简单起见,标点符号和普通字母一样处理。例如输入"Iamastudent.",则输出“student.aamI”.*/#include<stdio.h>#include<assert.h>voidreverse(char*begin,char*end){chartmp;while(begin<--end){tmp=*begin;*begin=*end;*end=tmp;++begin;}}char*word_reverse(charsrc[]){char*p=s 阅读全文
posted @ 2011-06-15 20:39 ACE封印 阅读(302) 评论(0) 推荐(0) 编辑
摘要:一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下 几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一 块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、 文字常量区—常量字符串就是放在这 阅读全文
posted @ 2011-06-15 20:35 ACE封印 阅读(170) 评论(0) 推荐(0) 编辑
摘要:基因学的一个主要主题就是比较 DNA 序列并尝试找出两个序列的公共部分。如果两个 DNA 序列有类似的公共子序列,那么这些两个序列很可能是同源的 。在比对两个序列时,不仅要考虑完全匹配的字符,还要考虑一个序列中的空格或间隙(或者,相反地,要考虑另一个序列中的插入部分)和不匹配,这两个方面都可能意味着突变。在序列比对中,需要找到最优的比对(最优比对大致是指要将匹配的数量最大化,将空格和不匹配的数量最小化)。如果要更正式些,您可以确定一个分数,为匹配的字符添加分数、为空格和不匹配的字符减去分数。全局序列比对 尝试找到两个完整的序列 S1 和 S2 之间的最佳比对。以下面两个 DNA 序列为例:S. 阅读全文
posted @ 2011-05-31 12:13 ACE封印 阅读(4458) 评论(0) 推荐(0) 编辑
摘要:Register修饰符暗示编译程序相应的变量将将被频繁使用,如果可能的话,应将其保存在CPU的寄存器中,以指加快其存取速度。但是,使用register修饰符有几点限制。 首先,register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小於或等於整型的长度。但是,有些机器的寄存器也能存放浮点数。 其次,因为register变量可能不存放在内存中,所以不能用取址符运算符“ & ”来获取取址符运算符“ &” register变量的地址。如果你试图这样做,编译程序就会报告这是一个错误。 register变量修饰符的用处有多大 阅读全文
posted @ 2011-05-30 20:24 ACE封印 阅读(253) 评论(0) 推荐(1) 编辑
摘要:位结构是一种特殊的结构,在需按位访问一个字节或字的多个位时,位结构 比按位运算符更加方便。 位结构定义的一般形式为:struct位结构名{ 数据类型变量名:整型常数; 数据类型变量名:整型常数; }位结构变量;数据类型必须是int(unsigned或signed)。整型常数必须是非负的整 数,范围是0~15,表示二进制位的个数,即表示有多少位。变量名是选择项,可以不命名,这样规定是为了排列需要。 struct id_flag { unsigned is_keyword:1; unsigned is_external:1 unsigned is_static:1; }flag;本例定义了is_k 阅读全文
posted @ 2011-05-30 18:03 ACE封印 阅读(1084) 评论(0) 推荐(0) 编辑
摘要:Socket 函数库--------------------------------------------------------------------------------相关函数:socket, bind, listen, connect表头文件:#include <sys/types.h> #include <sys/socket.h>函数定义:int accept(int s, struct sockaddr *addr, int *addrlen)函数说明:accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、lis 阅读全文
posted @ 2011-05-19 10:39 ACE封印 阅读(731) 评论(0) 推荐(0) 编辑
摘要:在second.c中还有一个函数需要调用first.c文件中的play1函数, 如何实现呢?Sencond.h 文件play1();sencond.c文件***(){Play();}例程-5在sencond.h文件内声明play1函数,怎么能调用到first.c文件中的哪个play1函数中呢? 是不是搞错了,没有搞错, 这里涉及到c语言的另一个特性:存储类说明符.C语言的存储类说明符有以下几个, 我来列表说明一下说明符 用法Auto 只在块内变量声明中被允许, 表示变量具有本地生存期.Extern出现在顶层或块的外部变量函数与变量声明中,表示声明的对象Static 具有静态生存期, 连接程序知 阅读全文
posted @ 2011-04-29 16:25 ACE封印 阅读(331) 评论(0) 推荐(0) 编辑
摘要:我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法: printf(\"%d\",i); printf(\"%s\",s); printf(\"the number is %d ,string is:%s\", i, s); 究 竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现的呢?本文就这个问题 阅读全文
posted @ 2011-04-29 16:24 ACE封印 阅读(276) 评论(0) 推荐(1) 编辑
摘要:absread()读磁盘绝对扇区函数原形:int absread(int drive,int num,int sectnum,void *buf)功能:从drive指定的驱动器磁盘上,sectnum指定的逻辑扇区号开始读取(通过DOS中断0x25读取)num个(最多64K个)扇区的内容,储存于buf所指的缓冲区中。参数:drive=0对应A盘,drive=1对应B盘。返回值:0:成功;-1:失败。头文件:dos.habswrite()写磁盘绝对扇区函数原形:int abswrite(int drive,int nsects,int lsect,void *buffer) drive=0(A驱动 阅读全文
posted @ 2011-04-29 16:24 ACE封印 阅读(1583) 评论(0) 推荐(0) 编辑
摘要:c文件操作函数open是一个非标准的低级文件I/O函数,返回的是文件的低级句柄,原型:intopen(char*path,intaccess,...);open是一个可变参数的函数实现,后面的可变参数通常表示unsignedmode,mode参数是否存在要看access的值,path是文件的路径。access和mode的可取值通常在FCNTL.h里面定义,access的可取值如下:#defineO_RDONLY1#defineO_WRONLY2#defineO_RDWR4access还可以是以下flag及它们之间的组合而得到的性质:#defineO_CREAT0x0100/*createand 阅读全文
posted @ 2011-04-29 16:23 ACE封印 阅读(580) 评论(0) 推荐(0) 编辑
摘要:函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例:#include <stdio.h> #include <string.h>int main(void) { char string[10]; char *str1 = "abcdefghi"; stpcpy(string, str1); printf("%s\n", string); return 0; } 函数名: strcat 功 能: 字符串拼接函数 用 法: ch 阅读全文
posted @ 2011-04-29 16:21 ACE封印 阅读(739) 评论(0) 推荐(0) 编辑
摘要:sprintf用法printf可能是许多程序员在开始学习C语言时接触到的第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf了解多吗?在将各种类型的数据构造成字符串时,sprintf的强大功能很少会让你失望。由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf比printf有用得多。所以本文着重介绍sprintf,有时也穿插着用用pritnf。sprintf是个变参函数,定义如下:int sprintf( char *buffer, 阅读全文
posted @ 2011-04-29 16:20 ACE封印 阅读(626) 评论(0) 推荐(0) 编辑