C语言程序
文章平均质量分 77
白帽子hhh
这个作者很懒,什么都没留下…
展开
-
求两个数的最大公约数
题目:求两个数的最大公约数分析:方法(1):辗转相除法int gcb2(int m, int n){ int left = 0; while (n) { left = m % n; m = n; n = left; } return m;//n等于0时,即m%n等于0,最大公约数是n,即m(里面赋值了)}方法(2):辗转相减法int gcb3...原创 2019-04-27 14:16:46 · 438 阅读 · 0 评论 -
简述delete/delete[]的区别
简述delete/delete[]的区别:(1)当通过new[]为数组分配空间时,如果数组元素是自定义类型,必须通过delete[]释放整个数组空间,因为delete[]会逐个调用数组中每个元素对象的析构函数,只有这样才能将数组元素内部申请的资源全部释放,否则只调用第一个元素的析构函数,其它对象内部成员申请的空间不会释放。(2)当数组元素的基本类型时,delete和delete[]都...原创 2019-03-04 16:42:38 · 562 阅读 · 0 评论 -
简述malloc/free 与 new/delete的区别
简述malloc/free 与 new/delete的区别如下:(1)malloc/free是C语言提供的库函数,new/delete是C++提供的运算符(2)malloc/free只能应用于基本类型,new/delete不但可以应用于基本类型,还可以应用于面向对象的自定义类型。(3)malloc函数返回类型是void*,使用时需要显示转换为自己需要的类型;new操作符直接指明了...原创 2019-03-04 16:29:41 · 439 阅读 · 0 评论 -
常见的排序算法
常见的排序算法如下:各个排序算法思想与实现:1.插入排序分为:直接插入排序、选择排序(1).直接插入排序将一个数据插入到一个有序区间中,区间不断扩大,直到数据被插完。void InsertSort(int* a, int n){ assert(a); int i = 0; int end = 0; for (i = 0; i < n-1; i++)/...原创 2019-03-06 17:24:01 · 158 阅读 · 0 评论 -
指针 与 引用的区别
题目:指针 与 引用的区别(1)指针是变量的地址,引用是变量的别名。(2)sizeof运算符的运算结果不同,对于指针运算是指针大小(4/8),对于引用运算是取决于原变量类型。自增++运算符意义不同,指针自增使得指针跳过同类型大小空间,指向下一个地址空间,指针本身指向的变量没变,引用自增是对原变量的值加1.(3)指针可以不初始化,引用必须初始化。指针本身可以修改,引用不能修改(...原创 2019-03-08 16:52:42 · 212 阅读 · 0 评论 -
找出人群中唯一的单身狗
题目:找出人群中唯一的单身狗(一个数组中除了一个数字只出现一次,其它数字 //均出现偶数次,找出这个只出现一次的数据),要求:只扫描一次数据。分析:通过“亦或”解决。注意两个公式:a^a=0, 0^a=a;int get_single_dog(int* a, int n){ int ret = 0; for (int i = 0; i < n; i++) { re...原创 2019-03-05 19:18:57 · 461 阅读 · 0 评论 -
将一个数的二进制数倒数第M位的前N位取反
题目:将一个二进制数倒数第M位的前N位取反分析:假设二进制位共有8位,M=2,N=4,将倒数第M位的前N为取反,即从倒数第3位开始至倒数第6位取反通过“亦或1处理”,因为将一个比特位亦或1,会将这个比特位取反。(即不包括倒数第M位,从它的下一位开始的连续N为)总体思想是:产生N个1,并且将这N个1放到从倒数第M+1置倒数M+N位置,再与原数据进行亦或。步骤如下:第一步:将1左移N位...原创 2019-03-05 19:03:09 · 868 阅读 · 0 评论 -
计算一个数二进制数中1的个数
题目:计算一个数二进制数中1的个数分析:方法1:逐位判断(按位与1)如onebit_count1(),但是该方法只能用于正数,因为负数右移时,左边补的是符号位1导致n一直不为0,停不下来。解决办法:直接将原数据移动的位数写死,分别移动0、1...31次。如onebit_count2().如果不想改变原数据的值时,当然也可以让1左移0、1...31与原数据按位与做判断。int o...原创 2019-03-05 17:35:47 · 345 阅读 · 0 评论 -
简述内联函数与宏定义的区别
内联函数VS宏定义相同点:(1)二者都是通过将函数调用替换成完整的函数体,相比函数调用的时间、空间开销而言,二者提高了效率。不同点:(1)宏定义不是函数,而内联函数时函数,因此内联函数可以调试,宏定义不能。(2)宏定义的代码展开阶段是预处理阶段,而内联函数在编译阶段,因此内联函数有类型安全检查,宏定义没有(3)内联函数作为类的成员函数时,可以访问类的所有成员(公有、保护、私有)...原创 2019-03-01 18:34:57 · 941 阅读 · 1 评论 -
打印乘法口诀表(两种方法)
打印乘法口诀表。方法一:两层for循环一层控制行,一层控制列void mul_fomula(int n){ int i = 0; int j = 0; for (i = 1; i <= n; i++)//控制行 { j = 0; for (j = 1; j <= i; j++)//控制列,第i行有i列 { printf("%d*%d=%2d "...原创 2019-03-01 17:36:32 · 2720 阅读 · 0 评论 -
不使用临时变量交换两个变量值
题目:不使用临时变量交换两个变量值分析:使用加、减、乘、亦或(a^b^a==b),四种方法分别如下://方法一:利用加法int Swap3(int *x, int *y){ *x = *x + *y;//*x是二者和 *y = *x - *y;//*y是*x *x = *x - *y;//*x是*y}//方法二:利用减法int Swap1(int *x, int ...原创 2019-03-04 17:36:21 · 1012 阅读 · 0 评论 -
简述main()执行前后都发生了什么?
题目:简述main()执行前后都发生了什么?(1)mian()在执行第一行代码之前,调用全局对象、静态对象的构造函数,初始化全局变量、静态变量。(2)main()函数最后一句代码执行之后会调用在atexit()中注册的函数,并且调用顺序与注册顺序相反。 atexit()函数的参数是一个指向函数的指针,通过将函数名作为参数,可以使函数在atexi()内部完成函数的注册,经过注册的函数会...原创 2019-03-07 14:01:16 · 461 阅读 · 0 评论 -
模拟实现atoi()函数
题目:atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。总体思路:123等于1*10+2=12,12*10+3=123.(当然也可以统计出位数,然后用每一位数字与其权值相乘,最后将所有的相加)注意:(1):会跳过前面的空白字符(如空格、换行、TAB等,即isspace()的字符),直到遇到数字字符才开始转换,遇到非数字字符或...原创 2019-04-09 16:52:33 · 175 阅读 · 0 评论 -
常见字符函数和字符串函数
我们都知道,在C语言里有string.h这个头文件,但是C语言里没有string这个类型。字符串通常放在常量字符串中或者字符数组中,字符串常量适用于那些对她不做修改的字符串函数。string.h这个头文件里声明的函数原型也全是针对char数组的种种操作。直到C++中才出现了string这个类这篇文章就简单整理一下C语言中处理字符、字符串的库函数。strlensize_t str...转载 2019-04-09 16:05:16 · 665 阅读 · 0 评论 -
数组指针 与 二维数组的区别
题目:假设数组a的地址&a=0X001DF720,请写出下面程序的结果。int main(){ int a[2][5] = { {1,2,3,4,5}, {6,7,8,9,10} }; int(*p)[5] = a; cout << p << endl; cout << p + 1 << endl; cout &l...原创 2019-03-07 17:15:21 · 917 阅读 · 0 评论 -
指针常量 与 常量指针
题目:指针常量 与 常量指针分别指什么?(1)指针常量是一个常量,其类型是一个指针。int* const p=&a; 说明指针p是一个常量,不可改变,即它始终指向同一个地址。因此必须在定义的同时进行初始化。(2)常量指针是一个指针,指向的内容是常量(不可改变)。const int *p=&a; *p=20这是错误的用法。 可以将常量、变量的地址赋给常量指针,但是都不允...原创 2019-03-07 15:57:27 · 133 阅读 · 0 评论 -
指针与句柄的区别
资源对象加载到内存时需要将首地址在资源列表中进行注册,注册后无论该资源对象的地址是否发生变化,其在资源列表中的注册位置始终不变。句柄是一个32位无符号整数,表示一个对象内存地址列表的整数索引。句柄没有直接指向资源对象,而是保存着一个资源对象在 资源注册列表中的索引,也就是说句柄是间接指向资源对象的。通过指针可以直接修改指针指向的内容,通过句柄只能、调用一些API函数。在概念上,句柄中记录...原创 2019-03-07 15:26:02 · 470 阅读 · 0 评论 -
编写一个程序,将主函数中的变量重新赋值,赋值后a>=b>=c
题目:编写一个程序,将主函数中的变量重新赋值,赋值后a>=b>=cvoid Swap(int* m, int* n){ int tmp = *m; *m = *n; *n = tmp;}void Sort(int* pa, int* pb, int* pc){ if (*pb > *pa)//保证*pa>*pb { Swap(pa, pb...原创 2019-03-07 14:28:13 · 973 阅读 · 0 评论 -
模拟实现strstr函数
题目:模拟实现strstr函数分析:在字符串str1中查找第一次出现str2的位置,如果存在返回str1中匹配字符串的首地址,否则返回NULL指针const char* my_strstr(const char* str1, const char* str2){ assert(str1); assert(str2); //str1指向每一次比较的起始位置,src遍历str...原创 2019-03-10 16:25:08 · 98 阅读 · 0 评论 -
模拟实现strcpy
题目:模拟实现strcpy分析:将str2指向的字符串拷贝到str1指向的字符串中。需要注意的是:'\0'也要拷贝;str1指向的内存空间要足够容纳字符串str2;原串str1是要以'\0'结束的标准串。char* my_strcpy(char* str1, const char* str2){ assert(str1); assert(str2); //逐字符拷贝,直到...原创 2019-03-10 16:24:00 · 243 阅读 · 0 评论 -
模拟实现strcmp函数
题目:模拟实现strcmp函数分析:strcmp()的函数功能是比较两个字符串str1和str2的大小(ASCII码)str1大于str2,返回结果大于0,str1小于str2,返回结果小于0,str1等于str2,返回结果等于0。int my_strcmp(const char* str1, const char* str2){ assert(str1); assert(s...原创 2019-03-10 16:22:19 · 258 阅读 · 0 评论 -
C语言包含两种头文件的方法区别
通过#include<> 与 #include""都可以将指定文件中的内容引入到当前文件,但是二者在搜索被引用文件时的搜索策略不同:(1)#include<>直接从编译器指定的路径出搜索,找不到直接报错。即库目录C:Program Files\Microsoft Visual Studio\VC\include(2)#include""首先在程序当前目录中进行搜索,...原创 2019-02-27 20:38:18 · 3303 阅读 · 0 评论 -
C语言中的“三字母词”
在ANSI标准中,定义了“三字母词”,也叫为“三联符序列”。目的主要是为了在一些特定的字符集中。三字母词”有且仅有9个,如以下。源代码中的“三字母词”,在编译阶段会被替换为“对应的字符”。但是由于编译器的原因,对ANSIC的支持也不一样,所以有些C编译器不处理“三字母词”,将它们当做普通的字符串来处理。...原创 2019-02-27 19:13:30 · 566 阅读 · 0 评论 -
关于动态内存管理
关于动态内存管理话题,我们讨论以下几个问题:为什么存在动态内存管理?动态内存管理函数有哪些?常见的动态内存错误?什么是柔性数组?几个经典的笔试题?问题一:为什么存在动态内存管理?平时我们定义的变量、数组等都在栈上开辟空间,这里的局限性是,空间开辟大小固定,尤其数组还要指定长度,所需内存在编译时分配;但是,有时候我们需要的空间大小在程序运行时才能知道,因此我们需要动态内存开辟。问题二:动态内存管理函...原创 2018-05-14 08:34:15 · 225 阅读 · 0 评论 -
c语言计算比赛名次、破案
算法思路:这种方法就是用5个for循环将每个人可能1-5名次遍历,根据结果要求每个人各说对一半为条件,得到结果,但是注意处理那种名次不连续情况的方法注意:(1)可以有重名次,但是这几个名次数字要连续,而且是从1开始#include int main(){ int a=0,b=0,c=0,d=0,e=0,ret=0; //遍历每个人的可能名次 for(a=1;a<=5;a+原创 2016-11-19 13:46:58 · 3593 阅读 · 0 评论 -
模拟实现strcpy、模拟实现strlen、模拟实现strstr函数
1.模拟实现strcpy(strcpy函数的功能是实现字符串的复制)方法一:算法思想:定义两个指针变量dest、str,分别指向目的字符串、原字符串,只要str指向的内容不为\0,完成复制,返回目的字符串的首地址注意:(1)将原字符串指针定义为 const类型(只读,不可修改) (2)这个函数是模拟strcpy库函数,其返回值是目的字符串的地址,所以调用时直接原创 2016-12-03 12:12:33 · 610 阅读 · 0 评论 -
判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回
判断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0方法一:算法思想:一个字符串左旋,无非还是这个字符串本身(长度未改变),并且字符本身未改变只是顺序改变;申请一个原来字符串数组空间的2倍加1(算上\0),如果另一个比较对象如果是这个字符串的子串(其中用到strstr函数),说明 二原创 2016-12-11 16:27:16 · 660 阅读 · 0 评论 -
.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA
1.实现一个函数,可以左旋字符串中的k个字符。AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAA方法一:算法思想:用移的步数作为while循环条件(每移1位完了减1),1位1位的移动,即只需要一个空的变量来存移出去的字符,而这时变量i已经到了数组最后的空位置,此时把先前移出去的字符再补回来即可注意:(1)for循环的判断条件是len-1,是因为把i原创 2016-12-11 16:17:08 · 686 阅读 · 0 评论 -
实现一个函数翻转字符串(将一个字符串的内容,逆序存储)
实现一个函数翻转字符串(将一个字符串的内容,逆序存储)算法思想:定义头指针、尾指针分别指向目标字符串的首尾两端,用异或方式交换二者内容,交换完之后,头指针加一,尾指针减一,以此类推,注意循环条件是头指针小于尾指针#include void reverse(char *star, char *end){ while(star<end) { *star=*star^*end原创 2016-12-11 16:09:53 · 1835 阅读 · 0 评论 -
宏函数实现一个数的奇数位和偶数位替换
写一个宏函数,将一个数的奇数位和偶数位替换:算法思想:将操作对象(某个整数x)的奇数位保留,偶数位置0(方法是x&0x55555555),同样的方法将整数x的偶数位保留,奇数位置0(方法是x&AAAAAAAA),这样之后拿到奇数位的结果向左移动一位,偶数位的向右移动一位,再一拼接(方法是按位或),用的原理是一个比特位按位或另一个比特位,不改变这个比特位注意:(1)一个整数从最低位开原创 2016-12-11 16:05:26 · 541 阅读 · 0 评论 -
将十进制数转化为八进制数
将一个十进制整数转化为八进制整数。 例:输入10,输出12算法思想:辗转相除法,除8模8,并且将余数作为输出位,(但是注意第一次拿到的是最低位,要逆序输出),在此过程若除数大于8,再将除数赋值给被除数,以此类推,直到除数为0为止。#include int main(){ int n=0,m=1,k=0,i=0; int a[32]={0}; scanf("%d",&n)原创 2016-12-10 16:50:25 · 8120 阅读 · 1 评论 -
交换两个变量的(六种)方法分析
方法一:用一个临时变量来交换两个变量#include int main(){ int tmp = 0; int i = 10; int j = 20; tmp=i; i=j; j=tmp; printf("%d %d",i,j); return 0;}方法二、三、四、:用和(差、积)的形式保存变量再进行变量之间的交换#include int main (){ i原创 2016-11-16 12:04:49 · 840 阅读 · 0 评论 -
在屏幕上输出一个菱形(大小可变)
算法思路:就是先用一个for循环控制行数,再寻找每行空格数、*的数分别与该行的对应关系,分别再用2个for循环来控制。注意:(1)先输出上半部分,再输出下半部分(算上中间那行)(2)记得i变化一次,就要输出一次换行符(3)将输入菱形行数设置成可以灵活变化的#include int main(){ int line=0,i=0,j=0; scanf("%d",&lin原创 2016-11-16 11:09:04 · 1551 阅读 · 0 评论 -
在屏幕上打印杨辉三角。
先按照数据规律关系,将第一列和对角线元素置成1,然后其他的每个元素都是其肩膀上两个元素之和所得,最后按照每行行数与空格关系,嵌套一层for循环将输出的杨辉三角更加美观注意:空格的添加在输出数组纷纷,而不是在元素修改部分 #include int main(){ int i=0,j=0; int a[10][10]={0}; for(i=0;i<10;i++) //数组元素修改部原创 2016-11-19 14:36:20 · 463 阅读 · 0 评论 -
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". 要求: 不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
算法思想:先将整个字符串整体逆置,再以每个单词为对象局部逆置(这时判断条件复杂一些);这里逆置时,需要一个逆置函数,需要两个参数,首指针和尾指针,由这两个指针锁定一个区域,将里面的字符从头至尾逆置注意:(1)最后一次跳出while循环时,相当于*q=='\0',所以最后这个单词没有逆置,需要再次调用逆置函数(2)if(表达式){语句1}语句2;这样的结构,无论if表达式成立与否,语句2原创 2016-12-03 12:21:24 · 669 阅读 · 0 评论 -
宏和函数的区别
宏和函数的区别; C语言中,宏的用处也是十分广泛,宏是一种规则或模式,或称语法替换 ,这种替换在预编译时进行,称作宏展开。 而函数函数就是一系列C语句的集合,为了完成某个会重复使用的特定功能。需要该功能的时候,直接调用该函数即可宏和函数功能上有相同点,但是也有许多差异,在不同的场合做合适的选择,是我们希望的,为此我们看两个例子:例子1:在两个数中找出较大原创 2017-04-26 09:20:37 · 777 阅读 · 0 评论 -
程序从源文件 到 可执行程序的全过程
1.程序从源文件 到 可执行程序的全过程:其中:1. 预处理选项gcc -E test.c -o test.i预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。2. 编译选项gcc -S test.c编译完成之后就停下来,结果保存在test.s中。3. 汇编gcc -c test.c汇编完成之后就停下来,结果保存在test.o中。原创 2017-04-25 10:48:27 · 1353 阅读 · 0 评论 -
C语言中的指针(指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针)
C语言中,我们知道,指针变量一种特殊的变量,专门用来存放其它变量的地址。因此,指针也可以说就是地址。但是,需要注意的是:什么类型的变量应该存放在什么类型的指针变量中。接下来我们对各类指针做一个讲解,希望能够帮到大家。分别有:指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针1.指针数组 指针数组强调的是数组,并且数组元素是指针类型例:int *arr[5]//ar原创 2017-05-25 17:30:17 · 728 阅读 · 0 评论 -
三子棋(五子棋...随便几子棋)游戏,把宏定义大小改变即可
算法思想: 这种方法可以实现:三子棋、五子棋、、、任意你想玩的棋子个数,棋盘规模也任意调整,相比较前一个使用范围广,更优化;具体实现内容上与上一个的区别是:(1)在初始化棋盘上比较细微,将棋盘的每个格子又划分为3*3的小格,再用大格表示小格(2)判断输赢时候,不是上一种的枚举可能赢得结果类型,而是以某个点为研究对象,分别计算出行(左加右)、列(上加下)、对角线上所有相同字原创 2016-11-27 12:26:04 · 896 阅读 · 0 评论 -
三子棋游戏
算法思想: 由于三子棋是一个游戏,而玩游戏的人至少应该进入游戏一次,之后再设置条件选择要不要继续玩;所以首先主逻辑应该用一个do{...}while()循环语句;接着就是应该打印一个比较美观的棋盘供玩家落子,之后就是玩家落子,电脑落子,判断输赢(注意是否有平局),现在结果。注意:(1)玩家和电脑每次各自落子之后,都要调用判断输赢函数来检查是否有赢家出现,注意平局的定义原创 2016-11-27 11:38:14 · 622 阅读 · 0 评论