Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
1

Какую функцию выполняет "%" в си

21.10.2012, 18:33. Показов 7891. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть такие строки в коде... в целом все понятно, но не пойму что делается display % 10000 / 1000 здесь...
C
1
2
volatile int display = 0;
PORTD = ~(SEGMENTE[display % 10000 / 1000])
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2012, 18:33
Ответы с готовыми решениями:

Какую функцию выполняет строчка в коде
Что делает первая строчка в While - " reverse = reverse * 10;" Если reverse = 0 , а оно еще потом...

Какую функцию выполняет switch?
какую функцию,выполняет switch?скажем есть switch(10); case 1: case 2: ... break; эта цифра...

Какую функцию выполняет оператор %
Согласно МСДН, оператор % возвращает остаток от деления 2-х чисел. Например, 5%2 = 1 ; 78%33 = 12...

Какую функцию выполняет оператор **
Наткнулся на оператор ** в статье про арифметические операции. Вот что там написано: To...

Какую функцию выполняет код
Есть код. Не могу разобраться, что он делает. Можете прокоментировать пару строчек данного кода?...

20
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
21.10.2012, 18:36 2
Деление с остатком
1
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
21.10.2012, 18:48  [ТС] 3
правильно ли я понял? делим display на 10000, а потом остаток от деления делим еще на 1000?
0
6287 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
21.10.2012, 18:59 4
Да (пять символов)
0
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
21.10.2012, 19:06  [ТС] 5
а почему именно пять символов?
0
Заблокирован
21.10.2012, 19:08 6
Цитата Сообщение от Санек25 Посмотреть сообщение
SEGMENTE[display % 10000 / 1000]
что за былокод? константы принято оформлять с помощью директивы define.
1
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
21.10.2012, 19:10  [ТС] 7
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
01.// Использование АЦП. Цифровой вольтметр
02. 
03.#include <avr/io.h>
04.#include <avr/interrupt.h>
05.#include <util/delay.h>
06. 
07.//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9----dp
08.char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80};
09. 
10.volatile unsigned char segcounter = 0;
11.volatile int display = 0;
12. 
13.// Прерывание по переполнению T2, динамическая индикация
14.ISR (TIMER2_OVF_vect)
15.{   
16.PORTD = 0xFF;
17.PORTB = (1 << segcounter);
18. 
19.switch (segcounter)
20.{   
21.case 0:
22.PORTD = ~(SEGMENTE[display % 10000 / 1000]);
23.break;
24.case 1:
25.PORTD = ~((SEGMENTE[display % 1000 / 100])|0x80); // добавляем десятичную точку
26.break;   
27.case 2:
28.PORTD = ~(SEGMENTE[display % 100 / 10]);
29.break;       
30.}
31.if ((segcounter++) > 2) segcounter = 0;   
32.}
33. 
34.volatile unsigned long value;
35.volatile unsigned int adc_counter;
36. 
37.// Прерывание по окончанию преобразования АЦП
38.ISR (ADC_vect)
39.{
40.value = value + (ADC*11/4);
41.adc_counter++;
42.}
43. 
44.// Главная функция
45.int main (void)
46.{
47.DDRD = 0xFF;
48.DDRB = (1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3);
49.PORTD = 0x00;
50.PORTB = 0x00;
51.DDRC = 0x00;  
52. 
53.TIMSK |= (1 << TOIE2); // разрешение прерывания по таймеру2
54.TCCR2 |= (1 << CS21);  //предделитель на 8
55. 
56.ADCSRA = (1 << ADEN) // разрешение АЦП
57.|(1 << ADSC) // запуск преобразования
58.|(1 << ADFR) // непрерывный режим работы АЦП
59.|(1 << ADPS2)|(1 << ADPS1)|(0 << ADPS0) // предделитель на 64 (частота АЦП 125kHz)
60.|(1 << ADIE); // разрешение прерывания
61. 
62.ADMUX = (1 << REFS1)|(1 << REFS0) // внутренний ИОН 2,56V
63.|(0 << MUX3)|(0 << MUX2)|(0 << MUX1)|(0 << MUX0); // вход ADC0
64. 
65._delay_ms(50);
66. 
67.sei(); //глобально разрешаем прерывания
68. 
69.while(1)
70.{
71.if (adc_counter > 300) // вычисляем среднее значение АЦП
72.{
73.display = value/adc_counter;
74.adc_counter = 0;
75.value = 0;
76.}    
77._delay_ms(50);
78.}
79.}
код для МК взят из статьи, вот мучаю его.
0
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.10.2012, 19:26 8
Я избегаю макросов. И вам советую: глобальные переменные ещё ладно. Но глобальные константы - это перебор. А макросы локальностью не страдают. Исключения - системные и общепринятые константы, они должны быть именно глобальными.
0
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
21.10.2012, 19:33  [ТС] 9
Цитата Сообщение от taras atavin Посмотреть сообщение
Я избегаю макросов. И вам советую: глобальные переменные ещё ладно. Но глобальные константы - это перебор. А макросы локальностью не страдают. Исключения - системные и общепринятые константы, они должны быть именно глобальными.
Говорю же код не мой...Собрал прибор, хотел откалибровать , но есть проблема как показания доходят до 13в ,то все сбрасывается и начинается отсчет как от 0 вольт.вот и думаю что в прошивке ошибка. Сам до этого поменял коэффициент (строка 40) так как изначально было расчитано на 25в , а мне надо на 35в...Хотя за совет спасибо...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.10.2012, 05:48 10
Цитата Сообщение от Санек25 Посмотреть сообщение
правильно ли я понял? делим display на 10000, а потом остаток от деления делим еще на 1000?
например, число 123456789
берём остаток от деления на 10000, получается 6789
делим 6789 на 1000, получается 6
всё вместе - взятие четвёртой цифры справа

Цитата Сообщение от Санек25 Посмотреть сообщение
Сам до этого поменял коэффициент (строка 40)
а что там было ?
может из-за дроби
C
1
11.0 / 4.0
1
12 / 12 / 6
Регистрация: 03.10.2012
Сообщений: 83
22.10.2012, 08:40 11
модуль двух чисел
0
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
22.10.2012, 09:19  [ТС] 12
Цитата Сообщение от accept Посмотреть сообщение

а что там было ?
может из-за дроби
C
1
11.0 / 4.0
там было 11.0 / 4.0, а стало 171/50. Дробь нужна для ускорения работы МК. Если написать не 171/50 , а 3,42 то МК подвисает...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.10.2012, 09:42 13
Цитата Сообщение от Санек25 Посмотреть сообщение
Если написать не 171/50 , а 3,42 то МК подвисает...
напиши 3.42, а если дробь, то должно быть 171.0 / 50.0
0
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
22.10.2012, 10:27  [ТС] 14
Цитата Сообщение от accept Посмотреть сообщение
напиши 3.42, а если дробь, то должно быть 171.0 / 50.0
хорошо вечером попробую с нулями , хотя и без них работает. А 3,42 я уже пробовал зависает МК слишком много памяти расходуется на решение с дробным числом. Но думаю не в этом проблема... более подробно я расписал здесь https://www.cyberforum.ru/elec... page2.html последний пост...

Не по теме:

т.к для операции умножения на дробное число микроконтроллеру потребуется много памяти, существует способ представить число 2,75 по другому, например: (ADC*11)/4

0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.10.2012, 10:29 15
Цитата Сообщение от Санек25 Посмотреть сообщение
хотя и без них работает
при целочисленном делении отбрасывается дробная часть

Цитата Сообщение от Санек25 Посмотреть сообщение
А 3,42 я уже пробовал
не надо пробовать 3,42 - это совсем другая запись
1
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
22.10.2012, 10:34  [ТС] 16
Цитата Сообщение от accept Посмотреть сообщение
при целочисленном делении отбрасывается дробная часть
не знал....Вечером попробую....

Цитата Сообщение от accept Посмотреть сообщение
не надо пробовать 3,42 - это совсем другая запись
я делал с точкой.А что эта запись значит?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.10.2012, 10:37 17
3,42 означает "операция запятая"

C
1
value = value + (ADC*3,42);
значение в скобках преобразуется в 42, так как это правый операнд "операции запятая"
C
1
value = value + 42;
1
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
22.10.2012, 10:46  [ТС] 18
Цитата Сообщение от accept Посмотреть сообщение
при целочисленном делении отбрасывается дробная часть
хорошо считаем без дроби

напряжение 1в

adc=1024*1/2,56=400

display=400*3=1200

дальше по этой формуле

Не по теме:

(SEGMENTE[display % 10000 / 1000]);



(SEGMENTE[1200 % 10000 / 1000])

1200/10000=0.1200
1200/1000=1


Индикация все равно должна быть
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.10.2012, 02:52 19
Цитата Сообщение от Санек25 Посмотреть сообщение
1200/1000=1
дальше берётся значение из массива 0x06
1
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
23.10.2012, 08:16  [ТС] 20
accept, Спасибо за совет я код в принципе понимаю (немного программирую на делфи)...Дело было в другом я пожертвовал сотой частью своего коэффициента и у меня получилось что я могу его представить в виде 17/5 (3.4) вместо 171/50 (3,42) и все заработало.Видимо МК не хватало памяти и он сбрасывался....Кстати

Не по теме:

напиши 3.42, а если дробь, то должно быть 171.0 / 50.0

так МК сильно притормаживал. Видимо для Мк синтаксис немного отличается от классического СИ...
0
23.10.2012, 08:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2012, 08:16
Помогаю со студенческими работами здесь

Какую функцию выполняет typeid?
template&lt;class T&gt; void Menu::showList(queue&lt;T&gt;&amp; l) { Smart a; Electro c; while (true) {...

Какую функцию выполняет 45p03-15 datasheet
Тут проблема такая на материнской плате ноутбука на отдельной плате где заходит питание есть...

Какую функцию выполняет приведенный код
помогите кто знает что эта за функция... #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include...

Какую функцию выполняет каждая строка?
Не поможете пожалуйста объяснить, какую функцию выполняет каждая строка, пожалуйста! var I,T,R:...

Какую функцию выполняет компонент TrayIcon?
Здравствуйте! Может кто-нибудь работал в C++Builderе с компонентом TrayIcon? Подскажите, какую...


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

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