Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/47: Рейтинг темы: голосов - 47, средняя оценка - 4.77
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89

Значения переменных после выполнения фрагмента кода

13.01.2012, 21:15. Показов 9170. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Не можете подсказать как понять одну строчку в задании:
Определить значения переменных после выполнения приведенного фрагмента программы
C++
1
2
3
4
5
6
7
8
9
int i, j, mas[10] = {0};
 
    for(i=0, j=9; j=(i<10); --j, i++)
    {
        if(j&1)
            mas[j] = i+1;
        else
            mas[j] = -i;
    }
что означает if(j&1) и как работает этот цикл вообще?

Вот запустил я этот фрагмент:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <conio.h>
main()
{
int i, j, mas[10] = {0};
 
    for(i=0, j=9; j=(i<10); --j, i++)
    {
        if(j&1)
            mas[j] = i+1;
        else
            mas[j] = -i;
    
printf("%d\n", mas[i]);
     }
printf("i=%d\n", i);
printf("s=%d\n", s);
getch();
}
Вот что он мне написал
массив {0,2,0,0,0,0,0,0,0,0}
i=10
j=0
Подскажите пожалуйста правильные ли это значения переменных и вообще что делает фрагмент кода?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2012, 21:15
Ответы с готовыми решениями:

Вычислить значения переменных после выполнения указанного кода
Вычислить значения переменных после выполнения фрагмента программы N=9 Объяснить работу программы.Изменится ли массива после...

Найти значения переменных после выполнения заданного кода
Дан следующий код: int a, b, c; a = b = 2; c = 1; a -= (++b - c); b += a++; a -= --c; b += b + c; Написать значения всех...

Что будет находится в переменных a и b после выполнения следующего фрагмента
Что будет находится в переменных a и b после выполнения следующего фрагмента программы: int a=5, b=2; a*=a-b++;

14
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 21:23
Цитата Сообщение от bacekk Посмотреть сообщение
if(j&1)
Эквивалентно if(j % 2)

Добавлено через 2 минуты
Цитата Сообщение от bacekk Посмотреть сообщение
printf("s=%d\n", s);
Откуда s?
1
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:33  [ТС]
сорри забыл исправить там не s, там j,
а результаты правильные?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
13.01.2012, 21:35
это ахтунг конечно а не код.
C++
1
j=(i<10)
тип выражения i < 10 бул, но результат выражения присваивается инту. поэтому бул в инт преобразуется (в 0 для false и в 1 для true). поэтому в теле цикла значение переменной j всегда будет равно 1. как только значение станет равным 0, цnкл прерывается. поэтому для j печатается 0. а цикл прерывается когда i < 10 == false, т.е. когда i будет равно 10. поэтому для iпечатается 10.

C++
1
2
3
4
5
if(j&1)
  mas[j] = i+1;
else
 mas[j] = -i;
printf("%d\n", mas[i]);
т.к. j тут всегда 1 в else никогда не попадаем. поэтому всегда изменяется элемент массива с индексом 1 (т.е. второй от начала.) но печатается всегда итый элемент. все элементы массива проинициализированы нулем.
сперва печатается элемент с индексом 0 (он равено нулю, потому что поменялся только второй элемент)
на второй итерации в элемент массива с индексом 1 записывается двойка (т.к. i = 1, а 1 + 1 = 2)
на третей итерации в элемент массива с индексом 1 записывается тройка, но после этого печатается элемент с индексом 2, который равен нулю. ну и так далее.
вот и получается что печатается
0 2 0 0 0 0 0 0 0 0
10
0
1
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:36  [ТС]
И вообще что фрагмент делает?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 21:38
Цитата Сообщение от bacekk Посмотреть сообщение
И вообще что фрагмент делает?
Определенно ничего полезного.
1
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:49  [ТС]
эти фрагменты написал наш препод для экзамена, говорит, что работает в Майкрософте))
есть еще пара вопросиков, по другому заданию правда:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <conio.h>
#include <float.h>
main()
{
      UCHAR_MAX = 255
      int mas;
      char b[10] = {1,3,5,7,9,2,4,6,8,0};
      char *p = b+8;
      mas = 0;
          while(*p)
                   { mas++; *p <<= 1; }
        printf("%d\n", mas);
printf("i=%s\n", b);
printf("j=%d\n", *p);
getch();
}
Вот я другой фрагмент запустил, не компилиться, пишет:
In function `int main()':
6: error: `UCHAR_MAX' undeclared (first use this function)
6: error: (Each undeclared identifier is reported only once for each function it appears in.)
7: error: expected `;' before "int"
11: error: `mas' undeclared (first use this function)

и вообще что означает символ: "<<=" в строчке { mas++; *p <<= 1; }
заранее спаибо
0
8 / 8 / 0
Регистрация: 13.01.2012
Сообщений: 19
13.01.2012, 21:49
Цитата Сообщение от bacekk Посмотреть сообщение
что означает if(j&1)
& в данном случае это поразрядная операция И. Рассмотрим пример 141 & 125. 141 в двоичной это 10001101, а 125 1111101. Если соответствующие разряды одинаковые, то имеем 1. В противном случае 0. В нашем примере (141 & 125) = 00001111. В Вашем случае это проверка числа на чётность. Если в двоичной записи числа последняя 1, значит оно нечётно. Таким образом, если а - целое, то ((2*а)&1)=0, а ((2*a+1)&1)=1.
0
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 22:05  [ТС]
Mockingbird,
Цитата Сообщение от soon Посмотреть сообщение
Эквивалентно if(j % 2)
это тоже правильно?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 22:09
Цитата Сообщение от bacekk Посмотреть сообщение
это тоже правильно?
Ага, на слово уже не верите?
Цитата Сообщение от bacekk Посмотреть сообщение
и вообще что означает символ: "<<=" в строчке { mas++; *p <<= 1; }
Побитовый сдвиг влево. Позиции справа заполнятся нулями.
Цитата Сообщение от bacekk Посмотреть сообщение
6: error: `UCHAR_MAX' undeclared (first use this function)
Значит нужен хедер, в котором UCHAR_MAX будет определена. Или определять в данной программе. Но т.к. она нигде не используется(в контексте данной программы), я полагаю, эту строку можно выкинуть.
1
8 / 8 / 0
Регистрация: 13.01.2012
Сообщений: 19
13.01.2012, 22:11
Цитата Сообщение от bacekk Посмотреть сообщение
это тоже правильно?
Это операция взятия остатка от деления на 2, то есть да, та же проверка на четность.
1
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 22:39  [ТС]
soon,
Цитата Сообщение от soon Посмотреть сообщение
Сообщение от bacekk
и вообще что означает символ: "<<=" в строчке { mas++; *p <<= 1; }
Побитовый сдвиг влево. Позиции справа заполнятся нулями.
вот у меня такой ответ:
mas=5 *p=0
b[10]= {1,3,5,7,9,2,4,6,0,0}
это разве правильным может быть? и как понять while (*p)
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 22:45
Цитата Сообщение от bacekk Посмотреть сообщение
это разве правильным может быть?
Вполне. Если не верите, можете в цикле выводить *p
Цитата Сообщение от bacekk Посмотреть сообщение
и как понять while (*p)
Пока разыменованный указатель отличен от нуля.
1
3 / 3 / 0
Регистрация: 30.11.2010
Сообщений: 89
14.01.2012, 02:36  [ТС]
И последний вопрос, задание то же, значения переменных после выполнения фрагмента кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <conio.h>
#include <float.h>
main()
{
      
      int mas[] = {1,2,3,4,5,5,4,3,2,1,0};
int i, j = 0, *p = mas;
 
    for(i=0; i<11 && (*p-i); i++)
    {
        j += i;
        printf("%d\n", *p);
    }
printf("i=%d\n", i);
printf("j=%d\n", j);
getch();
}
Вот такие получились значения:
i=1 j=0 *p=1
можно ли выводить указатель и почему он (*p) равен 1, когда речь идет о массиве?
Объясните начинающему программисту..
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.01.2012, 05:41
можно ли выводить указатель
Разумеется.
почему он (*p) равен 1, когда речь идет о массиве?
Ему присвоили адрес первого элемента массива. Условие выполнения массива - (*p - i). Т.к. первый элемент массива равен единице, то цикл прервется, когда i станет равной 1, т.е. на второй итерации.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2012, 05:41
Помогаю со студенческими работами здесь

Время выполнения фрагмента кода
Как измерить время выполнения алгоритма? В темах читал про clock() , сделал, но на выводе всегда 0

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

Каким будет результат выполнения фрагмента кода?
int main(int argc, char* argv) { char c; cout &lt;&lt;&quot;input num\n&quot;; cin &gt;&gt;c; switch (c) { case 'A': ...

Что выведется на экран в результате выполнения фрагмента кода?
Помогите пожалуйста, сделать 5 небольших задач , спасибо всем кто откликнется! 1.Что выведется на экран в результате выполнения...

Что будет выведено на экран в результате выполнения приведенного фрагмента кода?
Что будет выведено на экран в результате выполнения приведенного фрагмента кода? int n = 1; while (n&lt;=10) { if...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru