第一天的学习

时间:2021-02-28 00:48:35

string类的成员函数c_str()

c_str()函数原型:const char *c_str(void)

c_str()函数功能: 当程序用到atoi()、strcpy()这类的C函数时要求参数为char*型,就要将string类字符串转换成char型字符串;(string是个类,char是个常规类型)

c_str()函数实现:

 1 #include <iostream>
2 using namespace std;
3
4 //定义一个简易的string类,实现将传进来的任意类型的字符串 储存到 char*指针指向的空间里
5 class my_string
6 {
7 public:
8 my_string(const char* str = nullptr)
9 {
10 if(nullptr == str) //写判断语句时常量要写在前面,以减少出错(万一少些一个 '=' 系统会报错)
11 {
12 data = nullptr;
13 }
14 else
15 {
16 data = new char[strlen(str)+1]; //+1 是因为有 '\0'
17 strcpy(data,str); //只能strcpy(char* dest,const char* src)这一种参数形式
18 }
19 }
20 const char* c_str(void)
21 {
22 return data;
23 }
24 private:
25 char* data; // 用于储存 char* 字符串
26 };
27 int main(void)
28 {
29 my_string s("hello world!");
30 cout << s.c_str() << endl;
31 return EXIT_SUCCESS;
32 }

 

上式代码中有提到的strcpy,

strcpy()函数原型char* strcpy(char *dest, const char *src)

strcpy()函数功能:复制两个char型字符串,而且他们可以是空,但不可以指向一个地址不然达不到想要的效果(memcpy可以复制两个指向一个地址空间的变量/类/结构体)

strcpy()函数实现

1 char *my_strcpy(char *dest, const char *src)
2 {
3 char *ret = dest;
4 while(( *(dest++) = *(src++) ) != '\0');
5 return ret;
6 }

 

memcpy()函数原型:void *memcpy(void *dest,const void *src,size_t size)

memcpy()函数功能:从源src指向的内存地址的起始位置开始 拷贝size个字节到 目标dest所指的内存地址的起始位置中

memcpy()函数实现:

 1 void *my_memcpy(void *dest, const void *src,size_t size)
2 {
3 assert(nullptr != dest && nullptr != src);//有些时候只能用 (#define打开调试/#undef关闭调试) #ifdef ...#endif来选择 不同于头文件中的#ifndef..#define..#endif
4 void *ret = dest;
5 if(dest <= src || (char*)dest >= (char*)src + size)//源地址不低于目标地址或不重叠,正常拷贝
6 while(size--)
7 {
8 *(char*)dest == *(char*)src;
9 dest = (char*)dest + 1;
10 src = (char*)src + 1;
11 }
12 else //源地址低于目标地址,高字节向低字节拷贝
13 {
14 dest = (char*)dest + size - 1;
15 src = (char*)src + size - 1;
16 while(size--)
17 {
18 *(char*)dest == *(char*)src;
19 dest = (char*)dest - 1;
20 src = (char*)src - 1;
21 }
22 }
23 return ret;
24 }

 

atoi()函数原型:int atoi(const char *nptr)

atoi()函数功能:char型 字符串数字转化成整形数字,将传进来的字符串数*nptr逐个转化成数字,首先从一个非空白符的数字或者正负号开始,一旦开始遇到非数字结束。

atoi()函数实现:

 1 int my_atoi(const char *nptr)
2 {
3 int integer_sign = 1;
4 int ret_integer = 0;
5 assert(nptr);
6
7 while(isspace((int)*nptr) != 0) //跳过开头的空格符。while(isspace((int)*nptr) != 0)等价于while(isspace(*nptr) != 0) 调用时char型会自动转化成int型
8 {
9 cout << (int)*nptr << endl;
10 ++nptr;
11 }
12
13 if(*nptr == '-') //储存符号
14 integer_sign = -1;
15
16 if(*nptr == '+' || *nptr == '-') //跳过多余的符号
17 ++nptr;
18
19 while(*nptr >= '0' && *nptr <= '9') //开始转化,只接纳数字的转换
20 {
21 ret_integer = ret_integer*10 + *nptr - '0';
22 ++nptr;
23 }
24
25 ret_integer = integer_sign*ret_integer;
26
27 return ret_integer;
28 }

 

上文中提到的isspace函数

isspace函数原型:int isspcae(int _C)

isspace函数功能:检查参数c是否为空格字符,也就是判断是否为空格(' ')、水平定位字符('\t')009、归位键('\r')013、换行('\n')010、垂直定位字符('\v')011或翻页('\f')012的情况。若为空格符返回TRUE(!=0),否则NULL(=0)

isspace函数实现:

1 int my_isspace(int _C)
2 {
3 return (unsigned int)(_C - 9)<5u || _C == ' ';//\t水平制表(HT)009 \n换行(LF) 010 \v垂直制表(VT)011 因为\f换页(FF)012 \r回车(CR)013
4 }

同理还有一个isprint函数

isprint()函数原型:extern int isprint(char c)

isprint()函数功能: 判断字符c是否为可打印字符(含空格),当c为可打印字符(0x20-0x7e)时,返回非零值,否则返回零。

isprint()函数实现:

 1 #include <iostream>]
2 int my_isprint(char _C);
3 int main()
4 {
5 int c;
6 //clrscr(); // clear screen
7 c='a';
8 printf("%c:%s\n",c,my_isprint(c)?"yes":"no");
9 c=' ';
10 printf("%c:%s\n",c,my_isprint(c)?"yes":"no");
11 c=0x7f;
12 printf("%c:%s\n",c,my_isprint(c)?"yes":"no");
13 getchar();
14 return 0;
15 }
16
17 int my_isprint(char _C)
18
19 {
20 return (unsigned int)(_C - ' ') < 127u - ' '; //判断字符c是否为可打印字符(含空格)。当c为可打印字符(0x20-0x7e)时,返回非零值,否则返回零。
21 }

 有待完善的string 函数~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

黑马基础班第一天的课程

  

各种进制的表示形式 = 十进制的计算方法以及表现形式
1234(十进制) = 1*10^3 + 2*10^2 + 3*10^1 + 4*10^0(=1234)
2322(八进制) = 2*8^3 + 3*8^2 + 2*8^1 + 2*8^0(=1234)
4D2(十六进制) = 4*16^2 + 13*16^1+ 2*8^0(=1234)
10011010010(二进制) = 1*2^10 + 0*2^9 + 0*2^8 + 1*2^7 + 1*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0(=1234)

第一天的学习

第一天的学习

各进制之间的转换:

  1 //进制之间的转换(纯C编程)。读者可以使用C++的string和stack编写会更加快捷
2 //因为stack 先进后出的功能和适合该编程。
3 //stack的基本操作
4 //1.入栈:如s.push(x);
5 //2.出栈:如 s.pop().注意:出栈操作只是删除栈顶的元素,并不返回该元素。
6 //3.访问栈顶:如s.top();
7 //4.判断栈空:如s.empty().当栈空时返回true。
8 //5.访问栈中的元素个数,如s.size();
9 #include <iostream>
10 #include <math.h>
11
12 using namespace std;
13
14 void TenTooAll(); //十进制 → 二、八、十六进制
15 void TwoTooTen(); //二进制 → 十进制
16 void EightTooTen(); //八进制 → 十进制
17 void SixtteenTooTen(); //十六进制 → 十进制
18
19 int main()
20 {
21 while(1)
22 {
23 cout << "您即将输入的是几进制数:(如果您要退出前按数字0,谢谢!)" << endl;
24 int quit = 1;
25 int choice;
26 cin >> choice;
27 switch(choice) //选择要输入的进制
28 {
29 case 0:quit = 0;break;
30 case 10:TenTooAll();break;
31 case 2:TwoTooTen();break;
32 case 8:EightTooTen();break;
33 case 16:SixtteenTooTen();break;
34 default:cout << "您的输入不是已有进制" << endl;break;
35 }
36 if(0 == quit)
37 break;
38 }
39
40 return 0;
41 }
42
43 void TenTooAll() //十进制 → 二、八、十六进制
44 {
45 cout << "请你输入一个整形数:" << endl;
46 int number;
47 cin >> number;
48 cout << "您要转换成的进制是:" << endl; //选择要转换的进制
49 int system;
50 cin >> system;
51 if(number == 0)
52 {
53 cout << "十进制数:" << number << "转换成" << system << "进制数是:" << number <<endl;
54 }
55 else
56 {
57 cout << "十进制数:" << number << "转换成" << system << "进制数是:";
58 int i=0;
59 int a[100];
60 char b[100];
61 memset(a,0,100*sizeof(int)); // 一般情况不清零是没法用的
62 memset(a,0,100*sizeof(char));
63
64 //输出为16进制时————————————————
65 if(system == 16)
66 {
67 for(; number > 0; ++i)
68 {
69 int single;
70 single = number % system; // 求余
71 if(single > 9)
72 {
73 single = single -10+65-48;//因为single是int型 所以变成ASCII码值要变回int型
74 }
75 else
76 {
77 single = single + 48 -48;//便于阅读
78 }
79
80 b[i] = single +48; // 将int型转换成char型
81 number = number / system;
82 }
83
84 //倒序输出————————-——————
85 for(int j = i-1; j >= 0; --j)
86 {
87 if(b[j] > '9')
88 {
89 cout << b[j]; //输出字母
90 }
91 else
92 {
93 cout << b[j]-48; //输出数字
94 }
95
96 }
97 }
98
99 //输出为二、八进制时————————
100 else
101 {
102 for(; number > 0; ++i)
103 {
104 int single;
105 single = number % system;
106 number = number / system;
107 a[i] = single;
108 }
109 for(int j = i-1; j >= 0; --j)
110 {
111 cout << a[j];
112 }
113 }
114 cout << endl;
115 }
116
117 }
118
119
120
121 void TwoTooTen()
122 {
123 cout << "请你输入一个整形数:" << endl;
124 char enter;//用于接收回车键
125 char number[100];
126 enter = cin.get();
127 cin.getline(number,100,'\n');//输入遇到回车键 就结束
128 if(number-48 == 0)
129 {
130 cout << "二进制数:" << number << "转换成十进制数是:" << number <<endl;
131 }
132 else
133 {
134 cout << "二进制数:" << number << "转换成十进制数是:";
135 int i=0;
136 int total = 0;
137 for(; i < strlen(number); i++)
138 {
139
140 total = total + (number[strlen(number)-1-i] - '0') * pow(2,i); //此处要-1因为字符串有保存'\0' 且 数组下标从0开始
141
142 }
143 cout << total << endl;
144 }
145 }
146
147 void EightTooTen()
148 {
149 cout << "请你输入一个整形数:" << endl;
150 char enter;//用于接收回车键
151 char number[100];
152 enter = cin.get();
153 cin.getline(number,100,'\n');
154 if(number-48 == 0)
155 {
156 cout << "二进制数:" << number << "转换成十进制数是:" << number <<endl;
157 }
158 else
159 {
160 cout << "二进制数:" << number << "转换成十进制数是:";
161 int i=0;
162 int total = 0;
163 for(; i < strlen(number); i++)
164 {
165
166 total = total + (number[strlen(number)-1-i] - '0') * pow(8,i);
167
168 }
169 cout << total << endl;
170 }
171 }
172
173
174 void SixtteenTooTen()
175 {
176 cout << "请你输入一个整形数:" << endl;
177 char enter;//用于接收回车键
178 char number[100];
179 enter = cin.get();
180 cin.getline(number,100,'\n');
181 if(number-48 == 0)
182 {
183 cout << "二进制数:" << number << "转换成十进制数是:" << number <<endl;
184 }
185 else
186 {
187 cout << "二进制数:" << number << "转换成十进制数是:";
188 int i=0;
189 int total = 0;
190 for(; i < strlen(number); i++)
191 {
192 if(number[strlen(number)-1-i] >= 'A')//
193 total = total + (number[strlen(number)-1-i] - 7 - '0') * pow(16,i); //将字母转化成相应的数字
194 else
195 total = total + (number[strlen(number)-1-i] - '0') * pow(16,i);
196 }
197 cout << total << endl;
198 }
199 }

 c语言的32个关键字:

第一天的学习

c语言的34种运算符:

第一天的学习

c语言的9种控制语句:

第一天的学习

常用CMD-DOS指令:

第一天的学习

 

用vs打开记事本、网站等操作:

 1 #include <stdlib.h>
2
3 void main()
4 {
5 system("notepad");
6 //system("start notepad");//并行 进程
7 system("taskkill /f /im notepad.exe");//关闭程序
8 system("calc");
9 system("ipconfig");
10 system("tasklist");
11 system("netstat -a");
12 system("D:\\Users\\Administrator\\AppData\\Roaming\\360se6\\Application\\360se.exe www.qq.com");//如果目录有空格 就加"\" \""字符
13 system("pause");
14 }

 

 

黑马基础班第二天的课程

 

 用不同的方法输出 h

 1 //#include <windows.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5
6 void main()
7 {
8 char str[50] = "hello world!";
9 printf("%x",&str);
10 putchar(10);
11 //MessageBoxA(0,"朱碧云在玩游戏,所以网络故障!","网络断开",2);
12 //ShellExecuteA(0,"open","c:\\",0,0,1);//比system强大
13 //system("c:\\");
14 //前面三个0是系统+默认,后面1是正常打开,如果是0 就是隐藏打开 3最大化 6最小化
15
16 //while(1)
17 //{
18 // malloc(10000000);
19 // Sleep(1000);//休眠1000毫秒=1秒
20 //}
21
22 printf("h");
23 printf("%s","h");
24 printf("%c",'h');
25 putchar('h');
26 printf("\n");
27 putchar(104);//10进制
28 putchar(0150);//8进制
29 putchar('\150');//8进制
30 putchar(0x68);//16进制
31 putchar('\x68');//16进制
32 putchar(1101000);
33 putchar('\n');
34
35 //char str[50] = "hello world!";//在C语言里,变量只能在函数的开头处声明和定义
36 putchar(10);
37 printf("hello world!");
38 putchar(10);
39 sprintf(str,"%s","hello world!");
40 printf(str);
41 putchar(10);
42 sprintf(str,"%c%c%c%c%c",'h','e','l','l','o');
43 printf(str);
44 getchar();
45 }

 

 

黑马基础班第三天的课程

 

SHRT_MAX;//#include <limits.h> #define SHRT_MAX      32767 

 

变量a与b兑换数据:

 1 void temp(int &a,int&b)
2 {
3 int a = 100, b = 10;
4
5 //方法一:
6 int temp;
7 temp = a;
8 a = b;
9 b = a;
10
11 //方法二:
12 a = a + b;
13 b = a - b;
14 a = a - b;
15
16 //方法三:
17 a = a * b;
18 b = a / b;
19 a = a / b;
20 }

 

 

 

 

 

 1 //设置随机数
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <time.h>
5
6 void main()
7 {
8 int num;
9 time_t time1;
10 srand((unsigned)time(&time1));
11 num = rand() % 100; //(0到100)
12 num > 50 ? system("mspaint"):system("tasklist");
13
14 getchar();
15 }
 1 //设置极大值(极小值)
2 #include <limits.h>
3 #include <float.h>
4
5 void main()
6 {
7 SHRT_MAX;
8 INT_MAX;
9 UINT_MAX;
10 FLT_MAX;
11 DBL_MAX;
12 }

 


sizeof('a') = 4;  //C语言为了空间的拓展,字符常量设置为4个字节

 

 1 //sprintf的用法
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 void main()
6 {
7 char str1[10] = "ged";
8 char str2[10] = "i";
9 char str3[10];
10 sprintf(str3,"%s%s%c",str1,str2,'t');
11 printf("%s",str3);
12
13 getchar();
14 }

 

数据类型的隐式转换:short→int→unsigned→long→doublefloat,强制转换:如 (int)x;

 第一天的学习

二进制的输入函数:int str[30]; _itoa(num,str,8);//将数据num用8进制保存在str数组中;

 

偷钱:将123.345 小数点后第三位五舍六入,然后将小数点后第二位四舍五入。

算法:123.345*100→12334.5+0.4→(int)(12334.9)→12334/10→1233.4+0.5→(int)(1233.9)→1233/10

即:x = 123.345;

y = (int(  ( ((int)(x*100f+04f))/10f ) +0.5f  ) )/10f;

 

 

黑马基础班第七天的课程

字符常量:

第一天的学习

 

第一天的学习

算法的流程图:

第一天的学习第一天的学习第一天的学习

函数的递归调用:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

函数调用规则:调用函数没有执行完成之前,不会执行下一步,没有执行完的语句块会进制压栈,执行到最后会返回执行。

 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int Febc(int n);
5 void change(int n);
6 void main()
7 {
8 printf("%u",Febc(44));//会调用很多次,想当耗内存
9 change(10);
10 getchar();
11
12 }
13
14 int Febc(int n)
15 {
16 if(1 == n)
17 {
18
19 return 1;//函数调用结束出口
20 }
21 else if(2 == n)
22 {
23 return 2;
24 }
25 else
26 {
27 return (Febc(n-1)+Febc(n-2));
28 }
29 }
30
31 void change(int n)
32 {
33 if(1 == n)
34 {
35 printf("%d", n);//进行压栈
36 }
37 else
38 {
39 change(n / 2);
40 printf("%d", n % 2);//进行压栈,并且逆序输出余。
41 }
42 }

 第一天的学习