c语言

算法之排序(中)-c语言实现

我的未来我决定 提交于 2020-02-26 11:36:42
文章来源: http://blog.seclibs.com/算法之排序中-c语言实现/ 上一篇文章里说了归并排序和快速排序,它们的代码实现是非常相似的,只要理解了其中的具体实现,还是比较容易写出代码的。 归并排序 代码如下,需要下载代码的请移步至文末 快速排序 代码如下,需要下载代码的请移步至文末 代码: 归并排序: GitHub 快速排序: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客: http://blog.seclibs.com/ 来源: oschina 链接: https://my.oschina.net/u/3677719/blog/3163548

C语言宏定义总结

社会主义新天地 提交于 2020-02-26 10:51:51
http://www.cnblogs.com/floerggyy/archive/2008/04/05/1138455.html 转自:http://topcool99.ycool.com/post.1797687.html 宏定义了一个代表特定内容的标识符。 预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。 宏最常见的用法是定义代表某个值的全局符号。 宏的第二种用法是定义带参数的宏,这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。 1.#define指令 #define MAX_NUM 10 int array[MAX_NUM]; for(i=0;i<MAX_NUM;i++) /*……*/ #define VERSION "Version 1.0 Copyright(c) 2003" 2.带参数的#define指令  #define IS_EVEN(n) ((n)%2==0)  #define MAX(x,y) ((x)>(y) ? (x) :(y)) #define Cube(x) (x)*(x)*(x) 可以是任何数字表达式甚至函数调用来代替参数x。 3.#运算符 #的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。例如:

日常使用的C语言宏帮助打log

吃可爱长大的小学妹 提交于 2020-02-26 10:50:02
日常使用的C语言宏帮助打log 项目陷入僵局,写个blog放松一下。 cpp 在 debug 或者打 log 的时候可以借助一些宏定义让我们 强行 更便捷。下面介绍几个自己在写 cpp 时候常用的几个宏。(部分宏是C99新增的,要注意编译器支持不支持) # ## # 的效果简单说是把跟在后面的东西变成字符串。例子如下: #define LOG(x) cout<<#x<<":"<<x<<endl; int t = 2; LOG(t); 实际输出: t:2 ## 的效果简单说是对字符串做拼接。例子如下: #define X(n) x##n #define LOG(x) cout<<#x<<":"<<x<<endl; int X(1) = 2; LOG(x1); 实际输出: x1:2 __FUNCTION__ __FUNCTION__ 的效果简单说是取函数名。例子如下: #define LOG(x) cout<<#x<<":"<<x<<endl; void call_foo(){ LOG(__FUNCTION__); } int main(){ call_foo(); return 0; } 实际输出: __FUNCTION__:call_foo ... __VA_ARGS__ ... __VA_ARGS__ 常配合使用,用于省略参数。例子如下: #define LOG(...)

C语言变参宏

巧了我就是萌 提交于 2020-02-26 10:39:12
背景: C语言,GCC4.6,测试环境VS6.0 模拟printf的入参形式,达到如下目的: 某系统日志函数入参过多,在同一模块有很多重复的参数,希望能够减少输入,按照const char *format, ...的形式输入需要显示的内容。 研究结果: 在GCC编译环境下 使用GCC的变参宏(Varadic Macros)扩展实现: 1 /* 2 * main.c 3 * 4 * Created on: 2015年1月29日 5 * Author: lucifet 6 */ 7 8 #include <stdio.h> 9 #include <stdarg.h> 10 11 #define APP_DETAIL 0 12 #define APP_MSG 1 13 #define APP_WARN 2 14 #define APP_ERROR 3 15 #define APP_FAIL 4 16 #define APP_FATAL 5 17 18 #define TRUE 1 19 20 #define LogTraceAPP_DETAIL(id,LogId,Module,PrnLevel, Format,args...) do{\ 21 printf("id = %ld, LogId = %ld, Module = %ld, PrnLevel = %uc\n", \ 22 id

丁一第7次作业

余生颓废 提交于 2020-02-26 07:23:59
#include <stdio.h> void prt(int n) { printf("%d ",n%10); if(n>10) prt(n/10); } int main(void) { int a; printf("请输入整数:"); scanf("%d",&a); prt(a); return 0; } #include<stdio.h>//个字母的个数 #include<string.h> int main() { char name[0]; int length,i,a[26]={0}; printf("输入自己名字拼音:"); scanf("%s",name); length=strlen(name); for(i=0;i<length;i++) { a[name[i]-'a']++; } for(i=0;i<26;i++) { printf("%c:%d个\n",'A'+i,a[i]); } return 0; } #include<stdio.h> void R(int n) { if(!n) return; printf("%d",n%10); R(n/10); } int main() { int num; printf("输多位数:"); scanf("%d",&num); R(num); return 0; } 下面我说说我的感受

《C语言》 —— 数组详解

久未见 提交于 2020-02-26 03:05:41
书籍使我变成了一个幸福的人,使我的生活变成轻松而舒适的诗。——高尔基 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 前言  我本来准备C语言章节就写个指针就ok了,在我看来C语言的精华部分就是指针了。但是有很多同学就开始在群里各种拉扯C语言的其他问题,没办法,我是龙叔嘛,想想还是整理一下,把一些重要的C语言知识点都一一更新了吧。C语言指针的内容请点击 指针(上) 和 指针(下) , 记得点关注,不迷路 数组的基本概念  我们把一组数据的集合称为 数组(Array) ,它所包含的每一个数据叫做 数组元素 (Element),所包含的数据的个数称为 数组长度 (Length),数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为 下标 (Index),所包含数组的里面元素的类型叫做 数组类型 (Type)。  一句话就说清楚了数组的基本概念,就是这么简单,^_^。 数组底层结构探析 int array[5]; 内存布局图  不要看这个图简单,底层就是这样的。数组是一个整体,它的内存是 连续 的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。   这一点很重要,连续的内存为 指针 操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等

C语言中的union联合变量是什么意思

穿精又带淫゛_ 提交于 2020-02-26 03:00:46
什么是联合变量 c语言中的union 是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值 联合的定义 定义一个联合类型的一般形式为: union 联合名 { 成员表 }; 成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名 。成员名的命名应符合标识符的规定。例如: union perdata { int class; char office[10]; }; 定义了一个名为perdata的联合类型,它含有两个成员,一个为整型,成员名为class;另一个为字符数组,数组名为office。联合定义之后,即可进行联合变量说明,被说明为perdata类型的变量,可以存放整型量class或存放字符数组office。 联合变量的说明 联合变量的说明和结构变量的说明方式相同, 也有三种形式。即 A.先定义,再说明; B.定义同时说明; C.直接说明 以perdata类型为例,说明如下: union perdata { int class; char office[10]; }; union perdata a,b; 或者可同时说明为: union perdata { int class; char office[10]; }a,b; 或直接说明为: Union { int class; char office[10]; }a,b ;

c语言之指针

ε祈祈猫儿з 提交于 2020-02-26 02:58:35
指针就是用来存放地址。 &(取地址) 表示取出这个变量的地址符号, *(解引用) 指针说明符号,取地址里面的值 。 指针理解: int A=12;int *p=&A;把12存在变量 A空间 的 地址上 。把A的空间里面地址存在p指针上。 指针格式:指针虽然指针存放地址,但是也有类型。 int a = 5; int * p = &a; #include<stdio.h> #include<windows.h> int main() { int a = 5; int* p = &a; printf("这是指针的值:%d\n",*p); printf("这是指针的地址:%p\n", p); return 0; } 指针基础 数组和指针的关系;一维数组的数组名就是一个指针。 #include<stdio.h> #include<windows.h> int main() { int array[5] = { 1,2,3,4,5 }; int* p = array; for (int i = 0; i < 5;i++) { printf("直接使用指针作为数组名:%d\n",p[i]); } system("pause"); return 0; } 指针数组关系 悬空指针: 使用完之后(一般就是free释放空间之后)没有及时赋值为NULL的指针就是悬空指针。 野指针:

C语言堆排序问题排查

非 Y 不嫁゛ 提交于 2020-02-26 02:58:22
先上代码 #include <stdio.h> #include <stdlib.h> void printf_array(int a[], int length) { int i = 0; printf("array element:\n"); for (i = 0; i < length; i++) { printf("%d\t",a[i]); } printf("\n"); } void perDown(int a[], int parent, int length) { int temp = a[parent]; int child = 2 * parent + 1; while (child < length) { if(child + 1 < length && a[child+1] > a[child]) {//获取较大的儿子节点 child++; } if(a[child] > temp) { a[parent] = a[child]; parent = child; child = parent * 2 + 1; } else {//跳出循环 //a[parent] = temp;//为什么放在这里不好使呢? //怀疑编译器进行了内部优化导致此问题,放在这里和放在while体外,原则上是一样的意思 break; } } a[parent] = temp;

蓝桥杯 算法训练 阶乘(c语言版详细注释)

百般思念 提交于 2020-02-26 02:45:43
试题 算法训练 阶乘 蓝桥杯试题解答汇总链接 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5! = 1 * 2 * 3 * 4 * 5 = 120,因此5!最右边的那个非0的数字是2。再如:7! = 5040,因此7!最右边的那个非0的数字是4。请编写一个程序,输入一个整数n(n<=100),然后输出n! 最右边的那个非0的数字是多少。 输入格式 输入只有一个整数n。 输出格式 输出只有一个整数,即n! 最右边的那个非0的数字。 样例输入 6 样例输出 2 代码 # include <stdio.h> int main ( ) { int n , i , t = 1 ; scanf ( "%d" , & n ) ; for ( i = 1 ; i <= n ; i ++ ) { t * = i ; while ( t % 10 == 0 ) { //去掉末尾0 t / = 10 ; } t % = 1000 ; //因为n<