189
社区成员




这个作业属于哪个课程 | 福州大学软件工程社区 https://bbs.csdn.net/forums/fzuSoftwareEngineering2021 |
---|---|
这个作业要求在哪里 | 2021秋软工实践第一次个人编程作业 https://bbs.csdn.net/topics/600574694 |
这个作业的目标 | 完成编程目标,规范编程风格以及git工具使用和测试程序 |
学号 | 031902204 https://blog.csdn.net/m0_61536577?spm=1001.2101.3001.5343 |
github仓库 https://github.com/gheao/2021-
PSP | 预估耗时(h) | 实践耗时(h) |
---|---|---|
计划 | 0.5 | 0.5 |
估计这个任务需要多少时间 | 28.2 | 36.2 |
开发 | - | - |
需求分析 (包括学习新技术) | 4 | 5 |
生成设计文档 | - | - |
设计复审 | - | - |
代码规范 | 2 | 2 |
具体设计 | 2 | 3 |
具体编码 | 15 | 18 |
代码复审 | - | - |
测试 | 2 | 5 |
报告 | 0.5 | 0.5 |
测试报告 | - | - |
计算工作量 | 0.2 | 0.2 |
总结 | 2 | 2 |
合计 | 28.2 | 36.2 |
题目要求
根据题目的要求,分成几个部分来考虑
在题目以外,还有git工具的使用以及代码书写规范以及程序的测试三部分
按照计划,在实现基本功能的基础上迭代更新,最后实现编程目标
通过查询支持文件读写的库函数,了解到在C++可以用ifstream类来实现文件的读入
int Find_type;
string File_p;
cin >> File_p;
ifstream finput(File_p);
while (finput >> Text)
{
String_trim();
}
对读入的字符串进行修剪,然后判断字符串是否是关键字
对字符串修剪
void String_trim()
{
int n = Text.size();
string change;
string otherchange;
int first_change_flag=0;
int level = if_else_level;
int l_flag = else_flag;
for (int i = 0; i < n; i++)
{
if (Text[i] <= 'z' && Text[i] >= 'A' && explain_flag_1 == 0 && explain_flag_2 == 0)
{
change = change + Text[i];
}
else
{
if (first_change_flag == 0)
{
otherchange = change;
first_change_flag = 1;
}
change = "\0";
}
Search_and_Outfile(otherchange);
Search_and_Outfile(change);
}
查找符合条件的字符串并统计,此过程顺带统计了switch和case
void Search_and_Outfile(string s)
{
int l = s.size();
if (l <= 1)
{
return;
}
for (int i = 0; i <= 31; i++)
{
if (s == Key_word[i])
{
if (s == "switch")
{
Case_num.push_back(Single_case_num);
Switch_num++;
Single_case_num = 0;
}
if (s == "case")
{
Single_case_num++;
}
Total_num++;
break;
}
}
return;
}
首先是要判别出 else if ,不能将这个字段当 else 和 if 判断。到这一步我发现我读取文件的方式似乎不太适合查找 else if字段。因为我当时读取文件的时候用的是字符串,字符串读取到空格就结束读取了,导致读取出来的字符串是一节一节的,不是按行读取的,这样的结构必须要在查询到 else 的下一个字符串时才能判断。为了解决这个问题,我用一个变量 tmp 来保存 else ,再增设一个判断括号的 flag 标志,遇到 if 和 else 根据 flag 和 tmp 来判断 else if。
大体代码如下
if (Text == "else")
{
if (tmp != "else")
{
tmp = "else";
else_flag = 0;
}
else if (l_flag == 1)
{
if_else_judge("else",0);
tmp = "else";
if (Text[n - 1] == 'e')
{
else_flag = 0;
}
}
}
else if (Text == "if")
{
if (l_flag == 1 && tmp == "else")
{
if_else_judge("else",level);
tmp = "\0";
else_flag = 0;
if_else_judge("if",level);
}
else if (l_flag == 0 && tmp == "else")
{
if_else_judge("else_if",level);
tmp = "\0";
else_flag = 0;
}
else
{
if_else_judge("if",level);
}
}
实现了else if判断,接下来就是进行if else 和else if 判断
我用了两个栈来实现该判断。一个栈用来存放关键字类型,if用 i 表示,else if 用 c 表示。另一个栈用来存放它们各自的等级,等级遇到一个左括号加1遇到一个右括号减1。遇到else的时候,我们通过不断出栈来找到栈中的第一个 i 与其匹配,匹配过程中统计是否出现 c 符号,之后将与第一个 i 等级相同的元素全部删除。通过这两个栈,我们可以在找到else匹配的类型以及删除没有else的判断语句。
void if_else_judge(string s,int level)
{
int if_top = 0;
char if_char_top = 'i';
int if_else_if_else_flag = 0;
if (s == "if") {
if_else_char_stack.push('i');
if_else_stack.push(level);
}
else if (s == "else_if")
{
if_else_char_stack.push('c');
if_else_stack.push(level);
}
else if (s == "else")
{
if_top = if_else_stack.top();
while (!if_else_char_stack.empty()&&if_else_char_stack.top() != 'i')
{
if_else_if_else_flag = 1;
if_else_char_stack.pop();
if_else_stack.pop();
}
while (!if_else_stack.empty() && if_top == if_else_stack.top())
{
if_else_stack.pop();
if_else_char_stack.pop();
}
if (if_else_if_else_flag == 1)
{
If_else_if_else_num++;
}
else
{
If_else_num++;
}
}
}
单元测试
性能
第一次在 一个编程作业上花这么多时间,做完的时候感觉相当开心。这次编程也是出现了很多问题,比如在输文件路径的时候我在把一个txt文件命名的时候又加上txt后缀,变成text.txt.txt。输错路径好多次才发现这个问题。在编程的时候也是小错误不断,我认为这和我用按字符串读入的方式有关,但发现的时候太迟了,只能硬着头皮继续往下做下去,程序校错花了好长时间。除了天天守在编译器前受折磨以外,我还是有学到点东西的,学到git的使用以及一些新的函数之类的。
就写到这了,拜拜