200
任务描述
本关任务:文本匹配的时候经常会因为空格个数的不同而匹配失败,现在要求你编写程序对输入的字符串进行处理,去掉首尾的空格。
例如:输入的字符串是“ abcd ”,去掉首尾空格后字符串变为“abcd”。
相关知识
指针是 C 语言中的一个重要概念,也是 C 语言的一个重要特色。在 C 语言中,指针被广泛使用,它和数组、字符串、函数间数据的传递等有着密不可分的联系。可以说,没有掌握指针就没有掌握 C 语言的精华。
指针可以对内存中各种类型的数据进行快速、直接的处理,也可以为函数间的数据传递提供简洁、便利的方法。正确熟练地使用指针有利于编写高效的程序,但指针使用不当也容易导致严重错误。指针很灵活,也很危险。
定义指针变量
指针变量(简称指针)就是存放地址的变量。其声明形式与一般变量声明相比只是在变量名前多一个星号*
,接下来看两个例子。
例1:
int *p;
该例中声明了变量 p 为指向整型值的指针(即变量 p 中可以存放某个整型变量的地址)。这里的*
在声明语句中,是指针说明符,表示声明的变量是指针变量。
例2:
float *xPtr, *yPtr, f;
该例子中声明了两个指向浮点型值的指针 xPtr 和 yPtr 以及一个浮点型变量 f 。
指针的性质
① 指针可以赋值为 NULL 或某个地址。具有值 NULL 的指针不指向任何地址;
② 指针是具有特定属性的地址。光有地址只是知道数据存储在内存的某个位置,但怎么访问该位置的数据(即访问多少位,以什么方式访问)还需要指针类型来明确;
例如:使用 int 类型的指针访问其所指向的数据时,会一次性读取32位( int 类型的数据是32位),并使用整型数据的格式访问该数据。所以指针不仅仅是一个地址,还必须有特定的属性(类型)。
③ 数组名可以看成是一个特殊的地址,首先数组名是地址(数组的首地址),其次数组名有属性(数组元素的类型),所以可以把数组名赋值给同类型的指针变量。
例如:
char s[10] = "China";
char *sptr = s;
第二条语句赋值后 sptr 拥有和 s 同样的值,即数组的首地址,也就是存储字符‘C’的单元的地址。
④ 要访问指针所指向的单元可以使用间接引用运算符*
(不同于前面声明语句中的*
,这里的*
在表达式中,是运算符),*
也被称为复引用运算符,它返回其操作数(指针)所指向的对象;
例如:
char s[10] = "China";
char *sptr = s;
cout << *sptr;
将输出指针 sptr 所指的单元中存储的字符(因为 sptr 是 char 类型的指针),也就是输出字符‘C’。
⑤ 可以通过指针的复引用修改指针所指向的单元;
例如:
char s[10] = "China";
char *sptr = s;
*sptr = 'c';
上述代码会将该存储单元中大写字符的‘C’修改为小写字符的‘c’。
请注意前面代码的输出语句和下面的代码语句的区别:
char s[10] = "China";
char *sptr = s;
cout << sptr;
这条语句将输出字符串“China”。之前学习字符数组时应该知道,语句cout << s;
会输出数组 s 中存储的整个字符串,实际上 C++ 在使用 cout 输出 char 类型指针时,不是输出字符指针的值(地址),而是输出从该地址开始的字符串(逐个输出一个个字符,直到碰到 '\0' 为止)。所以cout << sptr;
和cout << s;
的作用一样,都是输出字符串“China”。
⑥ 访问一个字符串一般也是使用该字符串的首字符的地址;
⑦ 指针也可以参与算术运算。指针加上或减去一个整数 n,其运算结果是指向指针当前指向变量的后方或前方的第 n 个变量。
例如:之前 sptr 指向字符‘C’的存储单元,执行语句sptr++;
后 sptr 则指向字符‘h’的存储单元。如下语句:
```` while(*sptr != '\0') sptr++;
则可以使指针 sptr 指向该字符串后面的 '\0'。如果要输出字符串中的部分内容,也可以通过修改指针实现,如:
char s[10] = "China"; char *sptr = s; sptr++; cout << sptr;
上述代码执行语句`sptr++;`后,指针 sptr 指向了字符 'h' 的存储单元,此时`cout << sptr;`输出的是 sptr 指向的字符串,即“hina”。
⑧ 同类型的两个指针可以参与各种关系运算,其结果可以反映两指针所指向的地址之间的位置前后关系。
例如:
int a[10]; int *p = a, *q = &a[1]; if(p > q) cout << "p>q" << endl; else cout << "p<=q" << endl;
```
上述代码中指针 p 中存放的是 a 的值,也就是 a[0] 的地址,q 中存放的是 a[1] 的地址,而数组元素是按序连续存储的,所以 q 的值要比 p 的值大,程序输出p<=q
。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,以实现去掉字符串(字符串由平台提供,且已在主函数中获取)首尾空格的功能。具体要求如下:
对于输入的字符串,去掉该字符串首尾的空格后输出;
字符串的存储使用一维字符数组,但本关要求使用指针操作。写完程序后,你也会发现使用指针实现会容易得多。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
为了方便显示空格,下面给出的测试输入使用下划线 '_' 表示空格。
测试输入:_____asd
预期输出:asd
测试输入:___a_b_c_d__
预期输出:a_b_c_d
开始你的任务吧,祝你成功!
#include <iostream>
using namespace std;
char * trim(char * str);
int main()
{
char s[1024]; // 定义存储字符串的一维字符数组
// 输入一行字符,可以包含空格
// 输入的字符串存入s中,最多读取个字符,后面自动加上'\0'
cin.getline(s,1024);
cout << trim(s) << endl; // 输出去掉首尾空格后的字符串
return 0;
}
// 函数trim:去掉字符串首尾空格
// 参数:str-字符指针,指向输入的字符串
// 返回值:字符指针,指向去掉首尾空格后的字符串(首地址)
// 提示:可以直接在字符串str中操作
char * trim(char * str)
{
// 请在此添加代码,实现函数trim
/********** Begin *********/
char *p=str;
while(*p!='\0'){
p++;
}
p--;
while(p>str&&*p==' '){
*p='\0';
p--;
}
while(*str==' '){
str++;
}
return str;
/********** End **********/
}
100
任务描述
本关任务:使用指针实现两个整数值的交换。
相关知识
用指针传递参数
C 和 C++ 函数调用的参数传递方式有两种:传值和传引用。
传值只是值的传递,被调用函数则无法修改实在参数的值;
传引用则是实参和形参共享实在参数的存储单元,所以被调用函数可以通过修改形参来修改实参的值。
如果采用传值的方式传递指针值,可以实现类似于传引用的效果。
例如:
#include <iostream>
using namespace std;
// 函数inc:将p指向的整数值加
// 参数:p-int类型指针,指向要加的整数
void inc(int * p)
{
(*p)++; // *p 访问 p 指向的单元,++ 将该单元的数据加
// 注意不能是 *p++, 因为 * 和 ++ 优先级相同,且右结合,这种写法修改的是 p 的值,而不是 *p 的值
}
int main()
{
int a = 10;
inc(&a); // 调用 inc 函数,修改 a 的值(传递的是 a 的地址)
cout << a << endl; // 输出 a 的值
return 0;
}
上述程序的输出为11,其中被调用函数 inc 只修改了 main 函数中的局部变量 a 的值,但并没有修改实参的值(实参是&a
,即 a 的地址依然没变)。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,实现使用指针将两个整数(数据由平台提供,且已在主函数中获取)值交换的功能。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:1 2
预期输出:2 1
测试输入:123 678
预期输出:678 123
开始你的任务吧,祝你成功!
#include <iostream>
using namespace std;
void pswap(int * p, int *q);
int main()
{
int a, b;
cin >> a >> b; // 输入两个整数
pswap(&a,&b); // 调用pswap函数,交换a、b的值
cout << a << " " << b << endl; // 输出a、b的值
return 0;
}
//函数pswap:交换指针p和q指向的单元中的整数值
//参数:p,q-int类型指针,指向要交换的整数
void pswap(int * p, int *q)
{
// 请在此添加代码,实现函数pswap
/********** Begin *********/
int t;
t=*p;
*p=*q;
*q=t;
/********** End **********/
}
400
任务描述
本关任务:在一串隐藏着一个或多个数值的字符中,选出字符串中的所有数字字符,并将选出的数字字符重新组成新字符串。如果在第一个数字字符之前有负号,则保留该负号,有多个负号时只保留一个。
例如:输入的字符串为“a-1-2-4sd5 s6”,抽取数字后得到的新字符串为“-12456”。
相关知识
完成本关需要具备的知识介绍请参见第一、二关卡。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,选出字符串(数据由平台提供,已且在主函数中获取)中的所有数字字符并组成新的字符串输出。要求如果在第一个数字字符之前有负号,则保留该负号,有多个负号时也只保留一个。
提示
如果有字符指针 p 和 q,则下面的程序可以实现:当 q 指向的字符是数字时,将 q 指向的数字拷贝到 p 指向的存储单元:
if(*q >= '0' && *q <= '9')
{
*p = *q;
}
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:1 s23df53dcas12sd-121sd
预期输出:1235312121
测试输入:a-1-2-3sd45 j67sd
预期输出:-1234567
开始你的任务吧,祝你成功!
#include <iostream>
using namespace std;
void extractNum(char * str);
int main()
{
char s[1024];
cin.getline(s,1024); // 输入一行字符
extractNum(s); // 调用extractNum函数,选出数字
cout<<s<<endl; // 输出选出的数字
return 0;
}
// 函数extractNum:选出str指向的字符串中的数字,并写回str
// 参数:str-指向字符串
void extractNum(char * str)
{
// 请在此添加代码,实现函数extractNum
/********** Begin *********/
char *p=str,*q=str;
int isPrime=1;
while(*p!='\0'){
if(*p=='-'&& isPrime){
isPrime=0;
*q++=*p++;
}else if(*p>='0'&&*p<='9'){
isPrime=0;
*q++=*p++;
}else{
p++;
}
}
*q='\0';
/********** End **********/
}
200
任务描述
本关任务:将一个字符串中的所有小写字母变成对应的大写字母,其它字母不变。
例如:对字符串“abc12! ef”执行函数后输出结果为“ABC12! EF”。
相关知识
完成本关需要具备的知识介绍请参见第一、二关卡。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,实现将字符串(数据由平台提供,且已在主函数中获取)中的所有小写字母变成对应大写字母,其它字母不变的功能。
提示
在 ASCII 码表中,大写字母‘A’到‘Z’是连续编码的,小写字母‘a’到‘z’也是连续编码的。也就是说‘A’和‘a’的 ASCII 码的差与‘Z’和‘z’的 ASCII 码的差是一样的。
所以如果字符变量 ch 中存放的是小写字母,则下面的语句可以将其变成对应的大写字母:
ch = ch + 'A'-'a';
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:1q2w3ASD45sx~1
预期输出:1Q2W3ASD45SX~1
测试输入:as 12xfASA90[]kl{}
预期输出:AS 12XFASA90[]KL{}
开始你的任务吧,祝你成功!
#include <iostream>
using namespace std;
void toUp(char * str);
int main()
{
char s[1024];
cin.getline(s,1024); // 输入一行字符
toUp(s); // 调用toUp函数,转换成大写字母
cout<<s<<endl; // 输出变更后的新字符串
return 0;
}
// 函数toUp:将str指向的字符串中的小写字母变成对应的大写字母
// 参数:str-指向字符串
void toUp(char * str)
{
// 请在此添加代码,实现函数toUp
/********** Begin *********/
char *p=str,*q=str;
while(*p!='\0'){
if(*p>='a'&&*p<'z'){
*q++=*p++-32;
}else{
*q++=*p++;
}
}
*q='\0';
/********** End **********/
}
500
任务描述
本关任务:计算一个字符串(子串)在另一个字符串(长串)中出现的次数。
相关知识
字符串操作函数
C 和 C++ 提供了一系列操作字符串的函数,要使用这些函数只要在代码的头文件部分包含 string.h 即可。
常用的字符串处理函数见下表:
函数原型 | 函数功能 |
---|---|
char * strcpy(char *dest,const char *src) |
将字符串 src 复制到 dest |
char * strcat(char *dest,const char *src) |
将字符串 src 添加到 dest 末尾 |
char * strchr(const char *s,int c) |
检索并返回字符 c 在字符串 s 中第一次出现的位置 |
int strcmp(const char *s1,const char *s2) |
比较字符串 s1 与 s2 的大小,若 s1 串大于 s2 串则返回一个大于 0 的值;若 s1 串等于 s2 串则返回值为 0;若 s1 串小于 s2 串则返回一个小于 0 的值。 |
size_t strlen(const char *s) |
返回字符串 s 的长度 |
char * strncat(char *dest,const char *src,size_t n) |
将字符串 src 中最多 n 个字符复制到字符串 dest 中 |
int strncmp(const char *s1,const char *s2,size_t n) |
比较字符串 s1 与 s2 中前 n 个字符 |
char * strncpy(char *dest,const char *src,zise_t n) |
复制 src 中的前 n 个字符到 dest 中 |
char * strstr(const char *s1,const char *s2) |
扫描字符串 s1,并返回第一次出现 s2 的位置 |
char * strtok(char *s1,const char *s2) |
检索字符串 s1,该字符串 s1 是由字符串 s2 中定义的定界符所分隔 |
strstr 函数
在一个长串中查找子串可以使用strstr
函数,该函数的函数原型为:
char* strstr(const char* s1, const char* s2);
该函数从 s1 所指字符串中第一个字符起,顺序向后查找出与 s2 所指字符串相同的子串,若查找成功则返回该子串首次出现的首地址,否则返回 NULL。
例如:
char *a="abcdeabcde";
char *b="bcd";
cout<<strstr(a,b)<<endl;
该程序输出结果为“bcdeabcde”,因为strstr(a, b)
的返回值为“bcd”在“abcdeabcde”中第一次出现的首地址,所以用 cout 输出时,从该位置的字符开始,逐个输出直到 '\0',即字符串“bcdeabcde”。
当然,查找子串时,也可以从长串的某个位置开始。
例如:
char *a="abcdeabcde";
char *b="bcd";
cout<<strstr(a+4,b)<<endl;
该程序的输出为“bcde”。因为a+4
得到一个新地址,即 a 指向的字符串中第一个字符‘e’的地址,从该位置开始查找 b 指向的字符串‘bcd’,得到从字符‘e’开始的第一个“bcd”出现的地址,然后用 cout 输出该地址开始的字符串,即“bcde”。
strlen 函数
另外,下次从什么地方开始查找子串?应该是上次找到子串的开始位置加上子串的长度。其中,函数strlen
可以计算字符串的长度,其函数原型为:
int strlen(const char *s);
函数 strlen 只有一个参数 s,它是一个字符指针,代表了一个字符串,函数计算 s 指向字符串的长度并返回。
例如:
char *a="x";
char *b="Hello world!";
cout<<strlen(a)<<endl; // 输出 1
cout<<strlen(b)<<endl; // 输出 12
编程要求
在右侧编辑器中的Begin-End
之间补充代码,计算一个字符串(子串)在另一个字符串(长串)中出现的次数。
提示
一个子串在另一个长串中出现的次数是指长串中可以同时截取出多少个子串。例如:子串 "aaa" 在 "aaaaaaa" 中出现的次数为 2 次。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入: aaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
预期输出: 7
测试输入: ab
aaaaabbbbbabcdefg
预期输出: 2
开始你的任务吧,祝你成功!
自己打败自己是最可悲的失败,自己战胜自己是最可贵的胜利。
如果你觉得这一关的内容对你有帮助,请你在下面点赞。
// 包含字符串函数库
#include <string.h>
#include <iostream>
using namespace std;
int frequency(char * substr, char * str);
int main()
{
char sub[128],str[1024];
cin.getline(sub,128); // 输入子串
cin.getline(str,1024); // 输入长串
int n = frequency(sub,str); // 调用frequency函数,计算子串在长串中出现的次数
cout<<n<<endl; // 输出次数
return 0;
}
// 函数frequency:计算子串在长串中出现的次数
// 参数:substr-指向子串,str-指向长串
// 返回值:出现的次数
int frequency(char * substr, char * str)
{
// 请在此添加代码,实现函数frequency
/********** Begin *********/
char *p=substr,*q=str;
int n=0;
while(q=strstr(q,p)){
n++;
q=strstr(q,p)+strlen(p);
}
return n;
/********** End **********/
}
500
任务描述
本关任务:实现字符串的部分复制。
相关知识
完成本关需要具备的知识介绍请参见第五关卡。
编程要求
在右侧编辑器中的Begin-End
之间补充代码,实现字符串的部分复制。
提示
函数 strmncpy 的原型为:
void strmncpy(char *s, int m, int n, char *t);
参数 s 指向源字符串,t 指向字符串复制的目标单元,函数功能为将 s 指向字符串从第 m 个(从0开始编号)字符开始的连续 n 个字符复制到 t 指向的存储单元;
如果第 m 个字符后面的字符数不足 n 个,则复制到 '\0'为止;
如果 s 的长度不到 m,则复制空串。
例如:
char *s = "abcdefghijklmn";
char t[20];
strmncpy(s,4,6,t);
cout << t << endl;
输出结果为:efghij
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:
abcdefghjkksdsd
5 7
预期输出:fghjkks
测试输入:
asdftyuioplkm
3 9
预期输出:ftyuioplk
开始你的任务吧,祝你成功!
#include <iostream>
using namespace std;
void strmncpy(char *s, int m, int n, char *t);
int main()
{
char s[128],t[128];
int m,n;
cin>>s; // 输入源串
cin>>m>>n; // 输入m和n
strmncpy(s, m, n, t); // 字符串复制
cout << t <<endl; // 输出复制结果
return 0;
}
// 函数strmncpy:字符串的部分复制,将s指向字符串从第m个字符开始的n个字符复制的t中
// 参数:s-指向源字符串,t-指向目标字符串,m-起始位置,n-字符个数
// 返回值:无
void strmncpy(char *s, int m, int n, char *t)
{
// 请在此添加代码,实现函数strmncpy
/********** Begin *********/
s+=m;
while(*s!='\0'&&n!=0){
*t++=*s++;
n--;
}
*t='\0';
/********** End **********/
}
文章浏览阅读3.3k次,点赞7次,收藏39次。CPU 执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对异常情况或特殊请求进行处理,处理完毕后再返回现行程序断点处,继续执行原程序。void 函数名(void) interrupt n using m {中断函数内容 //尽量精简 }编译器会把该函数转化为中断函数,表示中断源编号为n,中断源对应一个中断入口地址,而中断入口地址的内容为跳转指令,转入本函数。using m用于指定本函数内部使用的工作寄存器组,m取值为0~3。该修饰符可省略,由编译器自动分配。_51单片机中断篇
文章浏览阅读396次。项目经验(案例一)项目时间:2009-10 - 2009-12项目名称:中驰别克信息化管理整改完善项目描述:项目介绍一,建立中驰别克硬件档案(PC,服务器,网络设备,办公设备等)二,建立中驰别克软件档案(每台PC安装的软件,财务,HR,OA,专用系统等)三,能过建立的档案对中驰别克信息化办公环境优化(合理使用ADSL宽带资源,对域进行调整,对文件服务器进行优化,对共享打印机进行调整)四,优化完成后..._网络工程师项目经历
文章浏览阅读1k次,点赞31次,收藏30次。LVS:Linux Virtual Server,负载调度器,内核集成, 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现。NATTUNDR优点端口转换WAN性能最好缺点性能瓶颈服务器支持隧道模式不支持跨网段真实服务器要求anyTunneling支持网络private(私网)LAN/WAN(私网/公网)LAN(私网)真实服务器数量High (100)High (100)真实服务器网关lvs内网地址。
文章浏览阅读899次。https://www.toutiao.com/a6713171323893318151/作者 | 黄小邪/言有三编辑 | 黄小邪/言有三图像预处理算法的好坏直接关系到后续图像处理的效果,如图像分割、目标识别、边缘提取等,为了获取高质量的数字图像,很多时候都需要对图像进行降噪处理,尽可能的保持原始信息完整性(即主要特征)的同时,又能够去除信号中无用的信息。并且,降噪还引出了一..._噪声很大的图片可以降噪吗
文章浏览阅读152次。目录谨慎地覆盖cloneCloneable接口并没有包含任何方法,那么它到底有什么作用呢?Object类中的clone()方法如何重写好一个clone()方法1.对于数组类型我可以采用clone()方法的递归2.如果对象是非数组,建议提供拷贝构造器(copy constructor)或者拷贝工厂(copy factory)3.如果为线程安全的类重写clone()方法4.如果为需要被继承的类重写clone()方法总结谨慎地覆盖cloneCloneable接口地目的是作为对象的一个mixin接口(详见第20_为继承设计类有两种选择,但无论选择其中的
文章浏览阅读958次,点赞21次,收藏24次。今天学长向大家分享一个毕业设计项目基于协同过滤的电影推荐系统项目运行效果:项目获取:https://gitee.com/assistant-a/project-sharing21世纪是信息化时代,随着信息技术和网络技术的发展,信息化已经渗透到人们日常生活的各个方面,人们可以随时随地浏览到海量信息,但是这些大量信息千差万别,需要费事费力的筛选、甄别自己喜欢或者感兴趣的数据。对网络电影服务来说,需要用到优秀的协同过滤推荐功能去辅助整个系统。系统基于Python技术,使用UML建模,采用Django框架组合进行设
文章浏览阅读614次。10G SFP+光模块被广泛应用于10G以太网中,在下一代移动网络、固定接入网、城域网、以及数据中心等领域非常常见。下面易天光通信(ETU-LINK)就为大家一一盘点下10G SFP+光模块都有哪些吧。一、10G SFP+双纤光模块10G SFP+双纤光模块是一种常规的光模块,有两个LC光纤接口,传输距离最远可达100公里,常用的10G SFP+双纤光模块有10G SFP+ SR、10G SFP+ LR,其中10G SFP+ SR的传输距离为300米,10G SFP+ LR的传输距离为10公里。_10g sfp+
文章浏览阅读239次。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:项目技术:Express框架 + Node.js+ Vue 等等组成,B/S模式 +Vscode管理+前后端分离等等。环境需要1.运行环境:最好是Nodejs最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发环境:Vscode或HbuilderX都可以。推荐HbuilderX;3.mysql环境:建议是用5.7版本均可4.硬件环境:windows 7/8/10 1G内存以上;_基于vue美食网站源码
文章浏览阅读62次。oldwain随便写@hexun链接:http://oldwain.blog.hexun.com/ ...
文章浏览阅读843次,点赞16次,收藏22次。用这个工具扫描其它网站时,要注意法律问题,同时也比较慢,所以我们以之前写的登录页面为例子扫描。_sqlmap拖库
文章浏览阅读1.5w次,点赞5次,收藏38次。Origin也能玩转图片的拼接组合排版谭编(华南师范大学学报编辑部,广州 510631)通常,我们利用Origin软件能非常快捷地绘制出一张单独的绘图。但是,我们在论文的撰写过程中,经常需要将多种科学实验图片(电镜图、示意图、曲线图等)组合在一张图片中。大多数人都是采用PPT、Adobe Illustrator、CorelDraw等软件对多种不同类型的图进行拼接的。那么,利用Origin软件能否实..._origin怎么把三个图做到一张图上
文章浏览阅读4.2k次,点赞4次,收藏51次。51单片机智能电风扇控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0042。_电风扇模拟控制系统设计