|
1 | | -using System.Collections; |
2 | | - |
3 | | -namespace algorithms_cs.Tape; |
| 1 | +namespace algorithms_cs.Tape; |
4 | 2 |
|
5 | 3 | public class TapeReader : Tape |
6 | 4 | { |
@@ -32,96 +30,53 @@ public void Close() |
32 | 30 | _file?.Close(); |
33 | 31 | } |
34 | 32 |
|
| 33 | + private bool ValueIsDigit(int value) |
| 34 | + { |
| 35 | + return value is >= 48 and <= 57; |
| 36 | + } |
| 37 | + |
35 | 38 | // This methods reading file and returns a next number from this file |
36 | 39 | public virtual TapeReturn<double> Next() |
37 | 40 | { |
38 | 41 | var token = ""; |
39 | | - bool isNumber = false, isUnSignNumber = false; |
| 42 | + bool tokenIsNumber = false; |
40 | 43 | //_isHaveNumber = IsEnd(); |
41 | 44 |
|
42 | 45 | while (!IsEnd) |
43 | 46 | { |
44 | | - var symbol = _file!.Read(); |
45 | | - var nextSymbol = _file.Peek(); |
46 | | - // Если число не началось |
47 | | - if (!isNumber && !isUnSignNumber) |
| 47 | + var currentChar = _file!.Read(); |
| 48 | + var nextChar = _file.Peek(); |
| 49 | + |
| 50 | + tokenIsNumber = !tokenIsNumber |
| 51 | + ? (currentChar == '-' && ValueIsDigit(nextChar)) || ValueIsDigit(currentChar) |
| 52 | + : tokenIsNumber; |
| 53 | + |
| 54 | + if (!tokenIsNumber) continue; |
| 55 | + |
| 56 | + // Checking negative or float number or continues digit |
| 57 | + tokenIsNumber = ValueIsDigit(currentChar is '.' or ',' or '-' ? nextChar : currentChar); |
| 58 | + |
| 59 | + if (!tokenIsNumber) |
48 | 60 | { |
49 | | - // Если число началось с знака: '-' |
50 | | - if (symbol == '-' && nextSymbol is >= 48 and <= 57) |
51 | | - { |
52 | | - isUnSignNumber = true; |
53 | | - } |
54 | | - else if (48 <= symbol && symbol <= 57) |
| 61 | + if (token.Length > 0) |
55 | 62 | { |
56 | | - isNumber = true; |
| 63 | + return new TapeReturn<double>(Convert.ToDouble(token.Replace('.', ','))); |
57 | 64 | } |
| 65 | + break; |
58 | 66 | } |
59 | 67 |
|
60 | | - // Если число уже начато |
61 | | - if (isNumber || isUnSignNumber) |
| 68 | + token += currentChar switch |
62 | 69 | { |
63 | | - // Если символ точка или запятая и следующий символ число, то продолжить чтение |
64 | | - if (symbol is '.' or ',' && nextSymbol is >= 48 and <= 57) |
65 | | - { |
66 | | - isNumber = true; |
67 | | - isUnSignNumber = true; |
68 | | - } |
69 | | - // Если после точки или запятой нет числа, то выходим из цикла |
70 | | - else if (symbol is '.' or ',' && nextSymbol is < 48 or > 57) |
71 | | - { |
72 | | - isNumber = false; |
73 | | - isUnSignNumber = false; |
74 | | - } |
75 | | - else if (symbol == '-' && nextSymbol is >= 48 and <= 57) |
76 | | - { |
77 | | - isNumber = true; |
78 | | - isUnSignNumber = true; |
79 | | - } |
80 | | - else if (symbol is >= 48 and <= 57) |
81 | | - { |
82 | | - isNumber = true; |
83 | | - isUnSignNumber = true; |
84 | | - } |
85 | | - else |
86 | | - { |
87 | | - isNumber = false; |
88 | | - isUnSignNumber = false; |
89 | | - } |
90 | | - |
91 | | - if (!isNumber && !isUnSignNumber) |
92 | | - { |
93 | | - //_isHaveNumber = token.Length > 0; |
94 | | - if (token.Length > 0) |
95 | | - { |
96 | | - return new TapeReturn<double>(Convert.ToDouble(token.Replace('.', ','))); |
97 | | - } |
98 | | - break; |
99 | | - //return new CorrectTapeReturn<double>(token.Length > 0 ? Convert.ToDouble(token.Replace('.', ',')) : 0.0); |
100 | | - //return new CorrectTapeReturn<double>(Convert.ToDouble(token.Replace('.', ','))); |
101 | | - } |
102 | | - |
103 | | - if (symbol == '-') |
104 | | - { |
105 | | - token += "-"; |
106 | | - } |
107 | | - else if (symbol == '.') |
108 | | - { |
109 | | - token += "."; |
110 | | - } |
111 | | - else if (symbol == ',') |
112 | | - { |
113 | | - token += ","; |
114 | | - } |
115 | | - else |
116 | | - { |
117 | | - token += (symbol - 48).ToString(); |
118 | | - } |
| 70 | + '-' => "-", |
| 71 | + '.' => ".", |
| 72 | + ',' => ",", |
| 73 | + _ => (currentChar - 48).ToString() |
| 74 | + }; |
119 | 75 |
|
120 | | - if (nextSymbol == -1) |
121 | | - { |
122 | | - //_isHaveNumber = true; |
123 | | - return new TapeReturn<double>(Convert.ToDouble(token.Replace('.', ','))); |
124 | | - } |
| 76 | + if (nextChar == -1) |
| 77 | + { |
| 78 | + //_isHaveNumber = true; |
| 79 | + return new TapeReturn<double>(Convert.ToDouble(token.Replace('.', ','))); |
125 | 80 | } |
126 | 81 | } |
127 | 82 | return new TapeReturn<double>(TapeReturnType.TapeEnded); |
|
0 commit comments