输入一个逻辑表达式,统计运算符(假设表达式中仅使用了关系运算符、逻弄运算符)分隔开的运算数的数量
了解一下编译原理 词法分析 有限状态自动机
//邻接矩阵构造无向图
int LocateVex(MGraph G, ElemType v)
{//寻找顶点的位置下标
int i;
for(i = 0; i<G.vexnum; i++)
{
if(v == G.vexs[i])
return i;
}
return -1; //没有找到该顶点返回-1
}
void Create_UDN(MGraph &G)
{
int i, j;
ElemType v1, v2;
int a1, a2;
scanf("%d %d", &G.vexnum, &G.arcnum);//输入顶点数和边数
//读入顶点信息
for(i = 0;i<G.vexnum; i++) //输入顶点
scanf("%d", &G.vexs[i]);
//初始化邻接矩阵
for(i = 0; i<G.vexnum; i++)
{
for(j = 0; j<G.vexnum; j++)
{
G.arcs[i][j] = 0; //邻接矩阵值为零表示两顶点无关
}
}
//读入弧的信息
for(i = 0; i<G.arcnum; i++)
{
scanf("%d %d", &v1, &v2);
a1 = LocateVex(G, v1);
a2 = LocateVex(G, v2);
G.arcs[a1][a2] = G.arcs[a2][a1] = 1;
//对于有向图只用令 G.arcs[a1][a2] = 1
}
}
问题分析:统计逻辑表达式中分隔开的运算数数量。
解决方案:可以采用遍历表达式的方式,统计运算数的数量。具体步骤如下:
1.定义一个变量来记录运算数的数量,初始值为0。
2.遍历逻辑表达式中的每一个字符。
3.如果当前字符为运算符,则运算数数量+1。
4.如果当前字符为括号(左括号或右括号),则跳过。
5.输出运算数数量。
代码实现如下:
#include <stdio.h>
#include <string.h>
int countOperands(char* expr) {
int count = 0;
int len = strlen(expr);
for(int i=0; i<len; i++) {
if(expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/' || expr[i] == '>' || expr[i] == '<' || expr[i] == '=') {
count++;
} else if(expr[i] == '(' || expr[i] == ')') {
continue;
}
}
return count;
}
int main() {
char* expr = "a+b>c-d";
int count = countOperands(expr);
printf("运算数数量为%d\n", count);
return 0;
}