一.俗话说算法是程序的灵魂,这下面本人写了一部分常用算法,欢迎大家使用,并提出批评和指正,当然也可以改进或者添加。

1.这是自己实现的算法库头文件

  1. #ifndef _INC_ALGORITHM
  2. #define _INC_ALGORITHM
  3. #endif
  4.  
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<windows.h>
  8. #include<math.h>
  9. #include<time.h>
  10. #include<string.h>
  11.  
  12. /*
  13. 本算法库封装了大多数常用算法,一部分摘取书籍,大部分为自己动手编写,
  14. 大部分经过测试,可以直接使用,如有错误,欢迎指正,使用请尊重作者的成果,注明出处。
  15. 注意:除了windows操作算法,其他都是跨平台的,本算法库在windows 8.1的VS2013上测试通过
  16. 学校:长安大学
  17. 作者:惠鹏博
  18. 时间:2017/5/25
  19.  
  20. 算法包括:
  21. 1.排序类算法
  22. 2.数学类算法
  23. 3.逻辑类算法
  24. 4.Windosw操作算法
  25. 5.字符串算法
  26. 6.经典算法
  27. 7.数据结构算法
  28. 8.文件操作算法
  29. */
  30.  
  31. /********************************************排序类算法********************************************/
  32. /*二分查找法,上,中,下,前提数组必须有序找到返回0否则返回-1*/
  33. int binerySearch(char **p, int count, char *des);
  34.  
  35. /********************************************数学类算法********************************************/
  36. /*乘法表打印方形*/
  37. void print9X9Table();
  38. /*乘法表打印反对角线以下*/
  39. void print9X9Table1();
  40. /*乘法表打印反对角线以上*/
  41. void print9X9Table2();
  42. /*乘法表打印正对角线以上*/
  43. void print9X9Table3();
  44. /*乘法表打印反对角线以下*/
  45. void print9X9Table4();
  46. /*乘法表打印反对角线上的*/
  47. void print9X9Table5();
  48. /*乘法表打印正对角线上的*/
  49. void print9X9Table6();
  50. /*乘法表打印两条对角线上部的*/
  51. void print9X9TableUp();
  52. /*乘法表打印两条对角线下部的*/
  53. void print9X9TableDown();
  54. /*乘法表打印两条对角线左边的*/
  55. void print9X9TableLeft();
  56. /*乘法表打印两条对角线右边的的*/
  57. void print9X9TableRight();
  58. /*求2的N次方*/
  59. int T2n(int N);
  60. /*求2的一次方到2的N次方的和*/
  61. int S2n(int N);
  62. /*求两个数的最大公因数 a > b*/
  63. int maxCommonFactor(int a, int b);
  64. /*求两个数的最小公倍数*/
  65. int minCommonDouble(int a, int b);
  66. /*获取N以下的质数,并按从小到大的顺序存放到数组P中,L为L为存放质数个数地址*/
  67. void getPrimeNumTable(int N, int *P, int *L);
  68. /*求一个数的所有质因数,并按从小到大的顺序存放到数组P中,L为存放质因数个数地址,F为中间获取质数的数组表,T为存储质数数组长度的变量*/
  69. int getFactor(int m, int *P, int *F, int *L, int *T);
  70. /*使用递归10进制转0进制打印*/
  71. void PrintBin(int n);
  72. /*二进制整数转十进制,接受一个二进制字符串,将它转为10进制整数数*/
  73. int BinToDec(char *bin);
  74. /*十进制整数转二进制字符串*/
  75. char *DecToBin(int num, char *s);
  76. /*求一个数对另一个数的余数,不使用求模运算符*/
  77. int YuNum(int a, int b);
  78. /*求一个整数的翻转*/
  79. int ReverseInt(int num);
  80. /*取出一个整数的每个位,存入到一个数组中,第一个为个位,依次类推*/
  81. int GetIntBit(int num, int bit[]);
  82. /*产生一个N之内的随机数*/
  83. int RandomNumber(int N);
  84. /*判断一个n位数num是不是水仙花数,每一位的数字由低到高存入bit数组中*/
  85. int searchNumber(int num, int n, int bit[]);
  86. /*生成n个小于m的随机数,并将生成的随机数存放到数组p中*/
  87. void randNumber(int *p, int n, int m);
  88.  
  89. /********************************************逻辑问题类算法****************************************/
  90. /************************四字节操作,如int ,long等类型**********************/
  91.  
  92. /*置位int数num的第N个位*/
  93. void setInt(int *num, int N);
  94. /*清零int数num的第N个位*/
  95. void clearInt(int *num, int N);
  96. /*统计num中是1的位数,返回位数*/
  97. int statIntOne(int num);
  98. /*统计num中是0的位数,返回位数*/
  99. int statIntZero(int num);
  100. /*翻转一个int数,即高位和低位互换 0位和31位互换,1位和30维护换返回位数*/
  101. int reverseInt(int *num);
  102. /*以二进制形式打印一个整数*/
  103. void printfIntBinary(int num);
  104. /*循环左移位的实现num左移N位*/
  105. int moveToLeft(int num, int N);
  106. /*循环右移位的实现num右移N位*/
  107. int moveToRight(int num, int N);
  108. /*使用位运算异或实现两个变量值的交换*/
  109. void exchange(int *a, int *b);
  110. /*获取int数num的第N个位的值,0或1*/
  111. int getIntBit(int num, int N);
  112. /*打印一个int数在内存中的二进制码*/
  113. void printfBinCode(int num);
  114. /*输出一个int数的原码,正数就是它的二进制码,负数就是对应二进制码(反码)的原码*/
  115. void printfSrcCode(int num);
  116. /*打印一个unsigned char 类型的二进制码*/
  117. void printfCharCode(unsigned char s);
  118. /*打印一个浮点数的二进制码*/
  119. void printfFloatCode(float f);
  120.  
  121. /*********************************************Windows操作算法******************************************/
  122. /*模拟鼠标单击*/
  123. void SingleClick();
  124. /*模拟鼠标双击*/
  125. void DoubleClick();
  126. /*模拟鼠标右击*/
  127. void RightClick();
  128. /*Left mouse button键的模拟*/
  129. void LeftMouseButton();
  130. /*Right mouse button键的模拟*/
  131. void RightMouseButton();
  132. /*Control-break processing键的模拟*/
  133. void Cancle();
  134. /*鼠标中键的模拟*/
  135. void MiddleButton();
  136. /*backspace键的模拟*/
  137. void Backspace();
  138. /*TAB key键的模拟*/
  139. void Tab();
  140. /*CLEAR key键的模拟*/
  141. void ClearKey();
  142. /*ENTER回车键 key键的模拟*/
  143. void Enter();
  144. /*SHIFT key键的模拟*/
  145. void Shift();
  146. /*CTRL key键的模拟*/
  147. void Ctrl();
  148. /*ALT key键的模拟*/
  149. void Alt();
  150. /*PAUSE key键的模拟*/
  151. void Pause();
  152. /*CAPS LOCK key键的模拟*/
  153. void CapsLock();
  154. /*ESC key键的模拟*/
  155. void Esc();
  156. /*SPACE空格 key键的模拟*/
  157. void Space();
  158. /*PAGE UP key键的模拟*/
  159. void PageUp();
  160. /*PAGE DOWN key键的模拟*/
  161. void PageDown();
  162. /*END key键的模拟*/
  163. void End();
  164. /*Home key键的模拟*/
  165. void Home();
  166. /*LEFT ARROW key键的模拟*/
  167. void LeftArrow();
  168. /*RIGHT ARROW key键的模拟*/
  169. void RightArrow();
  170. /*UP ARROW key键的模拟*/
  171. void UpArrow();
  172. /*DOWN ARROW key键的模拟*/
  173. void DownArrow();
  174. /*SELECT key键的模拟*/
  175. void Select();
  176. /*EXECUTE key键的模拟*/
  177. void Execute();
  178. /*PRINT SCREEN key键的模拟*/
  179. void PrintScreen();
  180. /*INSERT key键的模拟*/
  181. void Insert();
  182. /*DELETE key键的模拟*/
  183. void Delete();
  184. /*HELP key键的模拟*/
  185. void Help();
  186. /*Left Windows key键的模拟*/
  187. void LeftWin();
  188. /*Right Windows key键的模拟*/
  189. void RightWin();
  190. /*0 key键的模拟*/
  191. void NumberThero();
  192. /*1 key键的模拟*/
  193. void NumberOne();
  194. /*2 key键的模拟*/
  195. void NumberTwo();
  196. /*3 key键的模拟*/
  197. void NumberThree();
  198. /*4 key键的模拟*/
  199. void NumberFour();
  200. /*5 key键的模拟*/
  201. void NumberFive();
  202. /*6 key键的模拟*/
  203. void NumberSix();
  204. /*7 key键的模拟*/
  205. void NumberSeven();
  206. /*8 key键的模拟*/
  207. void NumberEight();
  208. /*9 key键的模拟*/
  209. void NumbeNine();
  210. /*乘号 key键的模拟*/
  211. void Multiply();
  212. /*加号 key键的模拟*/
  213. void Add();
  214. /*减号 Subtractkey键的模拟*/
  215. void Subtract();
  216. /*除号 /键的模拟*/
  217. void Divide();
  218. /*Separator 分隔符 \ 键的模拟*/
  219. void Separator();
  220. /*F1键的模拟*/
  221. void F1();
  222. /*F2键的模拟*/
  223. void F2();
  224. /*F3键的模拟*/
  225. void F3();
  226. /*F4键的模拟*/
  227. void F4();
  228. /*F5键的模拟*/
  229. void F5();
  230. /*F6键的模拟*/
  231. void F6();
  232. /*F7键的模拟*/
  233. void F7();
  234. /*F8键的模拟*/
  235. void F8();
  236. /*F9键的模拟*/
  237. void F9();
  238. /*F10键的模拟*/
  239. void F10();
  240. /*F11键的模拟*/
  241. void F11();
  242. /*F12键的模拟*/
  243. void F12();
  244. /*F13键的模拟*/
  245. void F13();
  246. /*F14键的模拟*/
  247. void F14();
  248. /*F15键的模拟*/
  249. void F15();
  250. /*F16键的模拟*/
  251. void F16();
  252. /*NUM LOCK键的模拟*/
  253. void NumLock();
  254. /* ";:" 键的模拟*/
  255. void ColonAndSemicolon();
  256. /* "+ =" 键的模拟*/
  257. void PlusEquals();
  258. /* "," 键的模拟*/
  259. void Comma();
  260. /* "- _" 键的模拟*/
  261. void MinusHyphen();
  262. /* "." 键的模拟*/
  263. void Point();
  264. /* "/ ?" 键的模拟*/
  265. void Question();
  266. /* "` ~" 键的模拟*/
  267. void BoLangHao();
  268. /* "[ {" 键的模拟*/
  269. void LeftBrackets();
  270. /* "\ |" 键的模拟*/
  271. void VerticalLine();
  272. /* "] }" 键的模拟*/
  273. void RightBrackets();
  274. /* "' "" 键的模拟*/
  275. void YinHao();
  276. /*win键的模拟*/
  277. void win();
  278. /*win+d键的组合模拟*/
  279. void winAndD();
  280. /*win+E键的组合模拟*/
  281. void winAndE();
  282. /*win+M键的组合模拟*/
  283. void winAndM();
  284. /*CTRL+ALT+DEL键的组合模拟*/
  285. void ctrlAndAltAndDel();
  286. /****************z26个字母键模拟*************************/
  287. /*A键模拟*/
  288. void AKey();
  289. /*B键模拟*/
  290. void BKey();
  291. /*C键模拟*/
  292. void CKey();
  293. /*D键模拟*/
  294. void DKey();
  295. /*E键模拟*/
  296. void EKey();
  297. /*F键模拟*/
  298. void FKey();
  299. /*G键模拟*/
  300. void GKey();
  301. /*H键模拟*/
  302. void HKey();
  303. /*I键模拟*/
  304. void IKey();
  305. /*J键模拟*/
  306. void JKey();
  307. /*K键模拟*/
  308. void KKey();
  309. /*L键模拟*/
  310. void LKey();
  311. /*M键模拟*/
  312. void MKey();
  313. /*N键模拟*/
  314. void NKey();
  315. /*O键模拟*/
  316. void OKey();
  317. /*P键模拟*/
  318. void PKey();
  319. /*Q键模拟*/
  320. void QKey();
  321. /*R键模拟*/
  322. void RKey();
  323. /*S键模拟*/
  324. void SKey();
  325. /*T键模拟*/
  326. void TKey();
  327. /*U键模拟*/
  328. void UKey();
  329. /*V键模拟*/
  330. void VKey();
  331. /*W键模拟*/
  332. void WKey();
  333. /*X键模拟*/
  334. void XKey();
  335. /*Y键模拟*/
  336. void YKey();
  337. /*Z键模拟*/
  338. void ZKey();
  339.  
  340. /*********************************************字符串算法*********************************************/
  341. /*自己实现的字符串检索函数,s2为要检索的字符串,s1位源字符串*/
  342. int strInStrPos(char s1[], char s2[]);
  343. /*打印hello的8种方式打印八个hello*/
  344. void printHello();
  345. /*从一个字符串str中子串substr的前面增加一个新字符串newstr*/
  346. void addStringInString(char *newstr, char *substr, char *str);
  347. /*从一个字符串str中使用newstr替换一个子串substr*/
  348. void changeStringInString(char *newstr, char *substr, char *str);
  349. /*从一个字符串str中删除一个子串substr*/
  350. void deleteStringInString(char *substr, char *str);
  351.  
  352. /**********************************************经典算法**********************************************/
  353. /*河内之塔算法,N为盘子个数,A,B,C分别表示三个柱子,搬运次数*/
  354. void Hanoi(int N, char A, char B, char C);
  355.  
  356. /*费氏数列:1 1 2 3 5 8 13 ......
  357. 有关系F(N) = F(N-1) + F(N-2)
  358. 求F(N)*/
  359. int Fib(int N);
  360.  
  361. /*帕斯卡三角形,N为多项式的(a+b)^N中的N,n为系数所处的位置,返回值为系数值,要满足 N >= n*/
  362. int Paska(int N, int n);
  363. /*老鼠走迷宫问题:
  364. 使用二维阵列表示迷宫
  365. 用2表示墙壁,用0表示空白可以行走,用1表示老鼠可以走出的路径
  366. 在起始位置有四个方向可以走,上下左右,起始位置肯定空白
  367. */
  368. #define M 10 //数组列数
  369. //int flag = 0; //是否找到标记
  370. /*查看i行j列处是否为空白,返回1表示成功找到,返回0表示没有找到,*/
  371. int visitArray(int startY, int startX, int endY, int endX, int(*P)[M]);
  372.  
  373. /*50个台阶,每次要么走一步,要么走两步,问有多少次走法
  374. 1个台阶 1 1
  375. 2 11 2 2
  376. 3 111 12 21 3
  377. 4 1111 22 121 112 211 5
  378.  
  379. 要到达50,从48走2,或从49走1所以有F(N) = F(N-1) + F(N-2)
  380. */
  381. int stepF(int n);
  382.  
  383. /*********************************************数据结构算法*********************************************/
  384.  
  385. /*********************************************文件操作算法*********************************************/
  386. /*从键盘读取字符输出到磁盘文件中,若读取到#,则结束*/
  387. void readFromKey();
  388. /*从磁盘文件读取内容,然后显示在屏幕上*/
  389. void printFileContent();
  390. /*文件复制*/
  391. int copyFile(char *src, char *des);
  392. /*将一个长度为L的整形数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/
  393. void writeIntArrayToFile(int a[], int L, char *path, int flag);
  394. /*将路径path表示的文件内容读取到整形数组a中,读取长度为L*/
  395. void readFileToIntArray(int a[], int L, char *path);
  396. /*将一个长度为L的Double数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/
  397. void writeDoubleArrayToFile(double a[], int L, char *path, int flag);
  398. /*将路径path表示的文件内容读取到双精度浮点数组a中,读取长度为L*/
  399. void readFileToDoubleArray(double a[], int L, char *path);
  400. /*将首地址为P的大小为L*SIZE的内存块写入到路径path表示的文件中,内存块的组成小块大小为SIZE,个数为L,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/
  401. void writeMemoryToFile(void *addr, int SIZE, int L, char *path, int flag);
  402. /*将路径path表示的文件内容读取到首地址为P的大小为L*SIZE的内存块中,读取长度为L,每小块大小为SIZE字节*/
  403. void readFileToMemory(void *addr, int SIZE, int L, char *path);
  404. /*在黑窗口查看一个文本文件内容,使用cmd命令,path为文件路径*/
  405. void lookFileUseType(char *path);
  406. /*在黑窗口查看一个文本文件内容,使用文件指针,path为文件路径*/
  407. void lookFileUsePointer(char *path);
  408. /*测量一个文件长度,查看文件大小,字节数表示,返回-1表示失败*/
  409. long measureFileSize(char *path);
  410. /*清空一个文件内容,任何格式磁盘文件文件大小变为0,但是不删除该文件*/
  411. void clearFileContent(char *path);
  412. /*将一个长度为L的字符型数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/
  413. void writeCharArrayToFile(char a[], int L, char *path, int flag);
  414. /*将路径path表示的文件内容读取到字符型数组a中,读取长度为L*/
  415. void readFileToCharArray(char a[], int L, char *path);
  416. /*修改路径为path的文件,将它距离文件开头pos字节数的位置的一个字节二进制数据修改为c*/
  417. void changeFileByte(char *path, int pos, char c);
  418. /*修改路径为path的文件,将它距离文件开头pos字节数的位置的L个字节二进制数据修改为*c*/
  419. void changeFileBytes(char *path, int pos, int L, char *c);
  420. /*合并两个文件,使用二进制形式,将一个文件rear添加到另一个文件front的末尾,flag=1表示合并后删除read文件,flag=0表示不删除*/
  421. void combineTwoFileBin(char *front, char *rear, int flag);
  422. /*根据指定路径创建一个目录*/
  423. void makeDir(char *path);
  424. /*统计英文文档大写字母个数,小写字母个数,数字字符数,统计换行符个数,空格字符个数,逗号字符数,其他字符数,按顺序存放在一个长度为7count数组中,path为文件路径 ,L必须为7*/
  425. void statEnglishFile(char *path, int count[], int L);
  426. /*统计双字节字符*/
  427. int statFileDoubleChar(char *path);
  428. /*统计汉字字符,汉字采用GBK编码*/
  429. int statFileChineseChar(char *path);
  430. /*windows下在路径searchpath下搜索文件名前缀为frontname后缀为rearname的文件,如果两者有一个为*代表通配符,统配任何哪种格式的文件,outputfile为存储找到的文件路径信息的文件*/
  431. void searchFileInWindows(char *searchpath, char *frontname, char *rearname, char *outputfile);
  432. /*linux下在路径searchpath下搜索文件名前缀为frontname后缀为rearname的文件,如果两者有一个为*代表通配符,统配任何哪种格式的文件,outputfile为存储找到的文件路径信息的文件*/
  433. void searchFileInLinux(char *searchpath, char *frontname, char *rearname, char *outputfile);
  434. /***************文件加密*****************/
  435. /*移位加密文本文件path为文件路径,endpath为加密后的密文路径,key为秘钥*/
  436. void encryptedFileUseMoveBit(char *path, char *endpath, int key);
  437. /*移位解密文本文件path为文件路径,endpath为解密后的明文路径,key为秘钥*/
  438. void decryptedFileUseMoveBit(char *path, char *endpath, int key);
  439. /*异或加密文件path为文件路径,endpath为加密后的密文路径,key为秘钥*/
  440. void encryptedFileUseXor(char *path, char *endpath, int key);
  441. /*异或解密文件path为文件路径,endpath为解密后的明文路径,key为秘钥*/
  442. void decryptedFileUseXor(char *path, char *endpath, int key);
  443. /*字符串加密文件path为文件路径,endpath为加密后的密文路径,key为秘钥,L为长度*/
  444. void encryptedFileUseChars(char *path, char *endpath, char key[], int L);
  445. /*字符串解密文件path为文件路径,endpath为解密后的明文路径,key为秘钥,L为长度*/
  446. void decryptedFileUseChars(char *path, char *endpath, char key[], int L);
  447. /*文件分割,path为要分割的文件路径name为文件名,count为分割数量,savepath为保存路径,返回-1表示分割失败,0表示成功*/
  448. int splitFile(char *path, int count, char *savepath, char *savename);
  449. /*合并文件,将文件list中每一行指定的文件按行顺序合并为一个大文件bigfile返回-1表示分割失败,0表示成功*/
  450. int mergeFile(char *list, int count, char *bigfile);
  451. /*写入一行文本到文件将一行字符串str写入文件path中,使用系统命令,mode表示模式,非0表示追加模式,0表示重新从头写入*/
  452. void writeStringToFile(char *str, char *path, int mode);
  453. /*写入一行文本到文件将一行字符串str写入文件path中,使用文件指针,mode表示模式,非0表示追加模式,0表示重新从头写入*/
  454. void writeStringToFileUsePointer(char *str, char *path, int mode);
  455. /*打印path这个文本文件内容*/
  456. void printfFileContent(char *path);
  457. /*文本文件查询,在文件path中搜索字符串str,如果找到返回1,没找到返回0,找到后将所在行号和内容打印出来*/
  458. int searchStringInFile(char *substr, char *path);
  459. /*文本文件删除,在文件path中删除字符串substr,temp为临时文件,如果成功返回1,没成功返回0,将删除后的文件打印出来*/
  460. int deleteStringFromFile(char *substr, char *path, char *temp);
  461. /*文本文件修改,在文件path中使用newstr替换字符串substr,temp为临时文件,如果成功返回1,没成功返回0,*/
  462. int changeStringInFile(char *newstr, char *substr, char *path, char *temp);
  463. /*文本文件增加,在文件path中将newstr添加在字符串substr的前面,temp为临时文件,如果成功返回1,没成功返回0,*/
  464. int addStringToFile(char *newstr, char *substr, char *path, char *temp);
  465. /*在文件path中搜索字符串str所在行然后打印出来*/
  466. void printStringInLine(char *substr, char *path);
  467. /*在文件path中读取第n行然后打印出来,*/
  468. void printnLineString(int n, char *path);
  469.  
  470. /*******************************************************内存操作算法***********************************/
  471. /*内存检索原理,检索int类型整数num,并用newnum进行替换的算法,startadd为起始地址十六进制表示形式,endadd为终止地址十六进制表示形式,返回0表示找到,返回-1表示未找到*/
  472. int searchIntInMemory(int startadd, int endadd, int num, int newnum);

2.这是自己实现的算法库源文件

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "algorithm.h"
  3. /*本算法库封装了大多数常用算法,经过测试,可以直接使用,使用请尊重作者的成果,注明出处*/
  4.  
  5. /*******************************************************内存操作算法***********************************/
  6. /*内存检索原理,检索int类型整数num,并用newnum进行替换的算法,startadd为起始地址十六进制表示形式,endadd为终止地址十六进制表示形式,返回0表示找到,返回-1表示未找到*/
  7. int searchIntInMemory(int startadd, int endadd, int num, int newnum)
  8. {
  9. void * start = (void *)startadd;
  10. void * end = (void *)endadd;
  11. for (char *p = start; p < end; p++)//一次移动一个字节,遍历地址空间
  12. {
  13. int *pnum = (int *)p;//pnum每次从p开始的地址取四个字节
  14. if (*pnum == num)
  15. {
  16. *pnum = newnum;
  17. return ;
  18. }
  19.  
  20. }
  21. return -;
  22. }
  23.  
  24. /********************************************排序查询类算法********************************************/
  25. /*二分查找法,上,中,下,前提数组必须有序找到返回0否则返回-1*/
  26. int binerySearch(char **p, int count, char *des)
  27. {
  28. int low = ;
  29. int high = count;
  30. while (low < high)
  31. {
  32. int mid = (low + count) / ;
  33. if (strcmp(des, p[mid]) < )
  34. {
  35. high = mid - ;
  36. }
  37. else if (strcmp(des, p[mid]) > )
  38. {
  39. low = mid + ;
  40. }
  41. else
  42. {
  43. printf("找到了");
  44. return ;
  45. }
  46. }
  47. return -;
  48.  
  49. }
  50.  
  51. /********************************************数学类算法********************************************/
  52. /*乘法表打印方形*/
  53. void print9X9Table()
  54. {
  55.  
  56. for (int i = ; i <= ; i++)
  57. {
  58.  
  59. for (int j = ; j <= ; j++)
  60. {
  61. printf("%d X %d = %d\t", i, j, i*j);
  62. }
  63. printf("\n\n");
  64. }
  65. printf("————————————————————————————————————");
  66. }
  67.  
  68. /*乘法表打印反对角线以下*/
  69. void print9X9Table1()
  70. {
  71. for (int i = ; i <= ; i++)
  72. {
  73.  
  74. for (int j = ; j <= ; j++)
  75. {
  76. if (i >= j)
  77. printf("%d X %d = %d\t", i, j, i*j);
  78. }
  79. printf("\n\n");
  80. }
  81. printf("————————————————————————————————————");
  82. }
  83.  
  84. /*乘法表打印反对角线以上*/
  85. void print9X9Table2()
  86. {
  87. for (int i = ; i <= ; i++)
  88. {
  89.  
  90. for (int j = ; j <= ; j++)
  91. {
  92. if (i <= j)
  93. {
  94. printf("%d X %d = %d\t", i, j, i*j);
  95. }
  96. else
  97. {
  98. printf(" \t");
  99. }
  100. }
  101. printf("\n\n");
  102. }
  103. printf("————————————————————————————————————");
  104. }
  105.  
  106. /*乘法表打印正对角线以上*/
  107. void print9X9Table3()
  108. {
  109. for (int i = ; i <= ; i++)
  110. {
  111.  
  112. for (int j = ; j <= ; j++)
  113. {
  114. if (i + j <= )
  115. {
  116. printf("%d X %d = %d\t", i, j, i*j);
  117. }
  118.  
  119. }
  120. printf("\n\n");
  121. }
  122. printf("————————————————————————————————————");
  123. }
  124.  
  125. /*乘法表打印反对角线以下*/
  126. void print9X9Table4()
  127. {
  128. for (int i = ; i <= ; i++)
  129. {
  130.  
  131. for (int j = ; j <= ; j++)
  132. {
  133. if (i + j >= )
  134. {
  135. printf("%d X %d = %d\t", i, j, i*j);
  136. }
  137. else
  138. {
  139. printf(" \t");
  140. }
  141. }
  142. printf("\n\n");
  143. }
  144. printf("————————————————————————————————————");
  145. }
  146.  
  147. /*乘法表打印反对角线上的*/
  148. void print9X9Table5()
  149. {
  150. for (int i = ; i <= ; i++)
  151. {
  152.  
  153. for (int j = ; j <= ; j++)
  154. {
  155. if (i == j)
  156. {
  157. printf("%d X %d = %d\t", i, j, i*j);
  158. }
  159. else
  160. {
  161. printf(" \t");
  162. }
  163. }
  164. printf("\n\n");
  165. }
  166. printf("————————————————————————————————————");
  167. }
  168. /*乘法表打印正对角线上的*/
  169. void print9X9Table6()
  170. {
  171. for (int i = ; i <= ; i++)
  172. {
  173.  
  174. for (int j = ; j <= ; j++)
  175. {
  176. if (i + j == )
  177. {
  178. printf("%d X %d = %d\t", i, j, i*j);
  179. }
  180. else
  181. {
  182. printf(" \t");
  183. }
  184. }
  185. printf("\n\n");
  186. }
  187. printf("————————————————————————————————————");
  188. }
  189.  
  190. /*乘法表打印两条对角线上部的*/
  191. void print9X9TableUp()
  192. {
  193. printf("上部区域:\n");
  194. for (int i = ; i <= ; i++)
  195. {
  196.  
  197. for (int j = ; j <= ; j++)
  198. {
  199. if (i < j && (i + j < ))
  200. {
  201. printf("%d X %d = %d\t", i, j, i*j);
  202. }
  203. else
  204. {
  205. printf(" \t");
  206. }
  207. }
  208. printf("\n\n");
  209. }
  210. printf("————————————————————————————————————");
  211. }
  212. /*乘法表打印两条对角线下部的*/
  213. void print9X9TableDown()
  214. {
  215. printf("下部区域:\n");
  216. for (int i = ; i <= ; i++)
  217. {
  218.  
  219. for (int j = ; j <= ; j++)
  220. {
  221. if (i > j && (i + j > ))
  222. {
  223. printf("%d X %d = %d\t", i, j, i*j);
  224. }
  225. else
  226. {
  227. printf(" \t");
  228. }
  229. }
  230. printf("\n\n");
  231. }
  232. printf("————————————————————————————————————");
  233. }
  234. /*乘法表打印两条对角线左边的*/
  235. void print9X9TableLeft()
  236. {
  237. printf("左部区域:\n");
  238. for (int i = ; i <= ; i++)
  239. {
  240.  
  241. for (int j = ; j <= ; j++)
  242. {
  243. if (i > j && (i + j < ))
  244. {
  245. printf("%d X %d = %d\t", i, j, i*j);
  246. }
  247. else
  248. {
  249. printf(" \t");
  250. }
  251. }
  252. printf("\n\n");
  253. }
  254. printf("————————————————————————————————————");
  255. }
  256. /*乘法表打印两条对角线右边的的*/
  257. void print9X9TableRight()
  258. {
  259. printf("右部区域:\n");
  260. for (int i = ; i <= ; i++)
  261. {
  262.  
  263. for (int j = ; j <= ; j++)
  264. {
  265. if (i < j && (i + j > ))
  266. {
  267. printf("%d X %d = %d\t", i, j, i*j);
  268. }
  269. else
  270. {
  271. printf(" \t");
  272. }
  273. }
  274. printf("\n\n");
  275. }
  276. printf("————————————————————————————————————");
  277. }
  278.  
  279. /*求2的N次方*/
  280. int T2n(int N)
  281. {
  282. int i = ;
  283. int num = ;
  284. for (; i <= N; i++)
  285. {
  286. num *= ;
  287. }
  288. return num;
  289. }
  290. /*求2的一次方到2的N次方的和*/
  291. int S2n(int N)
  292. {
  293. int i = ;
  294. int num = ;
  295. for (; i <= N; i++)
  296. {
  297. num += T2n(i);
  298. }
  299. return num;
  300. }
  301. /*求两个数的最大公因数 a > b*/
  302. int maxCommonFactor(int a, int b)
  303. {
  304. int r = ;
  305. while ( b != )
  306. {
  307. r = a % b;
  308. a = b;
  309. b = r;
  310. }
  311. return a;
  312. }
  313. /*求两个数的最小公倍数*/
  314. int minCommonDouble(int a, int b)
  315. {
  316. int m = maxCommonFactor(a, b);
  317. return (a*b) / m;
  318. }
  319. /*获取N以下的质数,并按从小到大的顺序存放到数组P中,L为存放质数个数地址*/
  320. void getPrimeNumTable(int N,int *P,int *L)
  321. {
  322. int T = ;
  323. int m = ;
  324. for (int j = ; j <= N; j++)
  325. {
  326. T = sqrt(j);
  327. int i;
  328. for (i = ; i <= T; i++)
  329. {
  330. if (j % i == )
  331. {
  332. break;
  333. }
  334. }
  335. if (i > T)
  336. {
  337. P[m++] = j;
  338. }
  339. if (m > L - )
  340. return;
  341. }
  342. *L = m;
  343.  
  344. }
  345. /*求一个数的所有质因数,并按从小到大的顺序存放到数组P中,L为存放质因数个数地址,F为中间获取质数的数组表,T为存储质数数组长度的变量*/
  346. int getFactor(int m,int *P,int *F,int *L,int *T)
  347. {
  348.  
  349. int n = ;
  350.  
  351. getPrimeNumTable(m, F, T);
  352.  
  353. for (int i = ; i < *T; i++)
  354. {
  355. if (m % F[i] == )
  356. {
  357. P[n++] = F[i];
  358.  
  359. }
  360. }
  361. *L= n;
  362. return n;
  363. }
  364.  
  365. /*使用递归10进制转0进制打印*/
  366. void PrintBin(int n)
  367. {
  368. if (n == )
  369. {
  370. return;
  371. }
  372. else
  373. {
  374. int x = n % ;//只要将2改为8,或16就可以转换为8进制或16进制
  375. n /= ;
  376. //printf("%d", x);放在递归调用之前,则会先打印,二进制反序
  377. PrintBin(n);
  378. printf("%d", x);//放在递归调用之后,则会最后执行打印
  379. }
  380. }
  381. /*穷举法求13X+12Y=100的整数解,X = (100 - 12Y)/ 13 为整数*/
  382. void getEquationValue()
  383. {
  384. for (int i = ;; i++)
  385. {
  386. if (( - * i) % == )
  387. {
  388. printf("整数解为:X = %d,Y = %d\n", ( - * i) / , i);
  389. break;
  390. }
  391. }
  392. system("pause");
  393. }
  394.  
  395. /*二进制整数转十进制,接受一个二进制字符串,将它转为10进制整数数*/
  396. int BinToDec(char *bin)
  397. {
  398. char *p;
  399. int len = ;//统计二进制位数
  400. int num = ;
  401.  
  402. for (p = bin; *p != '\0'; p++)
  403. {
  404. if ((*p) != '' && (*p) != '')
  405. {
  406. printf("%d", *p);
  407. printf("您输入的二进制整数不合法");
  408. return ;
  409. }
  410. len++;
  411. if (len > )
  412. {
  413. printf("您输入的位数过多");
  414. return ;
  415. }
  416. num = num * + (*p - );
  417. }
  418. return num;
  419.  
  420. }
  421. /*十进制整数转二进制字符串*/
  422. char *DecToBin(int num, char *s)
  423. {
  424. char *p;
  425. char *q;
  426. p = s;
  427. char c;
  428. while (num >= )
  429. {
  430. *p = num % + '';
  431. //printf("%c", *p);
  432. num = num / ;
  433. printf("%c\n", *p);
  434. p++;
  435.  
  436. }
  437. *p = '\0';
  438. q = p;
  439. q--;
  440. for (p = s; p < q; p++, q--)
  441. {
  442.  
  443. c = *p;
  444. *p = *q;
  445. *q = c;
  446.  
  447. }
  448. printf("%s\n", s);
  449. return s;
  450.  
  451. }
  452. /*求一个数对另一个数的余数,不使用求模运算符*/
  453. int YuNum(int a, int b)
  454. {
  455. int y;
  456. y = a - (a / b) * b;
  457. return y;
  458. }
  459. /*求一个整数的翻转*/
  460. int ReverseInt(int num)
  461. {
  462.  
  463. int tem = num;
  464. int m = ;
  465. while (tem != )
  466. {
  467. m = m * + tem % ;
  468.  
  469. tem /= ;
  470.  
  471. }
  472. return m;
  473. }
  474. /*取出一个整数的每个位,存入到一个数组中,第一个为个位,依次类推*/
  475. int GetIntBit(int num, int bit[])
  476. {
  477. int tem = num;
  478. int i = ;
  479.  
  480. while (tem != )
  481. {
  482. bit[i] = tem % ;
  483. i++;
  484. tem /= ;
  485.  
  486. }
  487. return i;
  488. }
  489. /*产生一个N之内的随机数*/
  490. int RandomNumber(int N)
  491. {
  492. //以时间为种子创建随机数
  493. time_t tm = ;
  494. srand((unsigned int)time(tm));//定义随机数种子,没用种子的话rand产生的随机数不会变
  495. int random = rand() % N;//产生0-100之间的随机数
  496. return random;
  497.  
  498. }
  499.  
  500. /*判断一个n位数num是不是水仙花数,每一位的数字由低到高存入bit数组中*/
  501. int searchNumber(int num, int n, int bit[])
  502. {
  503.  
  504. for (int i = ; i < n; i++)
  505. {
  506. int temp = ;
  507. for (int j = ; j < i; j++)
  508. {
  509. temp *= ;
  510. }
  511. bit[i] = num / temp % ;
  512. }
  513.  
  514. int tcf = ;
  515. for (int i = ; i < n; i++)
  516. {
  517. tcf += bit[i] * bit[i] * bit[i];
  518. }
  519. if (num == tcf)
  520. {
  521. printf("%d\n", num);
  522. return ;
  523. }
  524. return -;
  525.  
  526. }
  527.  
  528. /*生成n个小于m的随机数,并将生成的随机数存放到数组p中*/
  529. void randNumber(int *p, int n, int m)
  530. {
  531. time_t tm = ;//时间数据类型
  532. unsigned int ctime = (unsigned int)tm;
  533. srand(ctime);//以时间做种子生成随机数
  534. for (int i = ; i < n; i++)
  535. {
  536. p[i] = rand() % m;
  537. }
  538. }
  539.  
  540. /********************************************逻辑类算法****************************************/
  541. /*置位int数num的第N个位*/
  542. void setInt(int *num, int N)
  543. {
  544. if (N > )
  545. {
  546. printf("超出置位范围0-31");
  547. return;
  548. }
  549. *num |= ( << N);
  550. }
  551. /*清零int数num的第N个位*/
  552. void clearInt(int *num, int N)
  553. {
  554. if (N > )
  555. {
  556. printf("超出置位范围0-31");
  557. return;
  558. }
  559. *num &= ~( << N);
  560. }
  561. /*统计num中是1的位数,返回位数*/
  562. int statIntOne(int num)
  563. {
  564. int count = ;
  565.  
  566. for (int i = ; i < ; i++)
  567. {
  568. int t = num & ;
  569. if (t == )
  570. count++;
  571.  
  572. num = num >> ;
  573. }
  574. return count;
  575.  
  576. }
  577. /*统计num中是0的位数,返回位数*/
  578. int statIntZero(int num)
  579. {
  580. int count = ;
  581.  
  582. for (int i = ; i < ; i++)
  583. {
  584. int t = num & ;
  585. if (t == )
  586. count++;
  587.  
  588. num = num >> ;
  589. }
  590. return count;
  591.  
  592. }
  593. /*翻转一个int数,即高位和低位互换 0位和31位互换,1位和30维护换返回位数*/
  594. int reverseInt(int *num)
  595. {
  596.  
  597. int tem = *num;
  598. for (int i = ; i < ; i++)
  599. {
  600. int t = tem & ;//1.取出每一位的值,
  601.  
  602. //2.将第0位的值置给31,第一位的值置给30
  603. if (t == )//
  604. {
  605. setInt(num, - i);
  606. //printf("%d\n", *num);
  607. }
  608. else
  609. {
  610.  
  611. clearInt(num, - i);
  612. //printf("%d\n", *num);
  613. }
  614. tem = tem >> ;
  615.  
  616. }
  617.  
  618. return *num;
  619.  
  620. }
  621. /*以二进制形式打印一个整数*/
  622. void printfIntBinary(int num)
  623. {
  624. reverseInt(&num);
  625. for (size_t i = ; i < ; i++)
  626. {
  627.  
  628. int t = num & ;
  629. printf("%d", t);
  630. num = num >> ;
  631. }
  632. }
  633. /*循环左移位的实现num左移N位*/
  634. int moveToLeft(int num, int N)
  635. {
  636. for (int i = ; i < N; i++)
  637. {
  638. int t = num & ( << );//1.取出最高位的值,
  639. num = num << ;//左移一位
  640. //2.先将第0位的值置给31,
  641. if (t != )//
  642. {
  643. setInt(&num, );
  644. //printf("%d\n", *num);
  645. }
  646. else
  647. {
  648.  
  649. clearInt(&num, );
  650. //printf("%d\n", *num);
  651. }
  652. }
  653. return num;
  654.  
  655. }
  656. /*循环右移位的实现num右移N位*/
  657. int moveToRight(int num, int N)
  658. {
  659. for (int i = ; i < N; i++)
  660. {
  661. int t = num & ;//1.取出每一位的值,
  662. num = num >> ;
  663. //2.先将第0位的值置给31,
  664. if (t == )//
  665. {
  666. setInt(&num, );
  667. //printf("%d\n", *num);
  668. }
  669. else
  670. {
  671.  
  672. clearInt(&num, );
  673. //printf("%d\n", *num);
  674. }
  675.  
  676. }
  677. return num;
  678.  
  679. }
  680. /*使用位运算异或实现两个变量值的交换*/
  681. void exchange(int *a, int *b)
  682. {
  683. *a = (*a) ^ (*b);
  684. *b = (*a) ^ (*b);
  685. *a = (*a) ^ (*b);
  686. }
  687. /*获取int数num的第m个位的值,0或1*/
  688. int getIntBit(int num, int m)
  689. {
  690. if (m > )
  691. {
  692. printf("超出置位范围0-31");
  693. return -;
  694. }
  695. int t = (num & ( << m));
  696. if (t == )
  697. {
  698. return ;
  699. }
  700. else
  701. {
  702. return ;
  703. }
  704.  
  705. }
  706. /*打印一个int数在内存中的二进制码,正数就是它的原码,负数就是它的补码*/
  707. void printfBinCode(int num)
  708. {
  709. int m = ;
  710. while (m >= )
  711. {
  712. if (getIntBit(num, m))
  713. {
  714. printf("");
  715. }
  716. else
  717. {
  718. printf("");
  719. }
  720. m--;
  721. }
  722. }
  723. /*输出一个int数的原码,正数就是它的二进制码,负数就是对应二进制码(反码)的原码*/
  724. void printfSrcCode(int num)
  725. {
  726. if (num >= )
  727. {
  728. printfBinCode(num);
  729. }
  730. else
  731. {
  732. num = num - ;
  733. num = ~num;
  734. setInt(&num, );
  735. printfBinCode(num);
  736.  
  737. }
  738. }
  739.  
  740. /*打印一个unsigned char 类型的二进制码*/
  741. void printfCharCode(unsigned char s)
  742. {
  743. int m = ;
  744. while (m >= )
  745. {
  746. if (getIntBit(s, m))
  747. {
  748. printf("");
  749. }
  750. else
  751. {
  752. printf("");
  753. }
  754. m--;
  755. }
  756. }
  757. /*打印一个浮点数的二进制码*/
  758. void printfFloatCode(float f)
  759. {
  760. unsigned char *p;
  761. p = (unsigned char *)&f;
  762. int N = ;
  763. while (N >= )
  764. {
  765. printfCharCode(*(p + N));
  766. N--;
  767. }
  768.  
  769. }
  770. /*求一元二次方程的根*/
  771. void get2CiEquation(double a,double b,double c)
  772. {
  773. printf("你要求解的一元二次方程是:%lf*x*x + %lf*x + %lf = 0\n", a, b, c);
  774. if (a)//如果a不等于0
  775. {
  776. double m = b*b - * a*c;
  777. double n = - * b / / a;
  778. if (m == )
  779. {
  780. printf("有两个相等的实数根:x1 = x2 = %lf", n);
  781. }
  782. else if (m > )
  783. {
  784. printf("有两个不相等的实数根:x1 = %lf,x2 = %lf", n - sqrt(m) / / a, n + sqrt(m) / / a);
  785. }
  786. else
  787. {
  788. printf("有两个不相等的虚数根:x1 = %lf+%lfi,x2 = %lf-%lfi", n, sqrt(-m) / / a, n, sqrt(-m) / / a);
  789. }
  790. }
  791. else//a = 0
  792. {
  793. if (b)//b != 0
  794. {
  795. printf("方程为一元方程其根为:x = %lf", c / b);
  796. }
  797. else
  798. {
  799. if (c)// C != 0
  800. {
  801. printf("该方程无根");
  802. }
  803. else
  804. {
  805. printf("有无数个实数根");
  806. }
  807.  
  808. }
  809.  
  810. }
  811. }
  812.  
  813. /*********************************************Windows操作算法******************************************/
  814. /*模拟鼠标单击*/
  815. void SingleClick()
  816. {
  817. mouse_event(MOUSEEVENTF_LEFTDOWN, , , , );//鼠标左键按下
  818. mouse_event(MOUSEEVENTF_LEFTUP, , , , );//鼠标左键抬起,一组按下和抬起构成一次点击
  819. }
  820. /*模拟鼠标双击*/
  821. void DoubleClick()
  822. {
  823. mouse_event(MOUSEEVENTF_LEFTDOWN, , , , );//鼠标左键按下
  824. mouse_event(MOUSEEVENTF_LEFTUP, , , , );//鼠标左键抬起,一组按下和抬起构成一次点击
  825. mouse_event(MOUSEEVENTF_LEFTDOWN, , , , );//鼠标左键按下
  826. mouse_event(MOUSEEVENTF_LEFTUP, , , , );//鼠标左键抬起,一组按下和抬起构成一次点击
  827. }
  828. /*模拟鼠标右击*/
  829. void RightClick()
  830. {
  831. mouse_event(MOUSEEVENTF_RIGHTDOWN, , , , );//鼠标左键按下
  832. mouse_event(MOUSEEVENTF_RIGHTUP, , , , );//鼠标左键抬起,一组按下和抬起构成一次点击
  833.  
  834. }
  835. /*Left mouse button键的模拟*/
  836. void LeftMouseButton()
  837. {
  838. keybd_event(0x01, , , );//键盘模拟
  839. keybd_event(0x01, , , );//键盘模拟
  840. }
  841.  
  842. /*Right mouse button键的模拟*/
  843. void RightMouseButton()
  844. {
  845. keybd_event(0x01, , , );//键盘模拟
  846. keybd_event(0x01, , , );//键盘模拟
  847. }
  848. /*Control-break processing键的模拟*/
  849. void Cancle()
  850. {
  851. keybd_event(0x03, , , );//键盘模拟
  852. keybd_event(0x03, , , );//键盘模拟
  853. }
  854. /*鼠标中键的模拟*/
  855. void MiddleButton()
  856. {
  857. keybd_event(0x04, , , );//键盘模拟
  858. keybd_event(0x04, , , );//键盘模拟
  859. }
  860. /*backspace键的模拟*/
  861. void Backspace()
  862. {
  863. keybd_event(0x08, , , );
  864. keybd_event(0x08, , , );
  865. }
  866. /*TAB key键的模拟*/
  867. void Tab()
  868. {
  869. keybd_event(0x09, , , );
  870. keybd_event(0x09, , , );
  871. }
  872. /*CLEAR key键的模拟*/
  873. void ClearKey()
  874. {
  875. keybd_event(0x0C, , , );
  876. keybd_event(0x0C, , , );
  877. }
  878. /*ENTER回车键 key键的模拟*/
  879. void Enter()
  880. {
  881. keybd_event(0x0D, , , );
  882. keybd_event(0x0D, , , );
  883. }
  884. /*SHIFT key键的模拟*/
  885. void Shift()
  886. {
  887. keybd_event(0x10, , , );
  888. keybd_event(0x10, , , );
  889. }
  890. /*CTRL key键的模拟*/
  891. void Ctrl()
  892. {
  893. keybd_event(0x11, , , );
  894. keybd_event(0x11, , , );
  895. }
  896. /*ALT key键的模拟*/
  897. void Alt()
  898. {
  899. keybd_event(0x12, , , );
  900. keybd_event(0x12, , , );
  901. }
  902. /*PAUSE key键的模拟*/
  903. void Pause()
  904. {
  905. keybd_event(0x13, , , );
  906. keybd_event(0x13, , , );
  907. }
  908.  
  909. /*CAPS LOCK key键的模拟*/
  910. void CapsLock()
  911. {
  912. keybd_event(0x14, , , );
  913. keybd_event(0x14, , , );
  914. }
  915. /*ESC key键的模拟*/
  916. void Esc()
  917. {
  918. keybd_event(0x1B, , , );
  919. keybd_event(0x1B, , , );
  920. }
  921. /*SPACE空格 key键的模拟*/
  922. void Space()
  923. {
  924. keybd_event(0x20, , , );
  925. keybd_event(0x20, , , );
  926. }
  927. /*PAGE UP key键的模拟*/
  928. void PageUp()
  929. {
  930. keybd_event(0x21, , , );
  931. keybd_event(0x21, , , );
  932. }
  933. /*PAGE DOWN key键的模拟*/
  934. void PageDown()
  935. {
  936. keybd_event(0x22, , , );
  937. keybd_event(0x22, , , );
  938. }
  939. /*END key键的模拟*/
  940. void End()
  941. {
  942. keybd_event(0x23, , , );
  943. keybd_event(0x23, , , );
  944. }
  945. /*Home key键的模拟*/
  946. void Home()
  947. {
  948. keybd_event(0x24, , , );
  949. keybd_event(0x24, , , );
  950. }
  951. /*LEFT ARROW key键的模拟*/
  952. void LeftArrow()
  953. {
  954. keybd_event(0x25, , , );
  955. keybd_event(0x25, , , );
  956. }
  957. /*RIGHT ARROW key键的模拟*/
  958. void RightArrow()
  959. {
  960. keybd_event(0x27, , , );
  961. keybd_event(0x27, , , );
  962. }
  963. /*UP ARROW key键的模拟*/
  964. void UpArrow()
  965. {
  966. keybd_event(0x26, , , );
  967. keybd_event(0x26, , , );
  968. }
  969. /*DOWN ARROW key键的模拟*/
  970. void DownArrow()
  971. {
  972. keybd_event(0x28, , , );
  973. keybd_event(0x28, , , );
  974. }
  975. /*SELECT key键的模拟*/
  976. void Select()
  977. {
  978. keybd_event(0x29, , , );
  979. keybd_event(0x29, , , );
  980. }
  981. /*EXECUTE key键的模拟*/
  982. void Execute()
  983. {
  984. keybd_event(0x2B, , , );
  985. keybd_event(0x2B, , , );
  986. }
  987. /*PRINT SCREEN key键的模拟*/
  988. void PrintScreen()
  989. {
  990. keybd_event(0x2C, , , );
  991. keybd_event(0x2C, , , );
  992. }
  993. /*INSERT key键的模拟*/
  994. void Insert()
  995. {
  996. keybd_event(0x2D, , , );
  997. keybd_event(0x2D, , , );
  998. }
  999. /*DELETE key键的模拟*/
  1000. void Delete()
  1001. {
  1002. keybd_event(0x2E, , , );
  1003. keybd_event(0x2E, , , );
  1004. }
  1005. /*HELP key键的模拟*/
  1006. void Help()
  1007. {
  1008. keybd_event(0x2F, , , );
  1009. keybd_event(0x2F, , , );
  1010. }
  1011.  
  1012. /*Left Windows key键的模拟*/
  1013. void LeftWin()
  1014. {
  1015. keybd_event(0x5B, , , );
  1016. keybd_event(0x5B, , , );
  1017. }
  1018. /*Right Windows key键的模拟*/
  1019. void RightWin()
  1020. {
  1021. keybd_event(0x5C, , , );
  1022. keybd_event(0x5C, , , );
  1023. }
  1024. /*0 key键的模拟*/
  1025. void NumberThero()
  1026. {
  1027. keybd_event(0x60, , , );
  1028. keybd_event(0x60, , , );
  1029. }
  1030. /*1 key键的模拟*/
  1031. void NumberOne()
  1032. {
  1033. keybd_event(0x61, , , );
  1034. keybd_event(0x61, , , );
  1035. }
  1036. /*2 key键的模拟*/
  1037. void NumberTwo()
  1038. {
  1039. keybd_event(0x62, , , );
  1040. keybd_event(0x62, , , );
  1041. }
  1042. /*3 key键的模拟*/
  1043. void NumberThree()
  1044. {
  1045. keybd_event(0x63, , , );
  1046. keybd_event(0x63, , , );
  1047. }
  1048. /*4 key键的模拟*/
  1049. void NumberFour()
  1050. {
  1051. keybd_event(0x64, , , );
  1052. keybd_event(0x64, , , );
  1053. }
  1054. /*5 key键的模拟*/
  1055. void NumberFive()
  1056. {
  1057. keybd_event(0x65, , , );
  1058. keybd_event(0x65, , , );
  1059. }
  1060. /*6 key键的模拟*/
  1061. void NumberSix()
  1062. {
  1063. keybd_event(0x66, , , );
  1064. keybd_event(0x66, , , );
  1065. }
  1066. /*7 key键的模拟*/
  1067. void NumberSeven()
  1068. {
  1069. keybd_event(0x67, , , );
  1070. keybd_event(0x67, , , );
  1071. }
  1072. /*8 key键的模拟*/
  1073. void NumberEight()
  1074. {
  1075. keybd_event(0x68, , , );
  1076. keybd_event(0x68, , , );
  1077. }
  1078. /*9 key键的模拟*/
  1079. void NumbeNine()
  1080. {
  1081. keybd_event(0x69, , , );
  1082. keybd_event(0x69, , , );
  1083. }
  1084. /*乘号 key键的模拟*/
  1085. void Multiply()
  1086. {
  1087. keybd_event(0x6A, , , );
  1088. keybd_event(0x6A, , , );
  1089. }
  1090. /*加号 key键的模拟*/
  1091. void Add()
  1092. {
  1093. keybd_event(0x6B, , , );
  1094. keybd_event(0x6B, , , );
  1095. }
  1096. /*减号 Subtractkey键的模拟*/
  1097. void Subtract()
  1098. {
  1099. keybd_event(0x6D, , , );
  1100. keybd_event(0x6D, , , );
  1101. }
  1102. /*除号 /键的模拟*/
  1103. void Divide()
  1104. {
  1105. keybd_event(0x6F, , , );
  1106. keybd_event(0x6F, , , );
  1107. }
  1108. /*Separator 分隔符 \ 键的模拟*/
  1109. void Separator()
  1110. {
  1111. keybd_event(0x6C, , , );
  1112. keybd_event(0x6C, , , );
  1113. }
  1114. /*F1键的模拟*/
  1115. void F1()
  1116. {
  1117. keybd_event(0x70, , , );
  1118. keybd_event(0x70, , , );
  1119. }
  1120. /*F2键的模拟*/
  1121. void F2()
  1122. {
  1123. keybd_event(0x71, , , );
  1124. keybd_event(0x71, , , );
  1125. }
  1126. /*F3键的模拟*/
  1127. void F3()
  1128. {
  1129. keybd_event(0x72, , , );
  1130. keybd_event(0x72, , , );
  1131. }
  1132. /*F4键的模拟*/
  1133. void F4()
  1134. {
  1135. keybd_event(0x73, , , );
  1136. keybd_event(0x73, , , );
  1137. }
  1138. /*F5键的模拟*/
  1139. void F5()
  1140. {
  1141. keybd_event(0x74, , , );
  1142. keybd_event(0x74, , , );
  1143. }
  1144. /*F6键的模拟*/
  1145. void F6()
  1146. {
  1147. keybd_event(0x75, , , );
  1148. keybd_event(0x75, , , );
  1149. }
  1150. /*F7键的模拟*/
  1151. void F7()
  1152. {
  1153. keybd_event(0x76, , , );
  1154. keybd_event(0x76, , , );
  1155. }
  1156. /*F8键的模拟*/
  1157. void F8()
  1158. {
  1159. keybd_event(0x77, , , );
  1160. keybd_event(0x77, , , );
  1161. }
  1162. /*F9键的模拟*/
  1163. void F9()
  1164. {
  1165. keybd_event(0x78, , , );
  1166. keybd_event(0x78, , , );
  1167. }
  1168. /*F10键的模拟*/
  1169. void F10()
  1170. {
  1171. keybd_event(0x79, , , );
  1172. keybd_event(0x79, , , );
  1173. }
  1174. /*F11键的模拟*/
  1175. void F11()
  1176. {
  1177. keybd_event(0x7A, , , );
  1178. keybd_event(0x7A, , , );
  1179. }
  1180. /*F12键的模拟*/
  1181. void F12()
  1182. {
  1183. keybd_event(0x7B, , , );
  1184. keybd_event(0x7B, , , );
  1185. }
  1186. /*F13键的模拟*/
  1187. void F13()
  1188. {
  1189. keybd_event(0x7C, , , );
  1190. keybd_event(0x7C, , , );
  1191. }
  1192. /*F14键的模拟*/
  1193. void F14()
  1194. {
  1195. keybd_event(0x7D, , , );
  1196. keybd_event(0x7D, , , );
  1197. }
  1198. /*F15键的模拟*/
  1199. void F15()
  1200. {
  1201. keybd_event(0x7E, , , );
  1202. keybd_event(0x7E, , , );
  1203. }
  1204. /*F16键的模拟*/
  1205. void F16()
  1206. {
  1207. keybd_event(0x7F, , , );
  1208. keybd_event(0x7F, , , );
  1209. }
  1210. /*NUM LOCK键的模拟*/
  1211. void NumLock()
  1212. {
  1213. keybd_event(0x90, , , );
  1214. keybd_event(0x90, , , );
  1215. }
  1216. /* ";:" 键的模拟*/
  1217. void ColonAndSemicolon()
  1218. {
  1219. keybd_event(0xBA, , , );
  1220. keybd_event(0xBA, , , );
  1221. }
  1222. /* "+ =" 键的模拟*/
  1223. void PlusEquals()
  1224. {
  1225. keybd_event(0xBB, , , );
  1226. keybd_event(0xBB, , , );
  1227. }
  1228. /* "," 键的模拟*/
  1229. void Comma()
  1230. {
  1231. keybd_event(0xBC, , , );
  1232. keybd_event(0xBC, , , );
  1233. }
  1234. /* "- _" 键的模拟*/
  1235. void MinusHyphen()
  1236. {
  1237. keybd_event(0xBD, , , );
  1238. keybd_event(0xBD, , , );
  1239. }
  1240. /* "." 键的模拟*/
  1241. void Point()
  1242. {
  1243. keybd_event(0xBE, , , );
  1244. keybd_event(0xBE, , , );
  1245. }
  1246. /* "/ ?" 键的模拟*/
  1247. void Question()
  1248. {
  1249. keybd_event(0xBF, , , );
  1250. keybd_event(0xBF, , , );
  1251. }
  1252. /* "` ~" 键的模拟*/
  1253. void BoLangHao()
  1254. {
  1255. keybd_event(0xC0, , , );
  1256. keybd_event(0xC0, , , );
  1257. }
  1258. /* "[ {" 键的模拟*/
  1259. void LeftBrackets()
  1260. {
  1261. keybd_event(0xDB, , , );
  1262. keybd_event(0xDB, , , );
  1263. }
  1264. /* "\ |" 键的模拟*/
  1265. void VerticalLine()
  1266. {
  1267. keybd_event(0xDC, , , );
  1268. keybd_event(0xDC, , , );
  1269. }
  1270. /* "] }" 键的模拟*/
  1271. void RightBrackets()
  1272. {
  1273. keybd_event(0xDD, , , );
  1274. keybd_event(0xDD, , , );
  1275. }
  1276. /* "' "" 键的模拟*/
  1277. void YinHao()
  1278. {
  1279. keybd_event(0xDE, , , );
  1280. keybd_event(0xDE, , , );
  1281. }
  1282. /*win键的模拟*/
  1283. void win()
  1284. {
  1285. keybd_event(0x5b, , , );//键盘模拟win键按下
  1286. keybd_event(0x5b, , , );//键盘模拟win键松开
  1287. }
  1288. /*win+d键的组合模拟*/
  1289. void winAndD()
  1290. {
  1291. keybd_event(0x5b, , , );//键盘模拟键盘按下
  1292. keybd_event('D', , , );//D键按下
  1293. keybd_event('D', , , );//D键松开
  1294. keybd_event(0x5b, , , );//键盘模拟键盘松开
  1295. }
  1296. /*win+E键的组合模拟*/
  1297. void winAndE()
  1298. {
  1299. keybd_event(0x5b, , , );//键盘模拟键盘按下
  1300. keybd_event('E', , , );//D键按下
  1301. keybd_event('E', , , );//D键松开
  1302. keybd_event(0x5b, , , );//键盘模拟键盘松开
  1303. }
  1304. /*win+M键的组合模拟*/
  1305. void winAndM()
  1306. {
  1307. keybd_event(0x5b, , , );//键盘模拟键盘按下
  1308. keybd_event('M', , , );//D键按下
  1309. keybd_event('M', , , );//D键松开
  1310. keybd_event(0x5b, , , );//键盘模拟键盘松开
  1311. }
  1312. /*CTRL+ALT+DEL键的组合模拟*/
  1313. void ctrlAndAltAndDel()
  1314. {
  1315. keybd_event(0x11, , , ); // CTRL键按下
  1316. keybd_event(0x12, , , );
  1317. keybd_event(0x2E, , , );
  1318. keybd_event(0x2E, , , );
  1319. keybd_event(0x12, , , );
  1320. keybd_event(0x11, , , );//ctrl键松开
  1321. }
  1322. /*****************************************26个英文字母键模拟*****************************************/
  1323. /*A键模拟*/
  1324. void AKey()
  1325. {
  1326. keybd_event('A', , , );//A键按下
  1327. keybd_event('A', , , );//A键松开
  1328. }
  1329. /*B键模拟*/
  1330. void BKey()
  1331. {
  1332. keybd_event('B', , , );
  1333. keybd_event('B', , , );
  1334. }
  1335. /*C键模拟*/
  1336. void CKey()
  1337. {
  1338.  
  1339. keybd_event('C', , , );
  1340. keybd_event('C', , , );
  1341. }
  1342. /*D键模拟*/
  1343. void DKey()
  1344. {
  1345. keybd_event('D', , , );
  1346. keybd_event('D', , , );
  1347. }
  1348. /*E键模拟*/
  1349. void EKey()
  1350. {
  1351. keybd_event('E', , , );
  1352. keybd_event('E', , , );
  1353. }
  1354. /*F键模拟*/
  1355. void FKey()
  1356. {
  1357. keybd_event('F', , , );
  1358. keybd_event('F', , , );
  1359. }
  1360. /*G键模拟*/
  1361. void GKey()
  1362. {
  1363. keybd_event('G', , , );
  1364. keybd_event('G', , , );
  1365.  
  1366. }
  1367. /*H键模拟*/
  1368. void HKey()
  1369. {
  1370. keybd_event('H', , , );
  1371. keybd_event('H', , , );
  1372. }
  1373. /*I键模拟*/
  1374. void IKey()
  1375. {
  1376. keybd_event('I', , , );
  1377. keybd_event('I', , , );
  1378. }
  1379. /*J键模拟*/
  1380. void JKey()
  1381. {
  1382. keybd_event('J', , , );
  1383. keybd_event('J', , , );
  1384. }
  1385. /*K键模拟*/
  1386. void KKey()
  1387. {
  1388. keybd_event('K', , , );
  1389. keybd_event('K', , , );
  1390. }
  1391. /*L键模拟*/
  1392. void LKey()
  1393. {
  1394. keybd_event('L', , , );
  1395. keybd_event('L', , , );
  1396. }
  1397. /*M键模拟*/
  1398. void MKey()
  1399. {
  1400. keybd_event('M', , , );
  1401. keybd_event('M', , , );
  1402. }
  1403. /*N键模拟*/
  1404. void NKey()
  1405. {
  1406. keybd_event('N', , , );
  1407. keybd_event('N', , , );
  1408. }
  1409. /*O键模拟*/
  1410. void OKey()
  1411. {
  1412. keybd_event('O', , , );
  1413. keybd_event('O', , , );
  1414. }
  1415. /*P键模拟*/
  1416. void PKey()
  1417. {
  1418. keybd_event('P', , , );
  1419. keybd_event('P', , , );
  1420. }
  1421. /*Q键模拟*/
  1422. void QKey()
  1423. {
  1424. keybd_event('Q', , , );
  1425. keybd_event('Q', , , );
  1426. }
  1427. /*R键模拟*/
  1428. void RKey()
  1429. {
  1430. keybd_event('R', , , );
  1431. keybd_event('R', , , );
  1432. }
  1433. /*S键模拟*/
  1434. void SKey()
  1435. {
  1436. keybd_event('S', , , );
  1437. keybd_event('S', , , );
  1438. }
  1439. /*T键模拟*/
  1440. void TKey()
  1441. {
  1442. keybd_event('T', , , );
  1443. keybd_event('T', , , );
  1444. }
  1445. /*U键模拟*/
  1446. void UKey()
  1447. {
  1448. keybd_event('U', , , );
  1449. keybd_event('U', , , );
  1450. }
  1451. /*V键模拟*/
  1452. void VKey()
  1453. {
  1454. keybd_event('V', , , );
  1455. keybd_event('V', , , );
  1456. }
  1457. /*W键模拟*/
  1458. void WKey()
  1459. {
  1460. keybd_event('W', , , );
  1461. keybd_event('W', , , );
  1462. }
  1463. /*X键模拟*/
  1464. void XKey()
  1465. {
  1466. keybd_event('X', , , );
  1467. keybd_event('X', , , );
  1468. }
  1469. /*Y键模拟*/
  1470. void YKey()
  1471. {
  1472. keybd_event('Y', , , );
  1473. keybd_event('Y', , , );
  1474. }
  1475. /*Z键模拟*/
  1476. void ZKey()
  1477. {
  1478. keybd_event('Z', , , );
  1479. keybd_event('Z', , , );
  1480. }
  1481.  
  1482. /*********************************************字符串算法*********************************************/
  1483. /*自己实现的字符串检索函数,s2为要检索的字符串,s1位源字符串*/
  1484. int strInStrPos(char s1[], char s2[])
  1485. {
  1486. int length1 = strlen(s1);
  1487. int length2 = strlen(s2);
  1488. printf("length1 = %d,length2 = %d", length1, length2);
  1489. //找到标记 -1表示未找到
  1490. int pos = -;
  1491. for (int i = ; i <= length1 - length2; i++)
  1492. {
  1493. int j = ;
  1494. for (; j < length2; j++)
  1495. {
  1496. if (s1[i + j] != s2[j])
  1497. {
  1498. break;
  1499. }
  1500.  
  1501. }
  1502. if (j == length2)
  1503. pos = i;
  1504.  
  1505. }
  1506. return pos;
  1507.  
  1508. }
  1509. /*打印hello的8种方式打印八个hello*/
  1510. void printHello()
  1511. {
  1512. printf("%s\n", "hello");
  1513. printf("hello\n");
  1514. printf("%c%c%c%c%c\n", 'h', 'e', 'l', 'l', 'o');
  1515. printf("%c%c%c%c%c\n", , , , , );
  1516. printf("%c%c%c%c%c\n", , , , , );
  1517. printf("%c%c%c%c%c\n", 0x68, 0x65, 0x6c, 0x6c, 0x6f);
  1518. printf("%c%c%c%c%c\n", '\150', '\145', '\154', '\154', '\157');
  1519. printf("%c%c%c%c%c\n", '\x68', '\x65', '\x6c', '\x6c', '\x6f');
  1520. //%f 带小数点的实数%e指数形式的浮点数%g看%f和%e谁短以谁的形式打印,并去掉无用的部分
  1521.  
  1522. }
  1523.  
  1524. /*从一个字符串str中删除一个子串substr*/
  1525. void deleteStringInString(char *substr, char *str)
  1526. {
  1527. int lenstr = strlen(str);
  1528. int lensub = strlen(substr);
  1529. printf("%d\n", lenstr);
  1530. printf("%d\n", lensub);
  1531. char *p = strstr(str, substr);
  1532. printf("%s\n", p);
  1533. if (p != NULL)
  1534. {
  1535. int i = ;
  1536. for (; p[i + lensub] != '\0'; i++)
  1537. {
  1538. p[i] = p[i + lensub];
  1539. printf("%c\n", p[i + lensub]);
  1540. }
  1541. p[i] = '\0';
  1542. }
  1543. }
  1544.  
  1545. /*从一个字符串str中使用newstr替换一个子串substr*/
  1546. void changeStringInString(char *newstr, char *substr, char *str)
  1547. {
  1548. int lenstr = strlen(str);
  1549. int lensub = strlen(substr);
  1550. int lennew = strlen(newstr);
  1551. printf("%d\n", lenstr);
  1552. printf("%d\n", lensub);
  1553. char *p = strstr(str, substr);
  1554. printf("%s\n", p);
  1555. if (p != NULL)
  1556. {
  1557.  
  1558. if (lensub > lennew)
  1559. {
  1560. for (int j = ; j < lennew; j++)
  1561. {
  1562. p[j] = newstr[j];
  1563. }
  1564. int i = ;
  1565. for (; p[i + lensub] != '\0'; i++)
  1566. {
  1567. p[i + lennew] = p[i + lensub];
  1568. //printf("%c\n", p[i + lensub]);
  1569. }
  1570. p[i] = '\0';
  1571. }
  1572. else
  1573. {
  1574. int j = ;
  1575.  
  1576. char temp[];
  1577. while (p[j + lensub] != '\0')
  1578. {
  1579. temp[j + lensub] = p[j + lensub];
  1580. j++;
  1581. }
  1582. temp[j] = '\0';
  1583.  
  1584. for (j = ; j < lennew; j++)
  1585. {
  1586. p[j] = newstr[j];
  1587. }
  1588. while (temp[j] != '\0')
  1589. {
  1590. p[j] = temp[j];
  1591. j++;
  1592. }
  1593. p[j] = '\0';
  1594.  
  1595. }
  1596.  
  1597. }
  1598. }
  1599.  
  1600. /*从一个字符串str中子串substr的前面增加一个新字符串newstr*/
  1601. void addStringInString(char *newstr, char *substr, char *str)
  1602. {
  1603. int lenstr = strlen(str);
  1604. int lensub = strlen(substr);
  1605. int lennew = strlen(newstr);
  1606. printf("%d\n", lenstr);
  1607. printf("%d\n", lensub);
  1608. char *p = strstr(str, substr);
  1609. printf("%s\n", p);
  1610. if (p != NULL)
  1611. {
  1612.  
  1613. int j = ;
  1614. char temp[];
  1615. while (p[j] != '\0')
  1616. {
  1617. temp[j] = p[j];//将substr开始以后的所有字符保存起来
  1618. j++;
  1619. }
  1620. temp[j] = '\0';
  1621.  
  1622. for (j = ; j < lennew; j++)//将新字符串一个一个写入p
  1623. {
  1624. p[j] = newstr[j];
  1625. }
  1626. int i = ;
  1627. while (temp[i] != '\0')
  1628. {
  1629. p[j] = temp[i];
  1630. i++;
  1631. j++;
  1632. }
  1633. p[j] = '\0';
  1634.  
  1635. }
  1636. }
  1637.  
  1638. /**********************************************经典算法**********************************************/
  1639. /*河内之塔算法
  1640. 问题描述:三个柱子A,B,C,A上放有N个盘子,盘子从上往下依次增大,将A上的N歌盘子一个一个搬运到C柱子上,
  1641. 且一次只能搬运一个,求得搬运多少次,并且C上面盘子要保证与A原来摆放顺序一样(大盘子在下,小盘子在上)
  1642. 盘子个数 搬运次数 搬运方向
  1643. 1 1 A->C
  1644. 2 3 A->B A->C B->C
  1645. 3 7 A->C A->B C-B A->C B->A B->C A->C
  1646. N 2^N - 1
  1647. */
  1648. /*n为盘子个数,A,B,C分别表示三个柱子*/
  1649. void Hanoi(int n, char A, char B, char C)
  1650. {
  1651. if (n == )
  1652. {
  1653. printf("Move plante %d %c -> %c\n", n, A, C);
  1654. }
  1655. else
  1656. {
  1657. Hanoi(n - , A, C, B);
  1658. printf("Move plante %d %c -> %c\n", n, A, C);
  1659. Hanoi(n- , B, A, C);
  1660. }
  1661. }
  1662.  
  1663. /*费氏数列:1 1 2 3 5 8 13 ......
  1664. 有关系F(m) = F(m-1) + F(m-2)
  1665. */
  1666. /*求F(m)*/
  1667. int Fib(int n)
  1668. {
  1669. if (n == )
  1670. {
  1671. return ;
  1672.  
  1673. }
  1674. else if (n==)
  1675. {
  1676. return ;
  1677. }
  1678. else
  1679. {
  1680. return Fib(n - ) + Fib(n - );
  1681. }
  1682. }
  1683.  
  1684. /*帕斯卡三角形,m为多项式的(a+b)^m中的m,n为系数所处的位置,返回值为系数值,要满足 m+1 >= n*/
  1685. int Paska(int m, int n)
  1686. {
  1687. if (n < )
  1688. {
  1689. return ;
  1690. }
  1691. else if (n == )
  1692. {
  1693. return ;
  1694. }
  1695. else if ( < n < m )
  1696. {
  1697. return Paska(m - , n) + Paska(m - , n - );
  1698. }
  1699. else if (n == m)
  1700. {
  1701. return ;
  1702. }
  1703. else
  1704. {
  1705. return ;
  1706. }
  1707. }
  1708.  
  1709. /*老鼠走迷宫问题:
  1710. 使用二维阵列表示迷宫
  1711. 用2表示墙壁,用0表示空白可以行走,用1表示老鼠可以走出的路径
  1712. 在起始位置有四个方向可以走,上下左右,起始位置肯定空白
  1713. */
  1714. #define M 10 //数组列数
  1715. int flag = ; //是否找到标记
  1716. /*查看i行j列处是否为空白,返回1表示成功找到,返回0表示没有找到,找到的路线用1填充*/
  1717. int visitArray(int startY, int startX, int endY, int endX, int (*P)[M])
  1718. {
  1719. P[startY][startX] = ;
  1720. if (startY == endY && startX == endX)//如果到出口则找到
  1721. {
  1722. flag = ;
  1723. }
  1724. if (flag != && P[startY - ][startX] == )//没到到,上路为空白则向上找
  1725. visitArray(startY-,startX,endY,endX,P);
  1726. if (flag != && P[startY][startX-] == )//没到到,左路为空白则向左找
  1727. visitArray(startY , startX-, endY, endX, P);
  1728. if (flag != && P[startY +][startX] == )//没到到,下路为空白则向下找
  1729. visitArray(startY +, startX, endY, endX, P);
  1730. if (flag != && P[startY][startX+] == )//没到到,右路为空白则向右找
  1731. visitArray(startY , startX+, endY, endX, P);
  1732. return flag;
  1733.  
  1734. }
  1735.  
  1736. /*50个台阶,每次要么走一步,要么走两步,问有多少次走法
  1737. 1个台阶 1 1
  1738. 2 11 2 2
  1739. 3 111 12 21 3
  1740. 4 1111 22 121 112 211 5
  1741.  
  1742. 要到达50,从48走2,或从49走1所以有F(N) = F(N-1) + F(N-2)
  1743. */
  1744. int stepF(int n)
  1745. {
  1746. if (n == )
  1747. {
  1748. return ;
  1749. }
  1750. else if (n == )
  1751. {
  1752. return ;
  1753. }
  1754. else
  1755. {
  1756. return stepF(n - ) + stepF(n - );
  1757. }
  1758. }
  1759.  
  1760. /*********************************************数据结构算法*********************************************/
  1761.  
  1762. /*********************************************文件操作算法*********************************************/
  1763. /*从键盘读取字符输出到磁盘文件中,若读取到#,则结束*/
  1764. void readFromKey()
  1765. {
  1766. char str[];
  1767. printf("请输入要写入的文件名:");
  1768. scanf("%s", str);
  1769. FILE *F = NULL;
  1770. F = fopen(str, "wt+");
  1771. if (F != NULL)
  1772. {
  1773. int c = getchar();
  1774. while (c != '#')
  1775. {
  1776. fputc(c, F);
  1777. c = getchar();
  1778. }
  1779. fclose(F);
  1780. }
  1781. return;
  1782. }
  1783. /*从磁盘文件读取内容,然后显示在屏幕上*/
  1784. void printFileContent()
  1785. {
  1786. char str[];
  1787. printf("请输入要读取的文件名:");
  1788. scanf("%s", str);
  1789. FILE *F = NULL;
  1790. F = fopen(str, "rt+");
  1791. if (F != NULL)
  1792. {
  1793. int c = EOF;
  1794. while ((c = fgetc(F)) != EOF)
  1795. {
  1796. putchar(c);
  1797.  
  1798. }
  1799. fclose(F);
  1800. }
  1801. return;
  1802. }
  1803.  
  1804. /*文件复制*/
  1805. int copyFile(char *src, char *des)
  1806. {
  1807. FILE *SRC = fopen(src, "rt");
  1808. FILE *DES = fopen(des, "wt");
  1809. if (SRC == NULL)
  1810. {
  1811. return -;
  1812. }
  1813. if (DES == NULL)
  1814. {
  1815. fclose(SRC);
  1816. return -;
  1817. }
  1818. int c = EOF;
  1819. while ((c = fgetc(SRC)) != EOF)
  1820. {
  1821. fputc(c, DES);
  1822. }
  1823. fclose(SRC);
  1824. fclose(DES);
  1825. return ;
  1826.  
  1827. }
  1828. /*将一个长度为L的整形数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/
  1829. void writeIntArrayToFile(int a[], int L, char *path, int flag)
  1830. {
  1831. char *mode;
  1832. if (flag)
  1833. {
  1834. mode = "ab";
  1835. }
  1836. else
  1837. {
  1838. mode = "wb";
  1839. }
  1840. FILE *F = fopen(path, mode);
  1841. if (F == NULL)
  1842. {
  1843. printf("打开文件失败!");
  1844. }
  1845. else
  1846. {
  1847. int res = ;
  1848. res = fwrite(a, sizeof(int), L, F);//第一个参数表示写入内存块的首地址,第二个参数表示每个元素大小,
  1849. //第三个参数表示写入元素数量,第四个参数表示要写入的文件,写入成功会返回写入数量
  1850.  
  1851. if (res == L)
  1852. {
  1853. printf("写入成功");
  1854. }
  1855. else
  1856. {
  1857. printf("写入失败");
  1858. }
  1859. fclose(F);
  1860. }
  1861. }
  1862. /*将路径path表示的文件内容读取到整形数组a中,读取长度为L*/
  1863. void readFileToIntArray(int a[], int L, char *path)
  1864. {
  1865.  
  1866. FILE *F = fopen(path, "rb");
  1867. if (F == NULL)
  1868. {
  1869. printf("打开文件失败!");
  1870. }
  1871. else
  1872. {
  1873. int res = ;
  1874. res = fread(a, sizeof(int), L, F);//第一个参数表示写入内存块的首地址,第二个参数表示每个元素大小,
  1875. //第三个参数表示写入元素数量,第四个参数表示要写入的文件,写入成功会返回写入数量
  1876.  
  1877. if (res == L)
  1878. {
  1879. printf("读取成功");
  1880. }
  1881. else
  1882. {
  1883. printf("读取失败");
  1884. }
  1885. fclose(F);
  1886. }
  1887. }
  1888.  
  1889. /*将一个长度为L的Double数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/
  1890. void writeDoubleArrayToFile(double a[], int L, char *path, int flag)
  1891. {
  1892. char *mode;
  1893. if (flag)
  1894. {
  1895. mode = "ab";
  1896. }
  1897. else
  1898. {
  1899. mode = "wb";
  1900. }
  1901. FILE *F = fopen(path, mode);
  1902. if (F == NULL)
  1903. {
  1904. printf("打开文件失败!");
  1905. }
  1906. else
  1907. {
  1908. int res = ;
  1909. res = fwrite(a, sizeof(double), L, F);//第一个参数表示写入内存块的首地址,第二个参数表示每个元素大小,
  1910. //第三个参数表示写入元素数量,第四个参数表示要写入的文件,写入成功会返回写入数量
  1911.  
  1912. if (res == L)
  1913. {
  1914. printf("写入成功");
  1915. }
  1916. else
  1917. {
  1918. printf("写入失败");
  1919. }
  1920. fclose(F);
  1921. }
  1922. }
  1923. /*将路径path表示的文件内容读取到双精度浮点数组a中,读取长度为L*/
  1924. void readFileToDoubleArray(double a[], int L, char *path)
  1925. {
  1926.  
  1927. FILE *F = fopen(path, "rb");
  1928. if (F == NULL)
  1929. {
  1930. printf("打开文件失败!");
  1931. }
  1932. else
  1933. {
  1934. int res = ;
  1935. res = fread(a, sizeof(double), L, F);//第一个参数表示读取内存块的首地址,第二个参数表示每个元素大小,
  1936. //第三个参数表示写入元素数量,第四个参数表示要写入的文件,写入成功会返回写入数量
  1937.  
  1938. if (res == L)
  1939. {
  1940. printf("读取成功");
  1941. }
  1942. else
  1943. {
  1944. printf("读取失败");
  1945. }
  1946. fclose(F);
  1947. }
  1948. }
  1949.  
  1950. /*将首地址为P的大小为L*SIZE的内存块写入到路径path表示的文件中,内存块的组成小块大小为SIZE,个数为L,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/
  1951. void writeMemoryToFile(void *addr, int SIZE,int L, char *path, int flag)
  1952. {
  1953. char *mode;
  1954. if (flag)
  1955. {
  1956. mode = "ab";
  1957. }
  1958. else
  1959. {
  1960. mode = "wb";
  1961. }
  1962. FILE *F = fopen(path, mode);
  1963. if (F == NULL)
  1964. {
  1965. printf("打开文件失败!");
  1966. }
  1967. else
  1968. {
  1969. int res = ;
  1970. res = fwrite(addr, SIZE, L, F);//第一个参数表示写入内存块的首地址,第二个参数表示每个元素大小,
  1971. //第三个参数表示写入元素数量,第四个参数表示要写入的文件,写入成功会返回写入数量
  1972.  
  1973. if (res == L)
  1974. {
  1975. printf("写入成功");
  1976. }
  1977. else
  1978. {
  1979. printf("写入失败");
  1980. }
  1981. fclose(F);
  1982. }
  1983. }
  1984.  
  1985. /*将路径path表示的文件内容读取到首地址为P的大小为L*SIZE的内存块中,读取长度为L,每小块大小为SIZE字节*/
  1986. void readFileToMemory(void *addr, int SIZE, int L, char *path)
  1987. {
  1988.  
  1989. FILE *F = fopen(path, "rb");
  1990. if (F == NULL)
  1991. {
  1992. printf("打开文件失败!");
  1993. }
  1994. else
  1995. {
  1996. int res = ;
  1997. res = fread(addr,SIZE, L, F);//第一个参数表示读取内存块的首地址,第二个参数表示每个元素大小,
  1998. //第三个参数表示写入元素数量,第四个参数表示要写入的文件,写入成功会返回写入数量
  1999.  
  2000. if (res == L)
  2001. {
  2002. printf("读取成功");
  2003. }
  2004. else
  2005. {
  2006. printf("读取失败");
  2007. }
  2008. fclose(F);
  2009. }
  2010. }
  2011. /*在黑窗口查看一个文本文件内容,使用cmd命令,path为文件路径*/
  2012. void lookFileUseType(char *path)
  2013. {
  2014. char cmd[];
  2015. sprintf(cmd, "type %s", path);
  2016. system(cmd);
  2017. }
  2018. /*在黑窗口查看一个文本文件内容,使用文件指针,path为文件路径*/
  2019. void lookFileUsePointer(char *path)
  2020. {
  2021. FILE *F = fopen(path, "r");
  2022. if (F == NULL)
  2023. {
  2024. printf("打开文件失败");
  2025. }
  2026. else
  2027. {
  2028. char ch = fgetc(F);
  2029. do
  2030. {
  2031. putchar(ch);
  2032. ch = fgetc(F);
  2033. } while (ch != EOF);
  2034. fclose(F);
  2035. }
  2036. }
  2037. /*测量一个文件长度,查看文件大小,字节数表示,返回-1表示失败*/
  2038. long measureFileSize(char *path)
  2039. {
  2040. FILE *F = fopen(path, "rb");
  2041. if (F == NULL)
  2042. {
  2043. return -;
  2044. }
  2045. else
  2046. {
  2047. fseek(F, , SEEK_END);//将文件指针移动到文件末尾
  2048. long length = ftell(F);//计算文件指针到文件开头的字节数,即就是文件大小
  2049. fclose(F);
  2050. return length;
  2051. }
  2052. }
  2053. /*清空一个文件内容,任何格式磁盘文件文件大小变为0,但是不删除该文件*/
  2054. void clearFileContent(char *path)
  2055. {
  2056. FILE *F = fopen(path, "wb");
  2057. char s = '\0';
  2058. if (F == NULL)
  2059. {
  2060. printf("打开文件失败");
  2061. }
  2062. else
  2063. {
  2064. fwrite(&s, , , F);
  2065. fclose(F);
  2066. }
  2067. }
  2068.  
  2069. /*将一个长度为L的字符型数组a写入到路径path表示的文件中,flag为1表示在文件末尾追加,为0表示从文件头重新写入*/
  2070. void writeCharArrayToFile(char a[], int L, char *path, int flag)
  2071. {
  2072. char *mode;
  2073. if (flag)
  2074. {
  2075. mode = "ab";
  2076. }
  2077. else
  2078. {
  2079. mode = "wb";
  2080. }
  2081. FILE *F = fopen(path, mode);
  2082. if (F == NULL)
  2083. {
  2084. printf("打开文件失败!");
  2085. }
  2086. else
  2087. {
  2088. int res = ;
  2089. res = fwrite(a, sizeof(char), L, F);//第一个参数表示写入内存块的首地址,第二个参数表示每个元素大小,
  2090. //第三个参数表示写入元素数量,第四个参数表示要写入的文件,写入成功会返回写入数量
  2091.  
  2092. if (res == L)
  2093. {
  2094. printf("写入成功");
  2095. }
  2096. else
  2097. {
  2098. printf("写入失败");
  2099. }
  2100. fclose(F);
  2101. }
  2102. }
  2103. /*将路径path表示的文件内容读取到字符型数组a中,读取长度为L*/
  2104. void readFileToCharArray(char a[], int L, char *path)
  2105. {
  2106.  
  2107. FILE *F = fopen(path, "rb");
  2108. if (F == NULL)
  2109. {
  2110. printf("打开文件失败!");
  2111. }
  2112. else
  2113. {
  2114. int res = ;
  2115. res = fread(a, sizeof(char), L, F);//第一个参数表示写入内存块的首地址,第二个参数表示每个元素大小,
  2116. //第三个参数表示写入元素数量,第四个参数表示要写入的文件,写入成功会返回写入数量
  2117.  
  2118. if (res == L)
  2119. {
  2120. printf("读取成功");
  2121. }
  2122. else
  2123. {
  2124. printf("读取失败");
  2125. }
  2126. fclose(F);
  2127. }
  2128. }
  2129. /*修改路径为path的文件,将它距离文件开头pos字节数的位置的一个字节二进制数据修改为c*/
  2130. void changeFileByte(char *path, int pos, char c)
  2131. {
  2132. FILE *F = fopen(path, "rb+");
  2133. if (F == NULL)
  2134. {
  2135. printf("打开文件失败");
  2136. }
  2137. else
  2138. {
  2139. fseek(F, pos, SEEK_SET);
  2140. fwrite(&c, , , F);
  2141. fclose(F);
  2142. }
  2143. }
  2144. /*修改路径为path的文件,将它距离文件开头pos字节数的位置的L个字节二进制数据修改为*c*/
  2145. void changeFileBytes(char *path, int pos, int L, char *c)
  2146. {
  2147. FILE *F = fopen(path, "rb+");
  2148. if (F == NULL)
  2149. {
  2150. printf("打开文件失败");
  2151. }
  2152. else
  2153. {
  2154. fseek(F, pos, SEEK_SET);
  2155. fwrite(c, , L, F);
  2156. fclose(F);
  2157. }
  2158. }
  2159. /*合并两个文件,使用二进制形式,将一个文件rear添加到另一个文件front的末尾,flag=1表示合并后删除read文件,flag=0表示不删除*/
  2160. void combineTwoFileBin(char *front, char *rear, int flag)
  2161. {
  2162. FILE *F = fopen(front, "ab");
  2163. if (F == NULL)
  2164. {
  2165. printf("打开文件FRONT失败");
  2166. }
  2167. else
  2168. {
  2169. FILE *R = fopen(rear, "rb");
  2170. if (R == NULL)
  2171. {
  2172. printf("打开文件REAR失败");
  2173. fclose(F);
  2174. }
  2175. else
  2176. {
  2177. char s;
  2178. while (!feof(R))
  2179. {
  2180. fread(&s, , , R);
  2181. fwrite(&s, , , F);
  2182. }
  2183. fclose(F);
  2184. fclose(R);
  2185.  
  2186. if (flag)
  2187. {
  2188. remove(rear);
  2189. }
  2190.  
  2191. }
  2192. }
  2193. }
  2194. /*根据指定路径创建一个目录*/
  2195. void makeDir(char *path)
  2196. {
  2197. char md[];
  2198. sprintf(md, "mkdir %s", path);
  2199. system(md);
  2200. }
  2201. /*统计英文文档大写字母个数,小写字母个数,数字字符数,统计换行符个数,空格字符个数,逗号字符数,其他字符数,按顺序存放在一个长度为7count数组中,path为文件路径 ,L必须为7*/
  2202. void statEnglishFile(char *path, int count[], int L)
  2203. {
  2204. if (L != )
  2205. return;
  2206. for (size_t i = ; i < ; i++)
  2207. {
  2208. count[i] = ;
  2209. }
  2210.  
  2211. FILE *F = fopen(path, "r");
  2212. if (F == NULL)
  2213. {
  2214. printf("打开文件失败");
  2215. }
  2216. else
  2217. {
  2218. char ch;
  2219. while ((ch = fgetc(F)) != EOF)
  2220. {
  2221. if (ch > 'A' && ch < 'Z')
  2222. {
  2223. count[]++;
  2224. }
  2225. else if (ch > 'a' && ch < 'z')
  2226. {
  2227. count[]++;
  2228. }
  2229. else if (ch > '' && ch < '')
  2230. {
  2231. count[]++;
  2232. }
  2233. else if (ch == '\n')
  2234. {
  2235. count[]++;
  2236. }
  2237. else if (ch == ' ')
  2238. {
  2239. count[]++;
  2240. }
  2241. else if (ch == ',')
  2242. {
  2243. count[]++;
  2244. }
  2245. else
  2246. {
  2247. count[]++;
  2248. }
  2249. }
  2250.  
  2251. fclose(F);
  2252. }
  2253.  
  2254. }
  2255. /*统计双字节字符*/
  2256. int statFileDoubleChar(char *path)
  2257. {
  2258. FILE *F = fopen(path, "r");
  2259. int numc = ;//双字节字符
  2260. if (F == NULL)
  2261. {
  2262. printf("文件打开失败");
  2263. perror("失败原因:");
  2264. }
  2265. else
  2266. {
  2267. int ch;//必须用int,汉字占两个字节,char装不下,int占四个字节
  2268.  
  2269. int nume = ;//英文字符
  2270. int numn = ;//数字字数
  2271.  
  2272. while ((ch = fgetc(F)) != EOF)
  2273. {
  2274. if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
  2275. {
  2276. nume++;
  2277. }
  2278. else if (ch >= '' && ch <= '')
  2279. {
  2280. numn++;
  2281. }
  2282. else if (ch > )//判定ch为双字节字符
  2283. {
  2284. ch = fgetc(F);//在读取一个
  2285. numc++;
  2286. }
  2287. else
  2288. {
  2289.  
  2290. }
  2291. }
  2292. fclose(F);
  2293.  
  2294. }
  2295. return numc;
  2296. }
  2297. /*统计汉字字符,汉字采用GBK编码*/
  2298. int statFileChineseChar(char *path)
  2299. {
  2300. FILE *F = fopen(path, "r");
  2301. int numc = ;//汉字字符
  2302. if (F == NULL)
  2303. {
  2304. printf("文件打开失败");
  2305. perror("失败原因:");
  2306. }
  2307. else
  2308. {
  2309. int ch;//必须用int,汉字占两个字节,char装不下,int占四个字节
  2310.  
  2311. int nume = ;//英文字符
  2312. int numn = ;//数字字数
  2313.  
  2314. while ((ch = fgetc(F)) != EOF)
  2315. {
  2316. if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
  2317. {
  2318. nume++;
  2319. }
  2320. else if (ch >= '' && ch <= '')
  2321. {
  2322. numn++;
  2323. }
  2324. else if (ch > )//判定ch为双字节字符
  2325. {
  2326. int nextch = fgetc(F);//再读取一个
  2327. if ((ch >= 0x81 && ch <= 0xA0) && ((nextch >= 0x40 && nextch <= 0x7E) || (nextch >= 0x80 && nextch <= 0xFE)))
  2328. {
  2329. numc++;
  2330. }
  2331. else if ((ch >= 0xB0 && ch <= 0xD6) && ((nextch >= 0x40 && nextch <= 0x7E) || (nextch >= 0x80 && nextch <= 0xFE)))
  2332. {
  2333. numc++;
  2334. }
  2335. else if ((ch >= 0xD8 && ch <= 0xF7) && ((nextch >= 0x40 && nextch <= 0x7E) || (nextch >= 0x80 && nextch <= 0xFE)))
  2336. {
  2337. numc++;
  2338. }
  2339. else if ((ch >= 0xAA && ch <= 0xAF) && ((nextch >= 0x40 && nextch <= 0x7E) || (nextch >= 0x80 && nextch <= 0xA0)))
  2340. {
  2341. numc++;
  2342. }
  2343. else if ((ch >= 0xF8 && ch <= 0xFE) && ((nextch >= 0x40 && nextch <= 0x7E) || (nextch >= 0x80 && nextch <= 0xA0)))
  2344. {
  2345. numc++;
  2346. }
  2347. else if ((ch == 0xD7) && ((nextch >= 0x40 && nextch <= 0x7E) || (nextch >= 0x80 && nextch <= 0xF9)))
  2348. {
  2349. numc++;
  2350. }
  2351.  
  2352. }
  2353. else
  2354. {
  2355.  
  2356. }
  2357. }
  2358. fclose(F);
  2359.  
  2360. }
  2361. return numc;
  2362. }
  2363. /*windows下在路径searchpath下搜索文件名前缀为frontname后缀为rearname的文件,如果两者有一个为*代表通配符,统配任何哪种格式的文件,outputfile为存储找到的文件路径信息的文件*/
  2364. void searchFileInWindows(char *searchpath, char *frontname, char *rearname, char *outputfile)
  2365. {
  2366. char cmd[];
  2367. sprintf(cmd, "for /r \"%s\" %%i in (%s.%s) do @echo %%i >> \"%s\"", searchpath, frontname, rearname, outputfile);
  2368. system(cmd);
  2369. char show[];
  2370. sprintf(show, "type %s", outputfile);
  2371. system(show);
  2372.  
  2373. }
  2374. /*linux下在路径searchpath下搜索文件名前缀为frontname后缀为rearname的文件,如果两者有一个为*代表通配符,统配任何哪种格式的文件,outputfile为存储找到的文件路径信息的文件*/
  2375. void searchFileInLinux(char *searchpath, char *frontname, char *rearname, char *outputfile)
  2376. {
  2377. char cmd[];
  2378. sprintf(cmd, "find %s -name %s.%s >> %s ", searchpath, frontname, rearname, outputfile);
  2379. system(cmd);
  2380.  
  2381. }
  2382.  
  2383. /***************文件加密*****************/
  2384. /*移位加密文本文件path为文件路径,endpath为加密后的密文路径,key为秘钥*/
  2385. void encryptedFileUseMoveBit(char *path, char *endpath, int key)
  2386. {
  2387. FILE *F = fopen(path, "rb");
  2388. FILE *P = fopen(endpath, "wb");
  2389. if (F == NULL || P == NULL)
  2390. {
  2391. printf("加密失败");
  2392. }
  2393. else
  2394. {
  2395. char ch;
  2396. while ((ch = fgetc(F)) != EOF)
  2397. {
  2398.  
  2399. ch = ch + key;
  2400. fputc(ch, P);
  2401. }
  2402.  
  2403. fclose(F);
  2404. fclose(P);
  2405. }
  2406. }
  2407.  
  2408. /*移位解密文本文件path为文件路径,endpath为解密后的明文路径,key为秘钥*/
  2409. void decryptedFileUseMoveBit(char *path, char *endpath, int key)
  2410. {
  2411.  
  2412. FILE *F = fopen(path, "rb");
  2413. FILE *P = fopen(endpath, "wb");
  2414. if (F == NULL || P == NULL)
  2415. {
  2416. printf("加密失败");
  2417. }
  2418. else
  2419. {
  2420. char ch;
  2421. while ((ch = fgetc(F)) != EOF)
  2422. {
  2423.  
  2424. ch = ch - key;
  2425. fputc(ch, P);
  2426. }
  2427. fclose(F);
  2428. fclose(P);
  2429. }
  2430. }
  2431.  
  2432. /*异或加密文件path为文件路径,endpath为加密后的密文路径,key为秘钥*/
  2433. void encryptedFileUseXor(char *path, char *endpath, int key)
  2434. {
  2435. FILE *F = fopen(path, "rb");
  2436. FILE *P = fopen(endpath, "wb");
  2437. if (F == NULL || P == NULL)
  2438. {
  2439. printf("加密失败");
  2440. }
  2441. else
  2442. {
  2443. char ch;
  2444. while ((ch = fgetc(F)) != EOF)
  2445. {
  2446.  
  2447. ch = ch ^ key;
  2448. fputc(ch, P);
  2449. }
  2450.  
  2451. fclose(F);
  2452. fclose(P);
  2453. }
  2454. }
  2455.  
  2456. /*异或解密文件path为文件路径,endpath为解密后的明文路径,key为秘钥*/
  2457. void decryptedFileUseXor(char *path, char *endpath, int key)
  2458. {
  2459.  
  2460. FILE *F = fopen(path, "rb");
  2461. FILE *P = fopen(endpath, "wb");
  2462. if (F == NULL || P == NULL)
  2463. {
  2464. printf("加密失败");
  2465. }
  2466. else
  2467. {
  2468. char ch;
  2469. while ((ch = fgetc(F)) != EOF)
  2470. {
  2471.  
  2472. ch = ch ^ key;
  2473. fputc(ch, P);
  2474. }
  2475. fclose(F);
  2476. fclose(P);
  2477. }
  2478. }
  2479.  
  2480. /*字符串加密文件path为文件路径,endpath为加密后的密文路径,key为秘钥,L为长度*/
  2481. void encryptedFileUseChars(char *path, char *endpath, char key[], int L)
  2482. {
  2483. FILE *F = fopen(path, "rb");
  2484. FILE *P = fopen(endpath, "wb");
  2485. if (F == NULL || P == NULL)
  2486. {
  2487. printf("加密失败");
  2488. }
  2489. else
  2490. {
  2491. char ch;
  2492. for (int i = ; i < L;)
  2493. {
  2494. if ((ch = fgetc(F)) != EOF)
  2495. {
  2496.  
  2497. ch = ch + key[i];
  2498. fputc(ch, P);
  2499. i++;
  2500. if (i == L)
  2501. i = ;
  2502. }
  2503. else
  2504. {
  2505. break;
  2506. }
  2507.  
  2508. }
  2509.  
  2510. fclose(F);
  2511. fclose(P);
  2512. }
  2513. }
  2514.  
  2515. /*字符串解密文件path为文件路径,endpath为解密后的明文路径,key为秘钥,L为长度*/
  2516. void decryptedFileUseChars(char *path, char *endpath, char key[], int L)
  2517. {
  2518.  
  2519. FILE *F = fopen(path, "rb");
  2520. FILE *P = fopen(endpath, "wb");
  2521. if (F == NULL || P == NULL)
  2522. {
  2523. printf("加密失败");
  2524. }
  2525. else
  2526. {
  2527. char ch;
  2528. for (int i = ; i < L;)
  2529. {
  2530. if ((ch = fgetc(F)) != EOF)
  2531. {
  2532.  
  2533. ch = ch - key[i];
  2534. fputc(ch, P);
  2535. i++;
  2536. if (i == L)
  2537. i = ;
  2538. }
  2539. else
  2540. {
  2541. break;
  2542. }
  2543.  
  2544. }
  2545. fclose(F);
  2546. fclose(P);
  2547. }
  2548. }
  2549. /*文件分割,path为要分割的文件路径name为文件名,count为分割数量,savepath为保存路径,返回-1表示分割失败,0表示成功*/
  2550. int splitFile(char *path, int count, char *savepath, char *savename)
  2551. {
  2552. FILE *F = fopen(path, "rb");
  2553. if (F == NULL)
  2554. {
  2555. return -;
  2556. }
  2557. else
  2558. {
  2559. fseek(F, , SEEK_END);//将文件指针移动到文件末尾
  2560. int length = ftell(F);//计算文件指针到文件开头的字节数,即就是文件大小
  2561. int yushu = length % count;//余数
  2562. int size = length / count; //前面count-1份每一分大小为size,最后一份为size + yushu
  2563. for (int i = ; i <= count; i++)
  2564. {
  2565. char savefile[];
  2566. sprintf(savefile, "%s%d%s", savepath, i, savename);
  2567. printf("%s", savefile);
  2568. FILE *P = fopen(savefile, "wb");
  2569. if (P == NULL)
  2570. {
  2571. fclose(F);
  2572. return -;
  2573. }
  2574. else
  2575. {
  2576. fseek(F, (i - )*size, SEEK_SET);
  2577. if (i == count)
  2578. {
  2579. for (int j = ; j <= size + yushu; j++)
  2580. {
  2581. int c = fgetc(F);
  2582. fputc(c, P);
  2583. }
  2584. }
  2585. else
  2586. {
  2587. for (int j = ; j < size; j++)
  2588. {
  2589. int c = fgetc(F);
  2590. fputc(c, P);
  2591. }
  2592. }
  2593.  
  2594. }
  2595. fclose(P);
  2596. }
  2597. fclose(F);
  2598. return ;
  2599. }
  2600.  
  2601. }
  2602. /*合并文件,将文件list中每一行指定的文件按行顺序合并为一个大文件bigfile返回-1表示分割失败,0表示成功*/
  2603. int mergeFile(char *list, int count, char *bigfile)
  2604. {
  2605. FILE *F = fopen(list, "r");
  2606. FILE *BF = fopen(bigfile, "wb");
  2607. if (F == NULL || BF == NULL)
  2608. {
  2609. printf("打开文件失败");
  2610. return -;
  2611. }
  2612. else
  2613. {
  2614.  
  2615. for (int i = ; i < count; i++)
  2616. {
  2617. char str[];
  2618. fgets(str, , F);//每次读取一行字符串,读到末尾为0
  2619. printf("%s", str);
  2620. int len = strlen(str);
  2621. str[len - ] = '\0';
  2622. printf("%s", str);
  2623. FILE *P = fopen(str, "rb");
  2624. if (P == NULL)
  2625. {
  2626. printf("打开文件失败");
  2627. fclose(F);
  2628. fclose(BF);
  2629. return -;
  2630. }
  2631. else
  2632. {
  2633. int c = fgetc(P);
  2634. while (c != EOF)
  2635. {
  2636.  
  2637. fputc(c, BF);
  2638. c = fgetc(P);
  2639. }
  2640. }
  2641. fclose(P);
  2642.  
  2643. }
  2644.  
  2645. }
  2646. fclose(F);
  2647. fclose(BF);
  2648. return ;
  2649. }
  2650.  
  2651. /*写入一行文本到文件将一行字符串str写入文件path中,使用系统命令,mode表示模式,非0表示追加模式,0表示重新从头写入*/
  2652. void writeStringToFile(char *str, char *path, int mode)
  2653. {
  2654. char cmd[];
  2655. if (mode == )
  2656. {
  2657. sprintf(cmd, "echo %s > %s", str, path);
  2658. }
  2659. else
  2660. {
  2661. sprintf(cmd, "echo %s >> %s", str, path);
  2662. }
  2663.  
  2664. system(cmd);
  2665. }
  2666. /*写入一行文本到文件将一行字符串str写入文件path中,使用文件指针,mode表示模式,非0表示追加模式,0表示重新从头写入*/
  2667. void writeStringToFileUsePointer(char *str, char *path, int mode)
  2668. {
  2669. FILE *F;
  2670. if (mode == )
  2671. {
  2672. F = fopen(path, "wb");
  2673. }
  2674. else
  2675. {
  2676. F = fopen(path, "ab");
  2677. }
  2678. if (F == NULL)
  2679. {
  2680. printf("文件打开失败");
  2681. return ;
  2682. }
  2683. else
  2684. {
  2685. int len = strlen(str);
  2686. for (int i = ; i < len; i++)
  2687. {
  2688. fputc(str[i], F);
  2689. }
  2690. fputc('\r', F);
  2691. fputc('\n', F);
  2692. }
  2693. fclose(F);
  2694.  
  2695. }
  2696.  
  2697. /***********************大文本文件处理********************/
  2698. /* 下面这些方法可以处理大文件*/
  2699.  
  2700. /*打印path这个文本文件内容*/
  2701. void printfFileContent(char *path)
  2702. {
  2703. FILE *F = fopen(path, "r");
  2704. if (F == NULL)
  2705. {
  2706. printf("打开文件失败");
  2707. return;
  2708. }
  2709. else
  2710. {
  2711. char str[];
  2712. while (fgets(str, , F))//没有到达文件末尾就一直读
  2713. {
  2714. printf("%s", str);
  2715. }
  2716. }
  2717. fclose(F);
  2718.  
  2719. }
  2720. /*文本文件查询,在文件path中搜索字符串str,如果找到返回1,没找到返回0,找到后将所在行号和内容打印出来*/
  2721. int searchStringInFile(char *substr, char *path)
  2722. {
  2723. FILE *F = fopen(path, "r");
  2724. if (F == NULL)
  2725. {
  2726. printf("打开文件失败");
  2727. return ;
  2728. }
  2729. else
  2730. {
  2731. char str[];
  2732. int num = ;//记录行号,从第0行开始
  2733. while (fgets(str, , F))//读取一行没有到达文件末尾就一直读
  2734. {
  2735. printf("%s", str);
  2736. num++;
  2737. char *p = strstr(str, substr);
  2738. if (p != NULL)//找到
  2739. {
  2740. printf("找到要查找的内容:%d:%s", num, str);
  2741.  
  2742. }
  2743. else
  2744. {
  2745. printf("%s", str);
  2746. }
  2747.  
  2748. }
  2749. }
  2750. fclose(F);
  2751. return ;
  2752. }
  2753.  
  2754. /*文本文件删除,在文件path中删除字符串substr,temp为临时文件,如果成功返回1,没成功返回0,将删除后的文件打印出来*/
  2755. int deleteStringFromFile(char *substr, char *path, char *temp)
  2756. {
  2757. FILE *F = fopen(path, "r");
  2758. FILE *P = fopen(temp, "w");
  2759. if (F == NULL || P == NULL)
  2760. {
  2761. printf("打开文件失败");
  2762. return ;
  2763. }
  2764. else
  2765. {
  2766. char str[];
  2767. while (fgets(str, , F))//读取一行没有到达文件末尾就一直读
  2768. {
  2769. //printf("%s", str);
  2770.  
  2771. char *p = strstr(str, substr);
  2772. if (p != NULL)//找到就不写入temp文件中
  2773. {
  2774. //printf("找到要查找的内容:%d:%s",str);
  2775. deleteStringInString(substr, str);
  2776. fputs(str, P);
  2777.  
  2778. }
  2779. else
  2780. {
  2781. printf("%s", str);
  2782. fputs(str, P);
  2783. }
  2784.  
  2785. }
  2786. }
  2787. fclose(F);
  2788. fclose(P);
  2789. remove(path);//删除原来的文件
  2790. rename(temp, path);//将文件名改为原来的文件名
  2791. return ;
  2792. }
  2793.  
  2794. /*文本文件修改,在文件path中使用newstr替换字符串substr,temp为临时文件,如果成功返回1,没成功返回0,*/
  2795. int changeStringInFile(char *newstr, char *substr, char *path, char *temp)
  2796. {
  2797. FILE *F = fopen(path, "r");
  2798. FILE *P = fopen(temp, "w");
  2799. if (F == NULL || P == NULL)
  2800. {
  2801. printf("打开文件失败");
  2802. return ;
  2803. }
  2804. else
  2805. {
  2806. char str[];
  2807. while (fgets(str, , F))//读取一行没有到达文件末尾就一直读
  2808. {
  2809. //printf("%s", str);
  2810.  
  2811. char *p = strstr(str, substr);
  2812. if (p != NULL)//找到就不写入temp文件中
  2813. {
  2814. //printf("找到要查找的内容:%d:%s",str);
  2815. changeStringInString(newstr, substr, str);
  2816. fputs(str, P);
  2817.  
  2818. }
  2819. else
  2820. {
  2821. printf("%s", str);
  2822. fputs(str, P);
  2823. }
  2824.  
  2825. }
  2826. }
  2827. fclose(F);
  2828. fclose(P);
  2829. remove(path);//删除原来的文件
  2830. rename(temp, path);//将文件名改为原来的文件名
  2831. return ;
  2832. }
  2833.  
  2834. /*文本文件增加,在文件path中将newstr添加在字符串substr的前面,temp为临时文件,如果成功返回1,没成功返回0,*/
  2835. int addStringToFile(char *newstr, char *substr, char *path, char *temp)
  2836. {
  2837. FILE *F = fopen(path, "r");
  2838. FILE *P = fopen(temp, "w");
  2839. if (F == NULL || P == NULL)
  2840. {
  2841. printf("打开文件失败");
  2842. return ;
  2843. }
  2844. else
  2845. {
  2846. char str[];
  2847. while (fgets(str, , F))//读取一行没有到达文件末尾就一直读
  2848. {
  2849. //printf("%s", str);
  2850.  
  2851. char *p = strstr(str, substr);
  2852. if (p != NULL)//找到就不写入temp文件中
  2853. {
  2854. //printf("找到要查找的内容:%d:%s",str);
  2855. addStringInString(newstr, substr, str);
  2856. fputs(str, P);
  2857.  
  2858. }
  2859. else
  2860. {
  2861. printf("%s", str);
  2862. fputs(str, P);
  2863. }
  2864.  
  2865. }
  2866. }
  2867. fclose(F);
  2868. fclose(P);
  2869. remove(path);//删除原来的文件
  2870. rename(temp, path);//将文件名改为原来的文件名
  2871. return ;
  2872. }
  2873.  
  2874. /*在文件path中搜索字符串str所在行然后打印出来*/
  2875. void printStringInLine(char *substr, char *path)
  2876. {
  2877. FILE *F = fopen(path, "r");
  2878. if (F == NULL)
  2879. {
  2880. printf("打开文件失败");
  2881. return;
  2882. }
  2883. else
  2884. {
  2885. char str[];
  2886. while (fgets(str, , F))//读取一行没有到达文件末尾就一直读
  2887. {
  2888.  
  2889. char *p = strstr(str, substr);
  2890. if (p != NULL)//找到
  2891. {
  2892. puts(str);
  2893. }
  2894.  
  2895. }
  2896. }
  2897. fclose(F);
  2898. }
  2899.  
  2900. /*在文件path中读取第n行然后打印出来,*/
  2901. void printnLineString(int n, char *path)
  2902. {
  2903. FILE *F = fopen(path, "r");
  2904. if (F == NULL)
  2905. {
  2906. printf("打开文件失败");
  2907. return;
  2908. }
  2909. else
  2910. {
  2911. char str[];
  2912. int num = ;
  2913. while (fgets(str, , F))//读取一行没有到达文件末尾就一直读
  2914. {
  2915.  
  2916. num++;
  2917. if (num == n)//找到
  2918. {
  2919. puts(str);
  2920. }
  2921.  
  2922. }
  2923. }
  2924. fclose(F);
  2925. }

3.测试部分本人用于时间关系只测试了一小部分算法,大家有时间的话可以帮忙测试下,共同进步

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include "algorithm.h"
  4.  
  5. void main()
  6. {
  7. //Hanoi(3, 'A', 'B', 'C');
  8. //printf("%d", Fib(8));
  9. //printf("%d",Paska(4,2));
  10. /*获取N以下的质数,并按从小到大的顺序存放到数组P中,L为数组最大长度*/
  11. int factor[];
  12. int prime[];
  13. int mm;
  14. int nn;
  15.  
  16. //getPrimeNumTable(100, factor, &mm);
  17. //for (size_t i = 0; i < mm; i++)
  18. //{
  19. // printf("%d\n", factor[i]);
  20. //}
  21. /*求一个数的所有质因数,并按从小到大的顺序存放到数组P中,L为存放质因数个数地址,*/
  22. getFactor(, factor, prime, &mm,&nn );
  23. printf("%d\n",mm);
  24. for (int i = ; i < mm; i++)
  25. {
  26. printf("%d\n", factor[i]);
  27. }
  28. system("pause");
  29. }

4.c语言是一门运行高效开发低效的语言,但是也是最强大,最灵活的高级语言,将像一杯美酒,时间久了才会香,希望大家学好c语言。

c语言-自己写的库的更多相关文章

  1. 分享:写了一个 java 调用 C语言 开发的动态库的范例

    分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h   代码#pragma once#ifdef __cplusplusextern "C" {#e ...

  2. 将自己写的库上传到cocoapods(2015)

    2015年以前上传到cocoapods的方式相较于现在比较麻烦,现在用不上在此也就不提了.现在上传到cocoapods只需要简单的几步即可. 1.首先你需要有一个自我感觉写的差不多的库. 2.注册tr ...

  3. 【Go语言绘图】gg 库的基本使用

    最近接了个比较大的需求,需要做很多图片处理的事情,比如图片的旋转裁截拼接,各种渐变处理,文字排列,一开始光是想想就头疼.但没有办法,既然已经需求已经到手上了,那就得把它做好才行,于是便开始被迫营业,无 ...

  4. 在spring boot使用总结(九) 使用yaml语言来写配置文件

    yaml是专门用来写配置文件的语言.使用yaml来写配置文件扩展性比较强而且十分方便.spring boot支持使用yaml语言来写配置文件,使用snakeyaml库来读取配置文件.spring bo ...

  5. laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题

    在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...

  6. c++ 11开始语言本身和标准库支持并发编程

    c++ 11开始语言本身和标准库支持并发编程,意味着真正要到编译器从语言和标准库层面开始稳定,估计得到17标准出来.14稳定之后的事情了,根据历史经验,新特性的引入到稳定被广泛采用至少要一个大版本的跨 ...

  7. Go语言的标准net库使用

    Go语言的标准net库使用 与大多数语言一样,Go的标准库是很全的,因为Go的出现本来就是为了网络通信的高并发实现,所以其相关的网络库封装得很简洁,也更加的易读.这里对使用到的api进行记录. net ...

  8. Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建;学习Python语言,利用Python语言来写测试用例。加油!!!

    Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建:学习Python语言,利用Python语言来写测试用例.加油!!!

  9. C语言编写静态链接库及其使用

    本篇讲述使用C语言编写静态链接库,而且使用C和C++的方式来调用等. 一.静态库程序:执行时不独立存在,链接到可执行文件或者动态库中,目标程序的归档. 1.用C编写静态库步骤 a.建立项目(Win32 ...

随机推荐

  1. Git常用命令解说

    http://blog.csdn.net/hangyuanbiyesheng/article/details/6731629 1. Git概念  1.1. Git库中由三部分组成         Gi ...

  2. JSP设置文件编码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. 了解tomcat的server.xml文件

    <?xml version='1.0' encoding='utf-8'?> <!-- Note: http://201605130349.iteye.com/blog/229898 ...

  4. TProfiler部署文档--笔记

    TProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对象创建热点 线程状态分析等数据,为查找系统性能瓶颈提供数据支持. ...

  5. 聊聊Socket、TCP/IP、HTTP、FTP及网络编程

    1 这些都是什么 既然是网络传输,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. 1.1 TCP ...

  6. 华盛顿邮报:FBI 屡次夸大了“手机加密威胁”的数字

    <华盛顿邮报>周二报道称,美国联邦调查局(FBI)严重夸大了由加密手机所造成的问题.以去年为例,该机构调查人员声称被大约 7800 部涉嫌犯罪活动的加密设备挡在了门外,而准确的数字应该在 ...

  7. js模块化 javascript 模块化 闭包写法 闭包模块化写法

    var main = main || {}; ; (function (main) { 'use strict'; //私有变量 var _s1 = 'Hello '; var _s2 = 'Worl ...

  8. dev和master合并冲突解决

    前景 master主分支,dev是开发分支,master会保持最新的dev代码 问题的产生 dev开发新功能 版本发布,dev合并到了master,发布生产环境 新需求来了,在dev进行开发 同时,线 ...

  9. 一个C#程序员学习微信小程序的笔记

    客户端打开小程序的时候,就将代码包下载到本地进行解析,首先找到了根目录的 app.json ,知道了小程序的所有页面. 在这个Index页面就是我们的首页,客户端在启动的时候,将首页的代码装载进来,通 ...

  10. mvc、mvp和mvvm

    一.MVC 设计图: 可能由于MVP.MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM.因为后两种都是基于MVC发展而来的. 1 ...