8051句字计数器
8051 sentence and word counter
我在互联网上找到了下面这段代码,它可以计算 8051 MCU 上的句子。
有人可以向我解释一下有问号的地方究竟发生了什么。
任何形式的帮助将不胜感激。
#include<string.h>
char code *text=" what is a program? that has, a a lot of errors! When " ;
char code *text1=" you compile. this file, uVision. reports a number of? ";
char code *text2=" problems that you! may interactively correct. " ; //Null characters are also included in array!!!
void count ( char pdata* , char pdata*);
void main (void){
char pdata Nw,Ns;
char data TextNw[2],TextNs[2];
count(&Nw, &Ns); // call subroutine
TextNw[0]=Nw/10; //?????????????????????????????????
TextNw[1]=Nw%10; //?????????????????????????????????
TextNs[0]=Ns/10; //?????????????????????????????????
TextNs[1]=Ns%10; //?????????????????????????????????
while(1);
}
void count ( char pdata *Nw, char pdata *Ns ){
unsigned char N, i, ch;
typedef enum {idle1, idle2} state; //?????????????????????????????????
state S; // begining state
P2=0x00; // pdata bank definition it must be performed first!!
*Ns=*Nw=0; // without proper start-up there is no initialisation, initialise now!!
S=idle1; // beginning state
N=strlen(text)+strlen(text1)+strlen(text2)+3; //????????????? + 3 to acount 3 Null characters!
P2=0x00; // pdata bank definition
for(i=0;i!=N;i++){
ch=text[i]; // take a caharacter from the text
switch (S)
{
case (idle1):{
if (ch==0) break; // skip NULL terminating character!
if (ch!=' '){
S=idle2;
(*Nw)++;
}
break;
}
case(idle2):{
if (ch==0) break; // skip NULL terminating character!
if((ch==' ')||(ch==','))S=idle1;
else if ((ch=='?')||(ch=='.')||(ch=='!')){
S=idle1;
(*Ns)++;
}
break;
}
}
}
}
这个程序联合做了两件事——计算文本中句子的数量和文本中单词的数量。计数完成后,结果将存储在 2 字符数组中。例如,对于 3 个句子中的 57 个单词,结果将存储为:TextNw = {'5','7'}
和 TextNs = {'0','3'}
.
变量 N
包含文本的全长加上 3 个空终止字符(每个句子一个)。
该算法同时对单词和句子进行计数。在 idle1
状态下,计数处于字数计数模式。在 idle2
状态下,计数处于句子计数模式。根据读取的当前字符交换模式 - 如果遇到定界符,则增加相应的计数器。
我在互联网上找到了下面这段代码,它可以计算 8051 MCU 上的句子。 有人可以向我解释一下有问号的地方究竟发生了什么。 任何形式的帮助将不胜感激。
#include<string.h>
char code *text=" what is a program? that has, a a lot of errors! When " ;
char code *text1=" you compile. this file, uVision. reports a number of? ";
char code *text2=" problems that you! may interactively correct. " ; //Null characters are also included in array!!!
void count ( char pdata* , char pdata*);
void main (void){
char pdata Nw,Ns;
char data TextNw[2],TextNs[2];
count(&Nw, &Ns); // call subroutine
TextNw[0]=Nw/10; //?????????????????????????????????
TextNw[1]=Nw%10; //?????????????????????????????????
TextNs[0]=Ns/10; //?????????????????????????????????
TextNs[1]=Ns%10; //?????????????????????????????????
while(1);
}
void count ( char pdata *Nw, char pdata *Ns ){
unsigned char N, i, ch;
typedef enum {idle1, idle2} state; //?????????????????????????????????
state S; // begining state
P2=0x00; // pdata bank definition it must be performed first!!
*Ns=*Nw=0; // without proper start-up there is no initialisation, initialise now!!
S=idle1; // beginning state
N=strlen(text)+strlen(text1)+strlen(text2)+3; //????????????? + 3 to acount 3 Null characters!
P2=0x00; // pdata bank definition
for(i=0;i!=N;i++){
ch=text[i]; // take a caharacter from the text
switch (S)
{
case (idle1):{
if (ch==0) break; // skip NULL terminating character!
if (ch!=' '){
S=idle2;
(*Nw)++;
}
break;
}
case(idle2):{
if (ch==0) break; // skip NULL terminating character!
if((ch==' ')||(ch==','))S=idle1;
else if ((ch=='?')||(ch=='.')||(ch=='!')){
S=idle1;
(*Ns)++;
}
break;
}
}
}
}
这个程序联合做了两件事——计算文本中句子的数量和文本中单词的数量。计数完成后,结果将存储在 2 字符数组中。例如,对于 3 个句子中的 57 个单词,结果将存储为:TextNw = {'5','7'}
和 TextNs = {'0','3'}
.
变量 N
包含文本的全长加上 3 个空终止字符(每个句子一个)。
该算法同时对单词和句子进行计数。在 idle1
状态下,计数处于字数计数模式。在 idle2
状态下,计数处于句子计数模式。根据读取的当前字符交换模式 - 如果遇到定界符,则增加相应的计数器。