C 和 C++ 一些基础
位运算:
Part1:
#include <iostream> using namespace std; int main(int argc, char *argv[]) { //unsigned char per byte that contain 00000000 - 11111111 unsigned char a=2; // bin->0000 0010 unsigned char b = ~a; //~(0000 0010) result:(1111 1101) or 253 printf("%d\n",b); unsigned char c=3; //0000 0011 unsigned char d=2; //0000 0010 printf(" & %d\n",c&d); // c&d -> 0000 0010 : 2 printf(" | %d\n",c|d); // c|d -> 0000 0011 : 3 //十六进制->十进制 hexadecimal(hex)->base10 int d_hex = 0xA3F; //A-..-F (10-15) //0xA3F -> A3F -> 10*16^2 + 3*16^1 + 15*16^0 = 2623 printf("0xA3F : %d\n",d_hex); // 2623 int d_hex_zero = 0x000; //0*16^2 + 0*16^1 + 0*16^0 = 0 printf("0x000 : %d\n",d_hex_zero); int d_hex_1 = 0x001; //0*16^2 + 0*16^1 + 1*16^0 = 1 printf("0x001 : %d\n",d_hex_1); int d_hex_2 = 0x011; //0*16^2 + 1*16^1 + 1*16^0 = 17 printf("0x001 : %d\n",d_hex_2); return 1; }
Part2:
#include <iostream> using namespace std; int main() { // int is 32 bit int a = 10; //00000000 00000000 00000000 00001010 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 10 int b = 5; //00000000 00000000 00000000 00000101 1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 = 5 int c = a | b ; // 00000000 00000000 00000000 00001111 1+2+4+8 = 15 cout << c <<endl; int d = c|0xFF; //hex: 0xFF = 15*16^1 + 15*16^0 = 255 bin:255-> 1111 1111 cout << d <<endl; // ^ int e = a ^ b; //00000000 00000000 00000000 00001111 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 15 cout << e <<endl; // swap a b // a 00000000 00000000 00000000 00001010 // b 00000000 00000000 00000000 00000101 a = a ^ b ; // a->00000000 00000000 00000000 00001111 b = b ^ a ; // b->00000000 00000000 00000000 00001010 a = a ^ b ; // 00000000 00000000 00000000 00000101 cout << "after swap a,b a:" << a << "\t" << "b:"<<b <<endl; return 0; }
C语言的几个输入输出函数
#include <stdio.h>
getchar(),putchar()
scanf(),printf()
1->getchar()与scanf()唯一的区别是getchar()不会跳过'\n'或者空格,例如如下
#include <stdio.h> #include <stdlib.h> int main() { int ch; int a,b; printf("enter a char ,enter to quit\n"); while((ch=getchar()) != '\n' ) { if (scanf("%d %d",&a,&b)!=2) break; printf("you enter the %c %d %d\n",ch,a,b); // getchar();//the ch a b enter complete will leave a '\n' while(getchar() != '\n') // GNU BOOK always use this { continue; } printf("PLEASE ENTER ANOTHER CHAR \n"); } exit(0); }
如果没有while循环中的while(getchar() != '\n') ,那么程序输入一轮直接结束,原因是scanf()会把回车 放到输入队列。所以要剔除输入的回车
2->如何确定输入类型
scanf()返回值是其成功读入的项目个数。比如scanf("%d %d",&a,&b)==2
如下面代码,如果输入q,则state=0
int main() { int input; int state = scanf("%d",&input); printf("state = %d,and input value is %d,",state,input); exit(0); }
输入输出大集合:
char temp[81]; printf("Please enter your first name\n"); // STDIN //scanf("%s",temp); // jump backspace //fscanf(stdin,"%s",temp); // jump backspace fgets(temp,81,stdin); // do not jump backspace //gets(temp); // do not jump backspace // STDOUT //printf("You enter the strings -> : %s\n",temp); //fprintf(stdout,"You enter the strings -> : %s\n" ,temp); //fputs(temp,stdout); puts(temp); // CHAR putchar() getchar() //getc(FILE*) putc(char,FILE*) FILE *in; FILE *out; in = fopen("test.txt","r"); if(in==NULL){return;} out = fopen("test.txt","w"); if(out==NULL){ return;} int ch; while((ch=getc(in))!=EOF) // COPY DATA PER CHAR { putc(ch,out); }
宏定义:
#include <stdio.h> #define PSQR(x) printf("Value squre of "#x" is %d \n",(x*x)); #define XNAME(n) x##n #define SIZE "HOUDINI" #ifdef SIZE // if define the SIZE #define SIZE "MAYA" #endif #ifdef __GNUC__ //if define the __GUNC__ #define HOUDINI 2 #else #define HOUDINI 3 #endif #ifndef __SIZEOFINT__ // becuase __SIZEOFINT__ do not define,that "if not define the __SIZEOFINT__" #define __SIZEOFINT__ sizeof(int) // so can arrive this code #endif #define NOFLOAT 1 #if NOFLOAT == 1 //check NOFLOAT equal 1,then #include<float.h> #include <float.h> #elif NOFLOAT == 2 #include <typeinfo.h> #elif NOFLOAT == 3 #include <typeinfo.h> #else #include <stdarg.h> #endif #if defined(NOFLOAT) // if define NOFLOAT ------ same as #ifdef NOFLOAT #define A 2 #endif int main(int argc, char *argv[]) { printf("Hello World!\n"); PSQR(2*4); char name[20]; fprintf(stdout,"enter the name\n"); fgets(name,20,stdin); int i=0; return 0; }
定义一个简单的宏:
#define GARRSERT(EXP) \ {\ if(EXP != 1)\ {\ printf("Assert expression "#EXP " ERROR %s IN %d line \n",__FILE__,__LINE__);\ exit(0);\ }\ }
GARRSERT(3>5);
strycpy strlen
#include <stdio.h> #include <stddef.h> void gstrcpy(char *dst,char const *str); void gstrcpy2(char *dst, char const *str); size_t gstrlen(char *str); int main() { char *src = "houdini"; char dst[8]={'\0'}; gstrcpy(dst,src); printf("get final str %s \n" , dst); return 0; } void gstrcpy(char *dst, char const *str) { while( 1 ) { *dst++ = *str++; if(*dst != '\0') break; } } void gstrcpy2(char *dst, char const *str) { while((*dst++ = *str++) !='\0'); } size_t gstrlen(char *str) { int length; for(length=0;*str++ != '\0';length+=1); return length; }
3,C++ 标准输入cin, getline(),cin.get() ;
#include <iostream> #include <cstring> using namespace std; #define FLUSH_BUFFER()\ while(cin.get()!='\n') \ {\ continue;\ }\ int main() { char info[100]; cout << "\n**use cin>>info\n"; cin >> info; // read a word,and leave other to the buffer ,include '\n',but no whitespace cout << "==use cin>>info: " <<info << " It's Length: " <<strlen(info)<<endl; FLUSH_BUFFER(); cout << "\n**cin.getline(info,100)\n"; cin.getline(info,100); // read a line,discard '\n' cout << "==use cin.getline(info,100):" << info <<endl; cout << "\n**cin.get(info,100)\n"; cin.get(info, 100); // read a line ,but leave the '\n' to buffer cout << "==use cin.get(info,100): " << info << std::endl; FLUSH_BUFFER(); cout<< "\n**next use the String\n"; string stuff; cin>>stuff; //read a word ,leave \n,but no whitespace cout << "==use cin>>stuff: " << stuff << std::endl; FLUSH_BUFFER(); cout<< "\n**next use the getline(cin.stuff)\n"; getline(cin,stuff); // read a line,discard '\n' cout << "==use getline(cin,stuff) " << stuff << std::endl; char fname[10]; string lname; cin >> fname; // if input size > 9 , could be a problem cin >> lname; // can read long long word // C++ Style : operator>>(cin,fname); return 0; }
4,
(1)字符串分析,函数指针)
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <vector> #include <omp.h> #include <sstream> #include <string.h> #include <algorithm> using namespace std; namespace PARSE_STRING { inline int start_with(string &input,string startwith) { if(startwith.size()>input.size()) { return 0; } int state = 0; for(int i=0;i<startwith.size();i++) { if(input[i]!=startwith[i]) { state = -1; } } if(state==0) { return 1; } } inline string int_to_str(int value) { char str[10]; sprintf(str,"%d",value); string final(str); return final; } inline string str_to_pad(string str,int pad) { string prefix="0000000"; string cnt_str = prefix + str; string final = cnt_str.substr(cnt_str.size()-pad,cnt_str.size()); return final; } } namespace GLY_FUNCTION_POINTER { void test() { cout << "test with no arguments\n"; } void test2(int a) { cout << "test with one arguments "<< a <<"\n"; } void* test3() { cout << "test with no argumetens and return pointer"<<"\n"; int a =10; return (void*)&a; } void *test4(int b) { cout <<"test with one arguments and return pointer" << "\n"; return (void*)&b; } void test_pointer_func() { typedef void (*pf)(); pf _func_01 = test; _func_01(); typedef void (*pf_one)(int); pf_one _func_02 = test2; _func_02(2); typedef void * (*pf_sce)(); pf_sce _func_03 = test3; cout << *((int*)_func_03()) << endl; typedef void * (*pf_sce_one)(int); pf_sce_one _func_04 = test4; cout << *((int*)_func_04(5)) <<endl; } } void heap_test() { int ia[9]={0,1,2,3,4,8,9,3,5}; vector<int> ivec(ia,ia+9); for(int i=0;i<ivec.size();i++) { cout << "i :" << i << " -> value:" << ivec[i] << endl; } make_heap(ivec.begin(),ivec.end()); cout << "----\n"; for(int i=0;i<ivec.size();i++) { cout << "i :" << i << " -> value:" << ivec[i] << endl; } cout << "----\n"; pop_heap(ivec.begin(),ivec.end()); for(int i=0;i<ivec.size();i++) { cout << "i :" << i << " -> value:" << ivec[i] << endl; } } void convert_data() { int a = 10; void *data = (void*)&a; int b = *(int *)data; cout << b <<endl; } void reverse_the_container() { vector <int> aaa; aaa.push_back(1); aaa.push_back(2); aaa.push_back(3); //std::reverse(aaa.begin(),aaa.end()); // this is use the algorithm.h ,aaa will changed //cout << aaa[0] <<endl; for(vector<int>::const_reverse_iterator iter=aaa.rbegin();iter!=aaa.rend();++iter) // aaa do not change cout<<*iter<<endl; } void transfer_data(void *data,int length) { for(int i=0;i<length;i++) { cout << ((int*)data)[i] << endl; } } struct myarray { vector <int> data; }; void transfer_struct(void *data) { cout<<"transfer_struct "<<data<<endl; myarray rh_array = *(myarray*)data; for(int i=0;i<rh_array.data.size();i++) { cout<< rh_array.data[i] << endl; } } template <typename T> struct gly_array { vector <T> data_array; }; template <typename T> void transfer_struct_template(gly_array<T> rh_array) { for(int i=0;i<rh_array.data_array.size();i++) { cout<< rh_array.data_array[i] << endl; } } int main() { myarray _array; _array.data.push_back(10); _array.data.push_back(11); cout<< "main "<<&_array<<endl; transfer_struct((void*)&_array); cout<< "template "; gly_array<int> int_array; int_array.data_array.push_back(10); int_array.data_array.push_back(11); int_array.data_array.push_back(12); cout << &int_array<<endl; transfer_struct_template(int_array); }
(2)point
namespace test_struct_define { struct Point3d { float x; float y; float z; }; #define XSET(P,xval,yval,zval)\ {\ P.x=xval;\ P.y=yval;\ P.z=zval;\ } inline ostream& operator <<(ostream &os,const Point3d &pt) { os << "X:VALUE->"<<pt.x << " Y:VALUE->"<< pt.y << " Z:VALUE->" <<pt.z<<endl; return os; } int main() { Point3d pt; XSET(pt,1,2,3); cout<< pt <<endl; } } template <typename T> class GLY_POINT_3d { public: GLY_POINT_3d(T x=0.0,T y=0.0,T z=0.0):_x(x),_y(y),_z(z) { } T x() const { return _x; } T y() const { return _y; } T z() const { return _z; } friend ostream&operator<<(ostream &os,const GLY_POINT_3d <T> &pt) { os<< pt.x()<< " "<< pt.y()<<" " << pt.z(); return os; } T &operator [](int index) { assert(index<3); if(index==0) { return _x; } if(index==1) { return _y; } if(index==2) { return _z; } } private: T _x; T _y; T _z; }; int main() { GLY_POINT_3d <int> pt(1,2,3); cout << pt<<endl; cout << pt[0] <<endl; cout << pt[1] <<endl; cout << pt[2] <<endl; }