176
社区成员




This project has added some other features compared to the previous one, such as the function of retrieving surplus (%) and displaying historical records. The function of displaying historical records has used SQLite, and the front and back ends have been separated. These contents have made the functions of the calculator more complete and have given me a deeper understanding of software development.
Link to My Class. https://bbs.csdn.net/forums/ssynkqtd-04?typeId=5171412
Link to Assignment. https://bbs.csdn.net/topics/617332156
FZU ID/MU ID. 832102120/21124655
Link to gitHub. https://github.com/FanJingZhen/Cal2
Personal Software Process Stages | Estimated Time(minutes) | Actual Time(minutes) |
---|---|---|
Planning | 25 | 30 |
Estimate | 25 | 20 |
Development | 15 | 10 |
Analysis | 25 | 30 |
Design Review | 45 | 40 |
Coding Standard | 25 | 20 |
Design | 15 | 20 |
Coding | 400 | 300 |
Code Review | 30 | 20 |
Test | 10 | 10 |
Reporting | 25 | 30 |
Test Report | 10 | 10 |
Size Measurement | 10 | 10 |
Postmortem & Process Improvement Plan | 40 | 40 |
Sum | 700 | 590 |
(1)MyViewModel -- The content is to store user data and write calculation logic
public class MyViewModel extends ViewModel {
private MutableLiveData mainNum;//Principal value (the number that the user is operating on)
public boolean havePoint =false;//Used to record whether the main value contains a decimal point
public String sign1 = "",sign2 = "";//Used to store operational symbols
public String num[]={"",""};//Used to store numerical values participating in calculations
public MutableLiveData getMainNum(){
if (mainNum == null){
mainNum = new MutableLiveData<>();
mainNum.setValue("0");
}
return mainNum;
}
public void setMainNum(String n ){
if (mainNum.getValue().equals("0")){
mainNum.setValue(n);
}
else {
mainNum.setValue(mainNum.getValue() + n);
}
}
public String mainNumWithNum_0_Tocal(){
String value = "0";
if (mainNum.getValue().contains(".") || num[0].contains(".")) {//If one of two numbers has a decimal point in the operation
switch (sign1){
case "+":
value = String.valueOf(Double.valueOf(num[0]) + Double.valueOf(mainNum.getValue()));
break;
case "-":
value = String.valueOf(Double.valueOf(num[0]) - Double.valueOf(mainNum.getValue()));
break;
case "":
value = String.valueOf(Double.valueOf(num[0]) * Double.valueOf(mainNum.getValue()));
break;
case "/":
if (mainNum.getValue().equals("0")){
mainNum.setValue("1");
}
value = String.valueOf(Double.valueOf(num[0]) / Double.valueOf(mainNum.getValue()));
break;
case "%":
value = String.valueOf(Double.valueOf(num[0]) % Double.valueOf(mainNum.getValue()));
break;
}
}
else {
switch (sign1){//If there is no decimal point, it is an integer operation
case "+":
value = String.valueOf(Integer.valueOf(num[0]) + Integer.valueOf(mainNum.getValue()));
break;
case "-":
value = String.valueOf(Integer.valueOf(num[0]) - Integer.valueOf(mainNum.getValue()));
break;
case "":
value = String.valueOf(Integer.valueOf(num[0]) * Integer.valueOf(mainNum.getValue()));
break;
case "/"://Division sign still operates as a decimal
if (mainNum.getValue().equals("0")){
mainNum.setValue("1");
}
value = String.valueOf(Double.valueOf(num[0]) / Double.valueOf(mainNum.getValue()));
break;
case "%":
value = String.valueOf(Integer.valueOf(num[0]) % Integer.valueOf(mainNum.getValue()));
}
}
return value;
}
public String mainNumWith_Num_1_Tocal(){
String value = "0";
if (mainNum.getValue().contains(".") || num[0].contains(".")) {
switch (sign2){
case "":
value = String.valueOf(Double.valueOf(num[1]) * Double.valueOf(mainNum.getValue()));
break;
case "/":
if (mainNum.getValue().equals("0")){
mainNum.setValue("1");
}
value = String.valueOf(Double.valueOf(num[1]) / Double.valueOf(mainNum.getValue()));
break;
case "%":
value = String.valueOf(Double.valueOf(num[1]) % Double.valueOf(mainNum.getValue()));
}
}
else {
switch (sign2){
case "":
value = String.valueOf(Integer.valueOf(num[1]) * Integer.valueOf(mainNum.getValue()));
break;
case "/":
if (mainNum.getValue().equals("0")){
mainNum.setValue("1");
}
value = String.valueOf(Double.valueOf(num[1]) / Double.valueOf(mainNum.getValue()));
break;
case "%":
value = String.valueOf(Integer.valueOf(num[1]) % Integer.valueOf(mainNum.getValue()));
}
}
return value;
}
}
(2)activity_main -- The content is the writing of the UI interface
MainActivity--Perform data operations
public class MainActivity extends AppCompatActivity {
private MyViewModel myViewModel;//Data model
private static my_database helper;
private int ClickCout = 0;
private ContentValues values;
//Initialize buttons and text boxes
private TextView myTextView;
private TextView textView;
private TextView ansTextView;
private Button mBtn0;private Button mBtn1;private Button mBtn2;
private Button mBtn3;private Button mBtn4;private Button mBtn5;
private Button mBtn6;private Button mBtn7;private Button mBtn8;private Button mBtn9;
private Button mBtnPo; private Button mBtnAdd; private Button mBtnDe;private Button mBtnMu;
private Button mBtnDi;private Button mBtnCl; private Button mBtnCal; private Button mBtnBa;
private Button mBtnRe; private Button mBtnAns;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
helper = new my_database(this);
setContentView(R.layout.activity_main);
myTextView = findViewById(R.id.myTextView); textView = findViewById(R.id.textView2); ansTextView = findViewById(R.id.textView);
mBtn0 = findViewById(R.id.button0); mBtn1 = findViewById(R.id.button1); mBtn2 = findViewById(R.id.button2);
mBtn3 = findViewById(R.id.button3); mBtn4 = findViewById(R.id.button4); mBtn5 = findViewById(R.id.button5);
mBtn6 = findViewById(R.id.button6); mBtn7 = findViewById(R.id.button7); mBtn8 = findViewById(R.id.button8);
mBtn9 = findViewById(R.id.button9); mBtnPo = findViewById(R.id.buttonPo); mBtnAdd = findViewById(R.id.buttonAdd);
mBtnDe = findViewById(R.id.buttonDe); mBtnMu = findViewById(R.id.buttonMu);mBtnDi = findViewById(R.id.buttonDi);
mBtnCl = findViewById(R.id.buttonCl);mBtnCal = findViewById(R.id.buttonCal);mBtnBa = findViewById(R.id.buttonBa);
mBtnRe = findViewById(R.id.buttonRe); mBtnAns = findViewById(R.id.buttonAns);
myViewModel = new ViewModelProvider( this, (ViewModelProvider.Factory) new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);
myViewModel.getMainNum().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {//Listening for mainNum data changes
myTextView.setText(myViewModel.getMainNum().getValue());//Let mTextView display the value of mainNum
if (myViewModel.sign2.equals("")) {
if (myViewModel.sign1.equals("")) {
textView.setText(myViewModel.getMainNum().getValue());
} else {//If the second number is entered as b in a+b
textView.setText(myViewModel.num[0] + myViewModel.sign1 + myViewModel.getMainNum().getValue());
}
} else {//If the formula is in the form of a+b * c
textView.setText(myViewModel.num[0] + myViewModel.sign1 + myViewModel.num[1] + myViewModel.sign2 + myViewModel.getMainNum().getValue())
;
}
}
});
//number 1 to 9
mBtn0.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("0");
}
});
mBtn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("1");
}
});
mBtn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("2");
}
});
mBtn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("3");
}
});
mBtn4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("4");
}
});
mBtn5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("5");
}
});
mBtn6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("6");
}
});
mBtn7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("7");
}
});
mBtn8.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("8");
}
});
mBtn9.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.setMainNum("9");
}
});
mBtnPo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!myViewModel.havePoint){
myViewModel.getMainNum().setValue(myViewModel.getMainNum().getValue() + ".");
myViewModel.havePoint = true;
}
}
});
//Addition
mBtnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(myViewModel.sign1.equals("")){
myViewModel.sign1 = "+";
myViewModel.num[0] = myViewModel.getMainNum().getValue();
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else if(myViewModel.sign2.equals("")){
myViewModel.num[0] = myViewModel.mainNumWithNum_0_Tocal();
myViewModel.sign1 = "+";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else{
myViewModel.getMainNum().setValue(myViewModel.mainNumWith_Num_1_Tocal());
myViewModel.sign2 = "";
myViewModel.num[1] = "";
myViewModel.num[0] = myViewModel.mainNumWithNum_0_Tocal();
myViewModel.sign1 = "+";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
}
});
//Subtraction operation
mBtnDe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(myViewModel.sign1.equals("")){
myViewModel.sign1 = "-";
myViewModel.num[0] = myViewModel.getMainNum().getValue();
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else if(myViewModel.sign2.equals("")){
myViewModel.num[0] = myViewModel.mainNumWithNum_0_Tocal();
myViewModel.sign1 = "-";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else{
myViewModel.getMainNum().setValue(myViewModel.mainNumWith_Num_1_Tocal());
myViewModel.sign2 = "";
myViewModel.num[1] = "";
myViewModel.num[0] = myViewModel.mainNumWithNum_0_Tocal();
myViewModel.sign1 = "-";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
}
});
//multiplication
mBtnMu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(myViewModel.sign1.equals("")){
myViewModel.sign1 = "";
myViewModel.num[0] = myViewModel.getMainNum().getValue();
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else if(myViewModel.sign2.equals("")){
if(myViewModel.sign1.equals("") || myViewModel.sign1.equals("/")|| myViewModel.sign1.equals("%")){
myViewModel.num[0] = myViewModel.mainNumWithNum_0_Tocal();
myViewModel.sign1 = "";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else{
myViewModel.num[1] = myViewModel.getMainNum().getValue();
myViewModel.sign2 = "";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
}else{
myViewModel.num[1] = myViewModel.mainNumWith_Num_1_Tocal();
myViewModel.sign2 = "";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
}
});
//division
mBtnDi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(myViewModel.sign1.equals("")){
myViewModel.sign1 = "/";
myViewModel.num[0] = myViewModel.getMainNum().getValue();
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else if(myViewModel.sign2.equals("")){
if(myViewModel.sign1.equals("") || myViewModel.sign1.equals("/")|| myViewModel.sign1.equals("%")){
myViewModel.num[0] = myViewModel.mainNumWithNum_0_Tocal();
myViewModel.sign1 = "/";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else{
myViewModel.num[1] = myViewModel.getMainNum().getValue();
myViewModel.sign2 = "/";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
}else{
myViewModel.num[1] = myViewModel.mainNumWith_Num_1_Tocal();
myViewModel.sign2 = "/";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
}
});
//remainder
mBtnRe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(myViewModel.sign1.equals("")){
myViewModel.sign1 = "%";
myViewModel.num[0] = myViewModel.getMainNum().getValue();
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else if(myViewModel.sign2.equals("")){
if(myViewModel.sign1.equals("*") || myViewModel.sign1.equals("/") || myViewModel.sign1.equals("%")){
myViewModel.num[0] = myViewModel.mainNumWithNum_0_Tocal();
myViewModel.sign1 = "%";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}else{
myViewModel.num[1] = myViewModel.getMainNum().getValue();
myViewModel.sign2 = "%";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
}else{
myViewModel.num[1] = myViewModel.mainNumWith_Num_1_Tocal();
myViewModel.sign2 = "%";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
}
});
//clean button
mBtnCl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myViewModel.sign2 = "";
myViewModel.num[1] = "";
myViewModel.sign1 = "";
myViewModel.num[0] = "";
myViewModel.getMainNum().setValue("0");
myViewModel.havePoint = false;
}
});
// "="button
mBtnCal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(myViewModel.sign2.equals("")){
if(!myViewModel.sign1.equals("")){
writeData(1);
if (ClickCout % 2 != 0) {
readData();
}
myViewModel.getMainNum().setValue(myViewModel.mainNumWithNum_0_Tocal());
if(myViewModel.getMainNum().getValue().contains(".")){
myViewModel.havePoint = true;
}else {
myViewModel.havePoint = false;
}
myViewModel.num[0] = "";
myViewModel.sign1 = "";
}
}else{
writeData(2);
if (ClickCout % 2 != 0) {
readData();
}
myViewModel.getMainNum().setValue(myViewModel.mainNumWith_Num_1_Tocal());
myViewModel.num[1] = "";
myViewModel.sign2 = "";
myViewModel.getMainNum().setValue(myViewModel.mainNumWithNum_0_Tocal());
if(myViewModel.getMainNum().getValue().contains(".")){
myViewModel.havePoint = true;
}else{
myViewModel.havePoint = false;
}
myViewModel.num[0] = "";
myViewModel.sign1 = "";
}
textView.setText(myViewModel.getMainNum().getValue());
}
});
//back button
mBtnBa.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!myViewModel.getMainNum().getValue().equals("0")){
myViewModel.getMainNum().setValue(myViewModel.getMainNum().getValue().substring(0, myViewModel.getMainNum().getValue().length() - 1));
if(myViewModel.getMainNum().getValue().equals("")){
myViewModel.getMainNum().setValue("0");
}
}
}
});
//historic records
mBtnAns.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ClickCout++;
if (ClickCout % 2 != 0) {
readData();
}else{
ansTextView.setText("");
}
}
});
}
//Write data to the database
private void writeData(int v){
SQLiteDatabase db = helper.getWritableDatabase();
values = new ContentValues();
if(v == 1){//Write in the form of a+b
values.put("num1",myViewModel.num[0]);
values.put("sign1", myViewModel.sign1);
values.put("num2",myViewModel.getMainNum().getValue());
values.put("res" , myViewModel.mainNumWithNum_0_Tocal());
db.insert("information",null,values);
db.close();
}else{//Write in the form of a+b *c
values.put("num1",myViewModel.num[0]);
values.put("sign1", myViewModel.sign1);
values.put("num2",myViewModel.mainNumWith_Num_1_Tocal());
if(myViewModel.sign1.equals("+")){
values.put("res",String.valueOf(Integer.valueOf(myViewModel.mainNumWith_Num_1_Tocal()) + Integer.valueOf(myViewModel.num[0])));
}else if(myViewModel.sign1.equals("-")){
values.put("res",String.valueOf(Integer.valueOf(myViewModel.mainNumWith_Num_1_Tocal()) - Integer.valueOf(myViewModel.num[0])));
}
//values.put("sign2", myViewModel.sign2);
// values.put("num3", myViewModel.getMainNum().getValue());
db.insert("information",null,values);
db.close();
}
}
//Read data to the database
private void readData() {
ansTextView.setText("");
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("information", null, null, null, null, null, null);
cursor.moveToFirst();
ansTextView.setText(cursor.getString(1) + cursor.getString(2) + cursor.getString(3) + "=" + cursor.getString(4));
while (cursor.moveToNext()){
ansTextView.append("\n" + cursor.getString(1) + cursor.getString(2) + cursor.getString(3) + "=" + cursor.getString(4));
}
cursor.close();
db.close();
}
}
(1)base operate
addition:
subtraction:
multiplication:
division:
remainder:
(2)historic records
click button "ans" can show the historic records and click it again can hide the historic records
This article demonstrates the separation of the front and back ends of a computer and the use of a SQLite database to query the history of a calculator. The task goal is much more difficult than before, but it also benefits me a lot