《C++ Primer Plus(第六版)》(第七章 函数 笔记和答案)

1.ANSI C是C语言的标准,任何C语言的编译器都在ANSI C的基础上扩充。

ANSI C几乎不能完成任何程序的开发。TC、VC等都对ANSI C进行了扩充,加入了自己的规则和库之类的。

对于函数头:

void fun();
  
  
在ANSI C中,意味着不指出参数,后面定义参数列表。

而C++则是表示没有函数,要是想不指出参数表,应该用省略号

void fun(...);
  
  


2.C++标准使用参数(argument)来表示实参,使用参量(parameter)来表示形参


3.带const的二级指针和非const的一级指针混合使用的时候将不安全,先看个代码


  
  
  1. const int **pp2;
  2. int * p1;
  3. const int n = 13;
  4. pp2 = &p1; //这里会报错,如果这里成功的话,
  5. *pp2 = &n;
  6. *p1 = 10; //这里就修改了常量
会报错:

 
 

error C2440: “=”: 无法从“int **”转换为“const int **”

所以:当且仅当只有一层间接关系的时候(如指针指向基本数据类型)时,才可以将非const的地址或者指针赋值给const指针。

4.指向常量的指针,是可以改变指针指向的地址。


  
  
  1. int a = 1;
  2. int b = 2;
  3. const int * p = &a;
  4. p = &b; //这个是合法的,当然不能通过p修改a和b的值。
  5. int* const p2 = &a;
  6. p2 = &b; //这个不合法,不能修改指针的内容

5.C++不允许main()调用自己。C好像可以


6.函数也有指针,函数的名字就是它的指针


  
  
  1. int fun()
  2. {
  3. return 0;
  4. }
  5. void CChapter2Answer::answer()
  6. {
  7. cout << fun << endl;
  8. }


这样输出的就是函数的指针。怪不得函数名不能跟变量名相同。

要指向函数的指针,要编写对应的函数原型的指针。
因为C++是强类型语言,所以把函数地址作为参数传递到别的函数中,是非常麻烦的。怪不得这么少见,而Lua这种弱类型语言则到处都是这种处理。

看了书上的介绍,函数指针真的挺繁琐,但是因为这本书是基础的,所以没有提到在哪里比较有用。


7.12复习题


1.定义函数,提供原型,调用函数,(居然不是声明、实现、调用)


2.


  
  
  1. void igor();
  2. float tofu(int i);
  3. double mpg(double a , double b);
  4. long summation(long a[], int num);
  5. double doctor(const char* a);
  6. void ofcourse(boss b);
  7. char* plot(map* m);


3.

  
  
  1. void fun3(int a[], int size, int b)
  2. {
  3. for ( int i = 0; i < size; i++)
  4. {
  5. a[i] = b;
  6. }
  7. }


4.


  
  
  1. void fun4(int a[], int b[], int c)
  2. {
  3. for ( int* i = a; i != b; i++)
  4. {
  5. *i = c;
  6. }
  7. }
  8. void CChapter2Answer::answer()
  9. {
  10. int a[ 8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
  11. fun4(a, a + 8, 1);
  12. }

5.

  
  
  1. double fun5(const double a[], int b )
  2. {
  3. double md = 0;
  4. for ( int i = 0; i < b; i++)
  5. {
  6. if (i == 0)
  7. {
  8. md = a[i];
  9. }
  10. else if (md < a[i])
  11. {
  12. md = a[i];
  13. }
  14. }
  15. return md;
  16. }
  17. void CChapter2Answer::answer()
  18. {
  19. double a[ 8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
  20. cout << fun5(a, 8 ) << endl;
  21. }


6.将const限定符用于指针,以防止指向的原始数据被修改。程序传递的基本类型时,将按值传递,函数使用副本。修改对原始数据没有影响。


7.char* a,char a[],带”“的字符串常量


8.


  
  
  1. double replace(char * str, char c1, char c2 )
  2. {
  3. int count = 0;
  4. while (*str != 0)
  5. {
  6. if (*str == c1)
  7. {
  8. *str = c2;
  9. ++count;
  10. }
  11. ++str;
  12. }
  13. return count;
  14. }
  15. void CChapter2Answer::answer()
  16. {
  17. char str[ 80] = "fsajasdaaffafsaaereacsd"; //这里用char*,在函数里面赋值的时候就报错了。
  18. replace(str, 'a', 'l');
  19. }
写这个让我明白,char*和char[]还是有所不同的。用char*等于一个字符串常量的时候,这里面的东西是不能修改的。

用char[]的时候,自己保存了一份内存,可以修改。


9.字符串可以看做它本身的地址,也是第一个字符的地址。所以*”pizza”的值是p,”taco”[2]则是c


  
  
  1. cout << * "pizza" << endl;
  2. cout << "taco"[ 2] << endl;
结果:

p

c


10.值传递会构建一个副本,单其实这个副本是浅复制的,如果结构里面的属性是指针,也只是复制了地址。如果不允许修改,可能会被改了内容。

指针传递的话修改了肯定会改到的。所以对于函数,很少值传递一个结构的。复制也要花时间和空间啊。


  
  
  1. struct STest
  2. {
  3. int a;
  4. int b;
  5. };
  6. int funA( STest a )//值传递
  7. {
  8. return a.a + a.b;
  9. }
  10. int funB(STest* b)//地址传递
  11. {
  12. return b->a + b->a;
  13. }
  14. void CChapter2Answer::answer()
  15. {
  16. STest c;
  17. funA(c);
  18. funB(&c);
  19. }

11.


  
  
  1. int fun(const char* a)
  2. {
  3. return 1;
  4. }
  5. int (*funptr)( const char* a);
int judge(int (*funpter)(const char* a));

  
  

12.


  
  
  1. struct applicant
  2. {
  3. char name[ 30];
  4. int credit_ratings[ 3];
  5. };
  6. void printInfo(applicant a)
  7. {
  8. cout << a.name << endl;
  9. for ( int i = 0; i < 3; ++i)
  10. {
  11. cout << a.credit_ratings[i] << endl;
  12. }
  13. }
  14. void printInfoEx(applicant* a)
  15. {
  16. cout << a->name << endl;
  17. for ( int i = 0; i < 3; ++i)
  18. {
  19. cout << a->credit_ratings[i] << endl;
  20. }
  21. }
  22. void CChapter2Answer::answer()
  23. {
  24. applicant a = { "Fable Game", { 1001, 2002, 3003 } };
  25. printInfo(a);
  26. printInfoEx(&a);
  27. }

13.其实就是复制一下函数头,然后改一下函数名,并加个括号和星号。


  
  
  1. struct applicant
  2. {
  3. char name[ 30];
  4. int credit_ratings[ 3];
  5. };
  6. void f1(applicant * a);
  7. const char * f2(const applicant * a1, const applicant * a2);
  8. typedef void (*P1)(applicant * a);
  9. typedef const char * (*P2)( const applicant * a1, const applicant * a2);
  10. P1 p1;
  11. P2 p2;
  12. P1 ap[ 5];
  13. P2 pa[ 10];


7.13 编程练习

1.


  
  
  1. double ave(double a, double b)
  2. {
  3. return 2 * a * b / (a + b);
  4. }
  5. void CChapter2Answer::answer()
  6. {
  7. double a = 0;
  8. double b = 0;
  9. cout << "Please enter digit a:";
  10. cin >> a;
  11. cout << "Please enter digit b:";
  12. cin >> b;
  13. while ( a != 0 && b != 0 )
  14. {
  15. double c = ave(a, b);
  16. cout << "the ave of a, b: " << c << endl;
  17. cout << "Please enter digit a:";
  18. cin >> a;
  19. cout << "Please enter digit b:";
  20. cin >> b;
  21. }
  22. }


2.真心没明白为什么要用到3个数组。。。


  
  
  1. void printArr(int a[], int b)
  2. {
  3. for ( int i = 0; i < b; ++i)
  4. {
  5. cout << a[i] << " ";
  6. }
  7. cout << endl;
  8. }
  9. double ave(int a[], int b)
  10. {
  11. double c = 0;
  12. for ( int i = 0; i < b; ++i)
  13. {
  14. c += a[i];
  15. }
  16. return c/b;
  17. }
  18. void CChapter2Answer::answer()
  19. {
  20. const int ARRSIZE = 10;
  21. int a[ARRSIZE] = { 0 };
  22. //输入
  23. int actNum = 0;
  24. for ( int i = 0; i < ARRSIZE; ++i)
  25. {
  26. cout << "Please enter the score:" ;
  27. int c = 0;
  28. cin >> c;
  29. if (c < 0 || ! cin)
  30. {
  31. break;
  32. }
  33. a[i] = c;
  34. ++actNum;
  35. }
  36. if (actNum <= 0)
  37. {
  38. cout << "No data" << endl;
  39. return;
  40. }
  41. //显示
  42. int b[ARRSIZE];
  43. memcpy(b, a, sizeof(a)); //
  44. printArr(b, actNum);
  45. int c[ARRSIZE];
  46. memcpy(c, a, sizeof(a)); //
  47. double d = ave(c, actNum);
  48. cout << "ave: " << d << endl;
  49. }

3.


  
  
  1. struct box
  2. {
  3. char maker[ 40];
  4. float height;
  5. float width;
  6. float length;
  7. float volume;
  8. };
  9. void printInfo(box b)
  10. {
  11. cout << "maker:" << b.maker << endl;
  12. cout << "height:" << b.height << " width:" << b.width << " length:" << b.length << " volume:" << b.volume;
  13. }
  14. void computeVolume(box* b)
  15. {
  16. b->volume = b->height * b->length * b->width;
  17. }
  18. void CChapter2Answer::answer()
  19. {
  20. box b = { "Fable Game", 1, 32, 445, 0 };
  21. computeVolume(&b);
  22. printInfo(b);
  23. }

4.


  
  
  1. long double probalility(unsigned numbers, unsigned picks, unsigned otherTotal)
  2. {
  3. long double result = 1.0;
  4. long double n;
  5. unsigned p;
  6. for (n = numbers, p = picks; p > 0; n--, p--)
  7. {
  8. result = result * n / p;
  9. }
  10. return result * otherTotal;
  11. }
  12. void CChapter2Answer::answer()
  13. {
  14. unsigned total, choices, otherTotal;
  15. cout << "Enter the total number of choice on the game card and\n"
  16. "the number of picks allowed and the other total number of choice:\n";
  17. while (( cin >> total >> choices >> otherTotal) && choices <= total)
  18. {
  19. cout << "You have one chance in ";
  20. cout << probalility(total, choices, otherTotal);
  21. cout << " of winning.\n";
  22. cout << "Next three numbers (q ot quit):";
  23. }
  24. cout << "bye\n";
  25. }

5.


  
  
  1. long long recursion(unsigned number )
  2. {
  3. if (number <= 1)
  4. {
  5. return 1;
  6. }
  7. else
  8. {
  9. return number * recursion(number - 1);
  10. }
  11. }
  12. void CChapter2Answer::answer()
  13. {
  14. unsigned num;
  15. while ( cin >> num )
  16. {
  17. cout << num << "! = " << recursion(num) << endl;
  18. cout << "Next num (q ot quit):";
  19. }
  20. cout << "bye\n";
  21. }

6.



  
  
  1. int fillArray( double a[], int num)
  2. {
  3. cout << "Please enter a double:";
  4. double b;
  5. cin.clear();
  6. cin >> b;
  7. int count = 0;
  8. while ( cin && count < num)
  9. {
  10. a[count] = b;
  11. count++;
  12. cout << "Please enter a double:";
  13. cin >> b;
  14. }
  15. return count;
  16. }

  
  
  1. void showArray(double a[], int num)
  2. {
  3. cout << "show array:" << endl;
  4. for ( int i = 0; i < num; i++)
  5. {
  6. cout << i << " : " << a[i] << endl;
  7. }
  8. }

  
  
  1. void reverseArray(double a[], int num)
  2. {
  3. cout << "reverse array" << endl;
  4. double temp;
  5. for ( int i = 0; i < num - 1 - i; i++)
  6. {
  7. temp = a[i];
  8. a[i] = a[num - 1 - i];
  9. a[num -1 - i] = temp;
  10. }
  11. }

  
  
  1. void CChapter2Answer::answer()
  2. {
  3. const int Size = 20;
  4. double a[Size] = { 0};
  5. int actNum = fillArray(a, Size); //填充数组
  6. showArray(a, actNum); //显示数组
  7. reverseArray(a, actNum); //反转数组
  8. showArray(a, actNum); //显示数组
  9. reverseArray(a + 1, actNum - 2); //反转数组
  10. showArray(a, actNum); //显示数组
  11. }

7.

改之前的代码:


  
  
  1. const int Max = 5;
  2. int fill_array( double ar[], int limit)
  3. {
  4. double temp;
  5. int i;
  6. for (i = 0; i < limit; i++)
  7. {
  8. cout << "Enter value #" << (i + 1) << ": ";
  9. cin >> temp;
  10. if (! cin)
  11. {
  12. cin.clear();
  13. while ( cin.get() != '\n') continue;
  14. cout << "Bad input; input process terminated. \n";
  15. break;
  16. }
  17. else if (temp < 0)
  18. {
  19. break;
  20. }
  21. ar[i] = temp;
  22. }
  23. return i;
  24. }

  
  
  1. void show_array(const double ar[], int n)
  2. {
  3. for ( int i = 0; i < n; i++)
  4. {
  5. cout << "Property #" << i + 1 << ": $" << ar[i] << endl;
  6. }
  7. }

  
  
  1. void revalue(double r, double ar[], int n)
  2. {
  3. for ( int i = 0; i < n; i++)
  4. {
  5. ar[i] *= r;
  6. }
  7. }

  
  
  1. void CChapter2Answer::answer()
  2. {
  3. double properties[Max];
  4. int size = fill_array(properties, Max);
  5. show_array(properties, size);
  6. if (size > 0)
  7. {
  8. cout << "Enter revaluation factor: ";
  9. double factor;
  10. while (!( cin >> factor))
  11. {
  12. cin.clear();
  13. while ( cin.get() != '\n')
  14. {
  15. continue;
  16. }
  17. cout << "Bad input; Please enter a number: ";
  18. }
  19. revalue(factor, properties, size);
  20. show_array(properties, size);
  21. }
  22. cout << "Done. \n";
  23. cin.get();
  24. cin.get();
  25. }
改之后的代码:


  
  
  1. const int Max = 5;
  2. double* fill_array( double ar[], int limit)
  3. {
  4. double temp;
  5. int i;
  6. for (i = 0; i < limit; i++)
  7. {
  8. cout << "Enter value #" << (i + 1) << ": ";
  9. cin >> temp;
  10. if (! cin)
  11. {
  12. cin.clear();
  13. while ( cin.get() != '\n') continue;
  14. cout << "Bad input; input process terminated. \n";
  15. break;
  16. }
  17. else if (temp < 0)
  18. {
  19. break;
  20. }
  21. ar[i] = temp;
  22. }
  23. return ar + i;
  24. }

  
  
  1. void show_array(const double* beginPtr, const double* endPtr)
  2. {
  3. for ( int i = 0; beginPtr + i != endPtr; i++)
  4. {
  5. cout << "Property #" << i + 1 << ": $" << beginPtr[i] << endl;
  6. }
  7. }

  
  
  1. void revalue(double r, double* beginPtr, double* endPtr)
  2. {
  3. for ( int i = 0; beginPtr + i != endPtr; i++)
  4. {
  5. beginPtr[i] *= r;
  6. }
  7. }

  
  
  1. void CChapter2Answer::answer()
  2. {
  3. double properties[Max];
  4. double* endPtr = fill_array(properties, Max);
  5. show_array(properties, endPtr);
  6. if (properties != endPtr)
  7. {
  8. cout << "Enter revaluation factor: ";
  9. double factor;
  10. while (!( cin >> factor))
  11. {
  12. cin.clear();
  13. while ( cin.get() != '\n')
  14. {
  15. continue;
  16. }
  17. cout << "Bad input; Please enter a number: ";
  18. }
  19. revalue(factor, properties, endPtr);
  20. show_array(properties, endPtr);
  21. }
  22. cout << "Done. \n";
  23. cin.get();
  24. cin.get();
  25. }

8.

修改之前的:


  
  
  1. const int Seasons = 4;
  2. const std:: array< std:: string, Seasons> Snames = { "Spring", "Summer", "Fall", "Winter" };
  3. void fill(std::array < double, Seasons> *pa);
  4. void show(std::array<double, Seasons> da);
  5. void CChapter2Answer::answer()
  6. {
  7. std:: array< double, Seasons> expenses;
  8. fill(&expenses);
  9. show(expenses);
  10. cin.get();
  11. cin.get();
  12. }
  13. void fill(std::array< double, Seasons> *pa)
  14. {
  15. for ( int i = 0; i < Seasons; i++)
  16. {
  17. cout << "Enter " << Snames[i] << " expenses:";
  18. cin >> (*pa)[i];
  19. }
  20. }
  21. void show(std::array<double, Seasons> da)
  22. {
  23. double total = 0.0;
  24. for ( int i = 0; i < Seasons; ++i)
  25. {
  26. cout << Snames[i] << ": $"</span> &lt;&lt; da[i] &lt;&lt; <span class="hljs-built_in">endl</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> total += da[i];</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Total Expenses: $" << total << endl;
  27. }


a.


  
  
  1. const int Seasons = 4;
  2. const char* Snames[Seasons] = { "Spring", "Summer", "Fall", "Winter" };
  3. void fill(double pa[], int num);
  4. void show(double da[], int num);
  5. void CChapter2Answer::answer()
  6. {
  7. double expenses[Seasons];
  8. fill(expenses, Seasons);
  9. show(expenses, Seasons);
  10. cin.get();
  11. cin.get();
  12. }
  13. void fill(double pa[], int num)
  14. {
  15. for ( int i = 0; i < num; i++)
  16. {
  17. cout << "Enter " << Snames[i] << " expenses:";
  18. cin >> pa[i];
  19. }
  20. }
  21. void show(double da[], int num)
  22. {
  23. double total = 0.0;
  24. for ( int i = 0; i < num; ++i)
  25. {
  26. cout << Snames[i] << ": $"</span> &lt;&lt; da[i] &lt;&lt; <span class="hljs-built_in">endl</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> total += da[i];</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Total Expenses: $" << total << endl;
  27. }

b.

  
  
  1. const int Seasons = 4;
  2. const char* Snames[Seasons] = { "Spring", "Summer", "Fall", "Winter" };
  3. struct Expenses
  4. {
  5. double e[Seasons];
  6. };
  7. void fill(Expenses* pa);
  8. void show(Expenses* da);
  9. void CChapter2Answer::answer()
  10. {
  11. Expenses e;
  12. fill(&e);
  13. show(&e);
  14. cin.get();
  15. cin.get();
  16. }
  17. void fill(Expenses* pa)
  18. {
  19. for ( int i = 0; i < Seasons; i++)
  20. {
  21. cout << "Enter " << Snames[i] << " expenses:";
  22. cin >> pa->e[i];
  23. }
  24. }
  25. void show(Expenses* da )
  26. {
  27. double total = 0.0;
  28. for ( int i = 0; i < Seasons; ++i)
  29. {
  30. cout << Snames[i] << ": $"</span> &lt;&lt; da-&gt;e[i] &lt;&lt; <span class="hljs-built_in">endl</span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> total += da-&gt;e[i];</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Total Expenses: $" << total << endl;
  31. }

9.


  
  
  1. #include <iostream>
  2. using namespace std;
  3. const int SLEN = 30;
  4. struct Student
  5. {
  6. char fullname[SLEN];
  7. char hobby[SLEN];
  8. int ooplevel;
  9. };

  
  
  1. int getinfo(Student pa[], int n)
  2. {
  3. int count = 0;
  4. for ( int i = 0; i < n; ++i)
  5. {
  6. cout << "Please enter student name:";
  7. cin.getline(pa[i].fullname, 80);
  8. if ( strcmp(pa[i].fullname, "") == 0)
  9. {
  10. break;
  11. }
  12. cout << "Please enter student hobby:";
  13. cin.getline(pa[i].hobby, 80);
  14. cout << "Please enter student ooplevel:";
  15. cin >> pa[i].ooplevel;
  16. cin.get();
  17. count++;
  18. }
  19. return count;
  20. }

  
  
  1. void display1(Student st)
  2. {
  3. cout << "student[ name: " << st.fullname << " hobby: " << st.hobby << " ooplevel: " << st.ooplevel << "]\n";
  4. }

  
  
  1. void display2(const Student* ps)
  2. {
  3. cout << "student[ name: " << ps->fullname << " hobby: " << ps->hobby << " ooplevel: " << ps->ooplevel << "]\n";
  4. }

  
  
  1. void display3(const Student pa[], int n)
  2. {
  3. for ( int i = 0; i < n; ++i)
  4. {
  5. display2(pa + i);
  6. }
  7. }

  
  
  1. int main()
  2. {
  3. cout << "Enter class size: ";
  4. int class_size;
  5. cin >> class_size;
  6. while ( cin.get() != '\n')
  7. {
  8. continue;
  9. }
  10. Student* ptr_stu = new Student[class_size];
  11. int entered = getinfo(ptr_stu, class_size);
  12. for ( int i = 0; i < entered; i++)
  13. {
  14. display1(ptr_stu[i]);
  15. display2(&ptr_stu[i]);
  16. }
  17. display3(ptr_stu, entered);
  18. delete[] ptr_stu;
  19. cout << "Done\n";
  20. return 0;
  21. }

10.


  
  
  1. #include <iostream>
  2. using namespace std;
  3. double add(double a, double b)
  4. {
  5. cout << a + b << endl;
  6. return a + b;
  7. }

  
  
  1. double sub(double a, double b)
  2. {
  3. cout << a - b << endl;
  4. return a - b;
  5. }

  
  
  1. double mul(double a, double b)
  2. {
  3. cout << a * b << endl;
  4. return a * b;
  5. }

  
  
  1. double div(double a, double b)
  2. {
  3. cout << a / b << endl;
  4. return a / b;
  5. }

  
  
  1. double calculate(double a, double b, double(*fun)(double, double))
  2. {
  3. return fun(a, b);
  4. }

  
  
  1. int main()
  2. {
  3. double(*pf[ 4])( double, double) = { add, sub, mul, div };
  4. double a, b;
  5. cout << "Please enter a:";
  6. cin >> a;
  7. cout << "Please enter b:";
  8. cin >> b;
  9. while ( cin && b != 0)
  10. {
  11. for ( int i = 0; i < 4; ++i)
  12. {
  13. calculate(a, b, pf[i]);
  14. }
  15. cout << "Please enter a:";
  16. cin >> a;
  17. cout << "Please enter b:";
  18. cin >> b;
  19. }
  20. return 0;
  21. }

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值