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

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

13.01.2012, 21:15. Показов 9046. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru