-1

На 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! &lt; 100) ;

        Console.WriteLine(&quot;Введите второе трехзначное число&quot;);
        b = Convert.ToDouble(Console.ReadLine());
        if (b &lt; 100)
        {
            Console.WriteLine(&quot;ошибка&quot;);

        }
        while (b! &lt; 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($&quot;{a}{b}&quot;);

Aligat
  • 69

4 Answers4

3

Задача же простая, настолько, насколько это возможно. Здесь ее можно разделить на 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(&quot;Результат: {0}&quot;, 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(&quot;Введите второе трехзначное число: &quot;);
    if (int.TryParse(Console.ReadLine(), out number2) &amp;&amp; number2 &gt;= 100 &amp;&amp; number2 &lt;= 999)
        break;
    Console.WriteLine(errorText);
}

int result = number1 / 10 * 100 + number2 / 10;

Console.WriteLine(&quot;Результат: {0}&quot;, result);
Console.ReadKey();

}

aepot
  • 49,560
  • 1
    А вот этот ответ хорош. Только с предикатом как-то слишком для новичков. (как и в моес случае с дискардом, справедливости ради). С меня плюс. – Andrew Stop_RU_war_in_UA Sep 12 '20 at 20:31
2

Чтобы из 3-значного целого получить 2-значное, достаточно поделить его на 10.

В вашей программе я усматриваю следующие проблемы:

  1. Поскольку речь явно о целых числах, то переменные должны быть типа int, а не double.

  2. Даже если допустить, что эта конструкция компилируется, то это бесконечный цикл:

    while (a! < 100) ;
    
  3. Суть вычислений совершенно не ясна мне, и вряд ли она соответствует заданию:

    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(&quot;ошибка&quot;);
}

}

int a = NumberInput("Введите первое трехзначное число"); int b = NumberInput("Введите второе трехзначное число");

// Обрежем младшие разряды введённых чисел int a1 = a / 10; int b1 = b / 10; Console.WriteLine($"{a1}{b1}");

Заодно и избавимся от исключений при вводе данных, не являющихся целым числом.

Dmitry D.
  • 3,136
  • Спасибо бро, помог – Aligat Sep 12 '20 at 18:21
  • как все сложно здесь.... – Andrew Stop_RU_war_in_UA Sep 12 '20 at 18:51
  • @Andrew если вам здесь сложно, то я явно ошибся, нарочито сделав код максимально простым для автора вопроса (явно не знакомого пока даже с процедурным подходом) и с минимумом изменений. Впрочем, код рабочий и даже с валидацией. Технически, это хороший ответ. Причин его минусовать, кроме "а вот мне не нравится", нет. На большом SO за такой ответ я бы собрал плюса 3-4 и чекмарк. Хэшкод такой хешкод. :) – Dmitry D. Sep 12 '20 at 20:17
  • По-моему автору проще разобраться со строкой num1.ToString().SubString(0,2) + num2.ToString().SubString(0,2); чем с вот этой вот простыней. Так что да, код ОЧЕНЬ сложный. А еще здесь будут эксепшны в случае ввода текста :) – Andrew Stop_RU_war_in_UA Sep 12 '20 at 20:19
  • @Andrew и именно поэтому автор только мне и ответил благодарностью. Наверное, от того, что не смог разобраться. Так ответ верный или нет? Если верный, то минус незаслуженный. А хотя... ну зачем поддерживать авторов ответов, которые тратят своё время, помогая явным новичкам? Лучше топить их ответы. Что ж, воля ваша. ;) – Dmitry D. Sep 12 '20 at 20:26
  • Автор ответил с благодарностью потому что это был самый первый из ответов ;) Другие, вероятнее всего, он вообще не видел еще. – Andrew Stop_RU_war_in_UA Sep 12 '20 at 20:27
  • @Andrew насчёт исключений вы совершенно правы. Я добавил реализацию без исключений и с процедурным стилем в виде локальной функции. – Dmitry D. Sep 12 '20 at 20:47
  • снял минус за нижний блок. Стало лучше чем было. – Andrew Stop_RU_war_in_UA Sep 12 '20 at 21:04
  • А код компилируется? А то у меня есть некие сомнения на тему конструкции с инпутом в шарпе.... В свифте такое точно скомпилируется, а вот в шарпе не уверен – Andrew Stop_RU_war_in_UA Sep 12 '20 at 21:33
  • @Andrew конечно, компилируется! Я бы не позволил себе опубликовать ответ, который не проверил. Тем более, что ответ адресован новичку. – Dmitry D. Sep 12 '20 at 21:45
2

А не проще работать с 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));
Yaroslav
  • 7,040
  • До редактирования выглядело ЗНАЧИТЕЛЬНО лучше и читабельнее. Дублирующийся код нужно в отдельный метод вывести. А еще здесь куча лишник действий. Для чего стринг переводить в инт, что бы потом переводить в стринг, что бы потом переводить в инт? – Andrew Stop_RU_war_in_UA Sep 12 '20 at 18:54
  • С функциями лучше, чем без, спору нет =D C string->int->string действительно тупанул. – Yaroslav Sep 12 '20 at 19:02
  • Ан нет, не тупанул. Надо же удостовериться, что введины цифры. Вдруг там abc. – Yaroslav Sep 12 '20 at 19:05
  • нет, тупанул. Ибо можно не выходить с цикла в случае неудачного парса. А в случае удачного парса - дальше работать со стрингом. Что бы не делать лишних действий по возвращении инта в строку. Просмотри мое решение... Оно выглядит несколько читабельнее) – Andrew Stop_RU_war_in_UA Sep 12 '20 at 19:13
  • Нет не тупанул. Я прохраммист, я так вижу! Ты забыл ещё -1 самой теме поставить =D – Yaroslav Sep 12 '20 at 19:17
  • я поставил тебе сначала +1, а когда код стало сложно читать после правки, то тогда уже поставил -1. Код должен быть простым. После правки код стал плохо читаться, его сложно дебажить, а так же много лишних действий. И неинформативная ошибка) – Andrew Stop_RU_war_in_UA Sep 12 '20 at 19:18
  • И на тему того что "удостовериться что там введены цифры" - у тебя там выдаст эксепшн при введении не цифр, если что. То есть никакой защиты от введения не цифр здесь нет. – Andrew Stop_RU_war_in_UA Sep 12 '20 at 19:43
0

Господи, как у вас все сложно.... Задача решается в 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 = &quot;&quot;; }
}
return num;

}

UPD: Решил, все же, выпилить из ответа дискард и удалиться от решения через подстроки. Чисто что бы не пугать препода.

  • Ну так я о том-же – Yaroslav Sep 12 '20 at 18:32
  • Непонятно, почему вы отклонили правку, но поправьте, тогда ваш ответ сами, пожалуйста. – motpfofs Sep 12 '20 at 19:02
  • @motpfofs потому что убирание 2х пробелов в коментариях кода это не та правка, которую стоит делать в чужом ответе. Реальных улучшений ответа она не несет. Тем более что там отсутствовали кавычки еще. Если бы их добавил, то тогда бы правку принял бы ибо это улучшение кода. – Andrew Stop_RU_war_in_UA Sep 12 '20 at 19:04
  • В коментарии к изменениям было указано что основная причина это кавычки) И вы признаете, что это важная правка, раз сделали её сами) – motpfofs Sep 12 '20 at 19:06
  • тогда прошу прощения, кавычок там не увидел в правке) – Andrew Stop_RU_war_in_UA Sep 12 '20 at 19:08