Procházet zdrojové kódy

complex-numbers: add to track

Stuart Kent před 9 roky
rodič
revize
7d4690ab29

+ 7
- 0
config.json Zobrazit soubor

474
       ]
474
       ]
475
     },
475
     },
476
     {
476
     {
477
+      "slug": "complex-numbers",
478
+      "difficulty": 8,
479
+      "topics": [
480
+
481
+      ]
482
+    },
483
+    {
477
       "slug": "change",
484
       "slug": "change",
478
       "difficulty": 8,
485
       "difficulty": 8,
479
       "topics": [
486
       "topics": [

+ 18
- 0
exercises/complex-numbers/build.gradle Zobrazit soubor

1
+apply plugin: "java"
2
+apply plugin: "eclipse"
3
+apply plugin: "idea"
4
+
5
+repositories {
6
+  mavenCentral()
7
+}
8
+
9
+dependencies {
10
+  testCompile "junit:junit:4.12"
11
+}
12
+
13
+test {
14
+  testLogging {
15
+    exceptionFormat = 'full'
16
+    events = ["passed", "failed", "skipped"]
17
+  }
18
+}

+ 57
- 0
exercises/complex-numbers/src/example/java/ComplexNumber.java Zobrazit soubor

1
+final class ComplexNumber {
2
+
3
+    private final double real;
4
+
5
+    private final double imag;
6
+
7
+    ComplexNumber(double real, double imag) {
8
+        this.real = real;
9
+        this.imag = imag;
10
+    }
11
+
12
+    double getReal() {
13
+        return real;
14
+    }
15
+
16
+    double getImag() {
17
+        return imag;
18
+    }
19
+
20
+    ComplexNumber times(ComplexNumber other) {
21
+        return new ComplexNumber(
22
+                real * other.real - imag * other.imag,
23
+                real * other.imag + imag * other.real);
24
+    }
25
+
26
+    ComplexNumber add(ComplexNumber other) {
27
+        return new ComplexNumber(real + other.real, imag + other.imag);
28
+    }
29
+
30
+    ComplexNumber minus(ComplexNumber other) {
31
+        return new ComplexNumber(real - other.real, imag - other.imag);
32
+    }
33
+
34
+    ComplexNumber div(ComplexNumber other) {
35
+        return this.times(other.conjugate()).div(Math.pow(other.abs(), 2));
36
+    }
37
+
38
+    double abs() {
39
+        return Math.hypot(real, imag);
40
+    }
41
+
42
+    ComplexNumber conjugate() {
43
+        return new ComplexNumber(real, -imag);
44
+    }
45
+
46
+    ComplexNumber exponentialOf() {
47
+        return new ComplexNumber(Math.cos(imag), Math.sin(imag)).times(Math.exp(real));
48
+    }
49
+
50
+    private ComplexNumber div(double factor) {
51
+        return new ComplexNumber(real / factor, imag / factor);
52
+    }
53
+
54
+    private ComplexNumber times(double factor) {
55
+        return new ComplexNumber(factor * real, factor * imag);
56
+    }
57
+}

+ 0
- 0
exercises/complex-numbers/src/main/java/.keep Zobrazit soubor


+ 262
- 0
exercises/complex-numbers/src/test/java/ComplexNumberTest.java Zobrazit soubor

1
+import org.junit.Ignore;
2
+import org.junit.Test;
3
+
4
+import static org.junit.Assert.assertEquals;
5
+
6
+public class ComplexNumberTest {
7
+
8
+    // Test helpers
9
+
10
+    private static final double DOUBLE_EQUALITY_TOLERANCE = 1e-15;
11
+
12
+    private void assertDoublesEqual(double d1, double d2) {
13
+        assertEquals(d1, d2, DOUBLE_EQUALITY_TOLERANCE);
14
+    }
15
+
16
+    private void assertComplexNumbersEqual(ComplexNumber c1, ComplexNumber c2) {
17
+        assertDoublesEqual(c1.getReal(), c2.getReal());
18
+        assertDoublesEqual(c1.getImag(), c2.getImag());
19
+    }
20
+
21
+    // Tests
22
+
23
+    @Test
24
+    public void testImaginaryUnitExhibitsDefiningProperty() {
25
+        ComplexNumber expected = new ComplexNumber(-1.0, 0);
26
+        ComplexNumber actual = new ComplexNumber(0, 1.0).times(new ComplexNumber(0, 1.0));
27
+        assertComplexNumbersEqual(expected, actual);
28
+    }
29
+
30
+    @Ignore("Remove to run test")
31
+    @Test
32
+    public void testAdditionWithPurelyRealNumbers() {
33
+        ComplexNumber expected = new ComplexNumber(3.0, 0);
34
+        ComplexNumber actual = new ComplexNumber(1.0, 0).add(new ComplexNumber(2.0, 0));
35
+        assertComplexNumbersEqual(expected, actual);
36
+    }
37
+
38
+    @Ignore("Remove to run test")
39
+    @Test
40
+    public void testAdditionWithPurelyImaginaryNumbers() {
41
+        ComplexNumber expected = new ComplexNumber(0, 3.0);
42
+        ComplexNumber actual = new ComplexNumber(0, 1.0).add(new ComplexNumber(0, 2.0));
43
+        assertComplexNumbersEqual(expected, actual);
44
+    }
45
+
46
+    @Ignore("Remove to run test")
47
+    @Test
48
+    public void testAdditionWithRealAndImaginaryParts() {
49
+        ComplexNumber expected = new ComplexNumber(4.0, 6.0);
50
+        ComplexNumber actual = new ComplexNumber(1.0, 2.0).add(new ComplexNumber(3.0, 4.0));
51
+        assertComplexNumbersEqual(expected, actual);
52
+    }
53
+
54
+    @Ignore("Remove to run test")
55
+    @Test
56
+    public void testSubtractionWithPurelyRealNumbers() {
57
+        ComplexNumber expected = new ComplexNumber(-1.0, 0.0);
58
+        ComplexNumber actual = new ComplexNumber(1.0, 0.0).minus(new ComplexNumber(2.0, 0.0));
59
+        assertComplexNumbersEqual(expected, actual);
60
+    }
61
+
62
+    @Ignore("Remove to run test")
63
+    @Test
64
+    public void testSubtractionWithPurelyImaginaryNumbers() {
65
+        ComplexNumber expected = new ComplexNumber(0, -1.0);
66
+        ComplexNumber actual = new ComplexNumber(0, 1.0).minus(new ComplexNumber(0, 2.0));
67
+        assertComplexNumbersEqual(expected, actual);
68
+    }
69
+
70
+    @Ignore("Remove to run test")
71
+    @Test
72
+    public void testSubtractionWithRealAndImaginaryParts() {
73
+        ComplexNumber expected = new ComplexNumber(-2.0, -2.0);
74
+        ComplexNumber actual = new ComplexNumber(1.0, 2.0).minus(new ComplexNumber(3.0, 4.0));
75
+        assertComplexNumbersEqual(expected, actual);
76
+    }
77
+
78
+    @Ignore("Remove to run test")
79
+    @Test
80
+    public void testMultiplicationWithPurelyRealNumbers() {
81
+        ComplexNumber expected = new ComplexNumber(2.0, 0);
82
+        ComplexNumber actual = new ComplexNumber(1.0, 0).times(new ComplexNumber(2.0, 0));
83
+        assertComplexNumbersEqual(expected, actual);
84
+    }
85
+
86
+    @Ignore("Remove to run test")
87
+    @Test
88
+    public void testMultiplicationWithPurelyImaginaryNumbers() {
89
+        ComplexNumber expected = new ComplexNumber(-2.0, 0);
90
+        ComplexNumber actual = new ComplexNumber(0, 1.0).times(new ComplexNumber(0, 2.0));
91
+        assertComplexNumbersEqual(expected, actual);
92
+    }
93
+
94
+    @Ignore("Remove to run test")
95
+    @Test
96
+    public void testMultiplicationWithRealAndImaginaryParts() {
97
+        ComplexNumber expected = new ComplexNumber(-5.0, 10.0);
98
+        ComplexNumber actual = new ComplexNumber(1.0, 2.0).times(new ComplexNumber(3.0, 4.0));
99
+        assertComplexNumbersEqual(expected, actual);
100
+    }
101
+
102
+    @Ignore("Remove to run test")
103
+    @Test
104
+    public void testDivisionWithPurelyRealNumbers() {
105
+        ComplexNumber expected = new ComplexNumber(0.5, 0);
106
+        ComplexNumber actual = new ComplexNumber(1.0, 0).div(new ComplexNumber(2.0, 0));
107
+        assertComplexNumbersEqual(expected, actual);
108
+    }
109
+
110
+    @Ignore("Remove to run test")
111
+    @Test
112
+    public void testDivisionWithPurelyImaginaryNumbers() {
113
+        ComplexNumber expected = new ComplexNumber(0.5, 0);
114
+        ComplexNumber actual = new ComplexNumber(0, 1.0).div(new ComplexNumber(0, 2.0));
115
+        assertComplexNumbersEqual(expected, actual);
116
+    }
117
+
118
+    @Ignore("Remove to run test")
119
+    @Test
120
+    public void testDivisionWithRealAndImaginaryParts() {
121
+        ComplexNumber expected = new ComplexNumber(0.44, 0.08);
122
+        ComplexNumber actual = new ComplexNumber(1.0, 2.0).div(new ComplexNumber(3.0, 4.0));
123
+        assertComplexNumbersEqual(expected, actual);
124
+    }
125
+
126
+    @Ignore("Remove to run test")
127
+    @Test
128
+    public void testAbsoluteValueOfPositivePurelyRealNumber() {
129
+        double expected = 5.0;
130
+        double actual = new ComplexNumber(5.0, 0).abs();
131
+        assertDoublesEqual(expected, actual);
132
+    }
133
+
134
+    @Ignore("Remove to run test")
135
+    @Test
136
+    public void testAbsoluteValueOfNegativePurelyRealNumber() {
137
+        double expected = 5.0;
138
+        double actual = new ComplexNumber(-5.0, 0).abs();
139
+        assertDoublesEqual(expected, actual);
140
+    }
141
+
142
+    @Ignore("Remove to run test")
143
+    @Test
144
+    public void testAbsoluteValueOfPurelyImaginaryNumberWithPositiveImaginaryPart() {
145
+        double expected = 5.0;
146
+        double actual = new ComplexNumber(0, 5.0).abs();
147
+        assertDoublesEqual(expected, actual);
148
+    }
149
+
150
+    @Ignore("Remove to run test")
151
+    @Test
152
+    public void testAbsoluteValueOfPurelyImaginaryNumberWithNegativeImaginaryPart() {
153
+        double expected = 5.0;
154
+        double actual = new ComplexNumber(0, -5.0).abs();
155
+        assertDoublesEqual(expected, actual);
156
+    }
157
+
158
+    @Ignore("Remove to run test")
159
+    @Test
160
+    public void testAbsoluteValueOfNumberWithRealAndImaginaryParts() {
161
+        double expected = 5.0;
162
+        double actual = new ComplexNumber(3.0, 4.0).abs();
163
+        assertDoublesEqual(expected, actual);
164
+    }
165
+
166
+    @Ignore("Remove to run test")
167
+    @Test
168
+    public void testConjugationOfPurelyRealNumber() {
169
+        ComplexNumber expected = new ComplexNumber(5.0, 0);
170
+        ComplexNumber actual = new ComplexNumber(5.0, 0).conjugate();
171
+        assertComplexNumbersEqual(expected, actual);
172
+    }
173
+
174
+    @Ignore("Remove to run test")
175
+    @Test
176
+    public void testConjugationOfPurelyImaginaryNumber() {
177
+        ComplexNumber expected = new ComplexNumber(0, -5.0);
178
+        ComplexNumber actual = new ComplexNumber(0, 5.0).conjugate();
179
+        assertComplexNumbersEqual(expected, actual);
180
+    }
181
+
182
+    @Ignore("Remove to run test")
183
+    @Test
184
+    public void testConjugationOfNumberWithRealAndImaginaryParts() {
185
+        ComplexNumber expected = new ComplexNumber(1.0, -1.0);
186
+        ComplexNumber actual = new ComplexNumber(1.0, 1.0).conjugate();
187
+        assertComplexNumbersEqual(expected, actual);
188
+    }
189
+
190
+    @Ignore("Remove to run test")
191
+    @Test
192
+    public void testRealPartOfPurelyRealNumber() {
193
+        double expected = 1.0;
194
+        double actual = new ComplexNumber(1.0, 0).getReal();
195
+        assertDoublesEqual(expected, actual);
196
+    }
197
+
198
+    @Ignore("Remove to run test")
199
+    @Test
200
+    public void testRealPartOfPurelyImaginaryNumber() {
201
+        double expected = 0.0;
202
+        double actual = new ComplexNumber(0, 1.0).getReal();
203
+        assertDoublesEqual(expected, actual);
204
+    }
205
+
206
+    @Ignore("Remove to run test")
207
+    @Test
208
+    public void testRealPartOfNumberWithRealAndImaginaryParts() {
209
+        double expected = 1.0;
210
+        double actual = new ComplexNumber(1.0, 2.0).getReal();
211
+        assertDoublesEqual(expected, actual);
212
+    }
213
+
214
+    @Ignore("Remove to run test")
215
+    @Test
216
+    public void testImaginaryPartOfPurelyRealNumber() {
217
+        double expected = 0.0;
218
+        double actual = new ComplexNumber(1.0, 0).getImag();
219
+        assertDoublesEqual(expected, actual);
220
+    }
221
+
222
+    @Ignore("Remove to run test")
223
+    @Test
224
+    public void testImaginaryPartOfPurelyImaginaryNumber() {
225
+        double expected = 1.0;
226
+        double actual = new ComplexNumber(0, 1.0).getImag();
227
+        assertDoublesEqual(expected, actual);
228
+    }
229
+
230
+    @Ignore("Remove to run test")
231
+    @Test
232
+    public void testImaginaryPartOfNumberWithRealAndImaginaryParts() {
233
+        double expected = 2.0;
234
+        double actual = new ComplexNumber(1.0, 2.0).getImag();
235
+        assertDoublesEqual(expected, actual);
236
+    }
237
+
238
+    @Ignore("Remove to run test")
239
+    @Test
240
+    public void testExponentialOfPurelyImaginaryNumber() {
241
+        ComplexNumber expected = new ComplexNumber(-1.0, 0);
242
+        ComplexNumber actual = new ComplexNumber(0, Math.PI).exponentialOf();
243
+        assertComplexNumbersEqual(expected, actual);
244
+    }
245
+
246
+    @Ignore("Remove to run test")
247
+    @Test
248
+    public void testExponentialOfZero() {
249
+        ComplexNumber expected = new ComplexNumber(1.0, 0);
250
+        ComplexNumber actual = new ComplexNumber(0, 0).exponentialOf();
251
+        assertComplexNumbersEqual(expected, actual);
252
+    }
253
+
254
+    @Ignore("Remove to run test")
255
+    @Test
256
+    public void testExponentialOfPurelyRealNumber() {
257
+        ComplexNumber expected = new ComplexNumber(Math.E, 0);
258
+        ComplexNumber actual = new ComplexNumber(1.0, 0).exponentialOf();
259
+        assertComplexNumbersEqual(expected, actual);
260
+    }
261
+
262
+}

+ 1
- 0
exercises/settings.gradle Zobrazit soubor

15
 include 'change'
15
 include 'change'
16
 include 'clock'
16
 include 'clock'
17
 include 'collatz-conjecture'
17
 include 'collatz-conjecture'
18
+include 'complex-numbers'
18
 include 'crypto-square'
19
 include 'crypto-square'
19
 include 'custom-set'
20
 include 'custom-set'
20
 include 'diamond'
21
 include 'diamond'