C语言
文章平均质量分 50
SZL-C
潜力股
展开
-
重新调整数组的顺序是奇数位于偶数的前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变思路: 从前向后遍历,先找出第一个偶数; 然后以这个偶数为基准,向后找出奇数,插入到这个偶数的前面class Solution {public: void reOrderArray(vector<int> &array原创 2017-08-30 13:02:11 · 458 阅读 · 0 评论 -
c语言50题之小球落地问题、猴子吃桃问题
一个球从100m高度自由落下,每次落地后反跳回原来高度的一半,再落下。求第10次落地时,共经过多少米?第10次反弹的高度。#include<stdio.h>int main(){double i,a=100,b=0,n,sum=100;printf("请输入落地次数n:\n");scanf("%lf",&n);for(i=1;i<=n;i++){ sum=sum+2*b;a=a/2;原创 2016-12-16 22:14:54 · 1358 阅读 · 0 评论 -
动态内存分配(malloc colloc realloc free)
malloc和freemalloc是C语言库提供用于动态内存分配的函数,而free用于释放所分配的内存。 他们所包含在stdlib.h中,原型是:void *malloc(size_t size)void free(void *pointer)malloc的参数就是需要分配的内存字节数。如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块起始指针所指向的位置。 如果原创 2016-12-08 14:16:02 · 867 阅读 · 0 评论 -
简易通讯录
#include <stdio.h> #include <stdlib.h> #include<string.h> #include<ctype.h> typedef struct node{ char name[12]; char phone[13]; struct node *next; }LNode; LNode *h;原创 2016-12-15 23:01:18 · 390 阅读 · 0 评论 -
将十进制转化为二进制、八进制、十六进制
将十进制转化为二进制和八进制很简单,只需要将数对2&8取余,然后再逆序输出即可,难度不大,程序逻辑也简单。 将十进制转化为十六进制大致上也是这样的,不过有点复杂的地方就是数的范围,将10朝2&8转化的时候,直接取余,那么数的范围就是0~1 & 0~8,但是,十六进制的范围是0~f,所以说,还是得在定义个字符数组,所需的数就从这里取。 下面就来看这个程序吧!void change_binary(i原创 2016-11-28 13:03:18 · 2020 阅读 · 0 评论 -
strlen和sizeof
strlenstrlen(…)是函数,要在运行时才能计算。 参数必须是字符型指针(char*), 且必须是以’\0’结尾的。当数组名作为参数传入时,实际上数组就退化成指针了。 它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’。返回的长度大小不包括’\0’。sizeofsizeof的值在编原创 2016-12-09 14:16:10 · 330 阅读 · 0 评论 -
scanf、getchar和gets的区别
一、scanf函数作用:按照变量在内存的地址将变量值存进去。 一般格式:scanf(格式控制,地址表列) 其中,格式控制: %d:以带符号的十进制形式输出整数 %o:以八进制无符号形式输出整数 %x:以十六进制无符号形式输出整数 %u:以无符号十进制形式输出整数 %c:以字符形式输出,只输出一个字符 %s:输出字符串我们知道在用printf时,习惯性的在字符后面加\n,在这里我需要提原创 2016-11-27 17:00:27 · 7695 阅读 · 0 评论 -
递归实现一个数的任意指数次方
递归这个问题之前已经讨论过了,有利有弊,关键还是怎么使用,要是使用的好的不仅清晰,而且,事半功倍。那么现在我们就来说一下眼前这个问题吧! 要想实现一个数的任意次方,那么就得有两个数,一个作为底数,一个作为指数,然后就是分解这个问题了。一个数 x 的的 n 次方可以当成 n 个 x 的乘积,这样我们就知道这个题的做法了。最后就是分析怎样才能递归实现。 我们都知道,要想递归,首先要满足递归的条件原创 2016-11-27 12:23:11 · 2046 阅读 · 0 评论 -
选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 其实说白了,就是让程序在哪=那便遍历呢,遍历一遍找出最小值放在第一位,在对剩下的便利找出剩下的数中的最小值……一直到最后一个元素。 下图便是这个过程的图解,很详细:那么现在就来排序吧!void selecti原创 2016-11-26 20:45:49 · 313 阅读 · 0 评论 -
未定义类的报错
变量的定义我们都知道,不过,有时候我们写的代码,明明已经定义了,而且还没啥语法错误,但是,就是一直报错error C2065: “n”: 未声明的标识符。同样的道理,在调用函数的时候,这个问题也会被遇到“is_prime”未定义;假设外部返回 int同样的事情也会发生在结构体上,写结构体的时候也是一定要写在使用这个结构体的函数之前,要不然,会出现结构体未定义的现象原创 2016-12-07 13:40:36 · 3770 阅读 · 0 评论 -
杨氏矩阵查找算法
一、杨氏矩阵说白了,杨氏矩阵就是一个二维数组,不过这个二维数组有点特别:数组的每行从左到右是递增的,每列从上到下是递增的。比如说: 1 2 3 4 5 6 7 8 9二、查找算法知道了杨氏矩阵,再来看一下杨氏矩阵中的查找算法。就是说在杨氏矩阵中查找一个数。 要想查找这个数,还是得需要用到杨氏矩阵的性质,那就是,从左到右和从上到下都是递增的,这样,我们就可以定义一个指针分别指向最低行的最大值,原创 2016-11-24 20:31:07 · 904 阅读 · 1 评论 -
memcpy和memmove的区别
c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。 但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同原创 2016-11-23 12:40:09 · 248 阅读 · 0 评论 -
调整数组使奇数全部都位于偶数前面
调整数组使奇数全部都位于偶数前面。题目: 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。 ##对于这个问题,首先能想到的就是创建两个数组,然后再遍历一下原数组,找出奇数和偶数,分别放在两个数组中,再将其连接起来。这种方法,可行,但,不可取,我们都知道,创建一个数组同时需要给数组开辟空间,如果数组很小,也没啥,不过,要是数原创 2016-11-22 12:10:57 · 267 阅读 · 0 评论 -
指针作为返回值
1 指针作为函数的返回值 指针值也可以作为函数的返回值。这种情况下函数的返回值类型需要定义成指针变量类型。返回指针值的函数的一般定义格式为: 数据类型 *函数名称(形式参数列表) 例如: float *Func(float x, float y); 该函数的形式参数是两个float型的变量,返回一个float型变量的指针。下面是一个返回指针值的函数的例子:long score[10]={1,2原创 2016-12-14 23:00:38 · 1501 阅读 · 0 评论 -
C语言关于文件操作的总结(转)
在C语言中,文件的操作是通过FILE结构体进行了,具体实现时,先利用fopen返回一个指向FILE结构体的指针: FILE *fopen( const char *filename, const char *mode ); filename:文件名,mode:打开的模式,规定了是可读、可写、追加之类的属性。 “r”:可读,如果文件不存在,fopen调用失败 “w”:可写,如果文件存在,那么原转载 2017-01-02 22:50:21 · 690 阅读 · 0 评论 -
C语言实现C++继承和多态
例:C++中的一个类“Person”//Person.hclass Person{private: char* pFirstName; char* pLastName;public: Person(const char* pFirstName, const char* pLastName); //constructor ~Person(); //de原创 2017-08-01 22:08:14 · 344 阅读 · 0 评论 -
C语言50题之模拟实现atof、atoi
atof,就是 把字符串转换成浮点数,这个函数就可以完成,他们的家族有很多:atoi,itoa,其中的意思,就不详细说了,这里举出一个即可,都是一个家族的嘛,都与规律的。 首先说一下关于字符串转换成数字的问题,例如:“12345”要转换就是12345,那么,要是字符串中出现其他的字符,例如:“123ah”,这种情况呢? 显然这就是异常了,我们要写好这个函数,首先就得分析一下这个异常处理的情况:原创 2016-12-19 20:54:04 · 755 阅读 · 0 评论 -
c/c++测试函数的运行时间(八种方法)(转)
目前,存在着各种计时函数,一般的处理都是先调用计时函数,记下当前时间tstart,然后处理一段程序,再调用计时函数,记下处理后的时间tend,再tend和tstart做差,就可以得到程序的执行时间,但是各种计时函数的精度不一样.下面对各种计时函数,做些简单记录.void foo(){ long i; for (i=0;i<100000000;i++) { l转载 2017-02-22 20:04:32 · 31289 阅读 · 2 评论 -
C语言大总结
基本语法:关键字、类型基本语句:循环、选择语句数组:概念、多维数组、strlen、sizeof函数:声明、定义、栈帧、传参、库函数指针:……预处理:宏定义替换,宏函数,条件编译结构体:联合,位段,内存对齐文件;……内存管理:malloc……栈、堆原创 2016-12-29 23:01:31 · 363 阅读 · 0 评论 -
关于C语言中return的总结
return、break和continue这三个关键字有一个共同点,那就是读能让后面的语句不执行,不同的地方就是挑的距离不一样。return很强大,如果一个函数中有一个return,并且执行了,那么这个函数就完了。return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。 return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如原创 2017-01-01 13:36:35 · 89472 阅读 · 18 评论 -
标准函数库(#include<stdio.h>)
stdio.h我在学习C语言的最初,写的第一个程序一定是这样子的#include<stdio.h>int main(){printf("hello world!");}这个程序的结果会在一个黑框框上显示 hello world!当时我们或许对于这个不怎么理解,现在回过头来看这些问题的时候,就会发出感叹:真简单啊! 好了,现在说一下,这个问题的真正含义吧,其实这个函数要是什么都不写那么也能原创 2017-01-05 19:22:04 · 5303 阅读 · 0 评论 -
注释转换
C语言的注释 -> C++的注释 C语言的注释 /* xxxxx */ C++的注释 //xxxxx// 1.一般情况 /* int i = 0; */// 2.换行问题 /* int i = 0; */int j = 0; /* int i = 0; */ int j = 0;// 3.匹配问题 /int i = 0;/*xxxxx/// 4.多行注释问题 /* int i=原创 2016-12-24 23:04:17 · 276 阅读 · 0 评论 -
C语言50题之百度笔试题
判断你的电脑存储方式是大端还是小端大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权原创 2016-12-18 11:40:56 · 2321 阅读 · 0 评论 -
C语言50题之回文数
回文,在古诗中经常遇到,“画上荷花和尚画”,“书临汉墨翰林书”。 毫无疑问,会问就是,正着和倒着一样,回文数字,比如:12321 、4554等。回文字符串,比如:“abcdcba”、“dfggfd”。 那么今天就让我们用C语言来实现这种类型的题目吧!#include<stdio.h>#define _CRT_SECURE_NO_WARNINGSint main(){ int num,原创 2016-12-18 00:00:47 · 1259 阅读 · 1 评论 -
C语言文件操作
C语言文件操作 一、标准文件的读写1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名原创 2016-12-23 23:02:30 · 323 阅读 · 0 评论 -
函数设计一般规则和技巧
1、尽量少使用全局变量,因为全局变量的生命周期太长会长时间占用空间,而且容易出错。2、参数命名要恰当,注意命名的顺序。 例如:字符串拷贝函数,str_copy,如果有两个参数,那么可以命名为str1,str2,这样简单,但是有一个缺点,就是我们很难搞清楚把水拷贝给谁,所以这里提供一个更直观的命名;dest, src,这是目标 字符串和源 字符串,这样我们就知道,是要把,src拷给dest,当然我原创 2016-12-11 16:03:06 · 822 阅读 · 0 评论 -
浮点型的读取方式
在C语言中存在两种类型的浮点型,其中一种是单精度的浮点型(float)、双精度的浮点型(double)。浮点型数据和一般的整形数据具有较大的差别,具体的差别就是浮点型数据是一个近似值,并不是一个准确的值,这也就是为什么在比较浮点型数据的大小时不能采用直接等于的方式进行比较,因为浮点型只是一个近似值,也就是一个值可能表示一个范围区间,这样的表达方式就使得对浮点型采用相等的判断方法进行判断可能不合理,只原创 2016-12-22 22:34:15 · 2997 阅读 · 0 评论 -
c语言中的一个坑(2+3 != 5)
我们知道,其实有很多地方不仅可以使用常数,也可以使用常数表达式,但是,就是因为使用常数表达式,而引起了很多错误,这些错误归结起来就是一个”坑“。 下面我们来砍看一道简单的运算题: #define N 4 #define Y(n) ((N+2)*n) /*这种定义在编程规范中是严格禁止的*/则执行语句:z = 2 * (N + Y(5+1));后,z的值为: 显而易见这里使用的是5+1替代函数中原创 2016-12-12 22:37:04 · 2118 阅读 · 1 评论 -
c语言语法陷阱总结
学习C语言也有一段时间了,关于语法上的错误,现在基本上也没犯过,不过,我还是想小结一下。一、优先级问题运算优先级的问题,其实在背乘法表,的时候就已经开始接触了。那时候我们知道在加减乘除的混合运算中,先算乘除,再算加减,如果遇到括号,先算括号里的内容,这就是优先级问题。 那么在 c语言中,我们也有很多运算,有运算就有优先级的问题,关于优先级的问题,下面的表中会有一些总结。从这个表中我们可以看出很多问原创 2016-12-04 19:21:45 · 781 阅读 · 0 评论 -
一个字符串中查找第一个只出现一次的字符。 要求复杂度为O(N).
我们知道,在众多数字中查找一个单独出现的数字可以用异或,还有普通的方法,也就是用两个循环嵌套使用查找,这都很简单,不过这里要求查找的不是数字了,而是一个字符,那么我们就不能使用异或了,只能遍历查找。 然而,遍历查找是需要嵌套循环的,也就是说,它的时间复杂度是O(N)^2,而这里要求的是O(N),所以,就得想办法消去一个循环。 下面就来看一下这是如何实现的吧!#include<stdio.h>#原创 2016-11-21 17:54:30 · 590 阅读 · 0 评论 -
输入,输出的小事情
1、书写标识符时,忽略了大小写字母的区别。复制代码 代码如下:main(){ int a=5; printf("%d",A);}编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。2、忽略了变量的类型,进行了不合法的运算。复制代码 代码如下:main(){ fl原创 2016-10-27 23:30:03 · 351 阅读 · 0 评论 -
c语言中那些关键字
register 它的意思是请求编译器尽可能的将变量存在寄存器中,(注意文字的变化,尽可能而不是一定会将变量存在寄存器中。) 关于寄存器、内存、CPU,我在一本书上看到一个非常形象的比喻,将三者分别当成太监、大臣和皇帝。其工作流程是:数据从大臣(内存)那拿出来先放在太监(寄存器)那,然后皇帝(CPU)再从太监(寄存器)那读取数据处理,处理完之后,将数据通过太监(寄存器)存放在大原创 2016-10-05 18:44:09 · 516 阅读 · 0 评论 -
位运算符的用法
&(按位与) 首先要说的是这个与逻辑运算符&&和||的区别,其实也没啥,注意别整混淆就行,单层的是位运算符,双层的是逻辑运算符,当然现在说的是双层,不是双目,说起来,这两种都是双目运算符。另外要说的是这个与(&)也有取地址的意思,不过这个好像不会有人弄错。先面说一下这两个运算符的用法:按位与,首先得是二进制吧,其运算方法是只有两个二进制位数均为1,结果才为1,否则为0。原创 2016-10-09 15:46:21 · 2912 阅读 · 0 评论 -
模拟实现strcpy和strlen
模拟实现strcpystrcpy:其中的str表示字符串,cpy是copy的简写,也就是复制,那么这个函数就是把一个字符串里的内容拷贝到另一个之中。现在我们就要模拟这个函数,也就是说自己做一个函数来实现strcpy的功能。看下面的的程序:char* my_strcpy(char*dest,char*src){ char * ret=dest; assert(dest != N原创 2016-10-30 17:22:08 · 573 阅读 · 0 评论 -
最大公约数和最小公倍数
最大公约数 数学上求最大公约数一般有两种方法,辗转相除法和更向相减法: 首先来普及一下这两种数学上的方法,对接下来的算法很有帮助。辗转相除法,顾名思义,就是用除法来做的,不过这里用的是%(取余),我们假设有两个数是有最大公约数的,记为M,而这两个数就记为aM和bM,如果a>b,那么在使用辗转相除法后,所得结果便是(a-b)M,随着辗转相除,a-b最终会是1,那么便可求得原创 2016-11-02 00:47:40 · 469 阅读 · 0 评论 -
指针与数组
数组和指针1、数组和指针的区别: 数组和指针并不相等,下面我来说一下它们的一些区别: 举个例子吧, int a[5]; int *b; 这是指针和数组的声明,虽然他们都具有指针值,而且都可以进行指针访问和下标引用操作。但是,声明数组时,编译器会根据声明所指定的元素数量为数组保留一定的内存空间,然后再创建数组,并且它的只是一个常量,指向这段空间的起始位置;声明指针时,编译器只为指针本身原创 2016-11-04 14:26:29 · 358 阅读 · 0 评论 -
递归和迭代
递归、迭代我们在使用函数的时候,都会用到函数的调用,调用函数可以使整个程序的可读性增强,而且,如果你再一次需要这个被调用的函数时也很方便,不用说是再写一遍。那么函数自己调用自己呢?这个时候就要引入递归这个词了。 递归用好了,好处很多,至少看起来更加清晰。现在来说一下递归的两个特性:首先是存在限制条件,当符合这个限制条件时递归不在继续;然后是每次递归之后,越来越接近这个限制条件。 下面我们就来看一原创 2016-11-12 14:26:01 · 415 阅读 · 2 评论 -
写一个宏,将一个数的奇数位和偶数位交换
我们知道交换两个数的方法,而这个问题说的是将一个数的奇数位和偶数位交换,并且用宏实现,所以这个问题的主要障碍不是写一个宏,而是怎样提取奇数和偶数,只有提取奇数位和偶数位,那么一切都好说。现在我来说一种很神奇的方法,至少在我一筹莫展时看到后感觉很神奇。 其实说起来也没什么大不了的,就是将原数字 x 与01序列进行按位与运算,例如:13---->1101,要提取其奇数位,只需要将其与0x555原创 2016-11-11 22:19:50 · 539 阅读 · 0 评论 -
字符串旋转(续)
字符串左旋上次说到字符串旋转的事情,不过最简单直接的方法还是将字符串一步一步的移动直到满足条件,下面就来看一下吧:void rotate_left(char *str, int k){ assert(str); while (k > 0) { int i = 0; char left =*str; int原创 2016-11-10 17:32:36 · 306 阅读 · 0 评论 -
字符串旋转
字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 例如: AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 同理字符串右旋操作: AABCD右旋一个字符得到DAABC AABCD右旋两个字符得到CDAAB 那么今天就来说一下字符串旋转中的一些问题: 首先说一下简单的,先用函数形式实现字符串左旋,原创 2016-11-09 19:37:30 · 716 阅读 · 0 评论