Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
a6edbfeaf1 | |||
|
4a7874a0a7 |
@ -0,0 +1,23 @@
|
|||||||
|
package com.example.ipLab.TypesCalc.Configuration;
|
||||||
|
|
||||||
|
import com.example.ipLab.TypesCalc.domen.TypeCalcInteger;
|
||||||
|
import com.example.ipLab.TypesCalc.domen.TypeCalcString;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class CalcConfiguration {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(CalcConfiguration.class);
|
||||||
|
|
||||||
|
@Bean(value="int")
|
||||||
|
public TypeCalcInteger createTypeCalcInteger(){
|
||||||
|
return new TypeCalcInteger();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(value="string")
|
||||||
|
public TypeCalcString createTypeCalcString(){
|
||||||
|
return new TypeCalcString();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package com.example.ipLab.TypesCalc.Service;
|
||||||
|
|
||||||
|
import com.example.ipLab.TypesCalc.domen.TypeCalc;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class CalcService {
|
||||||
|
private final ApplicationContext applicationContext;
|
||||||
|
|
||||||
|
public CalcService(ApplicationContext applicationContext){this.applicationContext = applicationContext;}
|
||||||
|
|
||||||
|
public Object Sum(Object obj1, Object obj2, String type){
|
||||||
|
final TypeCalc typeCalculator = (TypeCalc) applicationContext.getBean(type);
|
||||||
|
if (type.startsWith("int")) return typeCalculator.Sum(Integer.parseInt(obj1.toString()), Integer.parseInt(obj2.toString()));
|
||||||
|
return typeCalculator.Sum(obj1, obj2);
|
||||||
|
}
|
||||||
|
public Object Dif(Object obj1, Object obj2, String type){
|
||||||
|
final TypeCalc typeCalculator = (TypeCalc) applicationContext.getBean(type);
|
||||||
|
if (type.startsWith("int")) return typeCalculator.Dif(Integer.parseInt(obj1.toString()), Integer.parseInt(obj2.toString()));
|
||||||
|
return typeCalculator.Dif(obj1, obj2);
|
||||||
|
}
|
||||||
|
public Object Multiply(Object obj1, Object obj2, String type){
|
||||||
|
final TypeCalc typeCalculator = (TypeCalc) applicationContext.getBean(type);
|
||||||
|
if (type.startsWith("int")) return typeCalculator.Multiply(Integer.parseInt(obj1.toString()), Integer.parseInt(obj2.toString()));
|
||||||
|
return typeCalculator.Multiply(obj1, obj2);
|
||||||
|
}
|
||||||
|
public Object Div(Object obj1, Object obj2, String type){
|
||||||
|
final TypeCalc typeCalculator = (TypeCalc) applicationContext.getBean(type);
|
||||||
|
if (type.startsWith("int")) return typeCalculator.Div(Integer.parseInt(obj1.toString()), Integer.parseInt(obj2.toString()));
|
||||||
|
return typeCalculator.Div(obj1, obj2);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package com.example.ipLab.TypesCalc.controller;
|
||||||
|
|
||||||
|
import com.example.ipLab.TypesCalc.Service.CalcService;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class TypeCalcController {
|
||||||
|
private final CalcService calcService;
|
||||||
|
|
||||||
|
public TypeCalcController(CalcService calcService) {this.calcService = calcService;}
|
||||||
|
|
||||||
|
@GetMapping("/CalcSum")
|
||||||
|
public Object calcSum(@RequestParam(value = "obj1", defaultValue = "null objects") Object obj1,
|
||||||
|
@RequestParam(value = "obj2", defaultValue = "provided") Object obj2,
|
||||||
|
@RequestParam(value = "type", defaultValue = "string") String type){
|
||||||
|
return calcService.Sum(obj1, obj2, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/CalcDif")
|
||||||
|
public Object calcDif(@RequestParam(value = "obj1", defaultValue = "null objects") Object obj1,
|
||||||
|
@RequestParam(value = "obj2", defaultValue = "provided") Object obj2,
|
||||||
|
@RequestParam(value = "type", defaultValue = "string") String type){
|
||||||
|
return calcService.Dif(obj1, obj2, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/CalcMultiply")
|
||||||
|
public Object calcMultiply(@RequestParam(value = "obj1", defaultValue = "null objects") Object obj1,
|
||||||
|
@RequestParam(value = "obj2", defaultValue = "provided") Object obj2,
|
||||||
|
@RequestParam(value = "type", defaultValue = "string") String type){
|
||||||
|
return calcService.Multiply(obj1, obj2, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/CalcDiv")
|
||||||
|
public Object calcDiv(@RequestParam(value = "obj1", defaultValue = "null objects") Object obj1,
|
||||||
|
@RequestParam(value = "obj2", defaultValue = "provided") Object obj2,
|
||||||
|
@RequestParam(value = "type", defaultValue = "string") String type){
|
||||||
|
return calcService.Div(obj1, obj2, type);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.example.ipLab.TypesCalc.domen;
|
||||||
|
|
||||||
|
public interface TypeCalc<T> {
|
||||||
|
T Sum(T obj1, T obj2);
|
||||||
|
T Dif(T obj1, T obj2);
|
||||||
|
T Multiply(T obj1, T obj2);
|
||||||
|
T Div(T obj1, T obj2);
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.example.ipLab.TypesCalc.domen;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
public class TypeCalcInteger implements TypeCalc<Integer>{
|
||||||
|
@Override
|
||||||
|
public Integer Sum(Integer num1, Integer num2) {
|
||||||
|
return num1 + num2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer Dif(Integer num1, Integer num2) {
|
||||||
|
return num1 - num2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer Multiply(Integer num1, Integer num2) {
|
||||||
|
return num1 * num2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer Div(Integer num1, Integer num2) {
|
||||||
|
try {
|
||||||
|
return num1 / num2;
|
||||||
|
}
|
||||||
|
catch (ArithmeticException ex){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
package com.example.ipLab.TypesCalc.domen;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
public class TypeCalcString implements TypeCalc<String> {
|
||||||
|
@Override
|
||||||
|
public String Sum(String s1, String s2) {
|
||||||
|
return s1 + s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String Dif(String s1, String s2) {
|
||||||
|
String res = "";
|
||||||
|
for (char c : s1.toCharArray()){
|
||||||
|
boolean foundInOther = false;
|
||||||
|
for (int i = 0; i < s2.length(); i++){
|
||||||
|
if (c == s2.charAt(i)) {
|
||||||
|
foundInOther = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!foundInOther) res += c;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String Multiply(String s1, String s2) {
|
||||||
|
String res = "";
|
||||||
|
for (char c : s1.toCharArray()){
|
||||||
|
boolean foundInOther = false;
|
||||||
|
for (int i = 0; i < s2.length(); i++){
|
||||||
|
if (c == s2.charAt(i)) {
|
||||||
|
foundInOther = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (foundInOther) res += c;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String Div(String s1, String s2) {
|
||||||
|
StringBuilder res = new StringBuilder();
|
||||||
|
int maxLength = Integer.max(s1.length(), s2.length());
|
||||||
|
for (int i = 0; i < maxLength; i++){
|
||||||
|
if (i < s1.length()){
|
||||||
|
res.append(s1.charAt(i));
|
||||||
|
}
|
||||||
|
if (i < s2.length()){
|
||||||
|
res.append(s2.charAt(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res.toString();
|
||||||
|
}
|
||||||
|
}
|
@ -1,13 +1,72 @@
|
|||||||
package com.example.ipLab;
|
package com.example.ipLab;
|
||||||
|
|
||||||
|
import com.example.ipLab.TypesCalc.Service.CalcService;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
@SpringBootTest
|
@SpringBootTest
|
||||||
class IpLabApplicationTests {
|
class IpLabApplicationTests {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
CalcService calcService;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void contextLoads() {
|
void testIntegerCalcSum() {
|
||||||
|
final Object res = calcService.Sum(2, 2, "int");
|
||||||
|
Assertions.assertEquals("4", res.toString());
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
void testIntegerCalcDif() {
|
||||||
|
final Object res = calcService.Dif(2, 2, "int");
|
||||||
|
Assertions.assertEquals("0", res.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testIntegerCalcMultiply() {
|
||||||
|
final Object res = calcService.Multiply(2, 3, "int");
|
||||||
|
Assertions.assertEquals("6", res.toString());
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
void testIntegerCalcDiv() {
|
||||||
|
final Object res = calcService.Div(4, 2, "int");
|
||||||
|
Assertions.assertEquals("2", res.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testIntegerCalcDivBy0() {
|
||||||
|
final Object res = calcService.Div(4, 0, "int");
|
||||||
|
Assertions.assertEquals("0", res.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStringCalcSum(){
|
||||||
|
final Object res = calcService.Sum("2", "2", "string");
|
||||||
|
Assertions.assertEquals("22", res.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStringCalcDif(){
|
||||||
|
final Object res = calcService.Dif("524", "24", "string");
|
||||||
|
Assertions.assertEquals("5", res.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStringCalcMultiply(){
|
||||||
|
final Object res = calcService.Multiply("523", "215", "string");
|
||||||
|
Assertions.assertEquals("52", res.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStringCalcDiv(){
|
||||||
|
final Object res = calcService.Div("135", "24", "string");
|
||||||
|
Assertions.assertEquals("12345", res.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testSpeakerErrorWiredInt() {
|
||||||
|
Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> calcService.Sum("1", "1", "integer"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<script src ="node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
|
<script src ="node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||||
<script src ="scripts/calc.js"></script>
|
<script src ="scripts/calcType.js"></script>
|
||||||
<link href="node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
|
<link href="node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
|
||||||
<link href="node_modules/@fortawesome/fontawesome-free/css/all.min.css" rel="stylesheet" />
|
<link href="node_modules/@fortawesome/fontawesome-free/css/all.min.css" rel="stylesheet" />
|
||||||
<title>Calc</title>
|
<title>Calc</title>
|
||||||
@ -13,11 +13,16 @@
|
|||||||
<body class="h-100">
|
<body class="h-100">
|
||||||
<div class="d-flex flex-column align-content-center flex-wrap">
|
<div class="d-flex flex-column align-content-center flex-wrap">
|
||||||
<div class="input-group p-3">
|
<div class="input-group p-3">
|
||||||
<input id="numberInput" type="number" class="form-control" placeholder="Введите число..." required>
|
<input type="text" class="form-control" id="obj1Input" placeholder="Введите объект 1...">
|
||||||
<button class="btn btn-outline-secondary" onclick="calcSecond()" type="button">^2</button>
|
<input type="text" class="form-control" id="obj2Input" placeholder="Введите объект 2...">
|
||||||
<button class="btn btn-outline-secondary" onclick="calcRoot()" type="button">√</button>
|
<select class="custom-select" id="typeSelect">
|
||||||
<button class="btn btn-outline-secondary" onclick="calcFact()" type="button">!</button>
|
<option selected value="int">Числа</option>
|
||||||
<button class="btn btn-outline-secondary" onclick="calcDigit()" type="button">Сумма цифр</button>
|
<option value="string">Строки</option>
|
||||||
|
</select>
|
||||||
|
<button class="btn btn-outline-secondary" onclick="calcSum()" type="button">+</button>
|
||||||
|
<button class="btn btn-outline-secondary" onclick="calcDif()" type="button">-</button>
|
||||||
|
<button class="btn btn-outline-secondary" onclick="calcMultiply()" type="button">*</button>
|
||||||
|
<button class="btn btn-outline-secondary" onclick="calcDiv()" type="button">/</button>
|
||||||
</div>
|
</div>
|
||||||
<a id="responseField" class="m-3"></a>
|
<a id="responseField" class="m-3"></a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
function calcSecond(){
|
function calcSum(){
|
||||||
var num = document.getElementById("numberInput").value;
|
var num = document.getElementById("numberInput").value;
|
||||||
fetch("http://127.0.0.1:8080/second?num=" + num)
|
fetch("http://127.0.0.1:8080/second?num=" + num)
|
||||||
.then(function(response) {
|
.then(function(response) {
|
||||||
@ -13,7 +13,7 @@ function calcSecond(){
|
|||||||
.catch(err => {document.getElementById("responseField").innerHTML = "Ошибка: " + err;})
|
.catch(err => {document.getElementById("responseField").innerHTML = "Ошибка: " + err;})
|
||||||
}
|
}
|
||||||
|
|
||||||
function calcRoot(){
|
function calcDif(){
|
||||||
var num = document.getElementById("numberInput").value;
|
var num = document.getElementById("numberInput").value;
|
||||||
if (num < 0) {
|
if (num < 0) {
|
||||||
document.getElementById("responseField").innerHTML = "Результат: введите НЕОТРИЦАТЕЛЬНОЕ число";
|
document.getElementById("responseField").innerHTML = "Результат: введите НЕОТРИЦАТЕЛЬНОЕ число";
|
||||||
@ -33,7 +33,7 @@ function calcRoot(){
|
|||||||
.catch(err => {document.getElementById("responseField").innerHTML = "Ошибка: " + err;})
|
.catch(err => {document.getElementById("responseField").innerHTML = "Ошибка: " + err;})
|
||||||
}
|
}
|
||||||
|
|
||||||
function calcFact(){
|
function calcMultiply(){
|
||||||
var num = document.getElementById("numberInput").value;
|
var num = document.getElementById("numberInput").value;
|
||||||
if (num < 0) {
|
if (num < 0) {
|
||||||
document.getElementById("responseField").innerHTML = "Результат: введите НЕОТРИЦАТЕЛЬНОЕ число";
|
document.getElementById("responseField").innerHTML = "Результат: введите НЕОТРИЦАТЕЛЬНОЕ число";
|
||||||
@ -53,7 +53,7 @@ function calcFact(){
|
|||||||
.catch(err => {document.getElementById("responseField").innerHTML = "Ошибка: " + err;})
|
.catch(err => {document.getElementById("responseField").innerHTML = "Ошибка: " + err;})
|
||||||
}
|
}
|
||||||
|
|
||||||
function calcDigit(){
|
function calcDiv(){
|
||||||
var num = document.getElementById("numberInput").value;
|
var num = document.getElementById("numberInput").value;
|
||||||
fetch("http://127.0.0.1:8080/digit?num=" + num)
|
fetch("http://127.0.0.1:8080/digit?num=" + num)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
|
36
frontend/scripts/calcType.js
Normal file
36
frontend/scripts/calcType.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
function calcSum(){
|
||||||
|
fetchServer("CalcSum");
|
||||||
|
}
|
||||||
|
|
||||||
|
function calcDif(){
|
||||||
|
fetchServer("CalcDif");
|
||||||
|
}
|
||||||
|
|
||||||
|
function calcMultiply(){
|
||||||
|
fetchServer("CalcMultiply");
|
||||||
|
}
|
||||||
|
|
||||||
|
function calcDiv(){
|
||||||
|
fetchServer("CalcDiv");
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetchServer(adress){
|
||||||
|
var obj1 = document.getElementById("obj1Input").value;
|
||||||
|
var obj2 = document.getElementById("obj2Input").value;
|
||||||
|
var type = document.getElementById("typeSelect").value;
|
||||||
|
if (type == "int" && (isNaN(obj1) || isNaN(obj2))){
|
||||||
|
document.getElementById("responseField").innerHTML = "Ошибка: введите число для операций с числами или измените тип данных!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fetch("http://127.0.0.1:8080/" + adress + "?obj1=" + obj1 + "&obj2=" + obj2 + "&type=" + type)
|
||||||
|
.then(function(response) {
|
||||||
|
if (!response.ok){
|
||||||
|
return response.text().then(text => {throw new Error(text)});
|
||||||
|
}
|
||||||
|
return response.text();
|
||||||
|
})
|
||||||
|
.then((response) => {
|
||||||
|
document.getElementById("responseField").innerHTML = "Результат: " + response;
|
||||||
|
})
|
||||||
|
.catch(err => {document.getElementById("responseField").innerHTML = "Ошибка: " + err;})
|
||||||
|
}
|
Binary file not shown.
BIN
ПИбд-23_Абазов_А.А_Лабораторная№2.docx
Normal file
BIN
ПИбд-23_Абазов_А.А_Лабораторная№2.docx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user