The first personal programming operation of soft worker
Which course does this assignment belong to | Construction method - Autumn 2021 - Software Engineering of Fuzhou University |
---|---|
What are the requirements for this assignment | The first personal programming operation of software engineering practice in autumn 2021. |
The goal of this assignment | Implement a program function, which can extract different levels of keywords from the read C or C + + code files. |
Student number | 031902432 |
PSP table
PSP | Estimated time (h) | Practice time (h) |
---|---|---|
Plan | ||
Estimate (estimated time) | 40 | 45 |
Development | ||
Analysis & Learning (demand analysis (including learning new technologies)) | 12 | 14 |
Design Spec (generate design document) | 2 | 2 |
-Coding Standard | 0.5 | 0.5 |
Design Review | 1 | 1.5 |
Coding | 18 | 24 |
Test (test, modify code) | 7 | 8 |
Test Report | 2 | 2.5 |
Size Measurement | 1 | 1 |
Postmortem & process improvement plan | 2 | 2 |
Total (total time) | 45.5 | 55.5 |
Code specification
Job address github warehouse
commit screenshot
Problem solving ideas
When I first saw this topic, my brain was blank. My first feeling was that it would be troublesome to use c + +, and I needed to call many functions to implement it (just my own feeling) Later, I heard from the students of other software engineering classes that it would be much easier to do software engineering homework with python, so I went to station B to find a py tutorial for self-study and grope while learning. In the process of learning, I slowly recognized the strength of py. After learning the basics, I began to find out whether python has a problem similar to this problem on the Internet, which is convenient to refer to the ideas and code of online leaders. First, I have to finish For the read in of files, there are some on the Internet that use the open function to open, and then use the cycle to read in by line or by word. Some are direct read. I chose read in to store the target file. The following is to deal with the redundant characters in the file, such as {}, (), []. In Baidu Rookie tutorial It is explained that regular expressions can be used to remove characters by matching.
def read_text(path):# Path is the incoming c,cpp path try: fp = open(path, 'r', encoding='utf-8') str_str = '~`!#$%^&*()_+-=|\';":/.,?><~·!@#¥%......&*()-+-=": ';,. ,?><{}' file_text = re.sub(r"[%s]+" % str_str, " ", fp.read()) # All symbols are removed by regularizing the original text content file_text = file_text.split('\n') # Split text by newline fp.close() except: print("File open error") return file_text
Basic requirements: output keyword statistics: to find the keyword and the total number, you can use the matching method to match the keyword. If you find it, it will be marked with + 1. Use the same method to traverse the code and cycle until the end. However, this will be slow and time complexity is high. I think the dictionary function can be used to store the keyword, but I haven't learned the dictionary, so I can only use Li first St (list).
def key_word(key_list): key_word0= {'else if', 'char', 'double', 'enum', 'float', 'int', 'long', 'short', 'signed', 'struct','void', 'for', 'do', 'while', 'break', 'continue', 'union', 'unsigned', 'const', 'sizeof', 'typedef', 'volatile' , 'if', 'else', 'goto', 'switch', 'case', 'default', 'return', 'auto', 'extern', 'register', 'static' } #Create a dictionary that contains all c + + built-in keywords key_num= 0 for word in key_list: if word in key_word0: key_num += 1 return key_num # Returns the total number of C and CPP keywords in the file
Advanced requirements: output several groups of switch case structures, and output the number of corresponding cases of each group: matching principle. The specific mark can be determined by one of the following switches. This method is the same as above.
def case_num(ed_key_list):# Cases can only be counted if there is a switch in the file length = len(ed_key_list) if (ed_key_list.count('switch',0)):#Find the number of switch es from index 0, and execute when found num_case = [] for i in range(length): if ed_key_list[i] == 'switch': if (i + 1) == length or ed_key_list[i + 1] != 'case': #switch is the last element in the list or the next position is not a case num_case.append(0) elif i < length - 1: #switch is the middle element of the list flag = 1 #Tag find time step if ed_key_list[i + flag] == 'case': #The next position is case case_cnt = 0 #Number of marked case s while i + flag < length: #Search in the list elements to avoid crossing the boundary and the system reports an error if ed_key_list[flag + i] == 'case': case_cnt += 1 flag += 1 else: break num_case.append(case_cnt) else: num_case.append(0) return num_case else: return [0]
Higher requirements: there are several groups of if and else structures in the output. The ultimate requirements: there are several groups of if, else, if and else structures in the output: at the beginning, I had no idea about this. Later, I looked at the homework submitted by the bosses in front and was inspired (in other words, after seeing it, I thought it could be solved by stack. The idea behind it is not mine, but I think I can't find other ideas, so I have to think about it.) : find the if else and if else if structures. You can use the stack. First, define if for 1, else for 2, and else for 3. Every time you encounter an if, the stack will press a 1. Every time you encounter an else, you will press a 3. When you encounter an else, you will start to delete circularly until the deletion stops at 1. If there are 3 in the deleted number, this is an if else if structure. If there is no 3, it is an if else structure , the push in number and delete number can be completed by append and pop. I Baidu how to use stack in py. Unfortunately, I can't do this, emo.
def count_if_else(key_list): count_if_else = 0 count_if_else_if = 0 l=key_list flag=0 if l[0] == 'i' and l[1] == 'f':#Judge if stack.append(1) if l[0] == 'e' and l[4] == 'i':#Judge else if stack.append(3) elif l[0] == 'e' and l[1] == 'l':#Judge else while stack[-1] != 1: if stack[-1] == 3: flag=1 stack.pop() stack.pop() if flag == 0: count_if_else += 1 if flag == 1: count_if_else_if += 1 else: pass temp= list([count_if_else,count_if_else_if]) list_key = temp return list_key
unit testing
Test one
Test two
Test three
Test four
performance testing
Difficulties encountered
The first is the construction of functions, file input and if_else_if search. These two are very difficult for me. At the beginning, I really didn't understand how to realize the input of files. It's difficult to choose whether to input by line, cycle through or read directly, and I won't do this. The main reason is that there is less code, and the debt owed in the past has borne its own consequences. Later, I consulted the online materials and materials The explanation of friends can barely be realized. I used the stack for the if_els_if structure, and specially went to the rookie tutorial and Baidu to find the usage. What suffocated me was that there was no result output. Give up and listen to other people's solutions later.
The second is python's functions. There are many functions in it, but it's troublesome to remember. You need to go to Baidu and know its specific usage. However, the algorithm to realize the function is still much simpler than c + +. It is possible that the function realized by c + + in ten lines only needs one line. At the beginning of self-learning py, there are still many unclear places, such as the relationship between dictionaries, lists and collections The application scenario needs to be explored slowly in the later time.
Then there is the performance test. I haven't found the test on pycharm for a long time (people split). I haven't figured it out according to the steps of the online tutorial. The tutorial has a configuration step. I don't understand the later ones. I still need to find them myself slowly.
Finally, there is the GIT with many holes. After downloading git, I read the practical tutorial, followed it and forgot it next time. There are a lot of bug s when uploading files. The most uncomfortable thing is the SSH key. I can't push when uploading files. I went to Baidu to know that the SSH key is not configured. It's not easy to find the key in the GIT command. A small part was missed when copying, and it took a lot of money later It's only after checking that we know. After SSH is completed, we still can't push. After checking the data, we know that the local file library branch is not connected with the remote library branch. After solving these problems, we can finally upload it.
summary
Quite a lot of knowledge has been learned. The use of git, the basic knowledge and practice of python, and the gradual deepening of understanding in the process of tapping the code are simpler, faster and easier to operate than c + +. Some functions can be roughly used, such as the basic functions of count, endswitch and startswitch.
When I finished my homework, I also learned to formulate my own code specification, the production of PSP table and the planning of time.