Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
#1

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

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

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

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

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

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

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

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

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

14
soon
2542 / 1307 / 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?
1
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:33  [ТС] #3
сорри забыл исправить там не s, там j,
а результаты правильные?
0
DU
1484 / 1130 / 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
1
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 21:36  [ТС] #5
И вообще что фрагмент делает?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 21:38 #6
Цитата Сообщение от bacekk Посмотреть сообщение
И вообще что фрагмент делает?
Определенно ничего полезного.
1
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; }
заранее спаибо
0
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.
0
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
13.01.2012, 22:05  [ТС] #9
Mockingbird,
Цитата Сообщение от soon Посмотреть сообщение
Эквивалентно if(j % 2)
это тоже правильно?
0
soon
2542 / 1307 / 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 будет определена. Или определять в данной программе. Но т.к. она нигде не используется(в контексте данной программы), я полагаю, эту строку можно выкинуть.
1
Mockingbird
8 / 8 / 1
Регистрация: 13.01.2012
Сообщений: 19
13.01.2012, 22:11 #11
Цитата Сообщение от bacekk Посмотреть сообщение
это тоже правильно?
Это операция взятия остатка от деления на 2, то есть да, та же проверка на четность.
1
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)
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.01.2012, 22:45 #13
Цитата Сообщение от bacekk Посмотреть сообщение
это разве правильным может быть?
Вполне. Если не верите, можете в цикле выводить *p
Цитата Сообщение от bacekk Посмотреть сообщение
и как понять while (*p)
Пока разыменованный указатель отличен от нуля.
1
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, когда речь идет о массиве?
Объясните начинающему программисту..
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.01.2012, 05:41 #15
можно ли выводить указатель
Разумеется.
почему он (*p) равен 1, когда речь идет о массиве?
Ему присвоили адрес первого элемента массива. Условие выполнения массива - (*p - i). Т.к. первый элемент массива равен единице, то цикл прервется, когда i станет равной 1, т.е. на второй итерации.
1
14.01.2012, 05:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2012, 05:41
Привет! Вот еще темы с ответами:

Что будет выведено после выполнения следующего фрагмента программы: - C++
int main() { int a = 3; int b = 4; int c = 5; int &amp;d = b; a = b = c; cout &lt;&lt; a &lt;&lt; b &lt;&lt; c &lt;&lt; d &lt;&lt;...

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

Чему будет равно a после выполнения следующего фрагмента программы в строке // 1 ? - C++
Чему будет равно a после выполнения следующего фрагмента программы в строке // 1 ? int a = 0; for (;;) { if (a) break; a--; ...

Чему будет равна переменная после выполнения следующего фрагмента программы? - C++
Пожалуйста, очень прошу помогите с тестами(( 2)Чему равна переменная m при p = 32 и p1 = 9 после выполнения следующего фрагмента...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru