本文目錄一覽:
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);
.
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/187704.html