2017-01-17 3 views
1

Я пытаюсь воссоздать свою программу на языке C++ несколько лет назад на своем новом языке C#. Все, что я мог вспомнить, это то, что это возможно связано с модулем, и, возможно, нет. Я знал, что в нем задействовано хотя бы одно заявление за и если. Однако, когда я начал пытаться воссоздать его, я не получал ничего близкого к тому, что должно быть. Я думал, что это связано с тем, что я не понимаю петли, но, оказывается, я прекрасно понимаю петли. Я не понимаю, как использовать modulo при выполнении математических операций.Мне нужна помощь в понимании оператора modulo

, например, что я делаю, когда я говорю что-то вроде:

(игнорировать, что она не может реально работать, это просто пример)

if(12 % 2 == 0) 
{ 
    Console.WriteLine("I don't understand."); 
} 

Такого рода вещи я не совсем все еще есть. Я понимаю, что он берет остаток, и это все, что я могу понять, а не как он фактически используется в реальном программировании. Мне удалось заставить свою программу-фактор работать на C# после немного размышлений и возиться, это опять же не означает, что я понимаю этого оператора или его использование. У меня больше нет доступа к старому файлу C++.

+0

Что касается того, как он используется в «реальном программировании», вот еще один пример - предположим, что у вас есть время в секундах, и вам нужно преобразовать его в минуты и секунды. , , , – peterG

ответ

3

Оператор% (modulo) дает остаток от деления. В вашем примере остаток равен 0 и , если оценивается как true (0 == 0). Классический пример - это когда он используется для определения того, является ли число четным или нет.

if (number % 2 == 0) { 
    // even 
} else { 
    // odd 
} 
1

Оператор modulo % возвращает оставшуюся часть операции деления. Например, где 13/5 = 2, 13 % 5 = 3 (с использованием целочисленной математики).

Это обычная тактика, чтобы проверить значение против % 2, чтобы узнать, равномерное. Если четно, то остаток будет 0, в противном случае он будет равен 1.

Что касается вашего конкретного использования этого, вы делаете 12 % 2, которые не только 0, но всегда быть 0. Это будет всегда сделайте условие if 12 % 2 == 0 true, что делает его избыточным.

2

Думайте о модуле, как о круге с указателем (прядильщик), самым простым примером являются часы.

https://latex.artofproblemsolving.com/f/4/d/f4daa2601de14fddf3d8441e16cc322a25e85354.png

Обратите внимание, как в верхней части она равна нулю.

Функция modulo отображает любое значение на одно из этих значений на счетчике, подумайте о значении слева от % как о числе шагов вокруг счетчика, а второе значение - о количестве общих шагов в spinner, так что у нас есть следующее.

0% 0 = 12

1% 12 = 1

12% 12 = 0

13% 12 = 1

Мы всегда начинается с 0.

Итак, если мы пройдем 0 шагов по 12-ти шагу, мы все равно на 0, если мы идем на 1 шаг с нуля, мы находимся на 1, если мы пройдем 12 шагов, мы вернемся к 0. Если мы идем 13, мы идем все вокруг и заканчивается на 1 снова.

Надеюсь, это поможет вам визуализировать его.

Это помогает, когда вы используете структуры, подобные массиву, и вы хотите их перебирать. Представьте, что у вас есть массив дней недели, 7 элементов (по воскресеньям). Вы хотите всегда отображать день 3 дня с текущего дня. хорошо Сегодня вторник, поэтому элемент массива days[1], если мы хотим получить день через 3 дня, мы делаем days[1+3];, теперь все в порядке, но что, если мы находимся в субботу (days[5]) и хотим получить 3 дня оттуда? ну, мы имеем days[5+3], который является ошибкой индекса за пределами границ, так как наш массив имеет только 7 элементов (максимальный индекс 6), и мы попытались получить доступ к 8-му элементу.

Однако, зная, что вы знаете о модуло и блесны теперь вы можете сделать следующее:

string threeDaysFromNow = days[(currentDay + 3)%7]; Когда он идет за пределы массива, он оборачивается вокруг и начинается все сначала. Для этого есть много приложений. Просто помните визуализацию прядильщиков, то есть когда он щелкнул в моей голове.

1

Как уже упоминалось, он обычно используется для проверки четности/нечетности, но также может использовать его для чередования циклов с интервалами или разделения файлов на куски мод. Я лично использую модем для проблем с типами часов, так как мои данные часто перемещаются по кругу.

регистр в модах, например, 8-битовый регистр переворачивается в 2^8 так, чтобы можно заставить соблюдение в размер регистра переменный = моды (вар, 256)

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

-1

Пример, где вы могли бы использовать это в индексах массивов в определенных циклах for. Например, возьмут простое уравнение, определяющее новое значение пикселя изображения, используя повторно создается бикубические интерполяции:

где

Не переживайте, что бикубическое именно на данный момент, мы просто заинтересованные о том, что кажется двумя простыми петлями for: один для индекса i и один для индекса j. Заметим, что вектор 'a' имеет длину 16 чисел.

Простой for цикл кто-то попытается может быть:

int n= 0; 
for(int i = 0; i < 4; ++i) 
{ 

    for(int j = 0; i < 4; ++j) 
    { 
    pxy += a[n] * pow(x,i) * pow(y,j); // p(x,y) 
    n++; // n = 15 when finished 
    } 

} 

Или вы могли бы сделать это в одном for цикле:

for(int i = 0; i < 16; ++i) 
{ 
    int i_new = floor(i/4.0); // i_new provides indices 0-3 incrementing every 4 iterations of loop  
    int j_new = i % 4;   // j_new is reset to 0 when i is a multiple of 4  
    pxy += a[i] * pow(x,i_new) * pow(y,j_new); // p(x,y) 
} 

печати i_new и j_new в петле:

i_new j_new 
0  0 
0  1 
0  2 
0  3 

1  0 
1  1 
1  2 
1  3 

2  0 
2  1 
2  2 
2  3 

3  0 
3  1 
3  2 
3  3 

Как видите, % может быть очень полезным.

+0

Это не ответ на вопрос –

+0

После повторного чтения вопроса вы правы. Я был вовлечен в пример. – Envidia

Смежные вопросы