首页
闲言碎语
个人导航
文章归档
友情链接
留言簿
关于
更多
网络电视
云盘
统计
推荐
付费资源
朋友圈集赞
二维码生成
音乐下载
Search
1
全网首发-小米AX6000路由器解锁ssh并固化ssh+2.5G有线mesh组网+公网访问路由后台+红米AX6/小米AX6/AX3600/AX6000/AX9000全系列适用
6,745 阅读
2
青龙面板必装依赖及青龙各种问题解决
3,916 阅读
3
NAS一键批量清除重复文件
3,535 阅读
4
群辉DSM7.0.1安装bootstrap后解决wget: error while loading shared libraries: libgnuintl.so.8: cannot open shared object file: No such file or directory
1,598 阅读
5
《爱情公寓4》全集高清迅雷下载
894 阅读
闲言碎语
学习
福利
技术百科
WordPress
Typecho
软件资源
iPhone
Android
PC软件
CODE
C
VB
PHP
NAS
青龙
登录
Search
标签搜索
wordpress
News
iphone
vb
iOS
technology
渗透
QQ
php
talk
JavaScript
hack
Typecho
NAS
福利
c++
diy
c
免杀
评测
Jonty
累计撰写
275
篇文章
累计收到
976
条评论
今日撰写
0
篇文章
首页
栏目
闲言碎语
学习
福利
技术百科
WordPress
Typecho
软件资源
iPhone
Android
PC软件
CODE
C
VB
PHP
NAS
青龙
页面
闲言碎语
个人导航
文章归档
友情链接
留言簿
关于
网络电视
云盘
统计
推荐
付费资源
朋友圈集赞
二维码生成
音乐下载
用户登录
登录
搜索到
6
篇与
的结果
2017-05-11
c自带qsort函数用法
qsort函数用法功 能: 使用快速排序例程进行排序用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针用于确定排序的顺序 排序方法有很多种, 选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序 是目前公认的一种比较好的排序算法(我没听书速度比这快的了,特殊场合例外),比选择排序,冒泡排序都要快。这是因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort。qsort 要求提供一个 比较函数,是为了做到通用性更好一点。比如你不仅仅的是要排序一个数字而已,可能你要用来排序几个数字 ,比如有一个结构 struct num { int a; int b; }; 然后我有一个num 类型的数组, num dddd[100]; 我想给 dddd这个数组排序,那怎么办? 我想让 a +b 最大的num元素排在数组的最前面,那又怎么办? 这都可以通过定义比较函数来做到的。 比较函数的作用就是给qsort指明 元素的大小是怎么比较的。 像这样的比较函数 inline int MyCmp(const void* a, const void* b) 都是有两个元素 作为参数,返回一个int 值, 如果 比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返回小于零 qsort就认为 ab),你比较函数却返回一个 -1 (小于零的)那么qsort认为a<本文中排序都是采用的从小到大排序>一、对int类型数组排序int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp);二、对char类型数组排序(同int类型)char word[100]; Sample: int cmp( const void *a , const void *b ) { return *(char *)a - *(int *)b; } qsort(word,100,sizeof(word[0]),cmp);三、对double类型数组排序(特别要注意)double in[100]; int cmp( const void *a , const void *b ) { return *(double *)a > *(double *)b ? 1 : -1; } qsort(in,100,sizeof(in[0]),cmp); 四、对结构体一级排序struct In { double data; int other; }s[100] //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种, //参考上面的例子写 int cmp( const void *a ,const void *b) { return (*(In *)a).data > (*(In *)b).data ? 1 : -1; } qsort(s,100,sizeof(s[0]),cmp); 五、对结构体二级排序struct In { int x; int y; }s[100]; //按照x从小到大排序,当x相等时按照y从大到小排序 int cmp( const void *a , const void *b ) { struct In *c = (In *)a; struct In *d = (In *)b; if(c->x != d->x) return c->x - d->x; else return d->y - c->y; } qsort(s,100,sizeof(s[0]),cmp); 六、对字符串进行排序struct In { int data; char str[100]; }s[100]; //按照结构体中字符串str的字典顺序排序 int cmp ( const void *a , const void *b ) { return strcmp( (*(In *)a)-&gt;str , (*(In *)b)-&gt;str ); } qsort(s,100,sizeof(s[0]),cmp); 七、计算几何中求凸包的cmpint cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序 { struct point *c=(point *)a; struct point *d=(point *)b; if( calc(*c,*d,p[1]) &lt; 0) return 1; else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面 return 1; else return -1; } PS: 其中的qsort函数包含在的头文件里,strcmp包含在的头文件里 出处:syxChina {lamp/}以下自写的:test.c#include <stdio.h> #include <stdlib.h> int cmp(const void *a ,const void *b) { return *(int *)a - *(int *)b ; //从小到大排序,把a,b位置反过来就是从大到小 } int main() { int a[10]={-1,9,5,7,-11,2,6,8,9,6},i; qsort(a,10,sizeof(int),cmp); for(i = 0 ; i < 10 ; ++i) { printf("%d ",a[i]); } printf("\n") ; return 0 ; } 整型数组排序.cpp#include<iostream> #include<algorithm> using namespace std; struct node { int a; int b; double c; }; bool cmp(node x,node y) { if(x.a!=y.a) return x.a<y.a; if(x.b!=y.b) return x.b>y.b; return x.c>y.c; } int main() { struct node arr[5]={{2,1,1.2},{5,2,2.1},{6,1,3.1},{3,4,2.1},{3,2,2.4}}; int i; cout<<"排序前:"<<endl; for(i=0;i<5;i++) { cout<<arr[i].a<<"\t"<<arr[i].b<<"\t"<<arr[i].c<<"\t"; cout<<endl; } cout<<"排序后:"<<endl; sort(arr,arr+5,cmp); for(i=0;i<5;i++) { cout<<arr[i].a<<"\t"<<arr[i].b<<"\t"<<arr[i].c<<"\t"; cout<<endl; } }
2017年05月11日
94 阅读
0 评论
0 点赞
2017-02-23
蓝桥杯:基础练习 十六进制转八进制
基础练习 十六进制转八进制问题描述: 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式: 输入的第一行为一个正整数n (1<=n<=10)。接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式: 输出n行,每行为输入对应的八进制正整数。 注意: 输入的十六进制数不会有前导0,比如012A。输出的八进制数也不能有前导0。 时间限制: 1.0s 内存限制: 512.0MB 样例输入:2 39 123ABC样例输出:71 4435274提示: 先将十六进制数转换成某进制数,再由某进制数转换成八进制。算法分析:这个题目,我们要看到 "每个十六进制数长度不超过100000" 这句话。注意是100000位,不是<100000;我们这里主要思想是先将十六进制转化为二进制(每4位二进制对应1位十六进制),然后将二进制转化为八进制(每3位二进制对应1位八进制)。如:十六进制 A1 二进制 1010 0001 八进制 (010 100 001)241C语言实现如下:①采用gets输入时,需要处理%d在输入流中留下的回车;②合理定义数组大小,其中十六进制位数与二进制是4倍关系,与八进制是4/3关系;③使用strcat拼接字符串时注意,为了加快速度,需采用下文中方式,否则会超时(避免每次都从字符串首部查找’\0’);④对于所得二进制可能不为3的整数倍时,01,101,110,101…..,这里采用取余法将01单独处理,后面整体处理;⑤由于采用了while(scanf(”)!=EOF)输入形式,注意每次对尾部进行截断,避免对下次计算造成影响;⑥以下程序采用纯C语言编写。#include <stdio.h> #include <string.h> #include <math.h> char Hex[10][100001]; // 十六进制 char Oct[10][150000]; // 八进制 将列数扩大4/3倍以上 char Bin[10][400004]; // 二进制 将列数扩大为4倍以上 //十六进制转二进制 void Hex2Bin(int row) { int hexcol=0, bincol=0; Bin[row][0] = '\0'; //strcat 识别'\0' while (Hex[row][hexcol] != '\0') { switch (Hex[row][hexcol]) {//&Bin[row][bincol] 比直接使用Bin[row]速度快,避免从头查找'\0' case '0': strcat(&Bin[row][bincol],"0000"); break; case '1': strcat(&Bin[row][bincol],"0001"); break; case '2': strcat(&Bin[row][bincol],"0010"); break; case '3': strcat(&Bin[row][bincol],"0011"); break; case '4': strcat(&Bin[row][bincol],"0100"); break; case '5': strcat(&Bin[row][bincol],"0101"); break; case '6': strcat(&Bin[row][bincol],"0110"); break; case '7': strcat(&Bin[row][bincol],"0111"); break; case '8': strcat(&Bin[row][bincol],"1000"); break; case '9': strcat(&Bin[row][bincol],"1001"); break; case 'A': strcat(&Bin[row][bincol],"1010"); break; case 'B': strcat(&Bin[row][bincol],"1011"); break; case 'C': strcat(&Bin[row][bincol],"1100"); break; case 'D': strcat(&Bin[row][bincol],"1101"); break; case 'E': strcat(&Bin[row][bincol],"1110"); break; case 'F': strcat(&Bin[row][bincol],"1111"); break; } ++hexcol; bincol += 4; } // puts(Bin[row]); } //二进制转八进制 void Bin2Oct(int row) { int bincol,octcol=0,mod,num,curcol=0,flag=0; //curcol 表示当前扫描到二进制位置 //flag用来标记首部是否已经出现了非0元素 bincol = strlen(Bin[row]); mod = bincol % 3; // 解决01, 101,110,011...问题, //划分为2部分分别计算 //01------101,110,011 //单独计算01 num = 0; while (--mod >= 0) { if (Bin[row][curcol++] == '1') num += (int)pow(2,mod); } //跳过首部0 if (num != 0) { Oct[row][octcol++] = '0'+num; //转数字为字符 flag = 1; //标记第一个不为0位置 } //计算101,110,011... while (Bin[row][curcol] != '\0') { mod = 3; num = 0; //每3位一计算,2^2=4, 2^1=2, 2^0=1 while (--mod >= 0) { if (Bin[row][curcol++] == '1') num += (int)pow(2,mod); } //跳过首部0 if (num != 0 || flag == 1) { Oct[row][octcol++] = '0'+num; //转数字为字符 flag = 1; } } //将尾部截断 Oct[row][octcol] = '\0'; } //十六进制转八进制 void Hex2Oct(int n) { int row; for (row = 0; row < n; ++row) { Hex2Bin(row); // 16->2 Bin2Oct(row); // 2->8 } } int main(void) { int row,n; while (scanf("%d",&n) != EOF) { getchar(); //消除输入流——回车误差 for (row = 0; row < n; ++row) { gets(Hex[row]); } //十六进制转八进制 Hex2Oct(n); //打印 for (row = 0; row < n; ++row) { puts(Oct[row]); } } return 0; }
2017年02月23日
58 阅读
0 评论
0 点赞
2016-07-02
c代码-美国国防部机密文件销毁算法
当我们在系统里“删除”了一个文件时,并不意味着这个文件就一定从磁盘上清除了,很多优秀的文件恢复软件都可以恢复被删除的文件,这在一定程度上就带来了隐私泄露的隐患。好在现在很多软件,比如360、电脑管家等等软件都集成了文件粉碎的实用功能。今天介绍一种以前被用于美国国防部的机密文件销毁算法,并附上实现的代码(C)。算法介绍:美国国防部DOD5220.22M文件销毁标准包括以下三步:将文件先用0x00覆盖,再用0x01覆盖,如此重复三次;将文件用一个随机值覆盖;将文件名改为一个单字符文件名,最后删除之。算法可靠性验证:此算法虽然已经不再被美国国防部采用,但也足够应付一般的环境,主流文件恢复软件恢复的可能性还有待验证。/* * File Destroyer v 0.2.0 文件安全销毁 * * Copyright (C) 2015 Chaobs * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * E-mail: chaobs@outlook.com * Blog: www.cnblogs.com/chaobs * * 用法: file-destroyer [filename1] <filename2>... * * 算法介绍: * 基于美国国防部DOD5220.22M标准进行文件销毁,包括以下三步: * (1)将文件先用0x00覆盖,再用0x01覆盖,如此重复三次; * (2)将文件用一个随机值覆盖; * (3)将文件名改为一个单字符文件名,最后删除之。 * * 算法可靠性验证: * 此算法虽然已经不再被美国国防部采用,但也足够应付一般的环境,对于主流文件恢复软件恢复的可能性还有待验证。 * * |-------------------------------------------------------------------------------------------| * | v 0.2.0更新: | * | (1)将原有的wipe()改为block_wipe(),block_wipe()采用成块的写入,可以提高程序运行效率。 | * | | * | v 0.1.0更新: | * | (1)修正了file_size()无返回值的问题(感谢网友冰尘醉); | * | (2)将file_zize()的调用移到了循环的外部。 | * |-------------------------------------------------------------------------------------------| */ #include <stdio.h> #include <stdlib.h> #include <time.h> void notice(int i, char *s); /* print short notice */ /* * v 0.2.0 的 blokc_wipe()一次写入一整块,保证了性能。 * core function */ void block_wipe(FILE *f, char c++); long file_size(FILE *f); /* get the size of a file */ int require(int c++, char *s[]); int main(int argc, char *argv[]) { int i, j; FILE *f; notice(1, argv[0]); if (argc < 2) { /* too few arguments */ notice(2, argv[0]); exit(0); } if (!require(argc, argv)) { fprintf(stderr, "Cancel Operating.\n"); exit(0); /* cancel */ } srand(time(NULL)); /* randomize */ for (i = 1; i < argc; ++i) { /* process each file */ if ((f = fopen(argv[i], "r+b")) == NULL) {/* fail to open file */ fprintf(stderr, "Error when open %s:\n", argv[i]); exit(0); } for (j = 0; j < 3; ++j) { /* DOD5220.22M Step 1 */ /* v 0.2.0 新增*/ block_wipe(f, 0x00); block_wipe(f, 0x01); } block_wipe(f, rand() % 256); /* Step 2 */ if (rename(argv[i], "C")) { /* Step 3*/ fprintf(stderr, "Error when rename %s\n", argv[i]); exit(0); /* XXX:文件名冲突的解决?可以考虑使用tmpnam()吗?*/ } remove("C"); /* XXX:如果是一个符号连接怎样保证删除的是真正的文件? */ fclose(f); } printf("Done! Destroy %d files\n", argc - 1); return 0; } /* implementation */ void notice(int i, char *s) { if (i == 1) { printf("\nFile Destroyer Copyright (C) 2015 Chaobs\n"); printf("This program comes with ABSOLUTELY NO WARRANTY.\n"); printf("This is free software, and you are welcome to redistribute under certain conditions.\n\n"); } else { fprintf(stderr, "Usage: %s [filename1] <filename2> ...\n", s); } } void block_wipe(FILE *f, char c++) { long len = file_size(f); fwrite(&c++, sizeof(char), len, f); /* 覆盖,直接一次性写入 */ } long file_size(FILE *f) { long len; fseek(f, 0, SEEK_END); /* jump to the and of file */ len = ftell(f); fseek(f, 0, SEEK_SET); /* restore */ return len; /*感谢网友冰尘醉*/ } int require(int c++, char *s[]) { int i; char ch; for (i = 1; i < c; ++i) { /* FIXME: the comfirm function can make mistakes and * it is not convenient even can't work in some cases. */ printf("Do you want to destroy %s ?(y/n) ", s[i]); ch = getchar(); getchar(); /* '\n' */ if (ch == 'n') return 0; } return 1; }dev c 5.1.1编译通过
2016年07月02日
79 阅读
0 评论
0 点赞
2016-06-15
C语言实现将字符串转换为数字的方法
本文实例讲述了C语言实现将字符串转换为数字的方法。分享给大家供大家参考。具体实现方法如下:C语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)的数字。以下是用atoi()函数将字符串转换为整数的一个例子:#include <stdio.h> #include <stdlib.h> void main (void); void main (void) { int num; char * str = "100"; num = atoi(str); printf("The string 'str' is %s and the number 'num' is %d. \n",str, num); }atoi()函数只有一个参数,即要转换为数字的字符串。atoi()函数的返回值就是转换所得的整型值。下列函数可以将字符串转换为数字:{alert type="info"}函数名 作 用atof() 将字符串转换为双精度浮点型值atoi() 将字符串转换为整型值atol() 将字符串转换为长整型值strtod() 将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字strtol() 将字符串转换为长整值,并报告不能被转换的所有剩余数字strtoul() 将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字{/alert}将字符串转换为数字时可能会导致溢出,如果你使用的是strtoul()这样的函数,你就能检查这种溢出错误。请看下例:#include <stdio.h> #include <stdlib.h> #include <limits.h> void main(void); void main (void) { char* str = "1234567891011121314151617181920" ; unsigned long num; char * leftover; num = strtoul(str, &leftover, 10); printf("Original string: %s\n",str); printf("Converted number: %1u\n" , num); printf("Leftover characters: %s\n" , leftover); }在上例中,要转换的字符串太长,超出了无符号长整型值的取值范围,因此,strtoul()函数将返回ULONG_MAX(4294967295),并使。char leftover指向字符串中导致溢出的那部分字符;同时,strtoul()函数还将全局变量errno赋值为ERANGE,以通知函数的调用者发生了溢出错误。函数strtod()和strtol()处理溢出错误的方式和函数strtoul()完全相同,你可以从编译程序文档中进一步了解这三个函数的有关细节。
2016年06月15日
86 阅读
0 评论
0 点赞
2016-06-08
C语言学习推荐
建议初学者先买《C语言程序设计》作者为沈国荣的。该书我已经学完,书确实不错,很适合初学者学习。建议此书学透彻后再买基本参考书看看;推荐《C和指针》+《c陷阱与缺陷》+《C专家编程 》俗称C语言编程三剑客;以及《你必须知道的495个C语言问题》一书。建议学了就上机实战,有效消化~
2016年06月08日
108 阅读
0 评论
0 点赞
2013-10-10
c++一个特殊数列的排序算法
#include <iostream> int main() { int a[]={10,6,9,5,2,8,4,7,1,3}; int len=sizeof(a)/sizeof(int); int temp; for(int i=0; i<len; ) { temp = a[a[i]-1]; a[a[i]-1]=a[i]; a[i]=temp; if(a[i] ==i+1) i++; } for(int j=0; j<len; j++) cout << a[j] << ","; return 0; } }这个算法其实是数学思想-分情况讨论的经典应用。1.一个数字如果在它该在位置上,那么算法继续作用下一个数。2.如果当前位置的数比该位置本来应有的数大,那么把它与后面的数交换。3.如果当前位置的数比该位置本来应有的数小,那么把它与后面的数交换。
2013年10月10日
77 阅读
1 评论
0 点赞