Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:15     значения перемнных после выполнения фрагмента кода #1
Доброго времени суток! Не можете подсказать как понять одну строчку в задании:
Определить значения переменных после выполнения приведенного фрагмента программы
Код
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) и как работает этот цикл вообще?

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

Код
#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
Подскажите пожалуйста правильные ли это значения переменных и вообще что делает фрагмент кода?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2012, 21:15     значения перемнных после выполнения фрагмента кода
Посмотрите здесь:

Что будет выведено на экран в результате выполнения приведенного фрагмента кода? C++
C++ Чему будет равно a после выполнения следующего фрагмента программы в строке // 1 ?
C++ Что будет выведено после выполнения следующего фрагмента программы:
Чему будет равно значение переменной z после выполнения следующего фрагмента программы? C++
Чему будет равна переменная после выполнения следующего фрагмента программы? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 21:23     значения перемнных после выполнения фрагмента кода #2
Цитата Сообщение от bacekk Посмотреть сообщение
if(j&1)
Эквивалентно if(j % 2)

Добавлено через 2 минуты
Цитата Сообщение от bacekk Посмотреть сообщение
printf("s=%d\n", s);
Откуда s?
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:33  [ТС]     значения перемнных после выполнения фрагмента кода #3
сорри забыл исправить там не s, там j,
а результаты правильные?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.01.2012, 21:35     значения перемнных после выполнения фрагмента кода #4
это ахтунг конечно а не код.
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
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:36  [ТС]     значения перемнных после выполнения фрагмента кода #5
И вообще что фрагмент делает?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 21:38     значения перемнных после выполнения фрагмента кода #6
Цитата Сообщение от bacekk Посмотреть сообщение
И вообще что фрагмент делает?
Определенно ничего полезного.
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:49  [ТС]     значения перемнных после выполнения фрагмента кода #7
эти фрагменты написал наш препод для экзамена, говорит, что работает в Майкрософте))
есть еще пара вопросиков, по другому заданию правда:
Код
#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; }
заранее спаибо
Mockingbird
8 / 8 / 1
Регистрация: 13.01.2012
Сообщений: 19
13.01.2012, 21:49     значения перемнных после выполнения фрагмента кода #8
Цитата Сообщение от bacekk Посмотреть сообщение
что означает if(j&1)
& в данном случае это поразрядная операция И. Рассмотрим пример 141 & 125. 141 в двоичной это 10001101, а 125 1111101. Если соответствующие разряды одинаковые, то имеем 1. В противном случае 0. В нашем примере (141 & 125) = 00001111. В Вашем случае это проверка числа на чётность. Если в двоичной записи числа последняя 1, значит оно нечётно. Таким образом, если а - целое, то ((2*а)&1)=0, а ((2*a+1)&1)=1.
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 22:05  [ТС]     значения перемнных после выполнения фрагмента кода #9
Mockingbird,
Цитата Сообщение от soon Посмотреть сообщение
Эквивалентно if(j % 2)
это тоже правильно?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 22:09     значения перемнных после выполнения фрагмента кода #10
Цитата Сообщение от bacekk Посмотреть сообщение
это тоже правильно?
Ага, на слово уже не верите?
Цитата Сообщение от bacekk Посмотреть сообщение
и вообще что означает символ: "<<=" в строчке { mas++; *p <<= 1; }
Побитовый сдвиг влево. Позиции справа заполнятся нулями.
Цитата Сообщение от bacekk Посмотреть сообщение
6: error: `UCHAR_MAX' undeclared (first use this function)
Значит нужен хедер, в котором UCHAR_MAX будет определена. Или определять в данной программе. Но т.к. она нигде не используется(в контексте данной программы), я полагаю, эту строку можно выкинуть.
Mockingbird
8 / 8 / 1
Регистрация: 13.01.2012
Сообщений: 19
13.01.2012, 22:11     значения перемнных после выполнения фрагмента кода #11
Цитата Сообщение от bacekk Посмотреть сообщение
это тоже правильно?
Это операция взятия остатка от деления на 2, то есть да, та же проверка на четность.
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 22:39  [ТС]     значения перемнных после выполнения фрагмента кода #12
soon,
Цитата Сообщение от soon Посмотреть сообщение
Сообщение от bacekk
и вообще что означает символ: "<<=" в строчке { mas++; *p <<= 1; }
Побитовый сдвиг влево. Позиции справа заполнятся нулями.
вот у меня такой ответ:
mas=5 *p=0
b[10]= {1,3,5,7,9,2,4,6,0,0}
это разве правильным может быть? и как понять while (*p)
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 22:45     значения перемнных после выполнения фрагмента кода #13
Цитата Сообщение от bacekk Посмотреть сообщение
это разве правильным может быть?
Вполне. Если не верите, можете в цикле выводить *p
Цитата Сообщение от bacekk Посмотреть сообщение
и как понять while (*p)
Пока разыменованный указатель отличен от нуля.
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
14.01.2012, 02:36  [ТС]     значения перемнных после выполнения фрагмента кода #14
И последний вопрос, задание то же, значения переменных после выполнения фрагмента кода:
Код
#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, когда речь идет о массиве?
Объясните начинающему программисту..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2012, 05:41     значения перемнных после выполнения фрагмента кода
Еще ссылки по теме:

Что будет находится в переменных a и b после выполнения следующего фрагмента C++
C++ Какие значения будут у ячеек массива после выполнения следующего кода?
Время выполнения фрагмента кода C++

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.01.2012, 05:41     значения перемнных после выполнения фрагмента кода #15
можно ли выводить указатель
Разумеется.
почему он (*p) равен 1, когда речь идет о массиве?
Ему присвоили адрес первого элемента массива. Условие выполнения массива - (*p - i). Т.к. первый элемент массива равен единице, то цикл прервется, когда i станет равной 1, т.е. на второй итерации.
Yandex
Объявления
14.01.2012, 05:41     значения перемнных после выполнения фрагмента кода
Ответ Создать тему
Опции темы

Текущее время: 23:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru