C
Table of Contents
1. Program
1.1. Decimal to Binary Octal Hexdecimal char
#include <stdio.h> int main( ) { int a = 80; printf("the input a is %d\n",a); printf("converse to 8 base is %#o\n", a); printf("converse to 16 base is %#X\n", a); printf("converse to char is %c\n", a); return 0; }
the input a is 80 converse to 8 base is 0120 converse to 16 base is 0X50 converse to char is P
1.2. Primzahl filter
#include<stdio.h> #include"math.h" int main( ) { int i; int j; for (i = 2; i < 10; i++) { int temp = (int)sqrt(i); for (j = 1; j <= 1000; j++) { if (j != 1 && i%j == 0 ) { break; }else { if (j == temp) { printf("%d \n",i); break; } } } } return 0; }
1.3. itoa
atoi, 如有非数字字符,就为0 itoa , 非ASCII标准函数库,看collection.
#include <stdio.h> #include <stdlib.h> char* itoa(int val, int base){ static char buf[32] = {0}; int i = 30; for(; val && i ; --i, val /= base) buf[i] = "0123456789abcdef"[val % base]; return &buf[i+1]; } int main(int argc, char *argv[]) { int a = 100; char* str = itoa(a, 8); printf("%s \n",str); return 0; }
1.4. each time only reserive 3 agruments
- Each time ask default 3 agreements, less is ok, the more will be ignored.
- scanf("%s", a); can't deal with more agreements. the more will be read next time
- scanf("%[^\n]", a); can't deal with less agreements,
because without \n, I don't know where to stop
- scanf("c%",a); can use '\n' and ' ' to determine the stop and number of agreements.
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { while(1){ char a[3][10] = {"", "", ""}; char b[100]; scanf("%[^\n]", b); printf("b is %s\n", b); int j = 0; int i = 0; do{ int k = 0; do{ a[j][k] = b[i]; i++; k++; }while(b[i] != ' '); printf("a[%d] iooooos %s\n", j, a[j]); j++; i++; } while (j<3); scanf("%*[^\n]"); scanf("%*c"); } // return 0; }
1.5. SortingGiveNumbersWithExchangeSortedDirection
1.6. milisecond time
#include <sys/time.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #define N 1000000 int current_timestamp() { struct timeval te; gettimeofday(&te, NULL); // get current time int milliseconds = te.tv_sec*1000 + te.tv_usec/1000; // calculate milliseconds return milliseconds; } int main(int argc, char *argv[]) { float arr[N]; float summation; int start, stop; for (int i = 0; i < N; ++i) { arr[i] = rand() % 100 / (float)100 ; } start = current_timestamp(); for (int i = 0; i < N; ++i) { summation += arr[i]; } stop = current_timestamp(); printf("Summation is %f, using time %d ", summation, stop-start); return 0; }
gcc task1_q1.c -o task1_q1 ./task1_q1
Summation is 494979.375000, using time 4
2. Point&array
2.1. pointer assignment
2.1.1. int *c
only exits *c, if assige 1 to c, segment default
int *c; printf("format string is %d, %d, %d\n" , *c, c, &c); *c = 101; printf("format string is %d, %d, %d\n" , *c, c, &c);#+end_src #+RESULTS: : format string is 1, -1754099728, -1754099984 : format string is 101, -1754099728, -1754099984 segment default for this #+begin_src C :results output int *c; printf("format string is %d, %d, %d\n" , *c, c, &c); c = 101; printf("format string is %d, %d, %d\n" , *c, c, &c);
2.1.2. int * c = 100
only exit c, if access to *c, segment default
int *cc = 100; printf("format string is %d, %d\n" , cc, &cc); cc = 101; printf("format string is %d, %d\n" , cc, &cc);
assign a address, all exits now
2.1.3. point to pass
void output(int *t){ printf("%d\n", *t ); (*t)++; } int c = 1; printf("c : %d\n",c ); for (int i = 0; i< 10; i++){ output(&c); } printf("c : %d\n",c );
void output(int t[2]){ printf("%d\n", t[1] ); (t[1])++; t[0] = 100; } int c[2] = {1,2}; printf("c[1] : %d\n",c[1] ); for (int i = 0; i< 10; i++){ output(c); } printf("c[0] : %d\n",c[0] ); printf("c[1] : %d\n",c[1] );
2.1.4. reference to pass not to that
void output(int &t){ printf("%d\n", t ); t++; } int a = 10; printf("a : %d\n",a ); for (int i = 0; i< 10; i++){ output(a); } printf("a : %d\n",a );
2.1.5. char *ptr;
all exist
char *ptr ; printf("format string %d is %s at %d \n" , *ptr, ptr, &ptr); ptr = "lko"; printf("format string is %s \n" , ptr);
all exist
char *ptrr = "ok"; printf("format string %d is %s at %d \n" , *ptrr, ptrr, &ptrr); ptrr = "lko"; printf("format string is %s \n" , ptrr);
2.2. pointer and array description
*p = a[n] | p | a |
---|---|---|
the first Value | *p / p[0] | *a / a[0] |
the n-th Value | *(p+n)/ p[n] | *a+n/ a[n] |
the first Address | p / | a / &a[0] |
the n-th Address | p+n / | &a[n] |
在传递过程中, 数组的传递可以用指针来接受, 指针的传递可以用数组来接受,但必须是指针类型的数组
#include <iostream> int main(){ int a[]={1,2,3,4,5}; int *p = a; printf("Print this hallo!\n"); printf("for value\n"); printf("%d\n",*p); printf("%d\n",*a); printf("%d\n",a[0]); printf("%d\n",p[0]); printf("nihao :%d\n",*(p+1)); printf("%d\n",*a+1); printf("%d\n",a[1]+1); printf("%d\n",p[1]+1); printf("for address:\n"); printf("%d\n",p); printf("%d\n",a); printf("%d\n",&a[0]); printf("%d\n",p+2); printf("%d\n",&a[2]); printf("%c\n","0123456789abcdef"[3]); char *list = "0123456789abcdef"; printf("%s\n",&list[10]); return 0; }
Print this hallo! for value 1 1 1 1 nihao :2 2 3 3 for address: -1472166160 -1472166160 -1472166160 -1472166152 -1472166152 3 abcdef
2.3. 2orderPoint assignment to *
2 order Point assignment to (*a, a, &a)
#include <stdio.h> void Point2order(int **a){ printf("**a : %d\n",**a ); printf("*a : %d\n",*a ); printf(" a : %d\n", a ); printf("&a : %d\n",&a ); printf("\n"); int *z = *a; printf(" int *z = *a : if z = *a\n"); printf("z : %d\n", z ); printf("*a : %d\n", *a ); printf("if *z = **a\n"); printf("*z :%d\n", *z ); printf("**a:%d\n", **a ); printf("\n"); int *y = a; printf(" int *y = a : if y = a\n"); printf("y : %d\n", y ); printf("a : %d\n", a ); printf("if *y = *a\n"); printf("*y : %d\n", *y ); printf("*a : %d\n", *a ); printf("\n"); int *x = &a; printf(" int *x = &a : if x = &a\n"); printf("x : %d\n", x ); printf("&a : %d\n", &a ); printf("if *x = *(&a)\n"); printf("*x : %d\n", *x ); printf("*&a: %d\n", *(&a) ); } int main(int argc, char *argv[]) { int aa[] = {10,20,30}; int *a = aa; Point2order(&a); return 0; }
**a : 10 *a : 1886852988 a : 1886852976 &a : 1886852904 int *z = *a : if z = *a z : 1886852988 *a : 1886852988 if *z = **a *z :10 **a:10 int *y = a : if y = a y : 1886852976 a : 1886852976 if *y = *a *y : 1886852988 *a : 1886852988 int *x = &a : if x = &a x : 1886852904 &a : 1886852904 if *x = *(&a) *x : 1886852976 *&a: 1886852976
2.4. Important
#include <stdio.h> int main(){ int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}; int(*p)[4]; int i,j; p=a; for(i=0; i<3; i++){ for(j=0; j<4; j++) printf("%2d ",*(*(p+i)+j)); printf("\n"); } printf("\n"); int *m[4] = {a[0],a[1],a[2],a[3]}; for(i=0; i<3; i++){ for(j=0; j<4; j++) printf("%2d ",*(*(m+i)+j)); printf("\n"); } return 0; }
0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 4 5 6 7 8 9 10 11
2.5. * assignment to 2orderPoint
char / int 数组/指针数组 to 二级指针 [] > * > + *(p+1)== p[1] and *p+1 == (*p)+1
#include <stdio.h> void funaa(char **p){ printf("address mani after 2\n"); printf("funaa : %c\n", *p[0] ); } void funbb(int **p){ printf("address mani after 2\n"); printf("funbb : %d\n", *p[0] ); } void funa(char **p){ printf("value mani: \n"); printf("funa: the first %c\n", **p ); printf("funa: the third %c\n", *( (*p+1) +1) ); char *pa = *p+2; funaa(&pa); } void funb(int **p){ printf("\n"); printf("value mani: \n"); printf("funb: the first %d\n", **p ); printf("funa: the third %d\n", *( (*p+1) +1) ); int *pa = *p +2; funbb(&pa); } void funChar2OrderPoint(char ** p){ printf("\n"); printf("point arrar[0][0]:%c\n", *( *(p+0) +0) ); printf("point arrar[0][1]:%c\n", p[0][1] ); printf("point arrar[0][2]:%c\n", *( *(p+0) +2) ); printf("point arrar[1][0]:%c\n", *( *(p+1) +0) ); printf("point arrar[1][1]:%c\n", *( *(p+1) +1) ); printf("point arrar[1][2]:%c\n", *( *(p+1) +2) ); printf("point arrar[2][0]:%c\n", *( *(p+2) +0) ); printf("point arrar[2][1]:%c\n", *( *(p+2) +1) ); printf("point arrar[2][2]:%c\n", *( *(p+2) +2) ); } void funInt2OrderPoint(int ** p){ printf("\n"); printf("point arrar[0][0]:%d\n", *( *(p+0) +0) ); printf("point arrar[0][1]:%d\n", *( *(p+0) +1) ); printf("point arrar[0][2]:%d\n", p[0][2] ); printf("point arrar[1][0]:%d\n", *( *(p+1) +0) ); printf("point arrar[1][1]:%d\n", *( *(p+1) +1) ); printf("point arrar[1][2]:%d\n", *( *(p+1) +2) ); printf("point arrar[2][0]:%d\n", *( *(p+2) +0) ); printf("point arrar[2][1]:%d\n", *( *(p+2) +1) ); printf("point arrar[2][2]:%d\n", *( *(p+2) +2) ); } int main(int argc, char *argv[]) { /* char 一维数组转二级指针 */ char a[] ="1234567"; char *pa = a; funa(&pa); /* int 一维数组转二级指针 */ int b[] = {1,2,3,4,5,6,7}; int *pb = b; funb(&pb); /* char 指针数组转二级指针 */ char a1[] ="123"; char a2[] = "456"; char a3[] = "789"; char *chara [] = {"123", "456", "789"}; char **poa = chara; funChar2OrderPoint(poa); printf("\n"); printf("%s\n", *chara+2 ); printf("%s\n", *chara+1 ); printf("%s\n", *chara ); printf("\n"); printf("%s\n", chara[0] ); printf("%s\n", chara[1] ); printf("%s\n", chara[2] ); printf("\n"); printf("%c\n", chara[1][2] ); printf("%c\n",*( chara[1] +2) ); printf("%c\n",*( *(chara+1) +2) ); /* int 指针数组转二级指针 */ int b1[] = {1,2,3}; int b2[] = {4,5,6}; int b3[] = {7,8,9}; int *intb [3] = {b1, b2, b3}; int **pob = intb; funInt2OrderPoint(pob); printf("\n"); printf("如果打开评论,可以执行,但是会报警告,结果是对应元素的地址\n"); // printf("%d\n", *intb+2 ); //&3 // printf("%d\n", *intb+1 ); //&2 // printf("%d\n", *intb ); //&1 // printf("\n"); // printf("%d\n", intb[0] ); //&123 // printf("%d\n", intb[1] ); //&456 // printf("%d\n", intb[2] ); //&789 printf("\n"); printf("%d\n", intb[1][2] ); printf("%d\n",*( intb[1] +2) ); printf("%d\n",*( *(intb+1) +2) ); return 0; }
2.6. Summary
1 | 3 | 2 | 4 | |
---|---|---|---|---|
Form | char *argv[] | int *a3[] | int *a2 | int a4[][2] |
传递时时参 | argv | a3 | &a2 | a4 |
接收时形参 | char **p1 | int **p3 | int **p2 | int(*p4)[2] |
argv[1][2] | a3[0][1] | a2[2] | a4[1][0] | |
p1[1][2] | p3[0][1] | p2[0][2] | p4[1][0] |
*(*(p+1)+2) | *(*(p+0)+1) | *(*(p+0)+2) | *(*(p+1)+0) |
#include <stdio.h> int main(int argc, char *argv[]) { char **p1 = argv; printf("%c \n", argv[1][2] ); printf("%c \n", p1[1][2] ); printf("%c \n", *(*(p1+1)+2) ); int b2[] = {1, 2, 3, 4, 5}; int *a2 = b2; int **p2 = &a2; printf("%d \n", a2[1] ); printf("%d \n", *(a2+1) ); printf("%d \n", p2[0][1] ); printf("%d \n", *(*(p2+0)+1) ); int m[] = {1,2}; int n[] = {3,4}; int *a3[] = {m, n}; int **p3 = a3; printf("%d \n", a3[0][1] ); printf("%d \n", p3[0][1] ); printf("%d \n", *(*(p3+0)+1) ); return 0; int a4[][2] ={{1,2},{3,4}}; int (*p4)[2] = a4; printf("%d \n", a4[1][0] ); printf("%d \n", p4[1][0] ); printf("%d \n", *(*(p4+1)+0) ); }
3. Polymorphism
3.1. C++ 先生成基类实列后再生成子类实例并指向
需要借助虚函数来实现对相应多态函数的调用,在函数前加上virtual
#include <iostream> using namespace std; class Animal { public: Animal(); virtual run(); }; Animal::Animal(){}; void Animal::run(){cout <<"Animal is running"<<endl;} class Dog : public Animal { public: Dog(); virtual run(); }; Dog::Dog(){}; void Dog::run(){cout <<"Dog is running"<<endl;} Animal *p = new Animal; p->run(); p = new Dog; p->run(); //此时的p就是多态变量,但是只有这个变量先由基类生成,再指向子类 //反之时不能的
3.2. Python 可基可子
class Animal(object): def __init__(self): self.name ='Animal name' def run(self): print('Animal is running') class Dog(Animal): def __init__(self): self.name ='Dog name' def run(self): print('Dog is running') # Polymorphism, all Class or instance will be checked the best passing # mothode or character def run_twice(a): a.run() def name(b): print(b.name) ani = Animal() ani.name ani.run() ani = Dog() ani.name ani.run()
## ani 可以先有基类实现再多态映射到子类,也可以反向实现
Python 3.7.4 (default, Aug 13 2019, 20:35:49) [GCC 7.3.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. Animal is running Dog is running Cat is running Dog is running Animal name Dog name Dog name python.el: native completion setup loaded
3.3. Java 子类实列指向父类引用
在向上转型后,就可以调用在所有子类中的同名函数
class Figure { double dim1; double dim2; Figure(double d1, double d2) { // 有参的构造方法 this.dim1 = d1; this.dim2 = d2; } double area() { // 用于计算对象的面积 System.out.println("父类中计算对象面积的方法,没有实际意义,需要在子类中重写。"); return 0; } } class Rectangle extends Figure { Rectangle(double d1, double d2) { super(d1, d2); } double area() { System.out.println("长方形的面积:"); return super.dim1 * super.dim2; } } class Triangle extends Figure { Triangle(double d1, double d2) { super(d1, d2); } double area() { System.out.println("三角形的面积:"); return super.dim1 * super.dim2 / 2; } } public class Test { public static void main(String[] args) { Figure figure = new Rectangle(9, 9); System.out.println(figure.area()); System.out.println("==============================="); figure = new Triangle(6, 8); System.out.println(figure.area()); System.out.println("==============================="); figure = new Figure(10, 10); System.out.println(figure.area()); } }
4. Scanf
4.1. input matching for multi input Scanf()
可以直接从控制台接受8, 10, 16 进制的数 只有当控制字符串以格式控制符(%d、%c、%f) 开头时,键入的input才会忽略换行符, 否则输入的空白符就不能忽略了,它会参与匹配过程
4.2. 清空每次输入的所有缓存
scanf("%*[^\n]"); scanf("%*c");
4.3. Scanf(%{*}{width}type)
其中,{ } 表示可有可无。各个部分的具体含义是: type表示读取什么类型的数据,例如 %d、%s、%[a-z]、%[^\n] 等;type 必须有。 width表示最大读取宽度,可有可无。 *表示丢弃读取到的数据,可有可无。
5. hits
5.1. malloc for 2 diamesion
char * commands; commands = (char *)malloc(NUMOFCOM * sizeof(char *)); for (int n = 0; n < NUMOFCOM; n++) commands[n] = (char *)malloc(sizeof(char) * COMLONG);
5.2. reference
1. 如果在函数体中修改了形参的数据,那么实参的数据也会被修改,从而拥有“在 函数内部影响函数外部数据”的效果 2. 不能返回局部数据(例如局部变量、局部对象、局部数组等)的引用,因为 当函数调用完成后局部数据就会被销毁,有可能在下次使用时数据就不存在 了 3. 给引用添加 const 限定后,不但可以将引用绑定到临时数据,还可以将引用 绑定到类型相近的数据,这使得引用更加灵活和通用,它们背后的机制都是 临时变量
5.3. class
1. 基类中的 protected 成员可以在派生类中使用,而基类中的 private 成员不能 在派生类中使用 2. 只有一个作用域内的同名函数才具有重载关系,不同作用域内的同名函数是 会造成遮蔽 3. 如果基类的成员变量被派生类的成员变量遮蔽, 基类成员仍会在实例化时被 创建,也可通过域解析符来访问。 4. 构造函数会被逐级的显示或者默认的在派生类中被调用,并且可以被重载 5. C++ 可以多继承不同的类(多继承和重继承),注意其构造函数的调用和成 员名称冲突,但是可以用域解析符来指明调用 6. 即使是类的private成员,仍能通过创建的对象的地址偏移或者直接利用指针 进行访问。(有点花里胡哨的) 7. C++中虚函数的唯一用处就是构成多态 8. 引用不像指针灵活,指针可以随时改变指向,而引用只能指代固定的对象
5.4. const
const 的作用在C++中和宏很像#defind 函数中const,修饰变量后可以将传入的参数,强制转换为设定的 初始化 const 成员变量的唯一方法就是使用参数初始化 类中的const, 变量,函数, 类, 只能互相承 重要:在头文件中用const修饰全部变量后,就可以多次被引入了而不会出现重 复定义的错
5.5. static
statis 变量, 函数,全部对象可以共用,访问,无this指针。不能调用普通变量和函数类 static 多被用来计数,可以在外部被改
5.6. GDB
can be done in terminal or in Emacs, recommend later one
b | add break point |
run | start the program |
run argv | if argv needed |
n | next |
l | list source code 10 lines |
p | print variables |
s | go into functions |
ignore | pass the break point |
q | exit |
set | set variable |
in emacs, if scanf, the input can not be given in gdb buffer. if it comes to scanf, go to the I/O buffer, and input the value , go back to gdb buffer, just next
5.7. Compile
There are four different kinds of Methods to compile a source file.
5.7.1. Makefile
There is a folder called Makefile, into this folder, and call "make" in terminal, don't forget "make clean" to clean it.
5.7.2. Terminal Compile
In pthreadandpid folder with terminal with "g++/gcc file.c -o file", and then "./file" to call it
5.7.3. Emacs Compile
Also in pthreadandpid folder, open the resource code with Emacs, and then M-x compile(C-z k) call it in minibuffer with : "gcc -pthread createpthread.c -o createpthread && ./createpthread"
6. Literatur programmierung
6.1. pass the agruments to program
在src block 中提前定义:var a = 3 javac test.java && echo 1 |java test 可以将1向StdInt传入 gcc test.c && echo 1 | ./a.out 可以将1向scanf("%d", &a)传入的a
6.2. Beispile
int b[] = {b1, b2, b3}; printf("niiiiilhakkko\n"); printf("%d\n", input); printf("%d\n", b2); for(int i = 0; i<3;i++){ printf("%d", b[i]); }
niiiiilhakkko 23 1 013