Проблема с операциями над числами в C#: соединение (конкатенация), обработка, вывод
На C# нужно ввести два трехзначных числа, соединить эти два числа так чтобы, например, для ввода
123
456
вышло
1245
Я сделал почти все из этого, кроме того что у меня выводит совсем другое число, например: я ввожу 123 и 456 у меня выводит 123456, а должно быть 1245.
Вот что я сделал:
double a, b,a1,b1;
Console.WriteLine("Введите первое трехзначное число");
a = Convert.ToDouble(Console.ReadLine());
if (a < 100)
{
Console.WriteLine("ошибка");
}
while (a! < 100) ;
Console.WriteLine("Введите второе трехзначное число");
b = Convert.ToDouble(Console.ReadLine());
if (b < 100)
{
Console.WriteLine("ошибка");
}
while (b! < 100) ;
b1 = b / 100;
b1 = b / 10 % 10;
a1 = a / 100;
a1 = a / 10 % 10;
a = a + b;
b = a - b;
a = a - b;
Console.WriteLine($"{a}{b}");
Ответы (4 шт):
Чтобы из 3-значного целого получить 2-значное, достаточно поделить его на 10.
В вашей программе я усматриваю следующие проблемы:
Поскольку речь явно о целых числах, то переменные должны быть типа
int, а неdouble.Даже если допустить, что эта конструкция компилируется, то это бесконечный цикл:
while (a! < 100) ;Суть вычислений совершенно не ясна мне, и вряд ли она соответствует заданию:
b1 = b / 100; b1 = b / 10 % 10; a1 = a / 100; a1 = a / 10 % 10; a = a + b; b = a - b; a = a - b;
Вместо этого я предлагаю следующее:
Console.WriteLine("Введите первое трехзначное число");
int a, b;
while (true)
{
a = Convert.ToInt32(Console.ReadLine());
if (a >= 100 && a < 1000)
{
break;
}
Console.WriteLine("ошибка");
}
Console.WriteLine("Введите второе трехзначное число");
while (true)
{
b = Convert.ToInt32(Console.ReadLine());
if (b >= 100 && b < 1000)
{
break;
}
Console.WriteLine("ошибка");
}
int a1 = a / 10;
int b1 = b / 10;
Console.WriteLine($"{a1}{b1}");
Если вам уже знаком процедурный стиль, то код можно упростить:
int NumberInput(string prompt)
{
Console.WriteLine(prompt);
while (true) // Итерируем до тех пор, пока введённые данные нас не устроят
{
if (int.TryParse(Console.ReadLine(), out var input) && input >= 100 && input < 1000)
{
// Введённые данные нас устраивают
return input;
}
Console.WriteLine("ошибка");
}
}
int a = NumberInput("Введите первое трехзначное число");
int b = NumberInput("Введите второе трехзначное число");
// Обрежем младшие разряды введённых чисел
int a1 = a / 10;
int b1 = b / 10;
Console.WriteLine($"{a1}{b1}");
Заодно и избавимся от исключений при вводе данных, не являющихся целым числом.
А не проще работать с string?
int ValueA, ValueB;
int RequiredLenght = 3;
Console.WriteLine("Введите первое трехзначное число: ");
while (true) {
ValueA = Convert.ToInt32(Console.ReadLine());
if (ValueA.ToString().Length == RequiredLenght)
break;
Console.WriteLine("Ошибка. Число знаков: "+ValueA.ToString().Length);
}
Console.WriteLine("Введите второе трехзначное число: ");
while (true) {
ValueB = Convert.ToInt32(Console.ReadLine());
if (ValueB.ToString().Length == RequiredLenght)
break;
Console.WriteLine("Ошибка. Число знаков: "+ValueB.ToString().Length);
}
string Result = ValueA.ToString().Substring(0, 2)+ValueB.ToString().Substring(0, 2);
Console.WriteLine(int.Parse(Result));
Господи, как у вас все сложно.... Задача решается в 1 строку кода
// input/output : string
var strRez = str1.SubString(0,2) + str2.SubString(0,2);
//Лично я бы выбрал этот путь за счет читабельности
//Увидев его -- сразу понятен результат, даже,
//если не виден контекст кода.
//Но преподавателю такой подход не понравится.
//input/output : int
var intRez = (number1 / 10) * 100 + number2 / 10;
// input: int, output: string
var strRez = $"{num1/10}{num2/10}";
А если полностью все писать, то нужно что-то вроде:
public static void Main(string[] args)
{
var num1 = GiveMeNum("Введите ПЕРВОЕ трехзначное число");
var num2 = GiveMeNum("Введите ВТОРОЕ трехзначное число");
Console.WriteLine($"{num1/10}{num2/10}");
}
private static int GiveMeNum( string msg = ""){
string str ="";
int num = 0;
while (str.length != 3) {
Console.WriteLine(msg);
str = Console.ReadLine();
if (!Int32.TryParse(str, out num)) { str = ""; }
}
return num;
}
UPD: Решил, все же, выпилить из ответа дискард и удалиться от решения через подстроки. Чисто что бы не пугать препода.
Задача же простая, настолько, насколько это возможно. Здесь ее можно разделить на 2 части - огранизовать безотказный ввод трехзначного числа и провести вычисления.
Я уже написал метод безотказного ввода числа на StackOverflow ранее, просто сделаю перепост.
Безотказный ввод числа
public static int ReadNumber(string prompt, Predicate<int> condition, string errorMessage)
{
int result;
while (true)
{
Console.Write(prompt);
if (int.TryParse(Console.ReadLine(), out result) && condition(result))
break;
Console.WriteLine(errorMessage);
}
return result;
}
Собственно, сам код
public static void Main(string[] args)
{
string errorText = "Введите число от 100 до 999.";
int number1 = ReadNumber("Введите первое трехзначное число: ", x => x >= 100 && x <= 999, errorText);
int number2 = ReadNumber("Введите второе трехзначное число: ", x => x >= 100 && x <= 999, errorText);
int result = number1 / 10 * 100 + number2 / 10;
Console.WriteLine("Результат: {0}", result);
Console.ReadKey();
}
Вывод в консоль
Введите первое трехзначное число: 123
Введите второе трехзначное число: 456
Результат: 1245
Тот же самый код, только для новичка, без предикатов
public static void Main(string[] args)
{
string errorText = "Введите число от 100 до 999.";
int number1;
while (true)
{
Console.Write("Введите первое трехзначное число: ");
if (int.TryParse(Console.ReadLine(), out number1) && number1 >= 100 && number1 <= 999)
break;
Console.WriteLine(errorText);
}
int number2;
while (true)
{
Console.Write("Введите второе трехзначное число: ");
if (int.TryParse(Console.ReadLine(), out number2) && number2 >= 100 && number2 <= 999)
break;
Console.WriteLine(errorText);
}
int result = number1 / 10 * 100 + number2 / 10;
Console.WriteLine("Результат: {0}", result);
Console.ReadKey();
}