Skip to content

Commit dca6ac8

Browse files
committed
Rewrote the Next method for reading number from tape
1 parent 6a6ab6b commit dca6ac8

File tree

1 file changed

+33
-78
lines changed

1 file changed

+33
-78
lines changed

src/Tape/TapeReader.cs

Lines changed: 33 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.Collections;
2-
3-
namespace algorithms_cs.Tape;
1+
namespace algorithms_cs.Tape;
42

53
public class TapeReader : Tape
64
{
@@ -32,96 +30,53 @@ public void Close()
3230
_file?.Close();
3331
}
3432

33+
private bool ValueIsDigit(int value)
34+
{
35+
return value is >= 48 and <= 57;
36+
}
37+
3538
// This methods reading file and returns a next number from this file
3639
public virtual TapeReturn<double> Next()
3740
{
3841
var token = "";
39-
bool isNumber = false, isUnSignNumber = false;
42+
bool tokenIsNumber = false;
4043
//_isHaveNumber = IsEnd();
4144

4245
while (!IsEnd)
4346
{
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)
4860
{
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)
5562
{
56-
isNumber = true;
63+
return new TapeReturn<double>(Convert.ToDouble(token.Replace('.', ',')));
5764
}
65+
break;
5866
}
5967

60-
// Если число уже начато
61-
if (isNumber || isUnSignNumber)
68+
token += currentChar switch
6269
{
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+
};
11975

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('.', ',')));
12580
}
12681
}
12782
return new TapeReturn<double>(TapeReturnType.TapeEnded);

0 commit comments

Comments
 (0)