自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qq_41889292的博客

C语言学习心得

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

原创 C语言之简单的通讯录实现

内容:通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人 实现:将变量定义在结构体中:typedef struct person { char name[20]; ...

2018-05-31 10:36:08 448

原创 C语言之动态内存管理

1.为什么存在动态内存分配?我们掌握的内存开辟方式:int val=20; //在栈上开辟4个字节char arr[10]={0}; //在栈上开辟10个字节的连续空间但这种开辟方式空间大小固定,在数组声明的时候必须指定长度,它所需要的内存在编译时分配,这时就需要用到动态内存开辟。2.动态内存函数:>malloc和free:malloc函数向内存申请一块连续可用的空间,...

2018-05-31 00:16:51 537

原创 每日一练:顺时针打印矩阵

内容:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。例如下列矩阵:1     2   3     45     6   7     89    10   11  1213   14  15  16则依次打印出来的数字为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10解题思路:设行数为row,列数col,打印第一圈的左上角坐标为(0,0),第二圈左上角坐标...

2018-05-30 21:26:32 157

原创 每日一练:调整数组使其奇数位于前面偶数位于后面

内容:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有的偶数位于后半部分。解题思路:思路一:定义两个变量表示数组下标,一个从数组头开始找偶数,一个从数组尾向头找奇数,找到后互换对应下标的数组内容。代码实现:void exchenge(int *a, int length){ assert(a); int i = 0; int j = length...

2018-05-30 19:11:57 179

原创 每日一练:位运算问题

1.判断整数是不是2的整次方int is_judge(int n){ if ((n&(n - 1))== 0) return 1; return -1;}解题思路:一个整数如果是2的整次方,那么它的二进制有且仅有一个1,而其他位是0。所以可以把这个整数减1,那么这个1就会减掉,然后再取余。2.输入两个整数m和n,计算需要改变m的二进制中的多少位才能得到n解题思路:如:10的二...

2018-05-30 00:23:40 106

原创 每日一练:数值的整数次方

内容:实现double Power(double base,int exponent);求base的exponent次方,不使用库函数,同时不考虑大数问题。解题思路:对于这一道简单的求值题,我们容易忽略一个重要的问题,那就是当base是负数的时候,加上这个就没什么问题。double power(double base,int exponent){ double reslut = 1.0; i...

2018-05-30 00:21:10 160

原创 剑指offer8:剪绳子问题(动态规划和贪婪算法)

内容:给定一根长度为n的绳子,请把绳子剪成m段,每段绳子记为k[0],k[1]……k[m]。请问k[0]*k[1]……*k[m]可能的最大乘积是多少?例如:当绳子长度为8时,我们把它剪成长度分别为2,3,3段,此时最大乘积为18.解题思路:思路一:我们先考虑能否把大问题分解成小问题,分解后的小问题也存在最优解,如果把小问题的最优解组合起来能否是整个问题的最优解,这就是动态规划求解。我们把绳子从第i...

2018-05-29 21:36:41 3015 2

原创 每日一练:旋转数组中的最小数字

内容:      把一个数组最开始的若干个元素搬到数组末尾,我们称之为数组的旋转。输入一个递增序列的数组的一个旋转,输出旋转数组的最小元素。如:{3,4,5,1,2}是{1,2,3,4,5}的一个旋转数组。最小值为1.解题思路:如果从头到尾遍历数组,能找到这个元素,但是时间复杂度为O(n),对于旋转数组来说不可取。我们注意到数组旋转之后实际上可以划分两个排序的子数组,而且前面的数组元素都大于或等于...

2018-05-28 16:55:48 134

原创 每日一练:青蛙跳台阶问题

内容:一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶。求该青蛙跳上n级台阶共有多少种跳法。题目分析:先简单考虑。如果只有1级台阶,那么只有一种跳法,如果是2级台阶,那么有两种跳法。我们把n级台阶的跳法当成一个函数f(n),那么当n级台阶,n>2时,每次跳台阶都有两种不同的跳法:一是跳1级,此时的跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1),二是跳2级,此时的跳法数目等于后...

2018-05-28 16:53:33 279

原创 每日一练:求菲波那切数列的第n项

内容:写一个函数,输入n,求菲波那切数列的第n项。方法1:递归int Fibonacci(int n ){ if (n<3) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2);}函数的调用时浪费时间和空间的:每一次函数的调用,都需要在内存栈中分配空间来保存参数,返回值,返回地址及临时变量,而且往栈里压入数据和弹出...

2018-05-28 16:52:11 501

原创 每日一练:字符串的空格替换

内容:请实现一个函数,把字符串中的每个空格替换成“%20”。例如:输入“Weare  happy”,输出“We%20are%20happy”。解题思路:首先将字符串遍历一遍,统计出字符串中空格的数量,并由此计算出替换后字符串的总长度。每替换一个空格,长度加2,因此替换后的长度等于空格数*2。我们从字符串的后面开始替换。首先准备两个指针:p1和p2。P1指向原始字符串的末尾,p2指向替换后的字符串的...

2018-05-28 00:10:23 188

原创 每日一练:二维数组中的查

内容:在一个二维数组中,每一行都按照从左往右递增的顺序排列,每一列都按照从上到下递增的顺序排列。请完成一个函数,输入这样的一个二维数组,判断是否含有该整数。解题思路:首先选取数组中右上角的数字,如果该数字等于要查找的数字,则查找结束;如果该数字大于要查找的数字,则剔除这个数字所在的列;如果该数字小于要查找的数字,则剔除这个数字所在的行。也就是说,如果要查找的数字不在数组的右上角,则每次都在数组中剔...

2018-05-27 23:19:47 103

原创 每日一练::不修改数组找出重复的数字

内容:在一个长为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个是重复的,找出重复的数字,但不能修改输入的数组。解题思路:我们把1~n的数字从中间的数字m分成两部分前一部分为1~m,后一部分为m+1~n。如果前一部分超过m,则说明肯定有重复的数字,否则另一部分肯定有重复的数字,可以继续把重复的数字区间分为两部分直到找到重复的数字。过程类似二分法,只是中间多了统计数字的数目。代码实现...

2018-05-27 17:32:20 268

原创 每日一练:找出数组中的重复数字

内容:在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个是重复的,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字。如{2,3,1,0,2,5,3},那么对应重复的数字为2或3。解题思路:重排这个数组。从头到尾一次扫描这个数组中的每一个数字。当下标为i时,首先比较这个数字(m)是不是等于i。如果是接着扫描下一个。如果不是,再拿这个数字和下标为m...

2018-05-27 17:23:19 6632

原创 自定义类型之:结构体,枚举,联合

1.结构体:>结构体的类型和声明:结构体是一种聚合类型,在C语言中结构体不能为空。结构体的声明:结构体是一些值的集合,这些值称为成员变量。成员变量可以是不同的值。struct tag{ // 结构体名tag见名只意,可以省略,但不建议省略 int a; //结构体成员变量:可以是任何类型  cha c;}list; //分号不能省略结构体之间不能相互赋值:st...

2018-05-27 14:57:46 241

原创 C语言内存操作函数的实现

>memcpy:void *memcpy(void *dest,const void *source,size_t num);(1)函数memcpy从source的位置开始向后复制num个字节的数据到dest的内存位置。(2)这个函数在遇到'\0'的时候并不会停下来。(3)如果source和dest有任何的重叠,复制的结果都是未定义的。void *my_memcpy(void *dest, ...

2018-05-23 22:58:12 762

原创 C语言之字符函数

1.字符函数分类:iscntrl:任何控制字符。isspace:空白字符:空格' ',换页'\f',换行'\n',回车'\r',制表符'\t'或垂直制表符'\v'。isdigit:十进制0~9。isxdigit:十六进制数字,包括所有十进制数字,小写字母a~f,大写字母:A~E.islower:小写字母a~z。isupper:大写字母A~Z.isalpha:字母a~z或者A~Z。is...

2018-05-23 21:22:20 341

原创 C语言之—模拟实现字符串函数

1.strlen:求字符串长度>直接用计算器实现: int my_strlen(const char *str) { int count = 0; while (*str){ count++; str++; } return count; ...

2018-05-22 21:02:46 191

原创 C语言之深入理解指针

1.指针和数组没有关系:>指针和数组是两种不同的类型>数组不能整体赋值,所以数组名不能做左值,做右值表示首元素地址2.指针数组:是数组,是一个存放指针的数组。例如:int *arr1[10];char *arr2[3];char **arr3[5];3.数组指针:>数组指针是指针,这个指针指向数组。如:int (*arr1)[10];char (*arr2)[3];与指针数...

2018-05-21 01:34:14 616

原创 用C语言设计计算器:实现加减乘除

方法一:通过普通方法:#include<stdio.h>#include<windows.h>int add(int x, int y){ return x + y;}int sub(int x, int y){ return x - y;}int nul(int x, int y){ return x*y;}int drv(int x, int...

2018-05-19 12:07:15 32090 2

原创 模拟printf()函数,并实现%d,%c,%s的打印

解题思路:在模拟实现printf()函数时我们将会面临两个问题:一共有多少个参数,每个参数的类型。在C语言中printf的返回类型为整形。我们可以通过%来确定有多少个参数,%后的字符来确定类型。#include<stdio.h>#include<windows.h>#include<assert.h>is_print(int n){ while (n&g...

2018-05-16 23:24:38 1109

原创 用C语言实现:使用可变参数,实现函数,求函数参数的平均值和最大值。

求平均值:#include<stdio.h>#include<Windows.h>int average(int n,...){ va_list arg; //声明变量用于访问参数列表的为确定部分 int i=0; int sum=0; va_start(arg,n); //用来初始化,第一个参数是va_list变量名,第二个参数是省略号前最后一个有名字的参...

2018-05-16 22:58:43 435

原创 用C语言实现:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

解题思路:通过递归来取出每一位,然后相加,如1729,则应该返回1+7+9+2=19#include<stdio.h>#include<windows.h>int DigitSum(int n){ if(n==0) return 0; return DigitSum(n/10)+n%10;}int main(){ printf("%d\n",DigitSu...

2018-05-16 22:41:51 167

原创 用C语言实现:实现一个函数,可以左旋字符串中的k个字符

如:ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 解题思路:先找出怎么左旋一次,然后在左旋两次。在左旋的时候要考虑如果左旋次数太大的情况,如ABCD左旋21次,其实是左旋一次,所以左旋的次数要和字符串长度取余。#include<stdio.h>#include<Windows.h>#include<assert.h>char *lef...

2018-05-16 21:52:32 161

原创 用C语言实现杨氏矩阵

问题:有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 数组: 1 2 3 2 3 4 3 4 5 1 3 4 2 4 5 4 5 6 解题思路:杨氏矩阵有四个特殊点:左上(行列最小),左下(行小列大),右上(行大列小),右下(行列都大),只要在这四个点开始找一次就会排除一行或者一列。下面就以右上角为例:#include<stdio.h...

2018-05-16 21:30:52 258

原创 用C语言模拟实现str和mem相关函数

>str开头的函数只能用于字符数据的操作,遇到NULL'\0'会停止。>mem开头的函数用于操作内存内容,可以处理NULL.操作的基本单位是字节操作1.str和mem对比实例:例如:strcpy和memcpy操作:>模拟strcpy:#include<stdio.h>#include<assert.h>#include<windows.h>...

2018-05-16 21:04:38 304

原创 用C语言实现:这个函数的返回值value的二进制位模式从左到右翻转后的值。

如: 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回: 2550136832思路:定义一个数data存放反转的二进制,从输入数值的二进制最低位开始与1按位与,如果为1,则将这个位放到data的高位,然后从第二低位开始依次进行,直...

2018-05-13 23:53:48 295

原创 用C语言实现:不使用(a+b)/2这种方式,求两个数的平均值

不使用(a+b)/2求平均数,考虑溢出问题。例如a有10块钱,b有5块钱.方法1:把a,b的钱放一起分,你一张我一张#include<stdio.h>#include<windows.h>int main(){ int a=10; int b=5; printf("%d\n",(a+b)>>1); system("pause"); return 0...

2018-05-13 23:13:12 295

原创 用C语言实现:写一个宏可以将一个数字的奇数位和偶数位交换。

解题思路:约定最右边的比特位是最低位,将二进制分两步(1)将奇数位保留,偶数位清零,然后左移一位,变成偶数位(2)将偶数位保留,奇数位清零,右移一位变成奇数位。如:这时简单的思路,在实现时,可以用下面的代码:将(x&(0x55555555))<<1; x按位与0x55555555后得到的二进制奇数位与x相同但偶数位均为0,然后再向左移一位,变成偶数位为原来的奇数位,且移动后奇数...

2018-05-13 22:55:52 372

原创 用C语言实现:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。

解题思路:2元可以喝3瓶,4元可以喝7瓶,5元可以喝9瓶……依次可得规律:有n元可以喝2*n-1瓶,判断空瓶的数量,是奇数则兑换n-1瓶,为偶数则兑换#include<stdio.h>#include<windows.h>int buy_water(int money){ int count=money; while(money){ if(money%2!=0)...

2018-05-12 22:54:29 441

原创 C语言实现:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

思路:异或数组中的每一个数,最终出现的结果是两个只出现一次数字的异或结果,,因为两个数组不一样,所以异或结果不为0,二进制结果有一个是1.在结果中找到第一个为1的位置,记为n,然后数组右移n位,为1,为0,分别输出两个数#include <stdio.h>#include<Windows.h>int two(int n){ int c = 0; while (n)...

2018-05-12 22:36:34 521

原创 C语言之浅谈指针

1.指针是什么? >指针 :是编程语言中的一个对象,利用地址。它的值直接指向存在电脑储存器中另一个地方的值。通俗的说就是地址>指针变量:就是变量里面放的是地址>变量指针:变量的地址如:int main(){ int a=10; //在内存中开辟一块空间 int *p=&a; //对变量a取出它的地址,可用&操作符。将a的地址放在p变量中,p就是...

2018-05-12 00:46:41 119

原创 可变参数

1.什么是可变参数?C语言中的可变参数是一个比较有意思的实现,通过将函数实现为可变参数的形式,可以使得函数可以接受一个以上的任意多个参数。可变参数用(...)表示。2.可变参数能被使用的必要条件:>必须知道每个参数的类型>必须知道一共传入参数的个数3.可变参数的实例: 实现一个函数可以求任意参数的平均值#include<stdio.h>#include<Window...

2018-05-10 20:03:42 130

原创 递归

1.什么是递归?是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。也就是自己调自己。2.为什么用递归?把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归的策略只需少量的程序就可描述解题过程所需要的多次重复计算,大大减少了程序的代码量。3.递归必要条件:>存在条件限制,当满足...

2018-05-10 19:30:13 143

原创 数组

1.什么是数组?      数组是具有相同类型元素的集合。是一种聚合的数据类型。数组不能直接整体赋值。2.数组的创建   创建方式:type_t arr_name [const_n]//type_t 数组的元素类型//arr_name 数组名//const_n 是一个常量表达式,来指定数组的大小,不能是变量3.数组的初始化数组的初始化:在创建数组的同时给数组的内容一些合理初始值.数组元素...

2018-05-08 22:57:48 231

原创 函数的调用过程,栈帧的创建和销毁。

1.cpu中的寄存器:通用寄存器:EAX,EBX,ECX,EDX程序计数器(EIP(PC)):存放当前正在执行的指令的下一条指令的地址。栈顶:ESP寄存器栈底:EBP寄存器2.将内存中的指令复制到CPU中: 读取指令--->分析指令--->执行指令3.什么是栈?>栈是一种特殊的链表形式的数据结构,只允许在链表的一端进行添加和删除。>栈有栈底和栈顶。从栈顶入栈称为pus...

2018-05-07 01:57:19 263

原创 C语言浮点数在内存中的存储

1.浮点数包括:float,double,long double2.浮点数存储公式:>(-1)^S*M*2^E>(-1)^S表示符号位,当S=0时,这个浮点数为正数,当 S=1时,浮点数为负数>M表示有效数字,大于等于1,小于2>2^E表示指数位例:十进制5.0,写成二进制是101.0,相当于1.01*2^2按照浮点数的格式,可以求出S=0,M=1.01,E=...

2018-05-05 00:01:21 732

原创 C中整形数据的存储---实际存放的是补码

1.对于整形来说:数据存放内存中其实存放的是补码>原因:在计算机系统中,数值一律用补码来表示存储,使用补码可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。2.通过大小端模式存储3.经典例题:>#include<stdio.h>int main(){ char a=-1;...

2018-05-03 22:50:18 1913

原创 大小端

1.什么是大小端:>大端存储模式:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。>小端存储模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。2.为什么会有大小端: 这是因为在计算机中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8 bit。但是在C 语言中除了 8 bit 的char之外,还有 16 bit 的 short型...

2018-05-03 22:41:35 190

空空如也

空空如也

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

TA关注的人

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