- 博客(51)
- 资源 (1)
- 收藏
- 关注
原创 实现对一个数据(int)指定位置0或置1
/********************************************************************** * RightMove.cpp * Compiler: GCC,VS,VC6.0 win32 * Author:WK * Time: 2015 3 29 *************************************
2015-03-29 20:54:10 1938
原创 实现字符串循环右移N位(改进版)
/********************************************************************** * RightMove.cpp * Compiler: GCC,VS,VC6.0 win32 * Author:WK ***********************************************************
2015-03-29 15:17:46 1052
原创 对一个程序的思考4(结构体内存对齐)
#include#include#pragma pack(4)int main(){ unsigned char puc[4]; struct tagPIM { unsigned char ucPim1; unsigned char ucData0 : 1; unsigned char ucData1 : 2; unsigned char ucData2 : 3;
2015-03-29 14:59:42 714
原创 对一个程序的思考3(移位操作之移动负数位)
在c 中左移也就是所说的逻辑移位,右端补0,而右移是算数移位,左端补齐的是最高位的符号位。(有的编译器可能右移也是逻辑移位,但道理是一样的),这里以右移部符号位为准。故负数左移,有可能变成正数,但负数右移,肯定还是负数。/********************************************************************** * y
2015-03-29 13:29:46 1105 1
原创 对一个程序的思考2(各编译器指针类型)
#includeusing namespace std;#includeint main(){ int a[3]={1,2,3}; cout<<sizeof(a)<<'\n' <<typeid(a).name()<<'\n' <<sizeof(&a)<<'\n' <<typeid(&a).name()<<'\n';return 0;}首先
2015-03-28 00:06:04 591
原创 奇妙的字符串
面对字符串是我们最关系的就是字符串的长度(用strlen())与它所占的字节数(用sizeof())也就是大小,下来我们就讨论一下 /* 一般我们初始化字符串的几种方式char a1[]="1234";char *a2="1234";char a3[10]="1234";char a4[]={'1','2','3','4'};char a5[]={'1','2','3',
2015-03-26 22:38:05 668
原创 实现字符串循环右移n 位与左移n位(不建立数组,直接用指针)
编写一个函数,作用是把一个 char 组成的字符串循环右移 n 个。比如原来是“abcdefghi”如果 n=2,移位后应该是“hiabcdefgh”左移n个比如原来是“abcdefghi”如果 n=2,移位后应该是“cdefghiab” 函数头是这样的: //pStr 是指向以'\0'结尾的字符串的指针 //steps 是要求移动的 n
2015-03-24 19:41:05 2250
原创 浅谈汉诺塔问题
对于任何一种问题的解决我们必须先找到解决的方法,才能开始去做,堆与写程序也是如此 对于汉诺塔问题,我首先不去想有n个盘子需要移动,我只从最小的1,2,3 个盘子进行分析,如下图 1.当只有一个盘子是只需要把A柱子上的盘子移动到C柱子上2.当有两个盘子的时候,就需要借助B把A中的盘子移动到C中3.当有三个盘子的时候,我们只要把A中上边两个移动到B上在把A中最下边的移
2015-03-23 09:33:10 905
转载 原码一位乘法与补码一位乘法
补码1位乘法原码乘法的主要问题是符号位不能参加运算,单独用一个异或门产生乘积的符号位。故自然提出能否让符号数字化后也参加乘法运算,补码乘法就可以实现符号位直接参加运算。为了得到补码一位乘法的规律,先从补码和真值的转换公式开始讨论。1. 补码与真值的转换公式设 [x]补 = x0 . x1x2…xn ,有: n
2015-03-16 16:57:48 84135 11
转载 编译器工作原理(GCC C/C++)
源码要运行,必须先转成二进制的机器码。这是编译器的任务。比如,下面这段源码(假定文件名叫做test.c)。#include stdio.h>int main(void){ fputs("Hello, world!\n", stdout); return 0;}要先用编译器处理一下,才能运行。$ gcc test.c$ ./a.outHello,
2015-03-31 09:34:43 3748
转载 编译器工作原理详解
第一篇摘自:http://www.21ic.com/app/embed/201103/79359.htm1. 词法分析词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看
2015-03-31 09:18:40 11484
原创 对一个程序的思考5(C++各种函数调用)
/********************************************************************** * main.cpp * Compiler: GCC,VS,VC6.0 win32 * Author:WK * Time: 2015 3 29 *************************************
2015-03-29 22:39:24 513
转载 五大算法之五--分支限界法
一、基本描述 类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。 (1)分支搜索算法 所谓“分支”就是采用广度优先的策略,依
2015-03-28 11:24:35 521
转载 五大算法之四--回溯法
1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 许多复杂的
2015-03-28 11:24:27 525
转载 五大算法之三--贪心算法
一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
2015-03-28 11:22:03 418
转载 五大算法之二--动态规划
动态规划--简单的理解 这个算法简单的来讲就是采用自底向上的方式递推求值,将待求解的问题分解成若干个子问题,先求解子问题,并把子问题的解存储起来以便以后用来计算所需要求的解。简言之,动态规划的基本思想就是把全局的问题化为局部的问题,为了全局最优必须局部最优。 多阶段决策问题是根据问题本身的特点,将其求解的过程划分为若干个相互独立又相互联系的阶段,在每一个阶段都需要做出决策
2015-03-28 11:21:15 572
转载 五大算法之一--分治法
一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其
2015-03-28 11:18:50 583
转载 C内存分配
c 内存分配1、程序代码区:存放函数体的二进制代码。 2、全局区数据区:全局数据区划分为三个区域。 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数据存放在另一个区域里。这些数据在程序结束后由系统释放。我们所说的BSS段(bss segment)通常是指用来存放程序中未初始化的
2015-03-28 11:09:18 636
转载 C语言之详解#ifdef等宏及妙用
这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2
2015-03-28 11:04:22 612
转载 浅谈C语言文件操作函数
clearerr(清除文件流的错误旗标)相关函数 feof表头文件 #include 定义函数 void clearerr(FILE * stream); 函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标。 返回值 fclose(关闭文件) 相关函数 close,fflush,fopen,setbuf 表头文件 #include
2015-03-28 11:00:52 404
原创 C语言中函数的思考(可以返回局部变量吗)
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意
2015-03-28 10:57:08 6567 2
转载 C++的五大内存分区
一、五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程
2015-03-28 10:54:10 855 1
转载 const常量与define 的区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。(2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查。(3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内
2015-03-28 10:50:05 442
转载 关于结构体的内存对齐
内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。一、内存对齐的原因大部分的参考资料都是如是说的:1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数
2015-03-27 08:55:54 363
原创 浅谈构造函数
构造函数 (一般是公有):与类名相同无返回值的函数,由编译器在定义对象时给数据初始化时自动调用并且只调用一次,构造函数可以带参数也可以不带参数,还可以带默认参数,如果不给出构造函数 系统会自定义一个无参构造函数,如果我们给出了构造函数系统就不会自己生成构造函数//一、 构造函数是干什么的class Counter{public: // 类Counter的构造
2015-03-25 17:43:38 465
原创 实现字符串循环右移n 位与左移n位(建立数组)
编写一个函数,作用是把一个 char 组成的字符串循环右移 n 个。比如原来是“abcdefghi”如果 n=2,移位后应该是“hiabcdefgh” 左移n个比如原来是“abcdefghi”如果 n=2,移位后应该是“cdefghiab” 函数头是这样的: //pStr 是指向以'\0'结尾的字符串的指针 //steps 是要求移动的 n
2015-03-24 12:41:27 4985
原创 对于一个程序的思考1(const与 volatile)
#includeint main(){ const int i=0; int *j=(int *)&i; *j=1; printf("%d,%d\n",i,*j); return 0;}对于上边这个看似简单的程序却是深藏玄机windows平台1.在 .c 文件中输出是 1,1 ,深究原因是因为 const 在.c文件中定义的变量是只
2015-03-23 23:41:00 512
原创 浅谈 -128的原码 反码 补码
-128,绝对值128,有符号数值范围是-127到+127,所以128的二进位是要用2字节内存保存,即16位,所以128的二进制码是(中括号只是表示一个字节)[00000000][10000000]以上是+128的原码,同时也是+128的补码-128就是要+128的原码全部取反再加1:+128的原码:[00000000][10000000]取反就得到:[11
2015-03-22 17:37:01 39932 5
原创 浅谈 my_strstr()函数与my_strrstr()函数的实现
my_strstr()函数:在s1中查找整个s2第一次出现的起始位置,并返回一个指向该位置的指针,如果s2没有完整的出现在s1中,则返回NULL;my_strrstr()函数:在s1中查找整个s2最后一次出现的起始位置,并返回一个指向该位置的指针,如果s2没有完整的出现在s1中,则返回NULL。/***************************************
2015-03-22 11:16:18 1339 2
原创 浅谈my_memcpy()函数的实现
my_memcpy(str1,str2) 函数用于把str2 字符串拷贝到 str1 中去,存在两种情况的拷贝 一种是由内存覆盖,另一种是无内存覆盖一.内存不重叠情况二.内存重叠情况/**************************************** * File Name : my_memcyp.c * Creat
2015-03-22 10:05:10 1550 1
原创 浅谈my_strchr() 与my_strrchr()函数
strstr() 函数实现从一个字符串中找到一个字符第一次出现的地址并返回它 strrstr() 函数实现从一个字符串中找到一个字符最后一次出现的地址并返回它/**************************************** * File Name : strchr.c * Creat Data : 2015.3.21 * Author : wk
2015-03-21 18:03:04 715
原创 C语言——读书心得2
1.强制类型转换只是在转换时候产生一个临时值赋给要接受的变量,之后就自动销毁了,不会改变原有的变量2.coutcount cout1只是\0char a;//这里是一字节printf("%d\n",sizeof(' ')); //4printf("%d\n",sizeof('a')); //4 C语言为了空间拓展容纳更多字符 规定字符常量为4字节,字符变量一个字节
2015-03-20 09:46:12 585
转载 C++函数重载的本质
——每个现象后面都隐藏一个本质,关键在于我们是否去挖掘写在前面:函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题1、声明/定义重载函数时,是如何解决命名冲突的?(抛开函数重载不谈,using就是一种解决命名冲突的方法,解决命名冲突还有很多其它的方法,这里就不论述了)2
2015-03-17 19:22:43 617
原创 计算一个无符号整数的二进制中0和1的个数
x=x|(x+1) 的作用是每次循环把x的二进制中从右往左数的最后一位0变成1,直道变成全1的时候x+1就溢出为全0,循环结束。x=x&(x-1) 的作用是每次循环把x的二进制中从右往左数的最后一位1变成0,直道变成全1的时候x就为全0,循环结束。#includeint count_zero(int x){ int n=0; while(
2015-03-17 13:30:43 2456
原创 C语言实现简单的通讯录
实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:1. 添加联系人信息2. 删除指定联系人信息3. 查找指定联系人信息4. 修改指定联系人信息5. 显示所有联系人信息6.清空所有联系人/***************************************** F
2015-03-17 11:37:56 1115
转载 浅谈内存对齐--linux和windows平台下内存分配的差异
一.内存对齐的初步讲解内存对齐可以用一句话来概括:“数据项只能存储在地址是数据项大小的整数倍的内存位置上”例如int类型占用4个字节,地址只能在0,4,8等位置上。例1:#include struct xx{ char b; int a; int c; char d;};
2015-03-15 13:49:37 1701
转载 原码乘法与补码乘法
原码乘法 1.人工算法与机器算法的同异性 在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号位按异或运算得到,而乘积的数值部分则是两个正数相乘之积。 设n位被乘数和乘数用定点小数表示(定点整数也同样适用) 被乘数 [x]原=xf .xn-1…x1x0 乘数 [y]原
2015-03-14 14:14:16 7743
原创 用递归的思想写编写一个函数reverse_string(char * string)实现字符串反向输出和反向排列
#includevoid reverse_string(char *string){ if ('\0'!=*(++string)) reverse_string(string);//递归调用,每次调用都要输出 printf("%c",*(string-1));}int main(){ char *a = "abcde"; reverse_string(a);
2015-03-13 09:52:19 3642
原创 实现DigitSum(n) 输入一个非负整数,返回组成它的数字之和
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1234),则应该返回1+2+3+4,它的和是10#include/*int DigitSum(int n)//非递归实现{ if(0==n) return 0; else { int ret=0; while(n) {
2015-03-12 21:58:29 475
原创 用递归实现N的K次方
#includeint n_pow(int n,int k)//N与K仅限正整数与0{ if(k==0) return 1; if(k==1) return n; if(k>1) { return n*n_pow( n, --k); } }int main(){printf("%d\n",n_pow( 2, 3
2015-03-12 08:54:10 792
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人