C语言
九零后的鹏鹏
这个作者很懒,什么都没留下…
展开
-
将C语言注释转换成C++注释
将input.c中的C语言注释转换成C++注释output。解题思路:C语言的注释用“/**/”,C++注释用“//”表示,通过无线状态机模来做这道题,首先将问题可能分成几个简单的小块:判断是否有‘/’,当有时,也要分成三种可能:‘/’后的那个字符是否是'/','*',如果是也分两种,如果不是则继续则跳过第一个'/',然后继续查找,找到“/*”时,说明是C语言风格,则继续找与“/*”相对应的“*/...原创 2018-06-09 20:57:35 · 247 阅读 · 0 评论 -
每日一练:二维数组中的查
内容:在一个二维数组中,每一行都按照从左往右递增的顺序排列,每一列都按照从上到下递增的顺序排列。请完成一个函数,输入这样的一个二维数组,判断是否含有该整数。解题思路:首先选取数组中右上角的数字,如果该数字等于要查找的数字,则查找结束;如果该数字大于要查找的数字,则剔除这个数字所在的列;如果该数字小于要查找的数字,则剔除这个数字所在的行。也就是说,如果要查找的数字不在数组的右上角,则每次都在数组中剔...原创 2018-05-27 23:19:47 · 95 阅读 · 0 评论 -
用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 · 156 阅读 · 0 评论 -
用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 · 250 阅读 · 0 评论 -
用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 · 300 阅读 · 0 评论 -
每日一练::不修改数组找出重复的数字
内容:在一个长为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个是重复的,找出重复的数字,但不能修改输入的数组。解题思路:我们把1~n的数字从中间的数字m分成两部分前一部分为1~m,后一部分为m+1~n。如果前一部分超过m,则说明肯定有重复的数字,否则另一部分肯定有重复的数字,可以继续把重复的数字区间分为两部分直到找到重复的数字。过程类似二分法,只是中间多了统计数字的数目。代码实现...原创 2018-05-27 17:32:20 · 245 阅读 · 0 评论 -
每日一练:找出数组中的重复数字
内容:在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个是重复的,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字。如{2,3,1,0,2,5,3},那么对应重复的数字为2或3。解题思路:重排这个数组。从头到尾一次扫描这个数组中的每一个数字。当下标为i时,首先比较这个数字(m)是不是等于i。如果是接着扫描下一个。如果不是,再拿这个数字和下标为m...原创 2018-05-27 17:23:19 · 6596 阅读 · 0 评论 -
自定义类型之:结构体,枚举,联合
1.结构体:>结构体的类型和声明:结构体是一种聚合类型,在C语言中结构体不能为空。结构体的声明:结构体是一些值的集合,这些值称为成员变量。成员变量可以是不同的值。struct tag{ // 结构体名tag见名只意,可以省略,但不建议省略 int a; //结构体成员变量:可以是任何类型 cha c;}list; //分号不能省略结构体之间不能相互赋值:st...原创 2018-05-27 14:57:46 · 217 阅读 · 0 评论 -
C语言之—模拟实现字符串函数
1.strlen:求字符串长度>直接用计算器实现: int my_strlen(const char *str) { int count = 0; while (*str){ count++; str++; } return count; ...原创 2018-05-22 21:02:46 · 177 阅读 · 0 评论 -
用C语言实现:这个函数的返回值value的二进制位模式从左到右翻转后的值。
如: 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回: 2550136832思路:定义一个数data存放反转的二进制,从输入数值的二进制最低位开始与1按位与,如果为1,则将这个位放到data的高位,然后从第二低位开始依次进行,直...原创 2018-05-13 23:53:48 · 265 阅读 · 0 评论 -
用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 · 288 阅读 · 0 评论 -
用C语言实现:写一个宏可以将一个数字的奇数位和偶数位交换。
解题思路:约定最右边的比特位是最低位,将二进制分两步(1)将奇数位保留,偶数位清零,然后左移一位,变成偶数位(2)将偶数位保留,奇数位清零,右移一位变成奇数位。如:这时简单的思路,在实现时,可以用下面的代码:将(x&(0x55555555))<<1; x按位与0x55555555后得到的二进制奇数位与x相同但偶数位均为0,然后再向左移一位,变成偶数位为原来的奇数位,且移动后奇数...原创 2018-05-13 22:55:52 · 345 阅读 · 0 评论 -
每日一练:字符串的空格替换
内容:请实现一个函数,把字符串中的每个空格替换成“%20”。例如:输入“Weare happy”,输出“We%20are%20happy”。解题思路:首先将字符串遍历一遍,统计出字符串中空格的数量,并由此计算出替换后字符串的总长度。每替换一个空格,长度加2,因此替换后的长度等于空格数*2。我们从字符串的后面开始替换。首先准备两个指针:p1和p2。P1指向原始字符串的末尾,p2指向替换后的字符串的...原创 2018-05-28 00:10:23 · 175 阅读 · 0 评论 -
每日一练:求菲波那切数列的第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 · 476 阅读 · 0 评论 -
每日一练:青蛙跳台阶问题
内容:一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶。求该青蛙跳上n级台阶共有多少种跳法。题目分析:先简单考虑。如果只有1级台阶,那么只有一种跳法,如果是2级台阶,那么有两种跳法。我们把n级台阶的跳法当成一个函数f(n),那么当n级台阶,n>2时,每次跳台阶都有两种不同的跳法:一是跳1级,此时的跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1),二是跳2级,此时的跳法数目等于后...原创 2018-05-28 16:53:33 · 259 阅读 · 0 评论 -
每日一练:将字符串转成整数
解题思路: 将字符串str中的每个字符通过ascll码转换成对应的数字,定义一个计数器num,每转换一次num*10,再加上当前字符转成的数字。字符串在转整数的时候要注意特殊情况:当第一个字符为+/-/字母/空格时。#include<stdio.h>#include<windows.h>#include<assert.h>enum en{ EROR,...原创 2018-06-07 15:48:56 · 102 阅读 · 0 评论 -
C语言之简单的通讯录实现
内容:通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人 实现:将变量定义在结构体中:typedef struct person { char name[20]; ...原创 2018-05-31 10:36:08 · 439 阅读 · 0 评论 -
C语言之动态内存管理
1.为什么存在动态内存分配?我们掌握的内存开辟方式:int val=20; //在栈上开辟4个字节char arr[10]={0}; //在栈上开辟10个字节的连续空间但这种开辟方式空间大小固定,在数组声明的时候必须指定长度,它所需要的内存在编译时分配,这时就需要用到动态内存开辟。2.动态内存函数:>malloc和free:malloc函数向内存申请一块连续可用的空间,...原创 2018-05-31 00:16:51 · 530 阅读 · 0 评论 -
每日一练:顺时针打印矩阵
内容:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。例如下列矩阵: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 · 150 阅读 · 0 评论 -
每日一练:调整数组使其奇数位于前面偶数位于后面
内容:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有的偶数位于后半部分。解题思路:思路一:定义两个变量表示数组下标,一个从数组头开始找偶数,一个从数组尾向头找奇数,找到后互换对应下标的数组内容。代码实现:void exchenge(int *a, int length){ assert(a); int i = 0; int j = length...原创 2018-05-30 19:11:57 · 172 阅读 · 0 评论 -
每日一练:位运算问题
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 · 98 阅读 · 0 评论 -
每日一练:数值的整数次方
内容:实现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 · 151 阅读 · 0 评论 -
每日一练:字符串排列
内容:输入一个字符串,打印该字符串中字符的所有序列。例如:输入字符串abc,则打印出:abc,acb,bac,bca,cab,cba解题思路:第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符,这样就把所有可能的字符放到第一位。第二步,固定第一个字符,然后把后面字符再进行排序,把后面的字符分成两部分:后面的第一个字符,和这个字符后面的所有字符,然后把第一个字符和后面的交换。这是...原创 2018-06-05 21:37:23 · 115 阅读 · 0 评论 -
剑指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 · 2989 阅读 · 2 评论 -
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 · 694 阅读 · 0 评论 -
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 · 329 阅读 · 0 评论 -
每日一练:旋转数组中的最小数字
内容: 把一个数组最开始的若干个元素搬到数组末尾,我们称之为数组的旋转。输入一个递增序列的数组的一个旋转,输出旋转数组的最小元素。如:{3,4,5,1,2}是{1,2,3,4,5}的一个旋转数组。最小值为1.解题思路:如果从头到尾遍历数组,能找到这个元素,但是时间复杂度为O(n),对于旋转数组来说不可取。我们注意到数组旋转之后实际上可以划分两个排序的子数组,而且前面的数组元素都大于或等于...原创 2018-05-28 16:55:48 · 129 阅读 · 0 评论 -
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 · 587 阅读 · 0 评论 -
函数的调用过程,栈帧的创建和销毁。
1.cpu中的寄存器:通用寄存器:EAX,EBX,ECX,EDX程序计数器(EIP(PC)):存放当前正在执行的指令的下一条指令的地址。栈顶:ESP寄存器栈底:EBP寄存器2.将内存中的指令复制到CPU中: 读取指令--->分析指令--->执行指令3.什么是栈?>栈是一种特殊的链表形式的数据结构,只允许在链表的一端进行添加和删除。>栈有栈底和栈顶。从栈顶入栈称为pus...原创 2018-05-07 01:57:19 · 257 阅读 · 0 评论 -
用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 · 31983 阅读 · 2 评论 -
求一个整数储存在内存中二进制的个数
有三种方法:1.直接法,除2取余。#include<stdio.h>int main(){ int num=10; int count=0; while(num){ if(num%2==1){ count++; } num=num/2; } printf("二进制1的个数:%d",count); return 0;} 2.通过右移,检测最低比特位是否...原创 2018-04-03 00:39:22 · 270 阅读 · 0 评论 -
简单的函数
1.函数的定义:子程序,是一个大型程序中的部分代码,由一个或多个语句块组成,负责完成某项特定任务,具有相对独立性。2.函数分类:>库函数(完成有限的功能)>自定义函数(可以实现自己想要的逻辑)3.库函数:顾名思义是把函数放到库里..是别人把一些常用到的函数编完放到一个文件里,供别人用.>库函数分类:IO函数,字符串操作函数,字符操作函数,内存操作函数,时间/日期函数,数学函数,其...原创 2018-04-10 00:19:45 · 199 阅读 · 0 评论 -
猜数字游戏
游戏规则:开始会出现一个选择菜单:1.开始,0.退出,键盘输入0或1确定要不要开始游戏,如果输入其他数字,会有提示让你重新输入。随机生成一个数字,然后输入你想的那个数,如果你输入的数字比生成的那个数大或者小,会显示猜大了或者猜小了,知道猜出来为止;下面是代码:#include<stdio.h>#include<windows.h>#include<time.h&g...原创 2018-04-02 01:29:08 · 291 阅读 · 0 评论 -
二分法查找具体的某个数
二分法查找:确定该区间的中间位置mid将查找的值key与a[mid]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。#include<stdio.h>#include<windows.h>int sceach(int arr[],int left,int right,int key){ int mid = 0; while (left <...原创 2018-04-02 00:45:55 · 388 阅读 · 0 评论 -
每日一题第一题:编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出。
分析:在ASCII码表中,如‘A’(65)与‘a’(97)之间相差32个序号,其他大小写相差也是32,所以给定大写输出小写只需加上32就可以得到相应的小写。程序如下:#include<stdio.h>int main(){ char c; int t; while((c=getchar())!=EOF){ //用来判断是否已经读取完 if(c>='a'&...原创 2018-04-08 18:14:25 · 546 阅读 · 0 评论 -
个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后 的结果满足如下条件,即是结果。#include<stdio.h>#include<math.h>#include<windows.h>int main(){ long int x,y; int i; for (i = 0; i...原创 2018-03-31 21:26:44 · 580 阅读 · 0 评论 -
认识C语言,常量,变量
1. C语言的最基础函数main函数,其返回值类型为int型。 基本数据类型:char(一个字节),short(两个字节),int(四个字节),Long(四个字节),Long Long(八个字节),float(四个字节),double(八个字节)。出现这些类型是为了给传入的变量开辟地址空间,当确定一个类型时就会开辟一定的存储空间。 字符串是由双引号引起来的一串字符比如:...原创 2018-03-25 23:56:21 · 165 阅读 · 0 评论 -
const修饰的变量
const定义的常量不能直接被修改,只能间接被修改,如,通过指针。int main(){const int a=20;int *p=10; //指针变量指向的是a的地址,通过给指针变量p赋值来改变a中的值printf(“%d\n”,a);return 0;}结果:10在C语言中,当const修饰的标识符,这个标识符依然是一个变量,但他具有常量属性,不能直接被改变。例如:#include<s...原创 2018-03-26 00:24:37 · 540 阅读 · 0 评论 -
static修饰的变量
例:#include<stdio.h>void test(){int num=0;num++; //方法体中是局部变量,进入作用域时开始,出作用域时结束printf("%d\n",num);}int main(){ int i=0;for(;i<5;i++){test();}return 0;}结果:1,1,1,1,1void test(){s...原创 2018-03-26 00:37:10 · 230 阅读 · 0 评论 -
浮点型和零的比较
浮点型和零比较时只能用范围比较,不能用“==”来比较:因为有些浮点数在内存中无法精确的储存,这样就会有精度流失。怎样来比较呢?设一个能够接受的精度,保证误差在精度范围内就可以。正确写法:#define EXP 0.0000000001float f=0.00000001;if((f>-EXP)&&(f<EXP)){//f意味着无限接近0的数字,就约等于0}例题:...原创 2018-03-26 22:53:55 · 442 阅读 · 0 评论