void input() { cout << "请输入:"; char ch; while ((ch = getchar()) != '\n') { inputToken[tokenNumber].value = ch; if (ch == '(') inputToken[tokenNumber].tokenType = leftBracket; else if (ch == ')') inputToken[tokenNumber].tokenType = rightBracket; else if (ch == '+') inputToken[tokenNumber].tokenType = addop; else if (ch == '*') inputToken[tokenNumber].tokenType = mulop; else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) inputToken[tokenNumber].tokenType = id; else inputToken[tokenNumber].tokenType = undefine; tokenNumber++; } inputToken[tokenNumber++].tokenType = endInput; } TreeNode* E() { TreeNode* node = new TreeNode; node->flag = "E"; switch (inputToken[curPos].tokenType) { case id: case leftBracket: { TreeNode* tNode = node->firstChild = T(); if (error) return node; tNode = tNode->nextSibling = E1(); break; } default: node = errorNode(); error = true; break; } return node;这段代码是什么意思
时间: 2023-10-23 20:10:48 浏览: 40
这段代码是语法分析器中的一部分,实现了对表达式的E部分的语法分析。在这段代码中,input函数用于读取输入的表达式,并将其转换为词法单元序列,存储在inputToken数组中。
E函数是一个递归下降函数,用于对表达式的E部分进行语法分析。在该函数中,首先创建一个新的语法树节点,并将其标记为E。然后根据当前词法单元的类型进行分支处理。
如果当前词法单元的类型为id或leftBracket,则调用T函数进行语法分析,并将其设置为E节点的第一个子节点。如果T函数返回的节点存在错误,则直接返回E节点。
然后,继续调用E1函数进行语法分析,并将其设置为E节点的第二个子节点。注意,E1函数是用于处理左递归的情况的函数。
如果当前词法单元的类型不是id或leftBracket,则说明表达式不符合文法规则,返回一个错误节点,并将error标志设置为true。
最后,返回E节点。
相关问题
void LookupNum(Student stu[]) { system("cls"); int n = Read(stu); int s; int i = 0; cout << endl << "======>> 查找学生成绩 <<======" << endl; cout << "请输入要查找学生的学号:"; cin >> s; while ((stu[i].num - s) != 0 && i < n)i++; if (i == n) { cout << "======>> 对不起,无法找到该学生...... <<======" << endl; } else { cout << "----------------------------" << endl; cout << "班级:" << stu[i].class_0 << endl; cout << "学号:" << stu[i].num << endl; cout << "姓名:" << stu[i].name << endl; cout << "电子技术:" << stu[i].elec << endl; cout << "C++程序设计:" << stu[i].c_program << endl; cout << "多媒体技术:" << stu[i].media << endl; cout << "大学英语:" << stu[i].english << endl; cout << "高等数学:" << stu[i].math << endl; cout << "大学体育:" << stu[i].sport << endl; cout << "马克思主义基本原理:" << stu[i].polity << endl; cout << "平均分:" << stu[i].average << endl; cout << "总分:" << stu[i].total << endl; } }修改为折半查找
折半查找(也称二分查找)需要一个有序数组,先比较数组中间位置的元素和目标元素的大小关系,如果相等则直接返回下标,否则根据大小关系缩小查找范围并继续查找。因此,需要对stu数组进行排序,可以使用STL中的sort函数进行升序排序,然后使用二分查找算法进行查找。
修改后的代码如下:
```
void LookupNum(Student stu[]) {
system("cls");
int n = Read(stu);
int s;
cout << endl << "======>> 查找学生成绩 <<======" << endl;
cout << "请输入要查找学生的学号:";
cin >> s;
// 先对stu数组按学号升序排序
sort(stu, stu + n, [](const Student& a, const Student& b) { return a.num < b.num; });
// 二分查找目标学号
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (stu[mid].num == s) {
cout << "----------------------------" << endl;
cout << "班级:" << stu[mid].class_0 << endl;
cout << "学号:" << stu[mid].num << endl;
cout << "姓名:" << stu[mid].name << endl;
cout << "电子技术:" << stu[mid].elec << endl;
cout << "C++程序设计:" << stu[mid].c_program << endl;
cout << "多媒体技术:" << stu[mid].media << endl;
cout << "大学英语:" << stu[mid].english << endl;
cout << "高等数学:" << stu[mid].math << endl;
cout << "大学体育:" << stu[mid].sport << endl;
cout << "马克思主义基本原理:" << stu[mid].polity << endl;
cout << "平均分:" << stu[mid].average << endl;
cout << "总分:" << stu[mid].total << endl;
return; // 直接返回
} else if (stu[mid].num < s) {
left = mid + 1;
} else {
right = mid - 1;
}
}
cout << "======>> 对不起,无法找到该学生...... <<======" << endl;
}
```
需要注意的是,折半查找要求数组有序,因此在查找之前需要对stu数组按学号升序排序。另外,如果找到目标学生,直接返回即可,不需要继续查找。
#include <iostream> #include <string> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop class*/ class Account { public: Account(){money=0;} void bankin(); void bankout(); void display(); void getdata(); private: int number; string name; double money; }; void Account::getdata() { cout<<"输入账户姓名:"<<endl; cin>>name; cout<<"输入账户账号:"<<endl; cin>>number; } void Account::bankin() { double t; cout<<"输入要存的钱金额:"<<endl; cin>>t; money=money+t; } void Account::bankout() { double t; cout<<"输入要取出钱的金额:" <<endl; cin>>t; if(t<=money) money=money-t; else cout<<"余额不足"<<endl; } void Account::display() { cout<<"账户姓名:"<<name<<endl; cout<<"账户账号:" <<number<<endl; cout<<"当前账户余额:"<<money<<endl; } int main(int argc, char** argv) { int a; Account b; cout<<"选择操作:1.输入账户信息,2.存钱,3.取钱,4.显示账户余额"<<endl; cin>>a; if(a==1) b.getdata(); if(a==2) b.bankin(); else if(a==3) b.bankout(); else if(a==4) b.display(); else cout<<"输入不合法"<<endl; return 0; }修改一下代码
#include <iostream>
#include <string>
using namespace std;
class Account
{
public:
Account(): money(0), number(0) {}
void bankin();
void bankout();
void display();
void getdata();
private:
int number;
string name;
double money;
};
void Account::getdata()
{
cout << "输入账户姓名:" << endl;
cin >> name;
cout << "输入账户账号:" << endl;
cin >> number;
}
void Account::bankin()
{
double t;
cout << "输入要存的钱金额:" << endl;
cin >> t;
money += t;
}
void Account::bankout()
{
double t;
cout << "输入要取出钱的金额:" << endl;
cin >> t;
if (t <= money)
money -= t;
else
cout << "余额不足" << endl;
}
void Account::display()
{
cout << "账户姓名:" << name << endl;
cout << "账户账号:" << number << endl;
cout << "当前账户余额:" << money << endl;
}
int main(int argc, char** argv)
{
int a;
Account b;
cout << "选择操作:1.输入账户信息,2.存钱,3.取钱,4.显示账户余额" << endl;
cin >> a;
switch (a)
{
case 1:
b.getdata();
break;
case 2:
b.bankin();
break;
case 3:
b.bankout();
break;
case 4:
b.display();
break;
default:
cout << "输入不合法" << endl;
break;
}
return 0;
}