自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小葱的博客

每一个不曾起舞的日子都是对生命的辜负。。。

  • 博客(125)
  • 收藏
  • 关注

原创 可以动态增长的通讯录(在第一版的基础上进行了改进)

在第一版中,我将通讯录可以保存的人的数量设置为定长,这样具有很大的缺陷,那就是当通讯录满的时候没有办法再增加人的信息,或许会有人说,那我再修改数组的大小就好了,但是你要修改为多少才会合适呢?有人说我把数组的大小扩大为原来的两倍,这样是可以存储更多的信息,但是如果我只需要再增加一个人的信息,那给数组开辟的空间不是就会浪费掉吗?        所以才会有第二版的动态增长型的通讯录,这样你需要多少空

2016-12-06 11:17:32 337

原创 动态内存分配

为什么会有动态内存分配?这是因为当你声明一个数组时,你必须使用一个编译时常量指定数组的长度,但是,数组的长度常常在运行时才知道,这是因为它所需要的内存空间取决于输入数据。而且这种方法人为的进行了数组大小的限制。

2016-12-04 08:49:58 467

原创 用顺序表实现的简易通讯录(第一版)

实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:1.    添加联系人信息2.    删除指定联系人信息3.    查找指定联系人信息4.    修改指定联系人信息5.    显示所有联系人信息6.    清空所有联系人7.    以名字排序所有联系人//addressbook.h

2016-12-01 10:26:53 8339 1

原创 关于sizeof和strlen()那些年我们都迷惑过的问题

首先,使用sizeof之前,我们一定要搞清楚一个问题,那就是sizeof是一个关键字或者操作符,而不是好多人认为的所谓的函数, sizeof任意类型的变量,都是求取这个变量所占的字节大小,注意:它求的是这个变量占空间大小的字节数。 而strlen()是一个函数,任何值作为它的参数,都会被强转为const char*类型的,它是为了求取字符串长度而产生的,这里应该注意 我们都知道

2016-11-28 18:10:43 512 1

原创 如何测试你的系统是大端还是小端模式

我们先来看看为什么会有大小端之分呢? 在计算机系统中,规定:每个地址单元都会对应一个字节(8个bit),但是,在c语言中,除了有一个字节(8个bit)的char,也有 两个字节(16个bit)的short,也有四个字节(32个bit)的long(在不同的编译器下可能不同)。对于16位或者32位的处理器,即就是大于8位的处理器,由于寄存器的宽度大于一个字节,那么就存在如何将一个多字节的变量的数据如

2016-11-26 14:25:29 3371

原创 用main函数的参数实现简易计算器

调用堆栈可以出现主函数的调用者 mainCRTStartup 函数调用main函数 main( int argc, char *argv[ ], char *envp[ ] ) 第一个参数是argc——-表示argv数组的容量 第二个参数argv———是一个指针数组,数组里面保存的是字符串的首地址 第三个参数的环境变量例如: 输出结果如下:

2016-11-22 22:15:45 720

原创 在一个字符串中查找第一个只出现一次的字符,要求复杂度为O(N)

注意:这道题的特点是查找出现一次的字符,那么就可以利用字符的特点,因为字符的个数不可能大于256,所以就可以用一个含有256个元素的数组统计所有字符出现的次数,最后再遍历一遍数组,找到次数为1的字符即可。//在一个字符串中查找第一次只出现一次的字母,要求复杂度为O(N)#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdl

2016-11-22 12:51:18 1227

原创 在杨氏矩阵中查找一个元素

题目:有一个二维数组.—-杨氏矩阵 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);1 2 3 4 5 6 7 8 9 分析:右上角的元素是第一行中最大的一个元素,是第三列中最小的一个元素,所以可以将要查找的元素与右上角的元素比较,如果这个元素大于右上角的元素,那么可以删去一行,因为这个元素已经比这一行中最大的元素还大,

2016-11-22 00:54:31 568

原创 冒泡排序和选择排序法的图示解析

思路:在进行冒泡法排序(升序)时,需要将数组元素(len)两两比较,如果 前面的元素大于后面的元素,则交换两个数,否则,比较下一个元素和它的下一个元素的大小,依次执行,执行一次循环,可以找到当前数组中最大的一个元素,然后问题规模变小,然后找出len-1个元素里的最大值,使之成为第二大元素,依次执行,需要在外层嵌套一层循环。 优化:考虑如果数组中的数据已经是排好序的,那么就不需要遍历那

2016-11-22 00:25:14 10999

原创 将数组的一组数据中的奇数放在前半部分,偶数放在后半部分

//将数组中的奇数放在前一部分,偶数放在后一部分#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>#include<stdlib.h>void swap(int *x,int *y){ assert(x); assert(y); *x ^= *y; *y ^= *x;

2016-11-22 00:19:51 680

原创 模拟库中的字符串处理函数

1.模拟实现strcpy函数的功能#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strcpy(char *dst,char const *src){ char *ret = dst; assert(dst); assert(s

2016-11-20 22:12:16 293

原创 用递归实现字符串的逆置

#define _CRT_SECURE_NO_WARNINGS 1#include#include#include#includevoid reverse(char *pstr){ char tmp = 0; char *pstr_end = pstr + strlen(pstr) - 1; assert(pstr); if (strlen(pstr) < 2)//新字符串的

2016-11-20 13:46:57 820

原创 结构体和联合体相关知识总结

1.结构体和数组都是聚合数据类型,它们之间有以下的区别: 数组是同种类型元素的集合,而结构体是相同或者不同的数据元素的集合。 数组名在传参时会退化为一个指针,但是结构体在作为函数参数时不会发生退化。 数组可以通过下标来访问某个元素,而结构体是通过结构体的成员名来访问成员的。struct A{ char a;//1 对齐数:1 double b;// 8 对齐

2016-11-18 00:27:40 834

原创 c程序的调用过程-----栈帧

对一个简单的c程序的函数调用过程的分析:在main函数中调用fun函数: 1).先将main函数的ebp入栈,以保存之前任务的信息。 2).然后将main函数的esp的值赋给ebp,即就是让ebp指向esp指向的空间,让ebp做为fun函数的栈底 3).然后将esp的值sub某个值,也就是为fun函数开辟新的栈空间。 4).fun函数调用结束后,将esp指向ebp

2016-11-17 11:15:23 898

转载 求取最大公约数的算法分析

求两个数的最大公约数,这个是基础中的基础,不过当我第一次看到的时候,我想到的只是循环让一个数加,再被他们除而已,所以第一次看到的时候,顿时觉得编程也是挺美的。int gcd(int a,int b){ int t; while(b!=0){ t = b; b = a%b; a = t; } return a;}1

2016-11-13 21:21:26 779 1

原创 用递归实现字符串的逆置

思路:对于一个字符串,先将字符串的首元素保存起来,实际上就是压入堆栈,因为递归是通过堆栈实现的,然后将最后一个元素赋给首元素, 此时完成了首元素和最后一个元素的交换,然后将最后一个元素赋字符串的结束标志’\0’,然后字符的首地址加1,指向下一个元素,这时就有了一个长度减小的新的字符串,问题的规模会不断减小,递归的出口条件是字符串的长度小于2#define _CRT_SECURE_NO_WARNIN

2016-11-13 16:20:36 2341

原创 (拓展)在一组成对出现的数据中找出两个不同的数

这道题的思路是这样的,应该异或一遍数组,因为两个相同的数异或结果为0,两个不同的数异或结果1,所以会得到 数组中不同的两个数异或的结果,然后从这个结果中取出为1的一个比特位,将这个比特位的位置标记下来,因为两个不同的数的这一位肯定不相等,所以可以根据这一位 把数组中不同的两个数分到两个组中,一定会把数组中相同的数分到同一组,这时就有两组数据,而这两组数据中均有一个单个出现的数据,再根据在一组数据中

2016-11-12 20:48:12 784

原创 用c实现strstr函数(子字符串查找)功能

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>char *mystrstr(const char *dst_str,const char *src_str)//子字符串查找函数{ const char *dst_start

2016-11-12 19:44:22 1531

原创 c语言智力题

每瓶汽水1元,两个空瓶可以置换一瓶汽水,现在有20元,最多能喝多少 瓶汽水? 分析: 首先,有20元,所以可以喝20瓶水(total = 20),有20个空瓶子。 20/2------------10(水)(total += 20) bottles = 20/2 +20%2-------------(bottles = 10) 10/2---------------5(水)-----

2016-11-12 18:29:15 712

原创 字符串的左旋问题解析

1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA第一种方法:思路:先将一个字符串左移一位,可以使用一层for循环来实现, 然后每次都可以调用这层循环,调用移位的次数,还有就是, 循环次数如果大于字符串的长度,会重复执行一些无用的 操作,所以给step模上字符串的长

2016-11-12 12:41:37 501

原创 用宏实现将一个十进制数对应的二进制数的奇偶位交换

#include<stdio.h>#include<stdlib.h>#include<string.h>//1.提取奇偶位 0101 0101//2.提取的奇数位左移一位,提取的偶数位右移一位//3.将移位后的数执行或运算#define EXANGE(x) ((((x) & (0x55555555)) << 1 )\| (((x) & (0xaaaaaaaa)) >> 1))int

2016-11-11 22:11:37 299

转载 浅析为什么char类型的范围是 -128~127

在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来也很简单容易, 以至于不用去思考为什么,不是有一个整型范围的公式吗:  -2^(n-1)~2^(n-1)-1   n为整型的内存占用位数,所以int类型32位 那么就是 -(2^31)~2^31 -1 即   -214

2016-11-10 07:48:00 491

转载 前端笔记:多人开发必备Git技能

前端笔记:多人开发必备Git技能玩转前端 | 2016-11-08 16:26如果你已经开始工作了,一定对Git不陌生,开发需要一个团队,版本控制必不可少。如果你还在学习,准备参加工作,那建议你抽空好好学习一下Git。Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。在我们的工作中也是必备的技能,还记得第一天入职主管给我的

2016-11-10 07:26:38 499

转载 空指针赋值分区

空指针赋值分区为什么通过空指针读写的时候就会出现异常?除了NULL表示空指针,是否还有其他的值也是空指针?如果还有其他的值,你们这些表示空指针的值都是什么?为什么?首先解答第一个问题,在windows核心编程第四版的windows的内存结构一章中,表13-1有提到NULL指针分配的分区。其范围是从0x00000000到0x0000FFFF。这段空间是空闲的,对于空闲

2016-11-08 14:41:33 456

原创 将一个十进制数对应的二进制数按逆序输出

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> void reverse_bits(unsigned int data) { int i = 0; int arr[32] = {0}; for (i=0; i<32;

2016-11-07 14:02:08 2778

原创 字符串处理函数、字符操作函数

一.字符串操作函数:头文件:include一般不要对字符串常量进行修改,如果要修改,最好把字符串存放在字符数组中你不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符。不受限制的字符串函数:1.strcpy 函数:char *strcpy( char *strDestination, const char *strSo

2016-11-06 21:17:50 688

原创 整形数和浮点数在内存中的存储方式

一.整数 .1).整型数(在内存中是以补码的形式存放的):#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#include<windows.h>int main(){ unsigned i = 0; for (

2016-11-06 17:28:41 1166

原创 常量和变量的存储类型

常量的样子和变量完全一样,只是它们的值不能被修改,可以使用const关键字来声明常量。int  const   max_eleemnts = 50;max_eleemnts  是一个值不能被修改的变量所以数组的长度不可以使用但是此时可以用 #define   MAX_ELEEMNTS  50      int  arr[MAX_ELEEMNTS ];就是正确的声明。   

2016-11-06 13:52:50 1075

原创 指针的运算

指针运算:指针算法并不依赖于指针的类型,(如果p是一个指向char的指针,那么p+1就指向下一个char)算术运算:指针的算数运算只限于两种形式:指针运算只有用于数组中其结果才是可以预测的,对于任何并非指向数组元素的指针执行算数运算其结果是非法的1.指针  +(-)整数---------------结果也是指针这种形式只能用于指向数组中某个元素的指针。对一个指针加1

2016-11-06 13:47:48 396

原创 预处理器(宏的用法)

编译器在对宏预处理时,会: 1.将头文件展开 2.去掉注释 3.宏替换

2016-11-05 08:43:47 1488

原创 将字符串逆置(不改变里面单词的顺序)

将student a am i”转换为“i am a student” #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include<ctype.h> void reverse(char *begin,

2016-11-05 08:13:02 948

原创 用c语言实现字符串的拷贝函数(不使用库函数)

第一种方法(未优化的):#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<assert.h> void MyStr_copy(char *dest,char *src) { /*使用指针时一定要判断指针是否为空

2016-11-05 08:06:52 2851

原创 用c语言实现三子棋的游戏

#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<time.h>#define ROWS 3#define COLS 3void menu();void init_board(char arr[][COLS], int x, int y);//初始化棋盘void print_board(char arr[][

2016-11-05 07:56:03 836

原创 用c语言实现的扫雷游戏

//sweep.h#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<time.h>#define ROWS 8#define COLS 8#define MINES 30void menu();//打印菜单void init_mine(char mine[][COLS+2], int x, int y);//

2016-11-05 07:37:29 1105 1

原创 浅析求两个数的最大公约数的三种算法

第一种方法:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int Max_Com_Divisor(int x, int y)//用辗转相减法求最大公约数{ while (1)//用大数减去小数并将结果保存在大数中 { if (x > y

2016-11-05 07:24:10 41680 13

原创 c程序的编译和链接过程

编译过程:              预编译  编译 汇编 链接可执行文件格式: Windows : PE (portable executable)                              Linux : ELF (executable linkable format)                             均来自于COFF (

2016-11-03 11:23:04 1301

转载 make和makefile以及程序的编译和链接过程

一,Linux下程序运行过程 1,在一个目录下新建三个文件:main.c hello.c hello.h分别编写他们如下图:  2,想要让这个程序执行起来,就必须对上面的三个文件分别进行编译链接执行,如下图:   通过上面这个过程。我们可以大致总结一下gcc编译器把目标文件经过预处理,编译,汇编,链接生成可执行文件的过程和命令: (1)预处理(宏替换,删除注释和多余的空

2016-11-03 07:45:17 5613

原创 将字符串中的空格用 代替

将字符串“we are happy”转换为“we%20are%20happy”#define _CRT_SECURE_NO_WARNINGS 1#include#include#include#includevoid My_Replace(char *arr){ char *start = arr;//"we are happy\0"start指向字符串首地址 char

2016-11-01 15:19:26 1210

原创 求一组成对出现的数据中的单身狗

第一种方法:#define _CRT_SECURE_NO_WARNINGS 1#include#include#include#includeint find_diff(int *arr,int sz){ int i = 0; int j = 0; for(i=0; i<sz; i++) { for (j=0; j<sz; j++

2016-11-01 13:42:00 378

原创 求两个数的二进制数的对应位有多少位不同?

第一种方法:#define _CRT_SECURE_NO_WARNINGS 1#include#include#include#includeint diff_bits(int x,int y){ int i = 0; int count = 0; int a[32] = {0}; int b[32] = {0}; for(i=0; i<32; i+

2016-11-01 13:01:32 1209

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除