Back-end separation calculator programming

832102120范景桢 2023-10-20 17:56:57

1.Introduction

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.

2.Personal information

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

3.PSP Table

Personal Software Process StagesEstimated Time(minutes)Actual Time(minutes)
Planning2530
Estimate2520
Development1510
Analysis2530
Design Review4540
Coding Standard2520
Design1520
Coding400300
Code Review3020
Test1010
Reporting2530
Test Report1010
Size Measurement1010
Postmortem & Process Improvement Plan4040
Sum700590

4.Flow chart

img

5.Code

1. front-end

(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

2. back-end

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();
}
}

6.Achievement display

(1)base operate

addition:

img

subtraction:

img

multiplication:

img

division:

img

remainder:

img

(2)historic records

img

click button "ans" can show the historic records and click it again can hide the historic records

7. summary

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

...全文
48 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

176

社区成员

发帖
与我相关
我的任务
社区描述
梅努斯软件工程
软件工程 高校 福建省·福州市
社区管理员
  • LinQF39
  • Jcandc
  • chjinhuu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧