本文目录一览:
c语言中做标记的技巧
#includestdio.h
int main()
{
int list[100],n,i,j,from=0,to=0,flag=0,count=0;
scanf("%d",n);
for(i=0;in;i++)
{
scanf("%d",list[i]);
}
for(i=0;in-1;i++)
{
for(j=i;jn-1;j++)
if(list[j]==list[j+1])
count++;
else break;
if(countflag)
{
from=i;to=j;
i=j+1;
flag=count;
count=0;
}
}
if(flag==0) printf("No equal number list.\n");
else printf("The longest equal number list is from %d to %d.\n",from,to);
getch();
}
怎么样用c语言编写文法压缩用加标记法实现
基本方法是
从识别符号向终结符过度时,从含有识别符号的规则入手,寻找所有规则中左部为识别符号的规则,然后搜索这些找到的规则的右部是否含有非终结符,若含有则从所有规则中找出左部为这个非终结符的规则,并标记,当搜完第一次后,循环查找具有标记的规则,按照上面的方式继续标记剩下的规则,直到没有新的规则被标记 退出 删除未标记的规则体
反方向同理……
说什么都不如看代码 下面是我写文法压缩时候写的压缩函数
void Mylist::condense(char spot,CString gettofun)
{
//condense with spot way
addsignal(spot,1);
for(int i=1;i7;i++)
{
for(int j=0;jcount;j++)
{
if(readsignal(j)==i)
{
int rightlength=findright(j).GetLength();
for(int k=0;krightlength;k++)
{
if(gettofun.Find(findright(j).GetAt(k))!=-1)
{
addsignal(findright(j).GetAt(k),i+1);
}
}
}
}
}
// unsigned the wordrule like s::=s*
bool caiding=false;
for(int j=0;jcount;j++)
{
int rightlength=findright(j).GetLength();
for(int k=0;krightlength;k++)
{
if(findleft(j)!=findright(j).GetAt(k))
caiding=true;
}
if(caiding==false)
{signal(j,0);}
}
//format every node have been signed
for(int m=0;mcount;m++)
{
if(readsignal(m)!=0)
{
signal(m,1);
}
}
//decide which to begin
for(m=0;mcount;m++)
{
if((gettofun.FindOneOf(findright(m))==-1)(readsignal(m)!=0))
{
signal(m,2);
}
}
//right way condense
int q=2;
for(int worry=0;worry10;worry++){
for(int j1=0;j1count;j1++)
{
if(readsignal(j1)==q)
{
for(int i1=0;i1count;i1++){
//int right=findright(i1).GetLength();
for(int i2=0;i2findright(i1).GetLength();i2++)
{
if(findleft(j1)==findright(i1).GetAt(i2))
{
signal(i1,q);
}
}
}
}
}//^
}
}
这里说明一下
其中的findright(int i) 函数的功能是从第i条文法规则中找到它的右部 返回值为CString类型
signal(int i,int j)函数 是在第i条规则中找到它的标志位(即加标记)并把j放入这个标志位 以示本条规则已经做好了标记
addsignal(char i,int j) 则是找到左部名为i的规则,并标记他的标志位为j addsignalright同理
本函数传递进来的有两个参数 其中spot是识别符号Z,CString类型的是终结符号队列,包含所有已知的终结符号
在说明一点 wordrule是一个文法体class的对象 它是一个链表 每一个结点(node)为一个规则:
class node
{
public:
char leftwords;
int signal;
CString rightwords;
node *next;
public:
node(char,CString);
virtual ~node();
};
希望对你有所帮助
c语言如何在整数数组中做记号?
这个没有,c++标准库中vector可以使用迭代器vector的end()函数返回指向vector尾部迭代器的下一位置。
如果你想实现这一功能,可以自定义一个index,或者指针ptr,来指向当前数组最后一个元素的下一位置。当然您需要自己维护这个变量。插入,删除(模拟的删除咯)等操作都需要修改这一变量。
c语言中的EOF标记怎么用?
EOF一般作为文件的结尾标记。其值是-1,也就是说在stdio.h如下定义#define
EOF
-1
-1对应着ctrl+Z,在有些系统也对应着f6键。
文件的结尾都有EOF,因此可以用如下程序显示一个文件的内容:
char
c;
FILE
*fp;
fp
=
fopen("filename.txt",
"rt");
while((c=fgetc(fp)!=EOF)putchar(c);
也可以如下写:
while((c=fgetc(fp)!=-1)putchar(c);
.