C++源代码单词扫描程序
扫描源代码——C
return -1;
}
// 检测是否为port扫描
if(!(stricmp(strlwr(argv[1]), "-p") == 0))
{
usage(argv[0]);
return -1;
}
// 程序初始化
if (WSAStartup(MAKEWORD(1,1), &wsadata) != 0) //如果初始化错误
maxth --;
return -1;
}
// sock超时处理
case 0:
{
maxth --;
Sleep(6000);
// 显示等待提示
printf("\r \r\n");
printf(" Wait ( %d )Thread end...\r\n", maxth);
for(;;)
{
// 判断所有线程是否已经结束
if (maxth > 0)
{
for (;;)
{
playx();
// 测试线程是否已满
if (maxth > thread)
Sleep(100);
else break;
}
return;
}
// 等待线程结束函数
void WaitThreadEnd()
{
// 延时
int portip, hoststart, hoststop, startport, endport; //定义了开始I和结束P地址,开始和结束端口
long searchnum, searched;
C++源代码单词扫描程序(词法分析)资料
一、需求分析1、程序功能:C++源代码扫描程序识别C++记号。
2、C++记号:C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。
3、界面要求:采用MFC界面实现。
4、文本压缩:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。
假设想牺牲可读性,以节省磁盘空间,那么可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。
二、概要设计1、关键字(67个):asm,auto,bool,break,case,catch,char,class,const,continue,default,delete,do,double,else,enum,except,explici t,extern,false,finally,float,for,friend,goto,if,inline,int,long,mutable,namesapce,new,operator,private,protect de,public,register,return,short,signed,szieof,static,struct,string,switch,template,this,throw,true,try,typedef,t ypename,union,unsigned,using,virtual,void,while,main,std,cin,cout,endl,scanf,printf,include,define2、一元运算符或分隔符(25个):, ; ( ) { } # ^ ? : . [ ] + - * / % = > < ! ~ | &3、二元运算符或分隔符(19个):&& || == >= <= != ++ -- :: << >> += -= *= /= %= &= ^= ->4、程序流程图:(1)主流程图:开始打开C++源文件后缀是否为.cpp或.h?是词法分析压缩文本是否退出?是结束(2) 词法分析模块流程图:开始提取源文件中一行字符文件指针指向末尾?结束提取字符串中的若干字符空格或制表符?预处理串?注释或屏蔽段?标识符或关键字?数字?特殊符号?字符或字符串?串结束?是否否否否否否否否是是(3) 文本压缩模块流程图:三、详细设计1、词法分析模块://函数功能:扫描一行字符串识别C++记号//函数参数:s表示C++源程序中的一行待分析的字符串//参数返回值:无void analyse(string s,LPVOID IParam){CScanDlg *q=(CScanDlg*)IParam; //获取对话框指针char str[300]; //用于存储识别出的C++记号CString St; //将上面str变量从char类型转换为CString类型int i=0; //记录s字符串的移动的当前位置int j; //记录str字符串的当前位置if(note_flag) //过滤掉存在"/*.......*/"形式的屏蔽段{while(s[i]!='*'&&s[i]!='\0'||s[i]=='*'&&s[i+1]!='/')//不存在"*/"串或当前串还没结束则s字符串的当前指针继续后移{i++;}if(s[i]!='\0') //遇到"*/",将标志note_flag置为false{i=i+2;note_flag=false;}}while(s[i]!='\0') //串没结束则循环扫描{if(s[i]==' '||s[i]=='\t') //过滤空格和制表符{i++;continue;}if((s[i]=='<'||s[i]=='"')&&s[0]=='#') //对include预处理字符串中头文件名的处理{St.Format ("%c",s[i]);q->m_list .InsertItem (count,St); //在列表控件中显示'<'或'"'字符St.Format ("%s","特殊符号");q->m_list .SetItemText(count,1,St);count++;j=0;i++;while(s[i]!='>'&&s[i]!='"'){str[j]=s[i];j++;i++;}str[j]='\0';St.Format ("%s",str);q->m_list .InsertItem (count,St); //在列表控件中显示头文件名St.Format ("%s","关键字");q->m_list .SetItemText(count,1,St);count++;St.Format ("%c",s[i]);q->m_list .InsertItem (count,St); //在列表空间中显示字符'>'或'"'St.Format ("%s","特殊符号");q->m_list .SetItemText(count,1,St);count++;i++;} //是否是预处理串else if(s[i]=='/'&&s[i+1]=='/') //过滤形式为"//"的注释段{i++;while(s[i]!='\0'){i++;}} //是否是注释else if(s[i]=='/'&&s[i+1]=='*') //对第一次在串中以形式为"/*"开头的后续串的处理{note_flag=true;i=i+2;while(s[i]!='*'&&s[i]!='\0'||s[i]=='*'&&s[i+1]!='/') //扫描到"*/"或'\0'则退出循环{i++;}if(s[i]!='\0'){note_flag=false;}} //是否是注释else if(isalpha(s[i])||s[i]=='_') //对以字母、下划线开头的字符串的处理{int flag=0;j=0;str[j]=s[i];i++;j++;while(isalpha(s[i])||isdigit(s[i])||s[i]=='_') //是字母、数字或下划线则继续循环{str[j]=s[i];i++;j++;}str[j]='\0';for(int k=0;k<key_count;k++) //判断扫描到的字符串在不在关键字表中{if(key[k]==str){St.Format ("%s",str);q->m_list .InsertItem (count,St);St.Format ("%s","关键字");q->m_list .SetItemText(count,1,St);count++;flag=1;break;}}if(flag!=1) //不在关键字表中则是标识符{St.Format ("%s",str);q->m_list .InsertItem (count,St);St.Format ("%s","标识符");q->m_list .SetItemText(count,1,St);count++;}} //是否是标识符或关键字else if(isdigit(s[i])||s[i]=='.'&&isdigit(s[i+1]))//判断是否是数字(包括浮点数和整数,以及、浮点数的科学计数表示法和数的不同进制表示),但不考虑"+/-"号{j=0;str[j]=s[i];j++;i++;while(s[i]!=' '&&s[i]!='\t'&&s[i]!='\0'&&(!is_op1(s[i])||s[i]=='-'||s[i]=='+'||s[i]=='.')) //遇到空格,制表符,串结束符或者不包括'.'的一元运算符则退出{str[j]=s[i];i++;j++;}str[j]='\0';St.Format ("%s",str);q->m_list .InsertItem (count,St);St.Format ("%s","数字");q->m_list .SetItemText(count,1,St);count++;} //是否是数字else if(is_op1(s[i])) //扫描到一元运算符{str[0]=s[i];i++;str[1]=s[i];str[2]='\0';if(is_op2(str)) //根据最长子串原理匹配是否是二元运算符{St.Format ("%s",str);q->m_list .InsertItem (count,St);St.Format ("%s","特殊符号");q->m_list .SetItemText(count,1,St);count++;}else //是一元运算符{i--;St.Format ("%c",s[i]);q->m_list .InsertItem (count,St);St.Format ("%s","特殊符号");q->m_list .SetItemText(count,1,St);count++;}i++;} //是否是特殊符号else if(s[i]=='\''||s[i]=='"') //判断是否字符或字符串{j=0;str[j]=s[i];if(s[i]=='\'') //对字符的处理,包括转义字符{i++;j++;while(s[i]!='\''){str[j]=s[i];i++;j++;}str[j]=s[i];if(s[i+1]=='\''){i++;j++;str[j]=s[i];}j++;str[j]='\0';St.Format ("%s",str);q->m_list .InsertItem (count,St);St.Format ("%s","字符");q->m_list .SetItemText(count,1,St);count++;i++;}else //对字符串的处理{i++;j++;while(s[i]!='"'||s[i-1]=='\\'){str[j]=s[i];i++;j++;}str[j]=s[i];j++;str[j]='\0';St.Format ("%s",str);q->m_list .InsertItem (count,St);St.Format ("%s","字符串");q->m_list .SetItemText(count,1,St);count++;i++;}}}//while}///////////////////////////////////////////////////////////////////函数功能:扫描函数,调用analyse函数对整个C++源代码进行扫描//函数参数:fileName表示C++源代码的路径名//参数返回值:无void scan(CString fileName,LPVOID IParam){ifstream infile; //不能作为全局变量使用infile.open (fileName,ios::in);char s[300];while(!infile.eof()) //指针没移到文件末尾{infile.getline (s,300); //提取一行字符analyse(s,IParam); //调用analyse函数对提取的字符串进行分析}infile.close ();}2、文本压缩模块://函数功能:对一行C++源代码字符串进行去空格和注释处理//函数参数:s表示待处理的字符串//参数返回值:无void condense(string s) //过滤掉存在"/*.......*/"形式的屏蔽段{int i=0;char front; //如果一个字符的后一个字符为空格或制表符,则将当前字符保存在front if(note_flag){while(s[i]!='*'&&s[i]!='\0'||s[i]=='*'&&s[i+1]!='/')//不存在"*/"串或当前串还没结束则s字符串的当前指针继续后移{i++;}if(s[i]!='\0'){i=i+2;note_flag=false;}}while(s[i]!='\0') //串没结束则循环扫描{if(s[i]==' '||s[i]=='\t') //过滤空格和制表符{i++;continue;}if(s[i]=='#'&&s[i+1]!='\'') //预处理指令单独占一行{while(s[i]!='\0'){outfile<<s[i];i++;}outfile<<endl;break;}else if(s[i]=='/'&&s[i+1]=='/') //过滤形式为"//"的注释段{i++;while(s[i]!='\0'){i++;}}else if(s[i]=='/'&&s[i+1]=='*') //对第一次在串中以形式为"/*"开头的后续串的处理{note_flag=true;i=i+2;while(s[i]!='*'&&s[i]!='\0'||s[i]=='*'&&s[i+1]!='/') //扫描到"*/"或'\0'则退出循环{i++;}if(s[i]!='\0'){note_flag=false;}}else if(s[i]=='\''&&s[i+1]==' '&&s[i+2]=='\'') //对字符(空格)的处理{outfile<<s[i]<<" "<<s[i+2];i=i+3;}else if(s[i]=='"'&&s[i-1]!='\''&&s[i+1]!='\'') //对字符串的处理(包含空格){outfile<<s[i];i++;while(s[i]!='"'||s[i-1]=='\\'){outfile<<s[i];i++;}outfile<<s[i];i++;}else if(s[i]!=' '&&s[i]!='\t'&&s[i]!='\0') //字符非空则输出到文本{if(i>1&&(s[i-1]==' '||s[i-1]=='\t')) //判断当前字符的前一个字符是否是空格或制表符{if((isalpha(front)||isdigit(front))&&(isalpha(s[i])||isdigit(s[i])))//如果中间被空格隔开的前后两个非空字符是数字或字母,则输出一个空格到文本{ outfile<<" ";}}outfile<<s[i];if(isdigit(s[i])&&s[i+1]=='\0') //对数字在串的末尾的情况则输出一个空格outfile<<" ";if(s[i+1]==' '||s[i+1]=='\t'){front=s[i];}i++;}}}四、调试分析1、设计中遇到的问题及解决:1)程序测试过程中发现注释符号//和/* … */有时会扫描出错,并且小数扫描时有时也会出错,经过反复调试和检查源代码最后找出错误所在。
C-词法扫描器及语法分析器实现
目录1 课程设计目标 (2)2 分析与设计 (3)2.1 程序结构 (3)2.2 程序流程 (4)3 词法分析 (5)3.1 代码结构分析 (5)3.2 Token定义 (6)3.2.1 Token的定义和类型 (6)3.2.2 Token的种别码 (6)3.3 DAF分析 (7)3.3.1 删除注释DFA (7)3.3.2 词法分析DFA (9)4 语法分析 (13)4.1 代码结构分析 (13)4.2 节点定义 (14)4.2.1 节点定义和类型 (14)4.2.2 各类型节点的描述 (15)4.3 递归向下语法分析 (15)4.3.1 C-文法 (15)4.3.2 递归向下分析过程 (16)5 测试结果 (33)5.1 流程 (33)5.2 词法分析结果 (33)5.3 词法分析出错 (37)5.4 语法分析结果 (38)5.5 语法分析出错 (40)6 总结 (41)6.1 词法分析编写过程 (41)6.2 语法分析编写过程 (42)6.3 成果和收获 (42)7 附录 (43)7.1 scanner.h源文件 (43)7.2 scanner.cpp源文件 (44)7.3 parser.h源文件 (53)7.4 parser.cpp源文件 (55)1 课程设计目标学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C++语言描述及上机调试,实现一个C-Minus 小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。
要求:(1)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。
将词法分析器设计成供语法分析器调用的子程序。
功能包括:a. 具备预处理功能。
将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;b. 能够拼出语言中的各个单词;c. 返回(种别码,属性值)。
c语言单词搜索的实现
c语⾔单词搜索的实现单词搜索给定⼀个 m x n ⼆维字符⽹格 board 和⼀个字符串单词 word 。
如果 word 存在于⽹格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些⽔平相邻或垂直相邻的单元格。
同⼀个单元格内的字母不允许被重复使⽤。
代码解题如下:int pi,pj;//static int r[100][100];void f(char** board,int n ,int m,int x,int y,char * word,int p,int **r, int *rz){int a[4][2]={{0,-1},{-1,0},{0,1},{1,0}};// printf(" %d ",r[x][y]);int nx,ny;int i,j;int cc=0;int l=0;int zx,zy;//printf("%d ",r);// r[x][y]=1;//printf(" --p %d %d ",p,rz);if(m>=3)r[0][3]=0;//printf("%d %c ",r[0][3],word[p]);for(i=0;i<4;i++){nx=a[i][0]+x;ny=a[i][1]+y;// if(nx==2)printf(" --nx ny %d %d %c",nx,ny,word[p]);if(nx>=0&&nx<=n&&ny>=0&&ny<=m){if(r[nx][ny]>=1 &&r[nx][ny]<=p*2&&board[nx][ny]==word[p-1]){ r[nx][ny]++;// printf("%d %d ",nx,ny);f(board,n,m,nx,ny,word,p,r,rz);// f(board,n,m,pi,pj,word,p,r,rz);// f(board,n,m,0,0,word,p,r,rz);}if(r[nx][ny]==0){// printf("ddf sa ");if(board[nx][ny]==word[p]){for(j=0;j<4&&j!=i;j++){zx=a[i][0]+x;zy=a[i][1]+y;if(board[zx][zy]==word[p]) {// printf("&& %c %d %d ",word[p],zx,zy);r[zx][zy]=0;// if(zx==0&&zy==3)// printf("r %d %d %d ",r[zx][zy],zx,zy);}}// printf(" nx ny %d %d %c",nx,ny,word[p]);// p++;// cc++;// printf("-- %c",word[p]);r[nx][ny]=1;printf("r %d %d %d %d ",r[nx][ny],nx,ny);f(board,n,m,nx,ny,word,p+1,r,rz);}}}}// printf(" --p %d %d ",p,rz);// if(cc==0){r[x][y]=0;}if(word[p]=='\0') {// printf(" **p %d %d",p,rz);*rz=1;}//// return true;}bool exist(char** board, int boardSize, int* boardColSize, char * word){ int i,j;int n=boardSize-1;int m=boardColSize[0]-1;int p=1;int x=0,y=0;int row;int z,w;int rz=0;// r[x][y]=1;// printf("-- %d ",rz);int **r = (int **)malloc(sizeof(int*) *boardSize );for(row = 0 ; row < boardSize; row++){r[row] = (int *)malloc(sizeof(int) * boardColSize[0]);memset(r[row],0,sizeof(int) * boardColSize[0]);}// printf("%d %d ",n,m);for(i=0;i<=n;i++){for(j=0;j<=m;j++){// printf("%c ",board[i][j]);if(board[i][j]==word[0]){for(z=0;z<=n;z++){for(w=0;w<=m;w++){r[z][w]=0;// printf("%c ",board[i][j]);}}r[i][j]=1;pi=i;pj=j;f(board,n,m,i,j,word,p,r,&rz);}}}// printf(" zz %d ",rz);if(rz==1)return true;else return false;}到此这篇关于c语⾔单词搜索的实现的⽂章就介绍到这了,更多相关c语⾔单词搜索内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
编译原理实验源程序的输入和扫描
编译原理实验源程序的输入和扫描源程序的输入和扫描学时数:2[实验内容]:1、编制一个源程序的输入、扫描程序,从文件中每次读入一行到输入缓冲区(可以用字符数组实现);然后从缓冲区中依次取出字符显示在屏幕上。
2、从文件每次读入一行到输入缓冲区的功能(可以用字符数组实现)用一个子程序实现。
[实验目的]:1、通过编制一个源程序的输入、扫描程序,熟悉和了解从文件中读入数据到输入缓冲区的过程。
[实验步骤]:(一)准备:确定开发工具,如TC、VC++等;熟悉开发工具;确定被处理的语言的语法特点(初步确定,也可使用现成语言如Pascal、C 等)。
写好实验报告,编好程序。
(二)上机:输入程序,修改、调试,运行。
1、编程思想:采用一个子程序实现的形式。
(1)程序判断源文件是否为NULL,如果是,则输出错误提示!如果不是,则进入循环。
(2)调用子程序readbuffer(),每次读入一个字符给字符变量,如果字符变量的内容不是回车符,则把字符变量的内容存入数组buffer(),然后读入下一字符,再判断再存入数组,直到一行全存入数组,然后返回主程序,用输出语句输出刚才存入数组的一行字符;(3)如果没有到文件尾,则重复第(2)步,直到文件结束,则退出主程序,完成任务![程序要求]:1)如输入如下一段C语言源程序,要求运行编制的输入、扫描程序后输出与输入相同。
main(){int a,b ,c;a = 10; b=20;c=a+b;}例:输入、扫描程序源代码(参考)://程序开始:#includestdio.h#includestdlib.h#includeconio.h//声明头文件int i;FILE *fp;char buffer;//声明变量int readbuffer() //子程序开始{int j=0;char ch;//声明变量while(j256){ch=fgetc(fp);if (ch=='\n'){i=j;return 0;} //ifbuffer[j]=ch;++j;}return 1;} //子程序结束main() //main()开始{if((fp=fopen(“d:\\a.c","r"))==NULL) {printf("THE FILE D OESN’T OPEN!"); exit(0); }while(!feof(fp)){int j;j=0;readbuffer();while(ji){printf("%c",buffer[j]);j++;}printf("\n");getch();}fclose(fp);getch();} //main()结束//程序结束2)当源文件为:d:\\a.c.。
编译语言-简单的单词识别程序
实验一简单的单词识别程序一、实验内容设计一个识别单词的程序,从文本文件中读取字符串,将字符串中的字符根据空格逐个识别为单词,并比较单词是否为zero,one,two,three,four,five,six,seven,eight,nine,若是则输出该单词对应的阿拉伯数字。
要求用JAVA语言、图形界面方式编程。
(可参考实验指导书P110至P113)举例:若文本文件中的字符串为one at are three six 234 eight 则输出为1368二、程序代码DistinguishWord.javapackage zlf;import java.io.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class DistinguishWord extends JApplet{private JFileChooser jfc = new JFileChooser(new File("."));private JTextArea jta1 = new JTextArea();private JTextArea jta2 = new JTextArea();private JButton jlb1 = new JButton("字符串的内容为:");private JButton jlb2 = new JButton("其中英文对应的阿拉伯数字为:");private JLabel fileName = new JLabel(" Filename ");private JTextField jtf = new JTextField(30);private JButton brower = new JButton("Brower");public DistinguishWord(){JPanel p1 = new JPanel();p1.setLayout(new BorderLayout());p1.setBorder(BorderFactory.createEmptyBorder(5,5,5,10));p1.add(jlb1,BorderLayout.NORTH);p1.add(new JScrollPane(jta1), BorderLayout.CENTER);add(p1,BorderLayout.CENTER);JPanel p2 = new JPanel();p2.setLayout(new BorderLayout());p2.setBorder(BorderFactory.createEmptyBorder(5,5,5,10));p2.add(jlb2,BorderLayout.NORTH);p2.add(new JScrollPane(jta2), BorderLayout.CENTER);add(p2,BorderLayout.EAST);JPanel p3 = new JPanel();p3.setLayout(new BorderLayout());p3.add(fileName,BorderLayout.WEST);p3.add(jtf);p3.add(brower, BorderLayout.EAST);add(p3,BorderLayout.SOUTH);jtf.setText("C:/1.txt");brower.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){open();}});jtf.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e){if(e.getKeyChar()==KeyEvent.VK_ENTER ) //按回车键执行相应操作;{String file = jtf.getText();try {BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));byte[] b = new byte[in.available()];in.read(b,0,b.length);jta1.append(new String(b,0,b.length));in.close();} catch (IOException e1) {jta1.setText("Error opening ");}}}});jlb2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){String s = jta1.getText();jta2.setText(translateFigure(s));}});}private String translateFigure(String string){String[] english = {"zero","one","two","three","four","five","six","seven","eight","nine"};String s = string;String str = "";String t = "";int n = 0;char[] ch = s.toCharArray();for(int i = 0; i < s.length(); i++){if(ch[i] == ' '||ch[i] == '.'||ch[i] == ','){t = s.substring(n, i);n = i+1;for(int j = 0; j < 10; j++){if(t.equals(english[j]))str = str + j;}}}return str;}private void open(){if(jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)open(jfc.getSelectedFile());}private void open(File file){try{BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));byte[] b = new byte[in.available()];in.read(b,0,b.length);jta1.append(new String(b,0,b.length));in.close();jtf.setText(file.getName());}catch(IOException ex){jtf.setText("Error opening " + file.getName());}}}1.txtone at are three six 234 eight三、实验结果截图:简单说明:字符串内容框内可输入内容,点击“其中英文对应的阿拉伯数字为:”按钮可得出结果,或者在Filename后输入文件路径与文件名后回车,字符串内容框会显示文本文件内容,此时再点击“其中英文对应的阿拉伯数字为:”按钮可得出结果,或者在“Brower”按钮查找文件显示在字符串内容框内,再点击“其中英文对应的阿拉伯数字为:”按钮可得出结果。
四款优秀的源代码扫描工具简介
一、DMSCA-企业级静态源代码扫描分析服务平台端玛企业级静态源代码扫描分析服务平台(英文简称:DMSCA)是一个独特的源代码安全漏洞、质量缺陷和逻辑缺陷扫描分析服务平台。
该平台可用于识别、跟踪和修复在源代码中的技术和逻辑上的缺陷,让软件开发团队及测试团队快速、准确定位源代码中的安全漏洞、质量和业务逻辑缺陷等问题,并依据提供的专业中肯的修复建议,快速修复。
提高软件产品的可靠性、安全性。
同时兼容并达到国际、国内相关行业的合规要求。
DMSCA是端玛科技在多年静态分析技术的积累及研发努力的基础上,联合多所国内及国际知名大学、专家共同分析全球静态分析技术的优缺点后、结合当前开发语言的技术现状、源代码缺陷的发展势态和市场后,研发出的新一代源代码企业级分析方案旨在从根源上识别、跟踪和修复源代码技术和逻辑上的缺陷。
该方案克服了传统静态分析工具误报率(False Positive)高和漏报(False Negative)的缺陷。
打断了国外产品在高端静态分析产品方面的垄断,形成中国自主可控的高端源代码安全和质量扫描产品,并支持中国自己的源代码检测方面的国家标准(GB/T34944-2017 Java、GB/T34943-2017 C/C++、GB/T34946-2017 C#),致力于为在中国的企业提供更直接,更个性化的平台定制和本地化服务。
DMSCA支持主流编程语言安全漏洞及质量缺陷扫描和分析,支持客户化平台界面、报告、规则自定义,以满足客户特定安全策略、安全标准和研发运营环境集成的需要。
产品从面世,就获得了中国国内众多客户的青睐,这些客户包括但不限于银行、在线支付、保险、电力、能源、电信、汽车、媒体娱乐、软件、服务和军事等行业的财富1000企业。
1、系统架构2、系统组件3、产品界面4、集成SDLC五、主要功能及特性操作系统独立。
代码扫描不依赖于特定操作系统,只需在在企业范围内部署一台扫描服务器,就可以扫描其它操作系统开发环境下的代码。
实验一_源程序的输入和扫描
} //main()结束
实验调试过程及测试结果
输入程序运行调试后实现源程序的输入和扫描:
1、源程序输入如下一段:(可以输入别的任何程序段)
main()
{
int a,b,c;
a = 10;
b=20;
c=a+b;
}
程序运行时输入如下图:
2、源程序扫描又输出上面输入的程序段如下图
i++; //i是统计已写入的字符个数
}
fclose(fp); // 关闭文件句柄
return i;
}
int readbuffer() //子程序开始
{
int flen=0; //定义整形变量flen,初始值为0
int j=0;
char ch;
char *filename="yanan";
//声明变量
printf("2、input o open the file \n");
scanf("%c",&creatflie) ;
if(creatflie=='c')
//printf("\n请输入内容进入你所创建的文件中,输入数字$创建完成\n");
WriteFile(filename);
if(creatflie=='o')
flen++;} //数组指针下移
printf("\n"); //换行
return 1;
} //子程序结束
main() //main()开始
{
char *filename={"yanan"};
VC6.0下电子词典源代码
Main():#include <stdio.h>#include <string.h>#include "dict.h"int main(int argc, char *argv[]){t est1();r eturn 0;}Dict.h:#ifndef __DICT_H#define __DICT_Htypedef struct node{c har *key;i nt n_strans;c har **strans;}WORD;int get_nword();WORD *get_wordarr(int n);int get_txt_usr(char *);int get_nword_usr(char *src);void add_usr(char *src);void add_txt_usr(char *src);int test1();int test2();#endifAdd_bin_usr.cpp:#include <stdio.h>#include <stdlib.h>#include <string.h>#include "dict.h"void add_usr(char *src){c har ch;g etchar();p rintf("you want to insert the word?please input y or n:"); s canf("%c", &ch);i f(ch == 'y'){int n_strans, i;char buf[512];FILE *fw;int len;if((fw = fopen("dict_bin_usr.txt", "a")) == NULL){perror("dict_bin_usr.txt open failuren");exit(-1);}len = strlen(src)+1;fwrite(&len, 4, 1, fw);fwrite(src,1, len, fw);printf("input word information:input n_strans:");scanf("%d",&n_strans);fwrite(&n_strans, 4, 1, fw);printf("input word information:input strans:");getchar();for(i=0;i<n_strans; i++){fgets(buf,sizeof(buf),stdin);len = strlen(buf);buf[len-1] = '\0';fwrite(&len, 4, 1, fw);fwrite(buf, 1, len, fw);}fclose(fw);}}Add_txt_usr.cpp:#include <stdio.h>#include <string.h>#include <stdlib.h>#include "dict.h"void add_txt_usr(char *src){c har ch;c har buf[100];p rintf("you want to insert the word?please input y or n:"); s canf("%c", &ch);i f(ch== 'y'){FILE *fw;int len;char str[100];if((fw = fopen("dict_usr.txt", "a")) == NULL){perror("dict_usr.txt open failuren");exit(-1);}fprintf(fw,"%s\n", src);printf("input word information:input strans:");getchar();fgets(buf,sizeof(buf),stdin);len = strlen(buf);buf[len-1] = '\0';fprintf(fw, "%s\n", buf);fclose(fw);}i f(ch == 'n')fgets(buf,sizeof(buf),stdin);}Dict1.cpp:#include <stdio.h>#include <string.h>#include <stdlib.h>#include "dict.h"int search(WORD *word, char *str, int n){i nt mid, i;i nt start = 0;i nt end = n-1;i nt flag = 1;w hile(start <= end){mid = (start+end)/2;if((strcmp(str, word[mid].key))==0){flag = 0;printf("%s\n", word[mid].key);for(i=0; i<word[mid].n_strans; i++)printf("%s\n",word[mid].strans[i]);return 0;}else if(strcmp(str, word[mid].key)>0)start = mid+1;elseend = mid-1;}p rintf("in database These is no the word\n");r eturn flag;}static void free_word(WORD *word,int n){i nt i,j;f or(i=n-1; i>=0; i--){for(j=word[i].n_strans-1;j>=0; j--)free(word[i].strans[j]);free(word[i].strans);free(word[i].key);}f ree(word);// word =NULL;}int test1(void){i nt n;n = get_nword();W ORD *pword = get_wordarr(n);c har a[50];i nt flag = 0;i nt len;p rintf("******************************************************\n" );p rintf("please input you want to search word(input exit end):");f gets(a,50, stdin);l en = strlen(a);a[len-1] = '\0';w hile(strcmp(a, "exit") != 0){flag = search(pword, a, n);//找到返回0,找不到返回1if(flag == 1){flag = get_txt_usr(a);if(flag == 1)add_txt_usr(a);}printf("******************************************************\n" );printf("please input you want to search word(input exit end):");//system("pause");fgets(a,50, stdin);len = strlen(a);a[len-1] = '\0';}f ree_word(pword, n);return 0;}Dict3.cpp:#include <stdio.h>#include <string.h>#include <stdlib.h>#include "dict.h"int N;static WORD *get_bin_nword(){i nt n, i, j, n_strans;F ILE *fr;i nt len;i f((fr = fopen("dict_bin.txt", "r")) == NULL){perror("dict_bin.txt open failuren");exit(-1);}f read(&n, 4, 1, fr);N = n;W ORD *wordarr=(WORD *)malloc(sizeof(WORD)*N);f or(i=0; i<n; i++){fread(&len, 4, 1, fr);wordarr[i].key = (char *)malloc(len);fread(wordarr[i].key, 1, len, fr);fread(&n_strans, 4, 1, fr);wordarr[i].n_strans = n_strans;wordarr[i].strans =(char **) malloc(sizeof(*(wordarr[i].strans)) * n_strans);for(j=0; j<wordarr[i].n_strans; j++){fread(&len, 4, 1, fr);wordarr[i].strans[j] =(char *) malloc(len);fread(wordarr[i].strans[j], 1, len, fr);}}f close(fr);r eturn wordarr;}static int search(WORD *wordarr, int n, char *src){i nt start = 0;i nt end = n-1;i nt mid;i nt i, flag = 1;w hile(start <= end){mid = (start+end)/2;if((strcmp(src, wordarr[mid].key))==0){flag = 0;printf("%s\n", wordarr[mid].key);for(i=0; i<wordarr[mid].n_strans; i++)printf("%s\n",wordarr[mid].strans[i]);return 0;}else if(strcmp(src, wordarr[mid].key)>0)start = mid+1;elseend = mid-1;}p rintf("****************************************\n");p rintf(" in database These is no the word\n");p rintf("****************************************\n");r eturn flag;}static void free_word(WORD *word,int n){i nt i,j;f or(i=n-1; i>=0; i--){for(j=word[i].n_strans-1;j>=0; j--)free(word[i].strans[j]);free(word[i].strans);free(word[i].key);}f ree(word);w ord =NULL;}Get_bin_wordaar_txt.cpp:#include <stdio.h>#include <stdlib.h>#include <string.h>#include "dict.h"WORD *get_wordarr(int n) //从文件中读取内容,放在数据结构里面{W ORD *word = (WORD *)malloc(sizeof(WORD)*n);c har buf[512], bufcp[512];c har *token, *begin;i nt i = 0,j;i nt len;F ILE *fr, *fw;i f((fr = fopen("dict.txt", "r")) == NULL){perror("dict.txt open failure\n");exit(-1);}i f((fw = fopen("dict_bin.txt", "w")) == NULL){perror("dict_bin.txt open failuren");exit(-1);}f write(&n, 4, 1, fw);w hile(fgets(buf, sizeof(buf), fr)){len = strlen(buf)-1;buf[len] = '\0';word[i].key = (char *)malloc(len);strcpy(word[i].key, &buf[1]);fwrite(&len, 4, 1, fw);fwrite(word[i].key, 1, len, fw);fgets(buf, sizeof(buf), fr);{strcpy(bufcp, buf);for(j=0,begin=buf; (token=strtok(begin, "@"))!=NULL; begin=NULL,j++)word[i].n_strans = j;fwrite(&j, 4, 1, fw);word[i].strans = (char **)malloc(sizeof(*(word[i].strans)) * j);for(j=0,begin=bufcp; (token=strtok(begin, "@"))!=NULL; begin=NULL,j++){len = strlen(token)+1;word[i].strans[j] = (char *)malloc(len);strcpy(word[i].strans[j],token);fwrite(&len, 4, 1, fw);fwrite(token, 1, len, fw);}}i++;}f close(fr);f close(fw);r eturn word;}Get_nword.cpp:#include <stdio.h>#include "dict.h"int get_nword(){F ILE *fp;i nt count = 0;c har buf[512];i f((fp=(fopen("dict.txt", "r")))==NULL){perror("file open failure\n");return -1;}w hile(fgets(buf, sizeof(buf), fp)){count++;}c ount /= 2;f close(fp);r eturn count;}Search_bin_usr.cpp:#include <stdio.h>#include <string.h>#include <stdlib.h>#include "dict.h"int get_nword_usr(char *src){int j, n_strans;FILE *fr;c har str[512];i nt len =0;i f((fr = fopen("dict_bin_usr.txt", "r")) == NULL) {perror("file open failuren");exit(-1);}w hile(fread(&len, 4, 1, fr)){fread(str, 1, len, fr);if(strcmp(str, src) == 0){printf("the word in usr database\n");printf("%s\n", str);fread(&n_strans, 4, 1, fr);for(j=0; j<n_strans; j++){fread(&len, 4, 1, fr);fread(str, 1, len, fr);printf("%s\n", str);}return 0;}fread(&n_strans, 4, 1, fr);for(j=0; j<n_strans; j++){fread(&len, 4, 1, fr);fread(str, 1, len, fr);}}p rintf("in usr these no the word\n");f close(fr);r eturn 1;}Seach_usr_txt.cpp:#include <stdio.h>#include <string.h>#include <stdlib.h>#include "dict.h"int get_txt_usr(char *src){F ILE *fr;c har str[512];i nt len =0;i f((fr = fopen("dict_usr.txt", "r")) == NULL){perror("dict_usr.txt open failuren");exit(-1);}w hile(fgets(str,sizeof(str), fr)){len = strlen(str);str[len-1] = '\0';if(strcmp(str, src) == 0){printf("****************************************\n");printf("the word in usr database\n");printf("%s\n", str);fgets(str, sizeof(str), fr);printf("%s\n", str);printf("****************************************\n");return 0;}}p rintf("****************************************\n");p rintf("in usr these no the word\n");p rintf("****************************************\n");f close(fr);r eturn 1;}。
c语言 scan实例
c语言 scan实例scan是C语言中用于从标准输入(键盘)读取数据的函数。
在本文中,我们将讨论scan函数的用法和一些常见问题。
scan函数是C语言中输入函数库(stdio.h)中的一个重要函数。
它允许我们从键盘读取各种类型的数据,并将其存储在变量中供后续使用。
scan函数的基本语法如下:```cscanf("格式控制字符串", 变量地址);```其中,格式控制字符串用于指定要读取的数据类型,变量地址则是要将数据存储的变量的地址。
scan函数可以读取多种数据类型,包括整数、浮点数、字符、字符串等。
下面我们分别介绍一些常见的用法。
1. 读取整数要读取一个整数,我们可以使用"%d"作为格式控制字符串。
例如,以下代码将从键盘读取一个整数,并将其存储在变量num中:```cint num;scanf("%d", &num);```2. 读取浮点数要读取一个浮点数,我们可以使用"%f"作为格式控制字符串。
例如,以下代码将从键盘读取一个浮点数,并将其存储在变量num中:```cfloat num;scanf("%f", &num);```3. 读取字符要读取一个字符,我们可以使用"%c"作为格式控制字符串。
例如,以下代码将从键盘读取一个字符,并将其存储在变量ch中:```cchar ch;scanf("%c", &ch);```需要注意的是,如果在读取其他类型数据之前已经使用了scanf函数读取字符,可能会出现问题。
因为scanf函数会在读取字符后留下一个换行符('\n')在输入缓冲区中,而后续的scanf函数会直接读取该换行符,导致无法读取到正确的值。
解决这个问题的方法是在读取字符之前加上一个空格,即"%c"前面加上一个空格,如下所示:```cscanf(" %c", &ch);```4. 读取字符串要读取一个字符串,我们可以使用"%s"作为格式控制字符串。
词法分析器(lex实现)
院系:计算机学院实验课程:编译原理实验项目:C++源代码单词扫描程序(词法分析)指导老师:陈寅开课时间:2014~2015年度第1学期专业:数据库班级:2班学生:雷楚楚学号:20122100158C++源代码单词扫描程序(词法分析)一、实验目的设计并实现一个词法分析器,深刻理解编译原理中词法分析器的原理。
二、实验内容1、C++源代码扫描程序识别C++记号。
C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串,注释,特殊符号(分解符)和运算符号等。
2、打开一个C++源文件,打印出所有以上的记号。
3、选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。
假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。
因此,程序中还看可以有这样的压缩功能。
4、进一步实现减少源文件大小的压缩功能。
5、完善软件文档。
二、实验过程1、对C++文法中的各类单词分类(1)保留字:asm、do、if、return、typedef、auto、double、inline、short、typeid、bool、try、include、long、sizeof、union、case、enum、mutable、static、unsigned、long、sizeof、union、case、enum、mutable、static、unsigned、catch、explicit、namespace、using、char、export、int、signed、break、else、new、struct、virtual、class、extern、operator、switch、void、const、false、private、template、volatile、float、protected、this、continue、for、public、throw、while、default、friend、register、true、delete、goto、try、include、std、iomanip、setw、setprecision、endl、setiosflags、ios (2)数字:包括整数和浮点数(3)标识符:由字母打头的字母和数字的字符串,可包含下划线(4)运算符:"&="、"^="、"、="、"<<="、">>="、"*="、"/="、"%="、"+="、"-="、"="、"?:"、"、、"、"&&"、"、"、"^"、"&"、"=="、"!="、">"、">="、"<"、"<="、"<<"、">>"、"+"、"-"、"*"、"/"、"%"、".*"、"->*"、"&"、"+"、"-"、"++"、"--"、"->"、"::"(5)界符:"{"、"}"、"("、")"、"#"、","、":"、";"、"."、"\""(6)注释:包括//和/**/两种类型的注释(7)字符串:包含在“”里面的内容2、将各类单词对应到Flex中:(1)保留字:asm|do|if|return|typedef|auto|double|inline|short|typeid|bool|try|include|long|sizeof|union|case|enum|mutable|static|unsigned|long|sizeof|union|case|enum|mutable|static|unsigned|catch|explicit|namespace|using|char|export|int|signed|break|else|new|struct|virtual|class|extern|operator|switch|void|const|false|private|template|volatile|float|protected|this|continue|for|public|throw|while|default|friend|register|true|delete|goto|try|include|std|iomanip|setw|setprecision|endl|setiosflags|ios(2)数字:包括整数和浮点数(正负)[+-]?([0-9]*|0|([0-9]*\.[0-9]*))(3)标识符:由字母打头的字母和数字的字符串,包含下划线[A-Za-z]([A-Za-z]|[0-9]|_)*(4)运算符:"&="|"^="|"|="|"<<="|">>="|"*="|"/="|"%="|"+="|"-="|"="|"?:"|"||"|"&&"|"|"|"^"|"&"|"=="|"!="|">"|">="|"<"|"<="|"<<"|">>"|"+"|"-"|"*"|"/"|"%"|".*"|"->*"|"&"|"+"|"-"|"++"|"--"|"->"|"::"(5)界符:"{"|"}"|"("|")"|"#"|","|":"|";"|"."|"\""(6)注释:包括//和/**/两种类型的注释\/\*(\s|.)*?\*\/(/**/)\/\/[^\n]*(//)(7)字符串:包含在“”里面的内容'[^'\n]*'|\"[^\"]*\"(8)除其他情况之外判断为出错3、跳过空行和空格[\t]+{}/*空格*/ \n|.{}/*空行*/4、为lex制定一些规则5、写子程序让用户输入要进行词法扫描的文件,当lex读完输入文件之后就会调用函数yywrap。
C语言编辑背单词程序
#include<stdio.h>#include<windows.h>#include<string.h>void main(){ int x0,x1,x2,x3,x4,x5,x6,x7,x8,x9;charword[10][20]={"good","book","like","love","name","time","open","read","work","bank"};char a[20];printf("good,book,like,love,name,time,open,read,work,bank");getchar("\n");system("cls");printf("输入好单词:\n");scanf("%s",a);if(strcmp(a,word[0])==0) puts("对了\n"),x0=10;else printf("错了,是%s\n",word[0]),x0=0;printf("输入书单词:\n");scanf("%s",a);if(strcmp(a,word[1])==0) puts("对了\n"),x1=10;else printf("错了,是%s\n",word[1]),x1=0;printf("输入喜欢单词:\n");scanf("%s",a);if(strcmp(a,word[2])==0) puts("对了\n"),x2=10;else printf("错了,是%s\n",word[2]),x2=0;printf("输入爱单词:\n");scanf("%s",a);if(strcmp(a,word[3])==0) puts("对了\n"),x3=10;else printf("错了,是%s\n",word[3]),x3=0;printf("输入名字单词:\n");scanf("%s",a);if(strcmp(a,word[4])==0) puts("对了\n"),x4=10;else printf("错了,是%s\n",word[4]),x4=0;printf("输入时间单词:\n");scanf("%s",a);if(strcmp(a,word[5])==0) puts("对了\n"),x5=10;else printf("错了,是%s\n",word[5]),x5=0;printf("输入打开单词:\n");scanf("%s",a);if(strcmp(a,word[6])==0) puts("对了\n"),x6=10; else printf("错了,是%s\n",word[6]),x6=0;printf("输入读单词:\n");scanf("%s",a);if(strcmp(a,word[7])==0) puts("对了\n"),x7=10; else printf("错了,是%s\n",word[7]),x7=0;printf("输入工作单词:\n");scanf("%s",a);if(strcmp(a,word[8])==0) puts("对了\n"),x8=10; else printf("错了,是%s\n",word[8]),x8=0;printf("输入银行单词:\n");scanf("%s",a);if(strcmp(a,word[9])==0) puts("对了\n"),x9=10; else printf("错了,是%s\n",word[9]),x9=0;printf("%d\n",x0+x1+x2+x3+x4+x5+x6+x7+x8+x9); }。
C++源代码单词扫描程序
C++源代码单词扫描程序-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN院系:计算机学院实验课程:编译原理实验实验项目:C++源代码单词扫描程序(词法分析)指导老师:黄煜廉一.实验项目C++源代码单词扫描程序(词法分析)二.实验要求1.C++源代码扫描程序识别C++记号。
C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。
2.打开一个C++源文件,打印出所有以上的记号。
3.要求应用程序应为Windows界面。
4.选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。
假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。
因此,程序中还应该有这样的压缩功能。
5.选作部分:进一步思考或实现——如何进一步实现减小源文件大小的压缩功能。
6.应该书写完善的软件文档。
三.需求分析1.根据所需的功能程序应分为分析关键字、分析标识符、分析数字、分析串、分析注释、分析特殊字符和过滤多余字符几部分。
2.关键字有 .goto include for break case if struct class等。
3.过滤字符要考虑到空格和换行。
四.实验代码五.#include <>六.#include <>七.#include <>八.#include <>九.#include <>十.FILE *fp;十一.char string(char c[]); , "(", ")", "{", "}","&&","||","!","()",">>"};十二.char*keyword[35]={"","include","break","case","char","const","continue","default","do", "double",十三."else","enum","cin","float","for","goto","if","int","long","cout",十四."return","short","signed","sizeof","static","struct","switch","typedef", "printf",十五."union","unsigned","void","volatile","while","main"};十六.十七.int search(char searchstr[],int type)十八.{十九.letter[++i]=ch;二十.ch=fgetc(fp);二十一.}二十二.letter[i+1]='\0';二十三.if (search(letter,1))二十四.{二十五.cout<<letter<<" "<<"关键字"<<endl;二十六.}二十七.else二十八.{二十九.cout<<letter<<" "<<"标识符"<<endl;三十.}三十一.return(ch);三十二.}三十三.三十四.三十五.char number(char ch)//数字处理三十六.{三十七.int i=-1;三十八.char num[20];三十九.while (isdigit(ch)!=0)四十.{四十一.num[++i]=ch;四十二.ch=fgetc(fp);四十三.}四十四.if(isalpha(ch)!=0)四十五.{四十六.while(!isspace(ch))四十七.{四十八.num[++i]=ch;四十九. ch=fgetc(fp);五十.}五十一.num[i+1]='\0';五十二.cout<<num<<""<<"错误!"<<endl;五十三.goto loop;五十四.}五十五.num[i+1]='\0';五十六.cout<<num<<" "<<"数字"<<endl;五十七.loop: return(ch);五十八.}五十九.六十.六十一.char other(char ch)六十二.{六十三.int i=-1;六十四.char other[1000];六十五.if (isspace(ch)) //是空格六十六.{六十七.ch=fgetc(fp);六十八.goto loop;六十九.}七十.while ((!isspace(ch))&&(!isalnum(ch))) //不是空格且不是字母或数字七十一.{七十二.other[++i]=ch;七十三.ch=fgetc(fp); //若是字母,不是空格的判断没有写出来七十四.}七十五.other[i+1]='\0';七十六.if (search(other,2))七十七.cout<<other<<" "<<"算数运算符"<<endl;七十八.else七十九.if (search(other,3))八十.cout<<other<<" "<<"特殊符号"<<endl;八十一.else八十二.if (search(other,4))八十三.cout<<other<<" "<<"注释符"<<endl;八十四.loop: return (ch);八十五.}八十六.char string(char c[])//字符串八十七.{八十八.int i=0 ;八十九. //char ch;九十.char stri[100];九十一.stri[i]=c[0];九十二.ch=fgetc(fp);九十三.while (ch!='"')九十四.{九十五.stri[++i]=ch;九十六.ch=fgetc(fp);九十七.}九十八.stri[++i]=ch;九十九.stri[++i]='\0';一○○.cout<<stri<<" "<<"字符串"<<endl;一○一.return(ch);一○二.}一○三.int main ()一○四.{一○五.char str,c;一○六.cout<<"Please enter a file name:";一○七.char FileName[100];一○八.cin>>FileName;一○九.fp=fopen(FileName,"r");一一○.一一一.一一二.if(fp==NULL)一一三.{一一四.cout<<"Unable to open file!"<<endl;一一五.return 0;一一六.}一一七.else一一八.{一一九.cout<<"Open the file successfully!"<<endl;一二○.cout<<fp<<endl;一二一.str=fgetc(fp);一二二.while (str!=EOF)一二三.{一二四.if (isalpha(str))一二五.str=letter(str);一二六.else一二七.{一二八.if (isdigit(str))一二九.str=number(str);一三○.else一三一.str=other(str);一三二.}一三三.}一三四.cout<<"endl"<<endl;一三五.一三六.}一三七. c=getch();一三八. return 0;一三九.}一四○.运行结果1.成功运行2.未找到文件时一四一.参考文献《编译原理及实践》《C++程序设计》。
C语言实现单词小助手功能完善版
C语⾔实现单词⼩助⼿功能完善版本⽂为⼤家分享了完善版的C语⾔单词⼩助⼿的具体实现代码,供⼤家参考,具体内容如下⼀.题⽬分析1、在原有代码基础上添加⽂档注释,函数注释及语句注释,使代码风格良好,易于阅读和修改。
2、完善功能,实现背单词时出错词的重复记忆。
3、在词库维护选项中添加中英⽂分别查询的功能4、完成输如数据的正确性验证,如:在菜单选择时输⼊不规范的错误提⽰、在添加单词时英⽂输⼊时输⼊汉语的异常排除等⼆.关键算法构造1.总菜单项⽬选择及maintain函数⼦选项的输⼊异常检查及提⽰。
2.添加单词三.程序实现#include <string.h>#include <stdlib.h>#define MAX_CHAR 20 // 最⼤字符#define MAX_NUM 200 // 单词的最⼤个数struct word//单词的结构体{char en[MAX_CHAR]; // 英⽂形式char ch[MAX_CHAR]; //中⽂形式} s[MAX_NUM],r[MAX_NUM]; //单词数组int num; //词典单词个数int rnum = 0; //增强记忆单词个数int select=1;//select 为是否退出系统的标记int d=0,c=0;//c为答错的次数,d为答对的次数//帮助void help(){printf("\n本系统主要实现英语单词学习的功能。
⽤户可对词典⽂件中的单词进⾏预览,增删改查。
"); printf("\n同时还可进⾏中英、英中测试。
本系统还提供了测试成绩的显⽰功能。
");}//从⽂件中读取单词的信息void readfile(){FILE *fp;int i=0;fp=fopen("data.txt","r");if(!fp){printf("\n打开⽂件data.txt失败!");}while(fscanf(fp,"%s %s ",s[i].en,s[i].ch)==2){i++;}printf("\n");fclose(fp);}//向⽂件中写⼊单词void writefile(){FILE *fp;int i=0;fp=fopen("data.txt","w");if(!fp){printf("\n打开⽂件data.txt失败!");}for(i=0;i<num;i++){fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);}printf("\n");fclose(fp);}//从增强记忆⽂件中读取单词void readRemeberfile(){FILE *fp;int i=0;fp=fopen("Remeberdata.txt","r");if(!fp){printf("\n打开⽂件Remeberdata.txt失败!");}while(fscanf(fp,"%s %s ",r[i].en,r[i].ch)==2){i++;}rnum=i;if(0==i)printf("\n你还没有错题哦!");elseprintf("\n");fclose(fp);}void sort()/*按字典排序*/{int i,j;char temp[MAX_CHAR];for(i=0;i<num-1;i++){for(j=num-1;j>i;j--)if(strcmp(s[j-1].en,s[j].en)>0)//string类strcmp函数通过Ascll 码逐字符⽐较{strcpy(temp,s[j-1].en);strcpy(s[j-1].en,s[j].en);strcpy(s[j].en,temp);strcpy(temp,s[j-1].ch);strcpy(s[j-1].ch,s[j].ch);strcpy(s[j].ch,temp);}}}//添加单词信息void add(){int i=num,j,flag=1,a;f: while(flag){flag=0;printf("\n请输⼊单词的英⽂形式:");scanf("%s",s[i].en);//strncpy(c,s[i].en.c_str(),s[i].en.length());for(a=0;a<20;a++){if(s[i].en[a]>>8==0){{printf("输⼊不是纯英⽂,请重新输⼊");flag=1;goto f;//当不是纯英⽂输⼊时跳转}}//if(a!=19) continue;for(j=0;j<i;j++)if(strcmp(s[i].en,s[j].en)==0)//与已有单词⽐较{printf("已有该单词,请检查后重新录⼊!\n");flag=1;break; /*如有重复⽴即退出该层循环,提⾼判断速度*/}}printf("\n请输⼊单词的中⽂形式:");scanf("%s",s[i].ch);num++;printf("\n您输⼊的信息为: 英⽂: %s 中⽂: %s ",s[i].en,s[i].ch);sort();}//删除单词信息void del(){int i=0,j=0;char en[MAX_CHAR];//英⽂形式printf("\n请输⼊你要删除的单词英⽂形式:");scanf("%s",en);for(i=0;i<num;i++)//先找到该英⽂形式对应的序号if(strcmp(s[i].en,en)==0)//判断已有单词中是否存在此词{for(j=i;j<num-1;j++)s[j]=s[j+1];num--; //数量减少 1return;}printf("\n没有这个单词!");}//修改单词信息void modify(){int i=0,choose=0,flag=1;//chooses代表选项标识,flag代表是否找到单词char en[MAX_CHAR]; //英⽂形式while(flag||choose){printf("\n请输⼊你要修改的单词英⽂形式:");scanf("%s",en);for(i=0;i<num;i++)//先找到该英⽂形式对应的序号if(strcmp(s[i].en,en)==0){printf("\n请输⼊单词正确的英⽂形式:");scanf("%s",s[i].en);printf("\n请输⼊此单词正确的的中⽂形式:");scanf("%s",s[i].ch);printf("\n继续修改请选1,返回上⼀级请选0:");scanf("%d",&choose);if(choose==0) return;}flag=0;}if(!flag)printf("\n没有这个单词!");}//单词预览void show(){int i=0;printf("\n单词:英⽂中⽂ ");//格式对齐for(i=0;i<num;i++)//查询单词void search(){int i=0,choose=0,flag=1;char ch[MAX_CHAR];//中⽂形式while(choose||flag){printf("\n请输⼊你要查询的单词中⽂形式:");scanf("%s",ch);for(i=0;i<num;i++)//先找到该中⽂形式对应的序号if(strcmp(s[i].ch,ch)==0){printf("\n英⽂形式中⽂形式 ");printf("\n %-12s%12s",s[i].en,s[i].ch);printf("\n继续查询请选1,返回上⼀级请选0:");scanf("%d",&choose);if(choose==0) return;}flag=0;}if(!flag) printf("\n没有这个单词!");}//查询单词(英)void ysearch(){int i=0,choose=0,flag=1;char en[MAX_CHAR]; //英⽂形式while(choose||flag){printf("\n请输⼊你要查询的单词英⽂形式:");scanf("%s",en);for(i=0;i<num;i++)//先找到该中⽂形式对应的序号if(strcmp(s[i].en,en)==0){printf("\n英⽂形式中⽂形式 ");printf("\n %-12s%12s",s[i].en,s[i].ch);printf("\n继续查询请选1,返回上⼀级请选0:");scanf("%d",&choose);if(choose==0) return;}flag=0;}if(!flag) printf("\n没有这个单词!");}//中译英测试void zytest(){char b1[20];int z;int choose=1;int i;FILE *fp;while(choose){fp=fopen("Remeberdata.txt","a+");//打开增强记忆⽂件if(!fp){printf("\n打开⽂件Remeberdata.txt失败!");}i = rand()%num;//在已有词汇中随机选取printf("\n【%s】请输⼊英⽂单词:",s[i].ch);scanf("%s",b1);int flag = 0;for(z=0;strcmp(b1,s[i].en)!=0;z++){if(z<=3){fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);//回答错误时写⼊增强记忆⽂件printf("\n");printf("\n输⼊错误!!请重新输⼊:");scanf("%s",b1);c=c+1;else{printf("⼩伙⼦,挣扎有⽤吗,快滚去看字典");flag=1;break;}}if(flag){return;}fclose(fp);printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;printf("\n继续测试请选1,返回上⼀级请选0:");scanf("%d",&choose);if(choose==0) return;}}//英译中测试void yztest(){char b1[20];int z,x=41;int choose=1;int i;//i = rand()%num;写⼊循环中FILE *fp;while(choose){i = rand()%num;fp=fopen("Remeberdata.txt","a+");if(!fp){printf("\n打开⽂件Remeberdata.txt失败!");//打开增强记忆⽂件}printf("【%s】请输⼊中⽂意思:",s[i].en);scanf("%s",b1);int flag = 0;for(z=0;strcmp(b1,s[i].ch)!=0;z++){if(z<=3){fp=fopen("Remeberdata.txt","a+");if(!fp){printf("\n打开⽂件Remeberdata.txt失败!");}fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);//回答错误时写⼊增强记忆⽂件printf("\n");printf("输⼊错误!!请重新输⼊:");}else{printf("⼩伙⼦,别挣扎了,看词典吧 ");flag = 1;break;}scanf("%s",b1);c=c+1;rnum++;}if(flag){return ;}fclose(fp);printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;printf("\n继续测试请选1,返回上⼀级请选0:");scanf("%d",&choose);if(choose==0) return;}}//中英增强记忆void zyRetest(){char b1[20];int z;int m = 0;while(choose){i = rand()%rnum;printf("\n【%s】请输⼊英⽂单词:",r[i].ch);scanf("%s",b1);for(z=0;strcmp(b1,r[i].en)!=0;z=z){printf("\n输⼊错误!!请重新输⼊:");scanf("%s",b1);c=c+1;}printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;printf("\n继续测试请选1,返回上⼀级请选0:");scanf("%d",&choose);if(choose==0) return;}}//英中增强记忆void yzRetest(){char b1[20];int z,x=41;int choose=1;int i;while(choose){i = rand()%num;printf("【%s】请输⼊中⽂意思:",r[i].en);scanf("%s",b1);for(z=0;strcmp(b1,r[i].ch)!=0;z=z){printf("输⼊错误!!请重新输⼊:");scanf("%s",b1);c=c+1;}printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;printf("\n继续测试请选1,返回上⼀级请选0:");scanf("%d",&choose);if(choose==0) return;}}//成绩列表void list(){printf("\n共计输⼊错误:%d次**每次扣10分**\n",c);printf("共计输⼊正确:%d次**每次加10分**\n",d);printf("你的总得分为:%d分\n\n",10*d-10*c);//计算最后得分}//词典维护int maintain(){int choose;//维护功能选择printf(" ------------------\n");printf(" 1.增加单词\n");printf(" 2.修改单词\n");printf(" 3.删除单词\n");printf(" 4.查询单词(中)\n");printf(" 5.查询单词(英)\n");printf(" 6.退出本菜单\n");printf(" ------------------\n");while(1){printf(" \n请输⼊维护功能编号:");//输⼊⾮法排错scanf("%d",&choose);int ret;ret=choose;while (ret != 1||ret !=2||ret!=3||ret!=4||ret!=5||ret!=6)//将输⼊限定在0-6的整数 { if(ret>6||ret<=0){while (getchar() != '\n');printf("error input,please again.\n");scanf("%d",&choose);elsebreak;}//直到输⼊的值为整数*/ret=choose;switch(ret){case 1:add();writefile();break;case 2:modify();writefile();break;case 3:del();writefile();break;case 4:search();break;case 5:ysearch();break;case 6: return 0;default: printf("\n请在1-6之间选择");}}}//⽤户界⾯void menu(){int item;printf(" \n");printf(" __________________________________________________________\n"); printf(" || ||\n");printf(" || 英语单词⼩助⼿ ||\n");printf(" || ||\n");printf(" || 版本: v1.0 ||\n");printf(" || ||\n");printf(" __________________________________________________________\n"); printf(" || ||\n");printf(" || 0.词库维护 1.单词预览 ||\n");printf(" || ||\n");printf(" || 2.单词背诵(中英) 3.单词背诵(英中) ||\n");printf(" || ||\n");printf(" || 4.查询成绩 5.帮助 ||\n");printf(" || ||\n");printf(" || 6.增强记忆(中英) 7.增强记忆(英中) ||\n");printf(" || ||\n");printf(" || 8.退出 ||\n");printf(" || ||\n");printf(" __________________________________________________________\n"); printf("\n");printf(" 请选择您需要的操作序号(0-8)按回车确认:");scanf("%d",&item);printf("\n");int ret;ret=item;while (ret != 1||ret !=2||ret!=3||ret!=4||ret!=5||ret!=6||ret!=7||ret!=8)//将输⼊限定在0-6的整数 { if(ret>8||ret<0){while (getchar() != '\n');printf("error input,please again.\n");scanf("%d",&item);ret =item;}elsebreak;}//直到输⼊的值为整数*/ret=item;readfile();switch(ret){case 0:show();maintain();break;//词库维护case 1:show();break; //单词预览case 2:yztest(); break;//英中背刺测试case 4:list();break;//成绩查询case 5:help();break;//使⽤帮助case 6:readRemeberfile();zyRetest();break;//调⽤⽂件读⼊已插⼊词汇,进⾏重复中英记忆case 7:readRemeberfile();yzRetest();break;// 调⽤⽂件读⼊已插⼊词汇,进⾏重复英中记忆case 8:select =0;break;//退出⼦选项default:printf("请在0-8之间选择\n");}}int main(){while(select){menu();}system("pause");return 0;}四.经验归纳此次程序设计在原有基础程序的基础上,实现功能的完善,侧重于程序的结构化及精细化编写。
C语言键盘扫描程序4
C语言键盘扫描程序4C语言键盘扫描程序4*4测试通过*/#includesbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P2_7=P2^7;sbit P3_7=P3^7;unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99, //0~4 0x92,0x82,0xF8,0x80,0x90, //5~90x88,0x83,0xC6,0xA1,0x86,0x8E}; //A~Fvoid KeyScan();void delay10ms(unsigned char time);void Dispaly(unsigned char k);void buzzer();unsigned char key,temp;void main() //主程序{while(1){KeyScan();}}void KeyScan() //按键扫描子程序{P1=0xFF;P1_0=0;temp=P1;temp&=0xF0;if(temp !=0xF0) {buzzer(); delay10ms(10); temp=P1; temp&=0xF0;if(temp !=0xF0) {temp=P1;temp&=0xF0; switch(temp) {case 0xE0:key=0;break; case 0xD0:key=4;break;case 0xB0:key=8;break; case 0x70:key=12;break; }Dispaly(key); }}P1=0xFF;P1_1=0;temp=P1;temp&=0xF0;if(temp !=0xF0) {buzzer(); delay10ms(10);temp=P1;temp&=0xF0;if(temp !=0xF0) {temp=P1;temp&=0xF0; switch(temp) {case 0xE0:key=1;break; case 0xD0:key=5;break; case 0xB0:key=9;break; case 0x70:key=13;break; }Dispaly(key); }P1=0xFF;P1_2=0;temp=P1;temp&=0xF0;if(temp !=0xF0) {buzzer(); delay10ms(10); temp=P1;temp&=0xF0;if(temp !=0xF0)temp=P1; temp&=0xF0; switch(temp) {case 0xE0: key=2;break; case 0xD0: key=6;break; case 0xB0: key=10;break; case 0x70: key=14;break; }Dispaly(key);}P1=0xFF;P1_3=0;temp=P1;temp&=0xF0;if(temp !=0xF0) {buzzer(); delay10ms(10); temp=P1;temp&=0xF0;if(temp !=0xF0) {temp=P1;temp&=0xF0;switch(temp) {case 0xE0: key=3;break; case 0xD0: key=7;break; case 0xB0: key=11;break; case 0x70: key=15;break; }Dispaly(key); }}}//延时程序void delay10ms(unsigned char time)unsigned char i;while(time--){for(i=0;i<120;i++) ;}}void Dispaly(unsigned char k) //显示程序{P0=table[k];P2_7=0;}void buzzer(){P3_7=0;delay10ms(20);P3_7=1;}6x3扫描键盘驱动程序(C语言编写)〖说明〗18个按键扫描驱动程序,横向扫描第一行:p0.6 第二行:p0.7 第三行:p2.6纵向扫描:第一行:p0.0 第二行:p0.1 第三行:p0.2 第四行:p0.3 第五行:p0.4 第六行:p0.5--------------------------------------------------------------------------------*///#i nclude "reg51.h"//#i nclude "lcd12864.h"#define port p0 //定义p0口sbit p2_6=p2^6; //定义p2.6口unsigned int zdtime=0; unsigned int pingbaotime=0; /*定义18个按键的返回值*/#define runkey 1#define stopkey 2#define upkey 3#define downkey 4#define a_c 5#define d_f 6#define g_i 7#define j_l 8#define m_o 9#define p_s 10#define t_v 11#define w_z 12#define pageupkey 13#define pagedownkey 14#define enterkey 15#define backkey 16#define chineseorenglish 17#define cancelkey 18//按键扫描函数unsigned char getkey(){unsigned char a,b;unsigned int delay=0; //延时变量port=0xff; //p0口复位p2_6=1; //p2.6复位//扫描第三行p2_6=0;while(!(port&0x01)){if(++delay>0x1ff0) { return(pagedownkey);}}while(!(port&0x02)){if(++delay>0x1ff0) { return(chineseorenglish); }}while(!(port&0x04)){if(++delay>0x1ff0) { return(backkey); }}while(!(port&0x08)){if(++delay>0x1ff0) { return(pageupkey); }}while(!(port&0x10)){if(++delay>0x1ff0) { return(cancelkey); }while(!(port&0x20)){if(++delay>0x1ff0) { return(enterkey);} }port=0xff; //p0口复位p2_6=1; //p2.6复位//扫描第一行port=0x7f;delay=0;while(!(port&0x01)){if(++delay>0x1ff0) { return(downkey);}if(delay>0xff0) { return(downkey); } while(!(port&0x02)) {if(++delay>0x1ff0) { return(stopkey);} }if(delay>0xff0) { return(stopkey); } while(!(port&0x04)) {if(++delay>0x5fd0) { return(w_z);}}if(delay>0xff0) { return(w_z); }while(!(port&0x08))if(++delay>0x5fd0) { return(t_v);} }if(delay>0xff0) { return(t_v); }while(!(port&0x10)){if(++delay>0x5fd0) { return(p_s);} }if(delay>0xff0) { return(p_s); } while(!(port&0x20)) {if(++delay>0x5fd0) { return(m_o);} }if(delay>0xff0) { return(m_o); }port=0xff; //p0口复位p2_6=1; //p2.6复位//扫描第二行port=0xbf;delay=0;while(!(port&0x01)){if(++delay>0x1ff0) { return(upkey);} }if(delay>0xff0) { return(upkey); } while(!(port&0x02)) {。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
院系:计算机学院实验课程:编译原理实验实验项目:C++源代码单词扫描程序(词法分析)指导老师:黄煜廉一.实验项目C++源代码单词扫描程序(词法分析)二.实验要求1.C++源代码扫描程序识别C++记号。
C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。
2.打开一个C++源文件,打印出所有以上的记号。
3.要求应用程序应为Windows界面。
4.选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。
假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。
因此,程序中还应该有这样的压缩功能。
5.选作部分:进一步思考或实现——如何进一步实现减小源文件大小的压缩功能。
6.应该书写完善的软件文档。
三.需求分析1.根据所需的功能程序应分为分析关键字、分析标识符、分析数字、分析串、分析注释、分析特殊字符和过滤多余字符几部分。
2.关键字有iostream.h.main.while.goto include for break case if struct class等。
3.过滤字符要考虑到空格和换行。
四.实验代码五.#include<iostream.h>六.#include<stdio.h>七.#include<string.h>八.#include<ctype.h>九.#include<conio.h>十.FILE*fp;十一.char string(char c[]);//字符串处理十二.char ch;十三.char*operate[6]={"+","-","*","/","++","--"};十四.char*note[4]={"//","/*","*/","\""};十五.char*symbol[31]={"%","$","^","&","_","#","<","<=","=",">",">=","<>","<<","==","!="," &&","||","!",十六.",",";",":=",".","(",")","{","}","&&","||","!","()",">>"};十七.char*keyword[35]={"iostream.h","include","break","case","char","const","continue","def ault","do","double",十八."else","enum","cin","float","for","goto","if","int","long","cout",十九."return","short","signed","sizeof","static","struct","switch","typedef","printf",二十."union","unsigned","void","volatile","while","main"};二十一.二十二.int search(char searchstr[],int type)//符号匹配查找二十三.{二十四.int i;二十五.switch(type)二十六.{二十七.case1:for(i=0;i<35;i++)二十八.{二十九.if(strcmp(keyword[i],searchstr)==0)三十.return1;三十一.三十二.}三十四.{三十五.for(i=0;i<=5;i++)三十六.{三十七.if(strcmp(operate[i],searchstr)==0)三十八.return1;三十九.}四十.break;四十一.}四十二.case3:for(i=0;i<31;i++)四十三.{四十四.if(strcmp(symbol[i],searchstr)==0)四十五.return1;四十六.}break;四十七.case4:for(i=0;i<=3;i++)四十八.{四十九.五十.if(!strcmp(note[i],searchstr)&&i==3)五十一.{五十二.string(searchstr);五十三.break;五十四.}五十五.else if(!strcmp(note[i],searchstr))五十六.return1;五十七.五十八.}break;五十九.}六十.return0;六十一.}六十二.六十三.char letter(char ch)//字母处理六十四.{六十五.int i=-1;六十六.char letter[50];六十七.while(isalnum(ch)||ch=='.')六十八.{六十九.letter[++i]=ch;七十.ch=fgetc(fp);七十一.}七十二.letter[i+1]='\0';七十三.if(search(letter,1))七十四.{七十五.cout<<letter<<""<<"关键字"<<endl;七十六.}七十八.{七十九.cout<<letter<<""<<"标识符"<<endl;八十.}八十一.return(ch);八十二.}八十三.八十四.八十五.char number(char ch)//数字处理八十六.{八十七.int i=-1;八十八.char num[20];八十九.while(isdigit(ch)!=0)九十.{九十一.num[++i]=ch;九十二.ch=fgetc(fp);九十三.}九十四.if(isalpha(ch)!=0)九十五.{九十六.while(!isspace(ch))九十七.{九十八.num[++i]=ch;九十九.ch=fgetc(fp);一百.}一百〇一.num[i+1]='\0';一百〇二.cout<<num<<""<<"错误!"<<endl;一百〇三.goto loop;一百〇四.}一百〇五.num[i+1]='\0';一百〇六.cout<<num<<""<<"数字"<<endl;一百〇七.loop:return(ch);一百〇八.}一百〇九.一百一十.一百一十一.char other(char ch)一百一十二.{一百一十三.int i=-1;一百一十四.char other[1000];一百一十五.if(isspace(ch))//是空格一百一十六.{一百一十七.ch=fgetc(fp);一百一十八.goto loop;一百一十九.}一百二十.while((!isspace(ch))&&(!isalnum(ch)))//不是空格且不是字母或数字一百二十二.other[++i]=ch;一百二十三.ch=fgetc(fp);//若是字母,不是空格的判断没有写出来一百二十四.}一百二十五.other[i+1]='\0';一百二十六.if(search(other,2))一百二十七.cout<<other<<""<<"算数运算符"<<endl;一百二十八.else一百二十九.if(search(other,3))一百三十.cout<<other<<""<<"特殊符号"<<endl;一百三十一.else一百三十二.if(search(other,4))一百三十三.cout<<other<<""<<"注释符"<<endl;一百三十四.loop:return(ch);一百三十五.}一百三十六.char string(char c[])//字符串一百三十七.{一百三十八.int i=0;一百三十九.//char ch;一百四十.char stri[100];一百四十一.stri[i]=c[0];一百四十二.ch=fgetc(fp);一百四十三.while(ch!='"')一百四十四.{一百四十五.stri[++i]=ch;一百四十六.ch=fgetc(fp);一百四十七.}一百四十八.stri[++i]=ch;一百四十九.stri[++i]='\0';一百五十.cout<<stri<<""<<"字符串"<<endl;一百五十一.return(ch);一百五十二.}一百五十三.int main()一百五十四.{一百五十五.char str,c;一百五十六.cout<<"Please enter a file name:";一百五十七.char FileName[100];一百五十八.cin>>FileName;一百五十九.fp=fopen(FileName,"r");一百六十.一百六十一.一百六十二.if(fp==NULL)一百六十三.{一百六十四.cout<<"Unable to open file!"<<endl;一百六十五.return0;一百六十六.}一百六十七.else一百六十八.{一百六十九.cout<<"Open the file successfully!"<<endl;一百七十.cout<<fp<<endl;一百七十一.str=fgetc(fp);一百七十二.while(str!=EOF)一百七十三.{一百七十四.if(isalpha(str))一百七十五.str=letter(str);一百七十六.else一百七十七.{一百七十八.if(isdigit(str))一百七十九.str=number(str);一百八十.else一百八十一.str=other(str);一百八十二.}一百八十三.}一百八十四.cout<<"endl"<<endl;一百八十五.一百八十六.}一百八十七.c=getch();一百八十八.return0;一百八十九.}一百九十.运行结果1.成功运行2.未找到文件时一百九十一.参考文献《编译原理及实践》《C++程序设计》。