В указанное место напишите код который поместит значение из переменной a в переменную x
Перейти к содержимому

В указанное место напишите код который поместит значение из переменной a в переменную x

  • автор:

Переменные, адреса и указатели

Переменная — это область памяти, к которой мы обращаемся за находящимися там данными, используя идентификатор (в данном случае, имя переменной). При этом у этой помеченной именем области есть еще и адрес, выраженный числом и понятный компьютерной системе. Этот адрес можно получить и записать в особую переменную. Переменную, содержащую адрес области памяти, называют указателем.

Когда мы меняем значение обычной переменной, то, можно сказать, просто удаляем из конкретной области памяти данные и записываем туда новые. Когда мы меняем значение переменной-указателя, то начинаем работать с совершенно иным участком памяти, т.к. меняем содержащийся в ней адрес.

Тема указателей тесно связана с темой динамических типов данных. Когда программа компилируется, то под объявленные переменные так или иначе (в зависимости от того, где они были объявлены) выделяются участки памяти. Потом размер этих участков не меняется, может меняться только их содержимое (значения или данные). Однако именно с помощью указателей можно захватывать и освобождать новые участки памяти уже в процессе выполнения программы. Динамические типы данных будут рассмотрены позже.

Прежде чем перейти к рассмотрению объявления и определения переменных-указателей, посмотрим, что из себя представляет адрес любой переменной и как его получить.

int i = 0; printf ("i=%d, &i=%p \n", i, &i);

В результате выполнения данного программного кода на экране появляется примерно следующее (шестнадцатеричное число у вас будет другим):

i=0, &i=0x7fffa40c5fac

Знак амперсанда (&) перед переменной позволяет получить ее адрес в памяти. Для вывода адреса переменной на экран используется специальный формат %p . Адреса обычных переменных (не указателей) в процессе выполнения программы никогда не меняются. В этом можно убедиться:

int a = 6; float b = 10.11; char c = 'k'; printf("%5d - %p\n", a, &a); printf("%5.2f - %p\n", b, &b); printf("%5c - %p\n", c, &c); a = 2; b = 50.99; c = 'z'; printf("%5d - %p\n", a, &a); printf("%5.2f - %p\n", b, &b); printf("%5c - %p\n", c, &c);
6 - 0x7fff653532e0 10.11 - 0x7fff653532e4 k - 0x7fff653532df 2 - 0x7fff653532e0 50.99 - 0x7fff653532e4 z - 0x7fff653532df

Как мы видим, несмотря на то, что значения переменных поменялись, ячейки памяти остались прежними.

Зная адрес, можно получить значение, которое находится по этому адресу, поставив знак * перед адресом:

int a = 8; printf("%d \n", *&a);

На экране будет выведено число 8.

Однако запись типа &a не всегда возможна или удобна. Поэтому существует специальный тип данных — указатели, которым и присваивается адрес на область памяти.

Указатели в языке C, как и другие переменные, являются типизированными, т.е. при объявлении указателя надо указывать его тип. Как мы узнаем позже, с указателями можно выполнять некоторые арифметические операции, и именно точное определение их типа позволяет протекать им корректно. Чтобы объявить указатель, надо перед его именем поставить знак *. Например:

int *pi; float *pf;

Обратите внимание на то, что в данном случае * говорит о том, что объявляется переменная-указатель. Когда * используется перед указателем не при его объявлении, а в выражениях, то обозначает совсем иное — «получить значение (данные) по адресу, который присвоен указателю». Посмотрите на код ниже:

int x = 1, y, z = 3; int *p, *q; p = &x; printf("%d\n", *p); // 1 y = *p; printf("%d\n", y); // 1 *p = 0; printf("%d %d\n", x, y); // 0 1 q = &z; printf("%d\n", *q); // 3 p = q; *p = 4; printf("%d\n", z); // 4 printf("%p %p\n", p, q); // p == q

С помощью комментариев указаны текущие значения ячеек памяти. Подробно опишем, что происходит:

  1. Выделяется память под пять переменных: три типа int и два указателя на int . В ячейки x и z записываются числа 1 и 3 соответственно.
  2. Указателю p присваивается адрес ячейки x. Извлекая оттуда значение ( *p ), получаем 1.
  3. В область памяти, которая названа именем у, помещают значение равное содержимому ячейки, на которую ссылается указатель p. В результате имеем две области памяти (x и y), в которые записаны единицы.
  4. В качестве значения по адресу p записываем 0. Поскольку p указывает на x, то значение xменяется. Переменная p не указывает на y, поэтому там остается прежнее значение.
  5. Указателю q присваивается адрес переменной z. Извлекая оттуда значение ( *q ), получаем 3.
  6. Переменной p присваивается значение, хранимое в q. Это значит, что p начинает ссылаться на тот же участок памяти, что и q. Поскольку q ссылается на z, то и p начинает ссылаться туда же.
  7. В качестве значения по адресу p записываем 4. Т.к. p является указателем на z, следовательно, меняется значение z.
  8. Проверяем, p и q являются указателями на одну и туже ячейку памяти.

Под сам указатель (там, где хранится адрес) также должна быть выделена память. Объем этой памяти можно узнать с помощью функции sizeof() :

int *pi; float *pf; printf("%lu\n", sizeof(pi)); printf("%lu\n", sizeof(pf));

Под указатели всех типов выделяется одинаковый объем памяти, т.к. размер адреса не зависит от типа, а зависит от вычислительной системы. В таком случае, зачем при объявлении указателя следует указывать тип данных, на который он может ссылаться? Дело в том, что по типу данных определяется, сколько ячеек памяти занимает значение, на которое ссылается указатель, и через сколько ячеек начнется следующее значение.

Если указатель объявлен, но не определен, то он ссылается на произвольный участок памяти с неизвестно каким значением:

int *pa, *pb; float *pc; printf(" %p %p %p\n", pa, pc, pb); // может возникнуть ошибка printf(" %d %f\n", *pa, *pc); 

Результат (в Ubuntu):

0x400410 0x7fff5b729580 (nil) -1991643855 0.000000

Использование неопределенных указателей в программе при вычислениях чревато возникновением серьезных ошибок. Чтобы избежать этого, указателю можно присвоить значение, говорящее, что указатель никуда не ссылается (NULL). Использовать такой указатель в выражениях не получится, пока ему не будет присвоено конкретное значение:

int a = 5; float c = 6.98; int *pa; float *pc; pa = NULL; pc = NULL; printf(" %15p %15p\n", pa, pc); // Error // printf(" %15d %15f\n", *pa, *pc); pa = &a; pc = &c; printf(" %15p %15p\n", pa, pc); printf(" %15d %15f\n", *pa, *pc);

Результат (в Ubuntu):

(nil) (nil) 0x7ffd8e77e550 0x7ffd8e77e554 5 6.980000

В данном случае, если попытаться извлечь значение из памяти с помощью указателя, который никуда не ссылается, то возникает «ошибка сегментирования».

На этом уроке вы должны понять, что такое адрес переменной и как его получить ( &var ), что такое переменная-указатель ( type *p_var; p_var = &var ) и как получить значение, хранимое в памяти, зная адрес ячейки ( *p_var ). Однако у вас может остаться неприятный осадок из-за непонимания, зачем все это надо? Это нормально. Понимание практической значимости указателей придет позже по мере знакомства с новым материалом.

Практически проверьте результат работы всех примеров данного урока, придумайте свои примеры работы с указателями.

Курс с решением части задач:
pdf-версия

Особенности JavaScript

Давайте кратко повторим изученный материал и отметим наиболее «тонкие» моменты.

Структура кода

Инструкции разделяются точкой с запятой:

alert('Привет'); alert('Мир');

Как правило, перевод строки также интерпретируется как разделитель, так тоже будет работать:

alert('Привет') alert('Мир')

Это так называемая «автоматическая вставка точки с запятой». Впрочем, она не всегда срабатывает, например:

alert("После этого сообщения ждите ошибку") [1, 2].forEach(alert)

Большинство руководств по стилю кода рекомендуют ставить точку с запятой после каждой инструкции.

Точка с запятой не требуется после блоков кода и синтаксических конструкций с ними, таких как, например, циклы:

function f() < // после объявления функции необязательно ставить точку с запятой >for(;;) < // после цикла точка с запятой также необязательна >

…Впрочем, если даже мы и поставим «лишнюю» точку с запятой, ошибки не будет. Она просто будет проигнорирована.

Строгий режим

Чтобы по максимуму использовать возможности современного JavaScript, все скрипты рекомендуется начинать с добавления директивы «use strict» .

'use strict'; . 

Эту директиву следует размещать в первой строке скрипта или в начале тела функции.

Без «use strict» код также запустится, но некоторые возможности будут работать в «режиме совместимости» со старыми версиями языка JavaScript. Нам же предпочтительнее современное поведение.

Некоторые конструкции языка (например, классы, которые нам ещё предстоит изучить) включают строгий режим по умолчанию.

Переменные

Можно объявить при помощи:

  • let
  • const (константа, т.е. изменению не подлежит)
  • var (устаревший способ, подробности позже)

Имя переменной может включать:

  • Буквы и цифры, однако цифра не может быть первым символом.
  • Символы $ и _ используются наряду с буквами.
  • Иероглифы и символы нелатинского алфавита также допустимы, но обычно не используются.

Переменные типизируются динамически. В них могут храниться любые значения:

let x = 5; x = "Вася";

Всего существует 8 типов данных:

  • number для целых и вещественных чисел,
  • bigint для работы с целыми числами произвольной длины,
  • string для строк,
  • boolean для логических значений истинности или ложности: true/false ,
  • null – тип с единственным значением null , т.е. «пустое значение» или «значение не существует»,
  • undefined – тип с единственным значением undefined , т.е. «значение не задано»,
  • object и symbol – сложные структуры данных и уникальные идентификаторы; их мы ещё не изучили.

Оператор typeof возвращает тип значения переменной, с двумя исключениями:

typeof null == "object" // ошибка в языке typeof function()<> == "function" // именно для функций

Взаимодействие с посетителем

В качестве рабочей среды мы используем браузер, так что простейшими функциями взаимодействия с посетителем являются:

prompt(question, [default]) Задаёт вопрос question и возвращает то, что ввёл посетитель, либо null , если посетитель нажал на кнопку «Отмена». confirm(question) Задаёт вопрос question и предлагает выбрать «ОК» или «Отмена». Выбор возвращается в формате true/false . alert(message) Выводит сообщение message .

Все эти функции показывают модальные окна, они останавливают выполнение кода и не позволяют посетителю взаимодействовать со страницей, пока не будет дан ответ на вопрос.

let userName = prompt("Введите имя", "Алиса"); let isTeaWanted = confirm("Вы хотите чаю?"); alert( "Посетитель: " + userName ); // Алиса alert( "Чай: " + isTeaWanted ); // true

Операторы

JavaScript поддерживает следующие операторы:

Простые * + — / , а также деление по модулю % и возведение в степень ** .

Бинарный плюс + объединяет строки. А если одним из операндов является строка, то второй тоже будет конвертирован в строку:

alert( '1' + 2 ); // '12', строка alert( 1 + '2' ); // '12', строка

Операторы присваивания

Простые a = b и составные a *= 2 .

Битовые операторы работают с 32-битными целыми числами на самом низком, побитовом уровне. Подробнее об их использовании можно прочитать на ресурсе MDN и в разделе Побитовые операторы.

Единственный оператор с тремя параметрами: cond ? resultA : resultB . Если условие cond истинно, возвращается resultA , иначе – resultB .

Логические И && , ИЛИ || используют так называемое «ленивое вычисление» и возвращают значение, на котором оно остановилось (не обязательно true или false ). Логическое НЕ ! конвертирует операнд в логический тип и возвращает инвертированное значение.

Оператор нулевого слияния

Оператор ?? предоставляет способ выбора определённого значения из списка переменных. Результатом a ?? b будет a , если только оно не равно null/undefined , тогда b .

Проверка на равенство == значений разных типов конвертирует их в число (за исключением null и undefined , которые могут равняться только друг другу), так что примеры ниже равны:

alert( 0 == false ); // true alert( 0 == '' ); // true

Другие операторы сравнения тоже конвертируют значения разных типов в числовой тип.

Оператор строгого равенства === не выполняет конвертирования: разные типы для него всегда означают разные значения.

Значения null и undefined особенные: они равны == только друг другу, но не равны ничему ещё.

Операторы сравнения больше/меньше сравнивают строки посимвольно, остальные типы конвертируются в число.

Существуют и другие операторы, такие как запятая.

Циклы

  • Мы изучили три вида циклов:
// 1 while (condition) < . >// 2 do < . >while (condition); // 3 for(let i = 0; i

Позже мы изучим ещё виды циклов для работы с объектами.

Конструкция «switch»

Конструкция «switch» может заменить несколько проверок if . При сравнении она использует оператор строгого равенства === .

let age = prompt('Сколько вам лет?', 18); switch (age) < case 18: alert("Так не сработает"); // результатом prompt является строка, а не число case "18": alert("А так сработает!"); break; default: alert("Любое значение, неравное значению выше"); >

Функции

Мы рассмотрели три способа создания функции в JavaScript:

    Function Declaration: функция в основном потоке кода

function sum(a, b)
let sum = function(a, b) < let result = a + b; return result; >;
// выражение в правой части let sum = (a, b) => a + b; // многострочный код в фигурных скобках < . >, здесь нужен return: let sum = (a, b) => < // . return a + b; >// без аргументов let sayHi = () => alert("Привет"); // с одним аргументом let double = n => n * 2;
  • У функций могут быть локальные переменные: т.е. объявленные в теле функции. Такие переменные видимы только внутри функции.
  • У параметров могут быть значения по умолчанию: function sum(a = 1, b = 2) .
  • Функции всегда что-нибудь возвращают. Если нет оператора return , результатом будет undefined .

Далее мы изучим больше

Это был краткий список возможностей JavaScript. На данный момент мы изучили только основы. Далее в учебнике вы найдёте больше особенностей и продвинутых возможностей JavaScript.

В указанное место напишите код который поместит значение из переменной a в переменную x

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2023. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Присвоить переменной «х» значение суммы переменных «a» и «b» если «a > b» или их произведение в остальных случаях.

В этом задании вам нужно вписать в указанное место код, который будет присваивать переменной «х» значение суммы переменных «a» и «b» в случае если *a > b или их произведение в остальных случаях.

Вот собственно сам код:

1 2 3 4 5 6
function testIf(a, b) { var x; //Сюда впишите код } return x; }

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Если произведение отрицательных чисел больше чем произведение нечетных , то присвоить переменной Т значение 1 иначе 0
и 2 плес: Дан одномерный массив А, состоящий из N целых чисел. Если произведение отрицательных.

Булевской переменной Flag присвоить значение True если значения переменных X равны
1) Булевской переменной Flag присвоить значение True если значения переменных X равны, и значение.

Если значения двух переменных равны по модулю, то присвоить каждой переменной произведение этих значений по модулю
Даны 2 переменные целого типа: A и B. Если их значения равны по модулю, то присвоить каждой.

565 / 464 / 183
Регистрация: 14.10.2017
Сообщений: 1,259

1 2 3 4
function testIf(a, b) { var x = a > b ? (a + b) : (a * b); return x; }

Регистрация: 13.11.2016
Сообщений: 13

В этом задании вам нужно вписать в указанное место код, который будет присваивать переменной «х» значение суммы переменных «a» и «b» — в случае если *a < b, разность "a" и "b" - в случае если *a >b, и их произведение *в остальных случаях.

565 / 464 / 183
Регистрация: 14.10.2017
Сообщений: 1,259
maxroyk, провалы в памяти? пичаль.
https://www.cyberforum.ru/java. 41923.html
Регистрация: 13.11.2016
Сообщений: 13
Нет не провалы в памяти просто не знаю как решить. Я ещё тернарные операторы не прошёл.
565 / 464 / 183
Регистрация: 14.10.2017
Сообщений: 1,259

ЦитатаСообщение от maxroyk Посмотреть сообщение

Я ещё тернарные операторы не прошёл.
раз уж вы разобрались что это тернарный,то изучить его 10-15 минут требуется

1 2 3 4 5 6 7 8
function testIf(a, b) { var x; if(a > b) x = a + b; else x = a * b; return x; }

если вам что-то не ясно-задавайте вопросы в этой же теме,а не клонируйте новую. Это нарушение правил форума.

Регистрация: 13.11.2016
Сообщений: 13

Цитата

Сообщение от klopp

1 2 3 4 5 6 7 8
function testIf(a, b) { var x; if(a > b) x = a + b; else x = a * b; return x; }

В данном случае по условию задачи, должно быть и 3 условие.
565 / 464 / 183
Регистрация: 14.10.2017
Сообщений: 1,259

ЦитатаСообщение от maxroyk Посмотреть сообщение

должно быть и 3 условие
где про это сказано?
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Переменной M присвоить минимальное значение переменных
Переменной M присвоить минимальное значение переменных целого типа I, J, K. Вывести на экран все.

Переменной S присвоить значение -1,если площадь треугольника ABC меньше или равна площади треугольника KLF
Даны два треугольника ABC (стороны a,b,c) и RLF (стороны r,l,f). Переменной S присвоить значение.

Если значения переменных не равны, то присвоить каждой переменной сумму значений
1. Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой.

Если значения переменных не равны, то присвоить каждой переменной большее из значений
Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной.

Присвоить логической переменной T значение true, если значение d-цифра, и значение false в противном случае
Имеется символьная переменная d, присвоить логической переменной T значение true, если значение.

Если значения переменных не равны, то присвоить каждой переменной сумму этих значений
Даны две переменные целого типа: А и В. Если их значения не равны, то присвоить каждой переменной.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *