Loading... //备忘录: /*说明: 用途:本头文件为Jorgan学习c/c++所用。将c语言编写难度python化 标注:函数分段:_,待完善函数注释://********,注意函数注释://&&&&&&&&&&,类型分段:$$ 。 函数类型与用途区分:函数前函数:函数名_(math_asdf_,为asdf的前函数,_后也可以加名称),测试辅助数据与函数:test_,数学函数与算法函数(涉及精度用double):math_,整数与数组函数:int_, 字符处理函数:str_ ,结构(首字母大写)结构名缩写_,应用型:应用名缩写_,控制台:con_,数据结构函数:date_,文件操作:file_。 */ // $$ $$ /*标准命名: 指针:最后一位是p,指向指针的指针命名:最后两位是pp他们前面一般命名指向的元素名称或指向的类型名,其后可加数字或下划线(之后写其归属或作用等)以区分,如strarrayp_count。 函数与变量:var:中间,cur:目前,偏移:offset,flag:标志,label:标签,tran/to:转换,i,j,k,l:迭代量,goto:移动到, new:新建 ,add:增添,del:删除,update:更新,find:查询,select:筛选 , start:开始,end结束,judge/jud:判断 ,res:结果 ,cmp:比较,app:追加,link:连接,arr:数组,sarr:字符数组 echo:重复,of:的,point:指向的 ,next:之后的,pre:之前的,node:节点,chain:链,stack :栈,queue:队列,line:队,ring:环,date:数据,con:控制台,pos:位置 ,datebase:数据集合,temp:临时,init:初始化,ori:原本,cpy:副本,elem:元素。 */ //$$ /*学习心得: 1.'\0'=0!='0'。 2.数组与指针:数组是指向首元素地址的常量,其声明包含了数组的最大元素数与每个元素的字节数信息(依照类型确定,char为一个字节)。指针是指向一个元素地址的变量。 定义数组,时,给数组设置大小并有同时初始化的情况下自动在所有非元素的位置初始化为0(也就是说int a[10]={0}表示首元素为0其他9个元素初始化为0)而不设置大小为其初始化'\0',而不初始化仅仅定义了元素个数也不会自动初始化其他部分为0。单方框[]可用于数组与指针访问偏移元素,[][]中后者 代表步长,指针加减a是按指针类型的字节大小访问偏移a个元素。指针必数组更灵活与快速。a[]代表a是一个常量指针。&*在一起时会抵消。 p+i=&a[i],*(p+i)=a[i] 3.数组会自动加0的情况:char a[]="asdf"(五个元素); 申明a[n]中n有值则n个元素初始化为0,无值则为垃圾值,若n为形式参数传入,则无法完成初始化为0; 初始化数组:memset(array, 0, ARRAY_SIZE_MAX):推荐,将array到ARRAY_SIZE_MAX初始化为0;char array[ARRAY_SIZE_MAX] = {0}:实际调用了memset方法。 ARRAY_SIZE_MAX部分只能写最大长度,0的位置也只能写0。二维数组初始化为0:a[x][y]={0}而x,y为形式参数则不行。 4.二维数组传参时只能传递第一行第一列元素的地址,形式参数为一个整数指针。 5.字符编码:printf("%c%c\n", 0xa8, 0x80)两个%c一起可以输出一个黑或白方块 printf("%c%c",254,254)正方格 printf("%c",32)长方 格。目前测试只有在vs2019的内部命令行中才可以用代码打印带颜色的字体 。("■")也为方格 。⊙。“□”。 6.输入输出:cout与scanf会省略空格等,要保留用getline(cin, name); (cin不变,name为变量)。 7.传参:形式参数传参是传的值相等的副本。函数传参如果传的是普通变量(不是指针)那肯定是输入型参数;若该函数形参是指针变量并且加了const,那么就表示这个参数是用来做输 入型参数的;若该函数形参是指针变量并且还没加const,那么就表示这个参数是用来做输出型参数的。譬如C库函数中strcpy函数。函数也可以返回指针。 已经赋值形式参数作为可选参数如果不用就写NULL/0以略过。 8.类型转换:(type),type可以是类型也可以是指针,也可以是结构,也可以是指向结构的指针,如:(int *) 进行指针强制转换。 9."->": 得到指针指向的结构的对应数据,p->date:p指向的结构的date的数据 10. 声明:typedef struct asd{}def;在定义时:def a,b;错误,应该分开写:def a;def b;。 11.printf函数就是使用的是缓冲I/O的方式,该函数在遇到“\n“换行符时自动的从缓冲区中将记录读出。所以exit()将缓冲区的数据写完后才能退出来, 所以调用exit()函数后程序并不会马上退出,这就是有些出现的僵尸程序,而_exit是直接退出进入到内核中去,不会读取缓冲区记录。exit(0):正常退出exit(!0):异常退出。 12.int main(int argc,charp argv[])中形式参数为调用此exe程序的控制台传入,格式为:“exe路径 参数0 参数1。。。。。。”参数0是程序全名,至少有一个参数0,argc>=1; 参数写法为常用的,可以自己该。argc为参数个数,argv为指向指针数组的指针,该指针数组的指针分别指向参数0,参数1。。。。。。 13.cin先左后右 ,返回一个指针。cin >> stuff;与等同getline(cin, stuff)/cin.getline(data, 100);。cin.get(a)与 a=cin.get()相同,都为获取一个任何包括空格的字符,如果到达文件末端,cin.get()返回0。单独cin.get()可以暂停一下,这只能读取字符不能数字。 14.字符型与整数型可以互相赋值,int变量=char变量传递的是ascii的字符对应十进制数字。 15.oj:打印出来的不管是整型还是字符型,都会变成ascii的字符,如打印8 '8'都会认为是'8' '8'。(自我总结),oj会判断数值是否是需要的类型(如整型)(其实是判断ASCII,因为整型与字符型数值ASCII不同)。 16. 17.可以用一个[]访问二维数组(传参时不加&,访问等维数组要加&),也可以用两个[]访问一维数组(传参时不行)。 证明二维数组与一维数组 储存相同,只是多一个方框代表了步长取值(传参时有问题) 。 18.数组是特殊的指针(可以用来访问数组对于第一个元素的偏移元素的地址,只是一种访问方法,并不是指针,但可以在形式参数中代表指针类型) ,并不代表它是指针,a[]代表了数组指针,可以用之修改数组, 但数组传递时只能用&a[0]来传递第一个元素的地址,而不用a[0],后者代表数组指针但不是指针 。 19.i++是先赋值后++,++i则反之。 20.定义变量而未初始化,该变量的值为垃圾值。 21.控制台输入值后每计算出值就刷新到输出缓存区,下一次输入等行为就把缓存区的数据打印出来或储存取来等,并存入新的输出,输入缓存区亦如此原理。输入过程中主程序已经return那么就不会再读取其他数据。 22.整型数据不能乘除小数,否则结果会有问题。 23.中文字符由两个char变量相连组成。 24.可以同时这样定义int a,*p; 25.指向函数的指针: int* p(int i, int j);表示返回值为指针 int (*p)(int i, int j);表示指向函数的指针 函数名即为函数的地址;函数指针的作用是有选择性地使用有相同参数定义类型的一些函数函数。可以用数组存放函数指针以使用这些函数。 int (*p)(char)=f; (f是个函数)。 前者是返回值是指针的函数;后者是一个指向函数的指针。 任何类型都可以转换为void类型并在转换为原类型时不会出错,该指针参数可以设置为void型的 。 26.类型占用字节大小: 32位编译器:char/unsigned char :1字节char *:4字节short int:2字节int/unsigned int:4字节long int:4字节float:4字节double:8字节long long:8字节long double:12字节 64位编译器:char/unsigned char :1字节char *:8字节short int:2字节int/unsigned int:4字节long int:8字节float:4字节double:8字节long long:8字节long double:16字节 结构:基础是4字节 27.函数返回数组首元素指针需要先申请内存,才能作为参数传入另外一个函数,否则会传入错误数据(因这是局部变量,函数结束即释放)。如:int* arr=(int*)malloc(4); 此后也可以用[]来赋予数组对应偏移地址的值了 。 28.空穴:如结构体的储存长度大于每种类型需要的字节长度,多余的部分就是空穴 29.static的变量为局部变量,创建后函数结束后该变量任然存在 。extern获取外部文件的全局变量,机制是相当于声明一个长这样的函数并编译,遇到之后的这样函数()本文件或其他文件就将其替换。 30.使用c/c++读写数据,需要保证IDE与文件编码格式相同,可以用notepad++转换文件编码格式,windows下一般转换为ANSI的GBK,而utf-8一般有问题 31.允许重定义一个变量,但其作用域不同才行,局部变量与全局变量同名,这时局部为局部变量的值,全局为全局变量的值 。可以定义同名函数,但其参数不能相同 32:if (1) MoveWindow(GetForegroundWindow(),0,0,300,300,true); else ShowWindow(GetForegroundWindow(),false);为1控制台变一定大小位置,为0控制台显示为假 33.函数左边转换符是对其返回值转换如int *a= (int*) malloc(sizeof(int)*(lenth+1)); 34.结构不管有没有初始化都需要在最后加; 35、const int/...相当于常量了 36.汉字为两个字节,每个字节都为负数 */ // $$ $$ /*问题: 1. 二维数组初始化为0:a[x][y]={0}而x,y为形式参数则不行。 2. 我写的所有打印数组元素的函数都有可能出现问题 */ //$$ /*错误分析: invalid types `char[int]' for array subscript:[]内问题,或许是之前定义的[]与后面定义的[]不一致([]的个数等)。 */ // $$ $$ /*库函数: <标准> void:任何类型都可以转换为void类型并在转换为原类型时不会出错。void类型值不能相互赋值,需要用memcpy 交换,因为字节数可能不同。 switch只能看一个直接的取值 <io.h> remove:删除文件 <stdio.h> getch():获取字符不需回车,不打印 getche():获取字符不需回车,打印在屏幕上 getchar:获取一个输入的字符,如果是数字则为其ASCII码,返回数字 putchar:打印一个字符,打印是对应数字的ASCII,返回打印的相同字符 gets(s): 从 stdin读取一行到 s 所指向的缓冲区,直到 EOF(手动换行时产生0,手动输不进0,为‘0’) puts(s):把字符串 s以0结尾写入到 stdout并换行 fopen: 创建一个新的文件或者打开一个已有的文件r 打开一个已有的文本文件,允许读取文件。 w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 r+ 打开一个文本文件,允许读写文件。 w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式: "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b" fclose: 如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF(-1) fputs(char* s,FILE* f): 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF fprintf(FILE *f,char * s, ...) :函数来写把一个字符串s写入到文件中f 并返回写入的长度 ,不放0 fgetc(FILE* f):f所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF fgets(char *buf, int n, FILE *f ):从 f 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到 buf数组(缓存区)中,并在最后追加一个 null 字符来终止字符串。 如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。 fscanf(FILE *fp, const char *format, ...) 函数来从文件中读取字符串,但是在遇到第一个空格和换行符时,它会停止读取。 size_t fread(void *ptr, size_t size_of_elements,size_t number_of_elements, FILE *a_file); 二进制读 size_t fwrite(const void *ptr, size_t size_of_elements,size_t number_of_elements, FILE *a_file);二进制写 sprintf(char [],...):将...的格式化信息打印出并放到左边数组里面,不放0,返回放入的个数。 <sys/time.h> gettimeofday(&s,NULL);为sdeftime的结构,NULL的位置参数用处不大,取时间有s结构内的秒与毫秒 。取实际时间 <unistd.h> getcwd(buf,sizeof(buf)); 先定义字符数组buf,获取当前运行目录 <windows.h> CopyFileA(sourse, destination, FALSE);//false代表覆盖,true不覆盖,A结尾是ASCII码的,W时unicode的,可以用TEXT("...")宏转换 MessageBox(NULL,"Hello","Notice",NULL); 消息框 <conio.h> getch():读键盘不需回车的字符返回其ASCII码 kbhit():检测是否有键盘敲击,结合getch()获取读取的字符 <time.h> time(0):返回值是从1970年1月1日至今所经历的时间(以秒为单位) clock():取时间 。取cpu运行的时间(不考虑输入输出与停顿等等) <errno.h> stderr:变量名,标准错误流 可以用fprintf(stderr,"dfsd")将错误输出到stderr中,(其其实是一个文件) errno:变量名,储存当前错误的数值。最好提前extern int errno ; 程序开始时被设置为0,表示正常 perror(s):打印“s: (当前错误errno对应的文本信息)" strerror():打印传入数值对应的错误信息的文本 <string.h> memcpy:赋值右指针所指向的数据给左指针,需要指定数据的字节。 atoi:将指针指向的字符数组的字符转换为数字,错误返回0 strcmp:以ASCII比较两字符串,相同返回0,不同返回正数或负数; strrev:指针修改为倒序数组 strcpy(c,a); //把串a复制到有足够空间的c中 strcat(c,b); //把b连接到c的串尾 <math.h> qsort():快速排序,参数:1 待排序数组,排序之后的结果仍放在这个数组中2 数组中待排序元素数量3 各元素的占用空间大小(单位为字节)4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数) e.g.:sort(a+c1,a+c2);a为数组,c1为开始元素索引,c2为第几个元素为结束,还可以加第三个compare函数用于决定升序还是降序 pow:开方与多次方,返回浮点数 <stdlib.h> srand(n)设置种子值为N,再rand()求出以种子值推导的值,不是真的随机数。一旦种子相同,在同一系统产生的随机数将是相同的 malloc:int* p,malloc函数返回的是 void * 类型,如果写成:p = malloc (sizeof(int)); 则程序无法通过编译。 所以必须通过 (int *) 来将强制转换,int可以通过sizeof取《数字(代表字节,如果字节小于类型的字节,多余的字节没有用),类型,结构,指针》的大小。 exit(a):提前结束程序 ,a=0,为正常,非0为异常退出 。EXIT_FAILURE 为-1, EXIT_FAILURE为0; calloc(int num, int size):返回一个指针,在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。 free(void *address):释放 address 所指向的内存块,释放的是动态分配的内存空间 malloc(int num): 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的,返回指针。 realloc(void *address, int newsize):重新分配内存,把内存扩展到 newsize,返回指针 .可以通过调用函数 realloc() 来增加或减少已分配的内存块的大小 system("pause"):控制台暂停,用getchar()不行,应该用这个 cls:清空屏幕 system():中写的字符串相当于在控制台中输入这字符串 <system.h> system: :设置控制台颜色。"cls":清屏。pause:停顿。 system("shutdown");//关机 system("reboot"); //重启 <stdarg.h> int func(int, ... ) <windows.h> MessageBox (句柄, 显示内容,标题,MB_OK) ;句柄可以为NULL,表示当前窗体的句柄. MessageBox( NULL , L"Hello world!", "错误" , MB_YESNO|MB_YESNO);L"Hello world!"也可TEXT("Hello world!") 最后一个参数是显示在提示框中的按钮类型: MB_ABORTRETRYIGNORE MB_OKCANCEL MB_RETRYCANCEL MB_YESNO MB_YESNOCANCEL MB_OK 可选任一标志。 图标: MessageBoxIcon.Question MessageBoxIcon.Asterisk MessageBoxIcon.Information MessageBoxIcon.Error MessageBoxIcon.Stop MessageBoxIcon.Hand MessageBoxIcon.Exclamation MessageBoxIcon.Warning MessageBoxIcon.None 返回值与类型: MessageBox.Show("消息内容", "返回值 确定1",MessageBoxButtons.OK,MessageBoxIcon.Question); MessageBox.Show("消息内容",, "返回值 确定1 取消2",MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk); MessageBox.Show("消息内容", "返回值 终止3 重试4 忽略5",MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); MessageBox.Show("消息内容", "返回值 是6 否7 取消2",MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); MessageBox.Show("消息内容", "返回值 是6 否7",MessageBoxButtons.YesNo, MessageBoxIcon.Hand); MessageBox.Show("消息内容", "返回值 重试4 取消2",MessageBoxButtons.RetryCancel, MessageBoxIcon.Information); GetAsyncKeyState():鼠标是否按下某个键 GetKeyState():鼠标是否按过(已经放开)某个键 常见vk键码: VK_SHIFT Shift键 VK_LSHIFT 左Shift键 VK_RSHIFT 右Shift键 VK_CONTROL Ctrl键 VK_LCONTROL 左Ctrl键 VK_RCONTROL 右Ctril键 VK_MENU Alt键 VK_LMENU 左Alt键 VK_RMENU 右Alt键 VK_LBUTTON 鼠标左键 VK_RBUTTON 鼠标右键 VK_ESCAPE ESC键 VK_RETURN回车键 VK_TABTAB键 VK_SPACE空格键 VK_UP↑键 VK_DOWN↓键 VK_LEFT←键 VK_RIGHT→键 更多:https://wenku.baidu.com/view/7c7dd28484868762caaed514.html <algorithm> sort:sort(a+n,a+m),a为数组,n为数组开始元素下标,m为结束元素下标+1。 transform(t.begin(),.end(),.begin(),::tolower):将字符串t中每个字符转为小写 <string> string:定义字符串 <iomanip> setiosflags(ios::fixed):设置为 setprecision(n)中N为保留小数位数 。必须在cout<<中用 setprecision(n):无 提前setiosflags(ios::fixed),表示保留有效n位。必须在cout<<中用 用法例子:cout<<a<<setprecision(9)<<a<<setiosflags(ios::fixed)<<setprecision(9)<<a; <fstream> ifstream f:文件输入流 ofstream f:文件输出流 fstream f:文件输入输出流 f.eof():判断是否到达文件末端 f.peek() —— 此函数将返回输入流文件的下一个字符,但它不移动内置指针。通过这个判断f.peek()==EOF f.open(“1.txt”, ios::out | ios::in)ios::app追加模式ios::ate文件打开后定位到文件末尾ios::in打开文件用于读取 ios::out打开文件用于写入ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。 f<<文件输出。f>>文件输入,每执行一次捕获一字符串直到空格与\n 。f.close():关闭文件,c++也会自动关闭的。 getline(f, a)从f中读取一行到a中; <stl> string a: a.end(),a.begin(), a.erase(2,3)//删除序号为2以后的 3个字符 a.erase(s.end() - 1)括号内为指针 ,删除a最后一个字符,不删除0, ,a.find(d)寻找 d var.length() 以上是指针,要访问则用*a.end() <string> s.npos判断是否没有得到s.find的值 <未知> */ //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ #define _CRT_SECURE_NO_WARNINGS//vs警告忽略 //#pragma once//表示这个文件只被包含一次 //#include<bits/stdc++.h>//包含所有c++头文件(会因为包含很多代码而运行变慢,但影响微小,将文件代码拷贝到该#define的位置) //#pragma comment(linker,"/subsystem:\"windows\"/entry:\"mainCRTStartup\"")设置控制台隐藏 ,直接运行exe才隐藏,如果调试则不隐藏 #include<stdio.h> #include<math.h> #include<time.h> #include<windows.h> #include<conio.h> #include<sys/time.h> #include<string.h> #include<stdlib.h> #include<errno.h> #include<stdarg.h> #include<io.h> #include<fstream> #include<iostream> #include<string> #include<algorithm> #include<cmath> //#define EOF -1//这是stdio.h中定义的 //#define NULL 0//ASCII设定 #define ELSERETURN -1 #define ZHUANXIAOXIE(x) (x-'A'+'a')//转为小写 #define ZHUANDAXIE(x) (x-'a'+'A')//转为大写 #define TRUE 1 #define FALSE 0 #define TRUERETURN 1 #define FALSERETURN 0//既可以表达函数执行结束,又可以表达函数执行错误 #define MAXCHAR 101//句子与单词字符数组最大长度 #define LONGMAXCHAR 1001//段落字符数组最大长度 #define LONGLONGMAXCHAR 100001//文章字符数组最大长度 #define MAXARRAY 101//一般数组最大长度 #define USER C:/Users/xingq/Desktop/learn/c/ using namespace std; //ios::sync_with_stdio(false); cin.tie(0); //加速cout与cin的方法,如果用了printf,putchar等等不能加这个,会扰乱次序。 //$$ //定义基本数据类型与结构: union types { int i; char c; float f;}; // $$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$ $$ //命名定义指针类型与引用类型: typedef int* intp; typedef long long* llintp; typedef float* floatp; typedef char* charp; typedef double* doublep; typedef void* voidp; typedef const int* cintp; typedef const long long* cllintp; typedef const float* cfloatp; typedef const char* ccharp; typedef const double* cdoublep; typedef const void* cvoidp; typedef int& intq; typedef long long& llintq; typedef float& floatq; typedef char& charq; typedef double& doubleq; typedef struct timeval sdeftime;//当前时间结构定义 typedef clock_t deftime;//储存时间的类型(长整型) typedef FILE* filetype; //文件流定义 //$$ //测试: int test_array[11] = {325,234,67,24,657,34,7685,23,234,865 }; char test_string[18] = "My name is Jorgan"; void test_timed(sdeftime start,sdeftime end){ int timeuse; timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; cout<<endl<<"实际总共用时:"<<(double)timeuse/1000000<<"秒"<<endl; }//实际总时间输出 void test_timec(deftime start,deftime end){ cout<<endl<<"cpu运算总共用时:"<<(double)(end-start)/CLOCKS_PER_SEC<<"秒"<<endl; }//cpu运行时间输出 struct bit{ unsigned int b1 : 1; unsigned int b2 : 2; unsigned int b3 : 3; unsigned int b4 : 4; unsigned int b5 : 5; unsigned int b6 : 6; unsigned int b7 : 7;//剩余4bit未用 };//位域结构,结构占用4个字节,如果变量总大小稍微多于4字节(如新增unsigned int b8 : 5)就位8字节了 // $$ $$ //基本操作函数: int shkey(ccharp str){ int s=str[0],comparenum=0,i=0; for(;str[i]!=0;i++) comparenum+=(int)str[i]; comparenum*=i; comparenum*=s; return comparenum; };//短字符串求key比较 void help(charp str){//************** switch(shkey(str)){ case 315100:cout<<"整数交换"; case 311650:cout<<"字符交换"; case 1785720:cout<<"math库中sort函数可加参数用于改为降序"; } } void dir(ccharp str){ switch(shkey(str)){ case 9025:cout<<"help,dir,shkey,swapi,swapc,swapa,sort_compare";//基本 case 185736:cout<<"";//math case 104265:cout<<"";//int case 119025:cout<<"";//str case 93411:cout<<"";//app case 467130:cout<<"";//strcut } } void turn(int c){ if(c>=48&&c<=57) c=c-48; if(c<=9) c=c+48; }//将数字与字符数字互转 void swapi(intp a, intp b) { int c=*a; *a = *b; *b = c; }//仅限于整数交换 void swapc(charp a, charp b) { char c = *a; *a = *b; *b = c; }//仅限于字符交换 void swapa(int arr[], int low, int high) { int temp; temp = arr[low]; arr[low] = arr[high]; arr[high] = temp; }//数组元素交换 void swap(voidp a, voidp b, int size){ void *var = malloc(size); memcpy(var, a, size); memcpy(a,b,size); memcpy(b,var,size); free(var); }//实现任意类型交换,a,b为(数组+偏移量)表示的指针,size为字节长度 bool sort_compare(int a,int b) { return a>b; //升序排列,如果改为return a>b,则为降序 }//math库sort可加的第三个参数,不加为升序,加为降序 //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //数学函数: int getnumplace(int n,int place) {//取得数字n的几位数字place=1为个位 return n/pow(10,place)%10; } inline int math_DoubleToInt(double d) { d += 6755399441055744.0; return *(int*)(&d); }//bouble转int快速版 int math_randomnum(int start,int end){ srand((int)time(0)); return rand()%(end-start+1)+start;//rand范围标准计算公式 } int* math_ranlist(int start,int end){ int lenth=end-start+1; int *a=(int*)malloc(sizeof(int)*(lenth+1)); a[lenth]=0; for(int i=0,ii=start;i<lenth;i++,ii++)a[i]=ii; srand((int)time(0)); for(int i=0;i<lenth;i++) swap(a[i],a[rand()%lenth]); return a; }//返回一个从start到end的乱序数组,末尾为0 void math_ranlist(int a[],int start,int lenth){ srand((int)time(0)); for(int i=start;i<=start+lenth-1;i++) swap(a[i],a[rand()%lenth+start]); }//将a从下标start开始共lenth个数组字符乱序 charp math_sort_char(charp ch,int maxstr){ char str_len(charp); int lenth=str_len(&ch[0]); char newch[lenth]; for(int i=0;i<lenth-1;i++) for(int j=1;j<lenth;j++) for(int i=0;i<lenth-1;i++) for(int j=1;j<lenth;j++) ; }//根据字符码排序字符数组,用c语言实现字符串数组 charp math_transradix(char num,int radix,int transradix){ char int_tochar(int); int str_tonum(char); char re[MAXCHAR]={0};int i=0; if(radix==10&&transradix==2){ for(;num!=0;i++){ re[i]=int_tochar(num%transradix);num/=transradix;} return &re[0];} else if(radix==2&&transradix==10){ ; } } int math_search_binary(int key,int arr[],int lenth) { int low=0,high=lenth-1,mid=(low+high)/2,cout=0; while(arr[mid]!=key){ if(high==low)return ELSERETURN; else if(arr[mid]>key){high=mid-1;mid=(high+low)/2;cout++;} else {low=mid+1;mid=(high+low)/2;cout++;}} return mid;; }//折半查找 ,先确定数组是升序数组,返回值的下标,如果无值,返回ELSERETURN int math_search_common(int key,int arr[]) { for(int i=0;arr[i]!=0;i++) if(arr[i]==key) return i; return ELSERETURN; }//顺序查找 intp math_matrix_multiply(intp m,int my,int mx,intp n,int ny,int nx){ int int_parray2(intp,int,int,charp); if(mx!=ny)return FALSE; int re[my][nx],M[my][mx],N[ny][nx]; for(int i=0;i<my;i++) for(int j=0;j<nx;j++) re[i][j]=0; for(int i=0;i<my;i++) for(int j=0;j<mx;j++) M[i][j]=m[i*mx+j]; for(int i=0;i<ny;i++) for(int j=0;j<nx;j++) N[i][j]=n[i*nx+j]; for(int i=0;i<my;i++) for(int j=0;j<nx;j++) for(int k=0;k<mx;k++) re[i][j]+=M[i][k]*N[k][j]; int_parray2(&re[0][0],my,nx,","); return &re[0][0]; } intp math_turnnumsystem(int num,int presys=10,int resys=2){ int i=0,j=0;intp arr=(int*)malloc(4),arrr=(int*)malloc(4); while(num!=0){ arr[i]=num%resys; num/=resys;i++;} i--; for(;i>=0;i--,j++) arrr[j]=arr[i]; arrr[j]=-1; free(arr); return arrr; }//e二进制数组以-1结尾,现仅仅支持10to2 intp math_matrix_npdr(intp m,int n,int y,int x,char which='p'){ int int_parray2(intp,int,int,charp); int M[y][x],re[x][y]; for(int i=0;i<y;i++) for(int j=0;j<x;j++) M[i][j]=m[i*x+j]; for(int i=0;i<y;i++) for(int j=0;j<x;j++){ if(which=='p')re[i][j]=M[i][j]*n; else if(which='d')re[i][j]=M[i][j]/n; else if(which='r'){re[i][j]=1/M[i][j];}} int_parray2(&re[0][0],y,x,","); return &re[0][0]; }//p:乘以数n,d:除以数n,r:求倒 intp math_matrix_ps(intp m,intp n,int y,int x,charp which="p"){ int int_parray2(intp,int,int,charp); int re[y][x],M[y][x],N[y][x]; for(int i=0;i<y;i++) for(int j=0;j<x;j++) M[i][j]=m[i*x+j]; for(int i=0;i<y;i++) for(int j=0;j<x;j++) N[i][j]=n[i*x+j]; for(int i=0;i<y;i++) for(int j=0;j<x;j++){ if(which=="p")re[i][j]=M[i][j]+N[i][j]; else if(which="s")re[i][j]=M[i][j]-N[i][j];} int_parray2(&re[0][0],y,x,","); return &re[0][0]; }//p:相加,s:相减 int math_determinant(intp array,int n){ int li[n][n],re; for(int i=0;i<n;i++) for(int j=0;j<n;j++) li[i][j]=array[i*n+j]; if(n==2)re=li[0][0]*li[1][1]-li[0][1]*li[1][0]; else if(n==3)re=li[0][0]*li[1][1]*li[2][2] +li[0][1]*li[1][2]*li[2][0] +li[0][2]*li[1][0]*li[2][1] -li[0][2]*li[1][1]*li[2][0] -li[0][1]*li[1][0]*li[2][2] -li[0][0]*li[1][2]*li[2][1]; return re; }//2/3阶计算 int math_min(int x, int y){ return x < y ? x : y; }//仅限于整数交换 void math_sort_selection(int b[], int n){ for (int i = 0; i < n - 1; i++) for (int j = 0; j < n - i - 1; j++) if (b[j] > b[j + 1]) swapi(&b[j], &b[j + 1]); }//简单的选择排序 intp math_numsplit(int num){ int arr[MAXARRAY]={0};intp arrp=arr; for(;num>=10;arrp++){ *arrp=num%10;cout<<*arrp<<endl;num/=10;cout<<num<<endl;} *(arrp)=num; return &arr[0]; }//10进制正整数将每位放入数组,数组排序是个十百...... int math_maxminnum(int m,int n,int max1ormin2=1){ int a,b; if(m>n) b=n; else b=m; for(int i=b;i>0;i--){a=i; if(m%i==0&&n%i==0) break;} switch(max1ormin2){ case 1: return a; case 2: return (m*n)/a; } }//求最大公倍数或最小公因式 int math_sort_quick_partition(int arr[], int low, int high){ int base = arr[low]; while(low < high){ while(low < high && arr[high] >= base){ high --;} swapa(arr, low, high); while(low < high && arr[low] <= base){low ++;} swapa(arr, low, high);} return low; } void math_sort_quick(int arr[], int low, int high) { if(low < high) { int base = math_sort_quick_partition(arr, low, high); math_sort_quick(arr, low, base - 1); math_sort_quick(arr, base + 1, high); } } void math_primenum(int n,intp list){ int k=0; for(int i=2,flag=1;i<=n;i++){ for(int j=2;j<i;j++){ if(i%j==0){ flag=0; } } if(flag==1){ list[k]=i; k++; } flag=1; } list[k]=0; }//求包括n范围内素数并放到数组里面,用例:math_primenum(100,&list[0]); //$$ //整数与数组函数: int int_findmax(int arr[]){ int var=0; for(int i=0;arr[i]!=0;i++) if(var<arr[i]) var=arr[i]; return var; } int int_findmin(int arr[]){ int i=0,var=arr[i]; for(int i=1;arr[i]!=0;i++) if(var>arr[i]) var=arr[i]; return var; } double int_getavg(int arr[]){ double var=0;int i=0; for(;arr[i]!=0;i++) var+=arr[i]; var/=i; return var; } void int_initchar(intp arrp,int lenth,char ch){ for(int i=0;i<lenth;i++) *(arrp++)=ch; } void int_parray(int array[],int lenth=NULL,char ge[]=" ",int end=0){ if(!lenth)for(;*array!=end;array++)printf("%d%s",*array,ge); else for (int i = 0; i<lenth; i++,array++)printf("%d%s",*array,(lenth-i>1)?ge:""); }//二进制数组可以将end设置为-1以结束 void int_parray2(int *a, int y, int x,char ge[]=" "){//a为一个m行,n列的二维数组的首地址。 int i, j; for(i = 0; i < y; i ++){ for(j = 0; j < x; j ++){ printf("%d%s", a[i*x+j],(x-j>1)?ge:"");}//a[i*x+j]也就是原始二维数组第i行第j列的元素。 printf("\n");}//每行结束输出换行。 } int int_len(int set[]) { int count = 0; while (set[count] != '\0')count++; return count; } void int_reserve(intp list){ int n; n=int_len(list); int li[n+1]; for(int i=0;i<n;i++) li[i]=list[n-i-1]; for(int i=0;i<n;i++) list[i]=li[i]; } char int_tochar(int num){ if(num>=0 && num<=9)return (char)('0'+num); //将0~9之间的数字转换成字符 else if(num>='A' && num<='Z')return (char)('A'+num-10); //将10到35的数字转换成大写字母 else return FALSE; }//将数字转换成字符,可用于最高36进制转换 // $$ $$ //字符类: charp str_strsplitwith(charp str); void str_initchar(charp arrp,int lenth,char ch){}; charp str_tostrarray(charp chararray,int wordsnums,int maxstr){ char strarray[wordsnums][maxstr]; for(int i=0;i<maxstr;i++) for(int j=0;j<wordsnums;j++) strarray[i][j]=0; for(int y=0,p=0;y<wordsnums;y++) for(int x=0;x<maxstr;x++,p++){ if(chararray[p]==0)break; strarray[y][x]=(char)chararray[p];}//*************************************************************************? return &strarray[0][0]; }//一维字符数组转为二维字符数组实现字符串数组的功能。一维字符数组单0结束单词,输入了wordsnums就不用以连续两个元素为0结束字符串数组了。 void str_parray(charp ch,int lenth=NULL){ if (!lenth) for(int i=0;*(ch+i)!=0;i++)printf("%c",*(ch+i)); else for(int i=0;i<lenth;i++)printf("%c",*(ch+i)); }//某些传参情况不稳定,可以用cout替换该功能********************************************************************************** void str_pstrarray(charp ar, int m, int n){//a为一个m行,n列的二维数组的首地址。 int i, j; for(i = 0; i < m; i ++){ for(j = 0; j < n; j ++) if(ar[i*n+j]!=0)cout<<ar[i*n+j];//ar[i*n+j]也就是原始二维数组第i行第j列的元素。 else continue; printf(" ");}//每行结束输出换行。 }//打印二维数组实现的字符串数组 void str_parray2(char *a, int y, int x,charp ge=" "){//a为一个m行,n列的二维数组的首地址。 int i, j; for(i = 0; i < y; i ++){ for(j = 0; j < x; j ++){ if(a[i*x+j]==0)printf("%c",ge); else printf("%c%s", a[i*x+j],(x-j>1)?ge:"");}//a[i*n+j]也就是原始二维数组第i行第j列的元素。 printf("\n");}//每行结束输出换行。 } int str_tonum(char ch){ if(ch>='0' && ch<='9')return ch-'0'; //将数字字符转换成数字 else if(ch>='A' && ch<='Z')return ch-'A'+10; //将大写字母字符转换成数字 else return FALSE; }//将字母与数字字符转换成数字,可用于最高36进制转换 void str_getnum(charp list,intp newlist){ int j=0; for(int i=0;list[i]!=0;i++){ if(list[i]>=48&&list[i]<=57){ newlist[j]=list[i]-48; j++; } } newlist[j]=0;//&&&&&&&&&&&&新生成数组要手动加'\0' }//将字符串中的数字字符转换为数字提取为新数组 void str_getstr(charp list,charp newlist){ int j=0; for(int i=0;list[i]!=0;i++){ if(list[i]<48||list[i]>57){ newlist[j]=list[i]; j++; } } newlist[j]=0; }//将字符串中的非数字字符提取为新数组 void str_getword(charp list,charp newlist){ int j=0; for(int i=0;list[i]!=0;i++){ if((list[i]>=65&&list[i]<=90)||(list[i]>=97&&list[i]<=122)){ newlist[j]=list[i]; j++; } } newlist[j]=0; }//将字符串中的字母提取为新数组 int str_len(charp set){ int count = 0; while (set[count] != '\0') count++; return count; } void str_reserve(charp list){ int n; n=str_len(list); char li[n+1]; for(int i=0;i<n;i++) li[i]=list[n-i-1]; for(int i=0;i<n;i++) list[i]=li[i]; } void str_lower(char* a) { for (int i = 0; a[i] != '\0'; i++) a[i] = (a[i] >= 'A' && a[i] <= 'Z') ? ZHUANXIAOXIE(a[i]) : a[i]; } char str_iflow(char a) { if (a >= 'a' && a <= 'z') return true; else if (a >= 'A' && a <= 'Z') return false; else return ELSERETURN; } void str_upper(char* a) { for (int i = 0; a[i] != '\0'; i++) a[i] = (a[i] >= 'a' && a[i] <= 'z') ? ZHUANDAXIE(a[i]) : a[i]; } // $$ $$ //应用型: double app_tem(double num,char tem,char turn){ if((turn=='C'||'c')&&(tem=='F'||'f'))return (tem-32)*5/9; if((turn=='C'||'c')&&(tem=='K'||'k'))return tem-273.15; if((turn=='F'||'f')&&(tem=='C'||'c'))return (tem*9)/5+32; if((turn=='F'||'f')&&(tem=='K'||'k'))return (tem*9)/5+32; if((turn=='K'||'k')&&(tem=='C'||'c'))return (tem*9)/5+32; if((turn=='K'||'k')&&(tem=='F'||'f'))return (tem*9)/5+32; } //华氏摄氏温度转换 //贪吃蛇游戏sk_(snake) //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //结构: //单链表opc_(one point chain) typedef struct opc_Node{ int date; struct opc_Node* next; }snode; void opc_addnode(snode*,snode*); int opc_lenchain(snode*); intp opc_chaintoarray(snode*); snode* opc_arraytochain(intp); void opc_addnode(snode*,snode*); void opc_delnode(snode*,int); snode* opc_newnode(){ return (snode*)malloc(sizeof(snode)); } int opc_lenchain(snode* n){ int lenth=0; for(;n -> next;n=n->next) lenth++; return lenth+1; } intp opc_chaintoarray(snode* chainp){ int arr[MAXARRAY]; for(int i=0;chainp;chainp=chainp->next,i++){ arr[i]= chainp -> date;}; return &arr[0]; } snode* opc_arraytochain(intp arr){ snode* headp = opc_newnode();//创建一个头结点 headp->date=*arr;arr++; snode* pointp = headp;//声明一个指针指向头结点,用于遍历链表 for (;*arr;arr++){ snode* var = opc_newnode(); var->date = *arr; var->next = NULL; pointp->next = var; pointp = pointp->next;} return headp; } void opc_addnode(snode* add,snode* cur){ snode* var; if(cur -> next){ var=cur -> next; cur -> next=add; add -> next=var;} else cur -> next=add; }//*********************************************************** void opc_delnode(snode* start,int offset){ snode* point=start+offset; if((point+1) -> next){ if((point-1) -> next)(point-1) -> next=(point+1); else start=start+1;} else {point -> next=0;point -> date =0;} }//*********************************************************** void opc_pchaindate(snode* arr){ for(;arr;arr=arr->next) printf("%d ",arr->date); } //$$ //控制台: void con_gotoxy(int y,int x){ COORD pos;pos.Y = y;pos.X = x; //定义一个位置,也可以写成COORD pos={x,y}; HANDLE winHandle;//句柄 winHandle = GetStdHandle(STD_OUTPUT_HANDLE);//将控制台窗口赋值给定义的句柄 SetConsoleCursorPosition(winHandle, pos); //设置光标位置 }//移动光标到(x,y)处 void con_gotoprint(int y,int x,charp obj){ con_gotoxy(y,x); for(;*obj;obj++) printf("%c",*obj); }//用于指定位置打印字符(数组),若打印空白则为删除 void con_color(int x) { HANDLE winHandle; winHandle = GetStdHandle((STD_OUTPUT_HANDLE)) ;//用来修改命令行窗口的颜色 SetConsoleTextAttribute(winHandle,x) ; }//颜色码:黑色0,蓝色1,绿色2,湖蓝色3,红色4,紫色5,黄色6,白色7,灰色8,淡蓝色9,淡绿色10,淡浅绿色11,淡红色12,淡紫色13,淡黄色14,亮白色15,恢复默认的颜色>16. // $$ $$ //文件操作: Last modification:October 16th, 2020 at 11:15 am © 允许规范转载 Support 赞赏不重要,能学到东西才是美妙的! ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat