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

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

13.01.2012, 21:15. Показов 9106. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru