0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 14
1

Операции с числами: объясните принцип работы кода (2)

07.05.2012, 22:29. Показов 1250. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброй ночи, я опять продолжаю нубить при изучении C# и пишу с просьбой помочь разобраться с кодом.

Это пример программы в учебнике, по условию тут она находит наибольший и наименьший
множители числа 100.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
class Comma
{
    public static void Main()
    {
        int i, j;
        int smallest, largest;
        int num;
        num = 100;
        smallest = largest = 1;
        for (i = 2, j = num / 2; (i <= num / 2) & (j >= 2); i++, j--)
        {
            if ((smallest == 1) & (num % i) == 0)
                smallest = i;
            if ((largest == 1) & (num % j) == 0)
                largest = j;
        }
            Console.WriteLine("Наибольший множитель: " + largest);
            Console.WriteLine("Наименьший множитель: " + smallest);
        
    }
}
Ответ, который она выводит:

Наибольший множитель: 50
Наименьший множитель: 2


Здесь вроде бы все предельно понятно, но есть два нюанса, зачем нужны переменные smallest и largest, и зачем им присваивается именно 1, если поменять на 0 - ничего не изменится, а если их убрать из инструкции цикла, т.е. убрать (smallest == 1) и (largest == 1) будет такой ответ:

Наибольший множитель: 2
Наименьший множитель: 50


То есть тут нужно будет просто переменным названия поменять, местами переставить. Я так понял, что данное присваивание (smallest == 1) способствует тому, что берется первое значение в ответ, а если убрать это присваивание, то программа проходит весь цикл до конца и берет последнее значение, разрешенное условием.

И вопрос по самому циклу, почему в итоге получается только два ответа? Ведь по условию (num % i) == 0) должны выводиться все числа num, которые делятся на i без остатка. Или я совсем забыл, но предполагаю, что дело в операторе "&" в этом месте "(i <= num / 2) & (j >= 2)". Именно благодаря оператору & выбирается только один ответ?

Я прав или нет? Если нет, объясните как это работает, пожалуйста. Заранее премного благодарен )
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2012, 22:29
Ответы с готовыми решениями:

Операции с числами: объясните принцип работы кода
Доброй ночи. Можете человеческим языком объяснить, как работает эта программа? using System;...

Цикл while, объясните принцип работы кода
Добрый день. Никак не могу понять как работает цикл while, чисто из принципа хочу разобраться. Это...

Объясните принцип работы кода
uses crt; function Armstrong(n:longint):boolean; var t,m,p,s,i,j:integer; a,b:arrayof...

Объясните принцип работы кода
#include &lt;string.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; int main()...

6
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
07.05.2012, 22:37 2
Цитата Сообщение от Farington Посмотреть сообщение
зачем нужны переменные smallest и largest, и зачем им присваивается именно 1, если поменять на 0
В них хранятся наименьший и наибольший множители числа. Как вы собираетесь получить 100 умножив на 0? Поэтому начинаем с 1

Цитата Сообщение от Farington Посмотреть сообщение
И вопрос по самому циклу, почему в итоге получается только два ответа? Ведь по условию (num % i) == 0) должны выводиться все числа num, которые делятся на i без остатка
Выводятся результаты не проверкой условия, а методом Console.WriteLine(). Бесспорно, многие числа соответствуют (num % i) == 0, но в каждом цикле переменным smallest и largest присваивается новое значение:

C#
1
2
3
smallest = i;
// ...
largest = j;
0
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 14
07.05.2012, 23:34  [ТС] 3
Вы немного не поняли моего первого вопроса, я хотел спросить какую роль играют эти присваивания (smallest == 1) и (largest == 1) в инструкции цикла? Ведь если их оттуда убрать, большой потери не будет.

Цитата Сообщение от tezaurismosis Посмотреть сообщение
Выводятся результаты не проверкой условия, а методом Console.WriteLine(). Бесспорно, многие числа соответствуют (num % i) == 0, но в каждом цикле переменным smallest и largest присваивается новое значение:
Я так и не понял, почему выводятся только два ответа. Можете показать строку кода, которая блокирует вывод всех остальных четных чисел? Я прошу как полному нубу объяснить это, не въехал пока что-то...
0
29 / 31 / 2
Регистрация: 14.04.2012
Сообщений: 152
07.05.2012, 23:46 4
циклический оператор for распространяется только на пространство от {},а Console.WriteLine() не входят в область действия оператора for.
Вот так бы выводилось так,как хочешь ты:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
class Comma
{
    public static void Main()
    {
        int i, j;
        int smallest, largest;
        int num;
        num = 100;
        smallest = largest = 1;
        for (i = 2, j = num / 2; (i <= num / 2) & (j >= 2); i++, j--)
        {
            if ((smallest == 1) & (num % i) == 0)
                smallest = i;
            if ((largest == 1) & (num % j) == 0)
                largest = j;
 Console.WriteLine("Наибольший множитель: " + largest);
  Console.WriteLine("Наименьший множитель: " + smallest);//чувствуешь разницу?
        }
          // Console.WriteLine("Наибольший множитель: " + largest);
          // Console.WriteLine("Наименьший множитель: " + smallest);
        
    }
}
А то,что операторам smallest и largest присваивается 1-принципиально,т.к математически они делители,а на ноль делить нельзя,конечно ставь любое другое значение,суть не изменится.
1
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 14
07.05.2012, 23:54  [ТС] 5
Да, теперь стало намного яснее, что-то я совсем снубил. Но опять же снова вопрос, я так сделал, чтобы посмотреть, но ответ там такой:

Наибольший множитель: 50
Наименьший множитель: 2
Наибольший множитель: 50
Наименьший множитель: 2
Наибольший множитель: 50
Наименьший множитель: 2
Наибольший множитель: 50
Наименьший множитель: 2
Наибольший множитель: 50
Наименьший множитель: 2
Наибольший множитель: 50
Наименьший множитель: 2
Наибольший множитель: 50
Наименьший множитель: 2
...


Почему он другие числа в расчет не берет, где загвоздка? Вот что мне интересно здесь )
0
29 / 31 / 2
Регистрация: 14.04.2012
Сообщений: 152
08.05.2012, 00:00 6
C#
1
2
3
4
5
6
for (i = 2, j = num / 2; (i <= num / 2) & (j >= 2); i++, j--) //пусть  i=5,а j = 47 ;операция даст результат true=> идём вниз.
        {
            if ((smallest == 1) & (num % i) == 0) //100 % 5 = 0 -true
                smallest = i;
            if ((largest == 1) & (num % j) == 0) //100 от 47 [S]=[/S] 0 -false
                largest = j;//в результате false=>начать заного
Таким образом только при значениях 50 и 2 выражения дадут результат true
//я конечно и сам непрофессионал,читаю только Шилдта,но не зацикливаюсь так конкретно на таких примерах,иди дальше,и как-то само начинает всё получаться
1
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
08.05.2012, 14:39 7
Цитата Сообщение от Farington Посмотреть сообщение
Почему он другие числа в расчет не берет, где загвоздка?
Этот метод ищет наименьший и наибольший множители числа (2*50=100), а не все подряд. Поставьте num = 300, например, будут другие числа. Чтобы лучше понять, как это работает, запустите пошаговую отладку (F11 в студии) и на каждом этапе можно будет увидеть значения всех переменных и выражений
1
08.05.2012, 14:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2012, 14:39
Помогаю со студенческими работами здесь

Объясните принцип работы кода
Доброго дня. Объясните пожалуйста принцип работы кода построчно. public partial class Form1 : Form...

Объясните пожалуйста принцип работы кода
Доброго времени суток, объясните пожалуйста принцип работы кода. Это шифровальщик и дешифровальщик...

Объясните принцип работы части кода для вывода элементов контейнера
Вот, собственно говоря, сам код для вывода элементов контейнера: struct print { char sep;...

Объясните принцип работы
Здравствуйте. При написании программы, которая должна выводить целые числа в интервале от 1 до n, у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru