Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 929
от 07.12.2007, 22:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 477, Экспертов: 57
В номере:Вопросов: 8, Ответов: 12


Вопрос № 111935: Объясните, пожалуйста, почему после нижеприведенных строк кода i=14? i=5; i=++i + ++i; ..
Вопрос № 111941: Здравствуйте, уважаемые эксперты! Появилась спонтанно у меня мысль, которая не дает покоя. Возможно в чем-то она и будет глуповато звучать, но всё таки. Она заключается в желании написать приложение, которое без особого труда со стороны пользоват...
Вопрос № 111961: Еще раз доброе утро))).Помогите пожалуста узнать чтобудет напечатано? Формулировка задачи. #include<stdio.h> main() { int a[4] [4]={1,1,-1,1,-2,-1,1,1,3,-1,-1,1,2,-2,1,-1},b[4],i,j; for(i=0;i<4;i++) { b[i]=a[i] [0]<br...
Вопрос № 111968: Помогите пожалуйста. вот тут программа.. можете ту чать программы которая считает запихнуть в функцию? #include <iostream.h> void main() { int a[10],b[10],i,k,max,imax,r,f; for(i=0;i<10;i++) { c...
Вопрос № 111983: Даны вещественные массивы A[3][5], V[3][5]. Для каждого массива опpеделить номеp столбца с наибольшим количеством положительных элементов....
Вопрос № 111985: Даны вещественные массивы A[7][4], F[7][4]. Для каждого массива опpеделить: сpеднее аpифметическое отpицательных элементов, сpеднее аpифметическое положительных элементов, наименьшее из всех положительных значений....
Вопрос № 112044: Привет всем! Дана задачка: var s: packed array [1...6] of char Во входном файле input задано оот 1 до 6 букв, за которыми следует точка. Ввести эти буквы и записать их вначало строки s, дополнив конец этой строки пробелами. Я написал ...
Вопрос № 112056: Здравствуйте, товарищи эксперты! У меня к вам вопрос: как можно осуществить удаление элемента из строки с заданным номером. Заранее спасибо за ответ! ...

Вопрос № 111.935
Объясните, пожалуйста, почему после нижеприведенных строк кода i=14?

i=5;
i=++i + ++i;
Отправлен: 02.12.2007, 01:28
Вопрос задал: Alekseybed (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: SiRuS
Здравствуйте, Alekseybed!
Всё логично, ибо префиксный оператор ++ миеет больший приоритет, чем бинарный +.
Пошаговый разбор:
1) Сначало выполнится либо первое префиксное увеличение, либо второе, зависит от компилятора.
i=6;
2) Выполняеться второе увиличение
i=7;
3) Выполняем сложение и получаем
i=7+7=14
Ответ отправил: SiRuS (статус: 4-ый класс)
Ответ отправлен: 02.12.2007, 02:07
Оценка за ответ: 5

Отвечает: Воробьёв Алексей Викторович
Здравствуйте, Alekseybed!

Вот выдержка из стандарта. Обратите внимание на второе предложение.
Величина переменной в выражении не должна меняться больше, чем 1 раз, иначе поведение не определено.
Причём, заметьте, не "зависит от компилятора", а "не определено".

4 Except where noted, the order of evaluation of operands of individual
operators and subexpressions of individual expressions, and the order
in which side effects take place, is unspecified. Between the previ-
ous and next sequence point a scalar object shall have its stored
value modified at most once by the evaluation of an expression. Fur-
thermore, the prior value shall be accessed only to determine the
value to be stored. The requirements of this paragraph shall be met
for each allowable ordering of the subexpressions of a full expres-
sion; otherwise the behavior is undefined. [Example:
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // `i' becomes 9
i = ++i + 1; // the behavior is undefined
i = i + 1; // the value of 'i' is incremented
--end example]

В Вашем примере переменная i модифицируется 3 раза.
Обратите внимание, что по стандарту даже для i = ++i + 1 поведение не определено.

Уважаемый SiRuS, тут нет ничего логичного.
Ваш компилятор (возможно Visual C++ как и у меня) решил, что надо сначала инкрементировать, потом складывать.
Я бы ожидал другого поведения: инкрементировал, положил в буфер или регистр 6, ещё раз инкрементировал, положил новое значение 7 в буфер или регистр, сложил 6 и 7.
Мой бы парсер выражений так и сработал. Я полагаю SiRuS не задумывался, как бы он написал разборщик такого выражения.
Ответ отправил: Воробьёв Алексей Викторович (статус: Практикант)
Ответ отправлен: 02.12.2007, 03:15
Оценка за ответ: 5
Комментарий оценки:
Хороший ответ с сылкой на "закон" - стандарт Си. Ехе бы по-русски, но это не принципиально. Учу всё-таки англ. Все равно отл.

Отвечает: Титов Михаил Анатольевич
Здравствуйте, Alekseybed!

А Вы какого ответа ожидали?
Вы используете префиксную форму оператора инкремента ++, следовательно значение переменной i будет увеличено ПЕРЕД его использованием в "объемлющем" выражении. Учитывая, что приоритет операции инкремента выше, чем у оператора сложения, то вначале будут выполнены оба инкремента, а затем сложение. Ваше выражение будет вычислено компилятором в следующей последовательности:

i=5;
++i; // i == 6
++i; // i == 7
i=i + i; // i == 7+7

В случае, если использовать постфиксную форму инкремента

i = i++ + i++;

, последовательность меняется (_t - назовем так временную переменную, которую будет использовать компилятор для сохранения значения i)

i=5;
_t = i; // _t == 5
i++; // i == 6
_t = i; // _t == 6
i++; // i == 7
i = _t + _t; // i == 6 + 6

Такие выражения полезны в качестве упражнения для понимания работы операторов Си, но принято считать, что в реальных программах следует избегать выражений, с более чем однократным инкрементом одной переменной. В более общем случае - следует избегать повторного использования в выражении переменных, задействованных в операциях с побочными эффектами, а именно : операции инкремента, декремента, вложенные присваивания и вызовы функций.
Это связано с тем, что результат выражения может зависеть от очередности изменения значений переменных, входящих в выражение. Стандарт не устанавливает этой очередности и она определяется компилятором. Для вашего выражения это не имеет значения, а вот в каноническом примере

i = 5;
a[i] = i++;

значение 6 будет присвоено пятому или шестому элементу массива a? Результат может быть различным на разных компиляторах.
Ответ отправил: Титов Михаил Анатольевич (статус: 4-ый класс)
Ответ отправлен: 02.12.2007, 05:41
Оценка за ответ: 5
Комментарий оценки:
Спасибо, очень подробно и понятно.


Вопрос № 111.941
Здравствуйте, уважаемые эксперты!
Появилась спонтанно у меня мысль, которая не дает покоя. Возможно в чем-то она и будет глуповато звучать, но всё таки. Она заключается в желании написать приложение, которое без особого труда со стороны пользователя позволяет невизуально посещать некоторые сайты и также невизуально (автоматически) организовывать клики по определенным ссылкам, баннерам, за что идет накопление N-го числа webmoney на свой кошель. При этом для меня остаются открытыми следующие вопросы: 1) какие данные и по какому(им) протоколу(ам) передаются при переходе по ссылке(баннеру); 2)каким образом "спонсоры" перечисляют определенную сумму в кошелек(т.е. как фиксируется, что именно я, именно с таким кошельком организовал эти клики - т.е. как передается данная информация).

Таким образом, вопрос заключается в автоматизировании процесса, так сказать, халявного зароботка по принципу "без труда чтоб вытащить рыбёшку из пруда".
Может где-то есть источники, в которых описаны принципы приема и передачи указанной необходимой информации? Или же может существуют "алгоритмы решения" подобной задачи?

Извините за наивность,
и заранее СПАСИБО БОЛЬШОЕ ЗА ОТВЕТЫ!!!
Отправлен: 02.12.2007, 02:15
Вопрос задал: S.Varbanets (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: SiRuS
Здравствуйте, S.Varbanets!
1) В вашем случае, все данные передаются по http протоколу. А следовательно информация с вашего компьютера отправляется в виде GET или POST запросов, которые вам и следует формировать.
Просмотреть какой именно запрос отправляется серверу можно, например используя плагин для браузера Firefox - Tamper Data. Ну или используя сниферы (способ не совсем тривиальный и требует отдельных разъяснений)
Подробности о "формирование http запросов" ищите в гугле. Там много информации.
2) Опять таки, через эти запросы и происходит ваша идентификация. Просто в запросе указывается ваш "код", по которому сервер определяет, от кого был послан запрос.
Но
1) Это не законно ибо является машейничеством.
2) Скорее всего, такой способ накрутки продуман. И вашей программе придётся каждый раз заново искать в странице нужную ссылку. Но это, конечно же, зависит от сервиса...
Ответ отправил: SiRuS (статус: 4-ый класс)
Ответ отправлен: 02.12.2007, 05:29
Оценка за ответ: 4
Комментарий оценки:
Спасибо большое за столь срочный ответ.
Однако, всё ещё не ясно, каким образом происходит идентификация номера кошелька с последующей пересылкой мани (т.е. какая взаимосвязь между "кодом", передаваемым в запросе и номером кошелька).
В целом, ответ я оцениваю как хороший!

Отвечает: Лясин Александр Владимирович
Здравствуйте, S.Varbanets!
В общем согласен с SiRus, за исключением того, что это не законно.
Тут необходимо привести ссылку на закон, в котором это означено.
Лично я не вижу в этом ничего противозаконного.
Ответ отправил: Лясин Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 02.12.2007, 08:47
Оценка за ответ: 2
Комментарий оценки:
Увы ответ не по существу! С незаконностью я тоже бы поспорил.


Вопрос № 111.961
Еще раз доброе утро))).Помогите пожалуста узнать чтобудет напечатано? Формулировка задачи.
#include<stdio.h>
main()
{
int a[4] [4]={1,1,-1,1,-2,-1,1,1,3,-1,-1,1,2,-2,1,-1},b[4],i,j;
for(i=0;i<4;i++) {
b[i]=a[i] [0]
for(j=1;j<4;j++)
b[i]*=a[i] [j]
}
for(i=0;i<4;i++)
printf(" b(%d)=%d ",i,b[i] );
}
И если трудно объяснить формулировку задачи(что в ней делается)
Отправлен: 02.12.2007, 10:22
Вопрос задал: Pimp (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ross
Здравствуйте, Pimp!

Напечатано будет:
b(0)=-1 b(1)=2 b(2)=3 b(3)=4

b[i] - произведение элементов i-го столбца матрицы a
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 02.12.2007, 14:10


Вопрос № 111.968
Помогите пожалуйста.
вот тут программа.. можете ту чать программы которая считает запихнуть в функцию?


#include <iostream.h>

void main()
{
int a[10],b[10],i,k,max,imax,r,f;
for(i=0;i<10;i++)
{
cout<<"a["<<i<<"]";
cin>>a[i];
}
for(i=0;i<10;i++)
{
cout<<"b["<<i<<"]";
cin>>b[i];
}
cout<<"vvedite R=";
cin>>r;
cout<<"vvedite F=";
cin>>f;
imax=0;
max=a[0];
for(i=0;i<10;i++)
if(a[i]>max)
{
max=a[i];
imax=i;
}
for(i=0;i<imax;i=i+2)
a[i]=r;
max=0;
max=b[0];
for(i=0;i<10;i++)
if(b[i]>max)
{
max=b[i];
imax=i;
}
for(i=0;i<imax;i=i+2)
b[i]=f;
cout<<"a ";
for(i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<"b ";
for(i=0;i<10;i++)
cout<<b[i]<<" ";
}
Отправлен: 02.12.2007, 11:53
Вопрос задал: Бурдюк Вадим Витальевичь (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лясин Александр Владимирович
Здравствуйте, Бурдюк Вадим Витальевичь!
в приложении код вашей программы, немного переделанной.

Приложение:

Ответ отправил: Лясин Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 02.12.2007, 22:58


Вопрос № 111.983
Даны вещественные массивы A[3][5], V[3][5]. Для каждого массива опpеделить номеp столбца с наибольшим количеством положительных элементов.
Отправлен: 02.12.2007, 13:46
Вопрос задал: Лапотников Ден Александрович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Djec
Здравствуйте, Лапотников Ден Александрович!
В приложении решение. Выводит номер нужного столбца, считая, что первый столбец - 1, а не нулевой. Если надо, чтобы выводило 0, как первый, в функции Maxj необходимо вернуть не j_Max+1, а просто j_Max. Будут вопросы, пишите в минифорум.

Приложение:

---------
"Если ты что-то делаешь, делай это хорошо. если же ты не можешь или не хочешь делать хорошо, лчуше совсем не делай" © Л.Н.Толстой"

Ответ отправил: Djec (статус: 5-ый класс)
Ответ отправлен: 02.12.2007, 15:09
Оценка за ответ: 5
Комментарий оценки:
sps))


Вопрос № 111.985
Даны вещественные массивы A[7][4], F[7][4]. Для каждого массива опpеделить: сpеднее аpифметическое отpицательных элементов, сpеднее аpифметическое положительных элементов, наименьшее из всех положительных значений.
Отправлен: 02.12.2007, 13:47
Вопрос задал: Лапотников Ден Александрович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: din
Здравствуйте, Лапотников Ден Александрович!
В приложении код, который решает Вашу задачу. Массивы инициализированы в самом коде. Можно сделать ввод с консоли (получится 56!!! элементов на вводе, что неудобно), или считывать из файла. Так же можно было бы обращаться к массивам через адресную арифметику, а не по индексам.

Приложение:

---------
Есть только одно зло - невежество, и только одно благо - знания

Ответ отправил: din (статус: Специалист)
Ответ отправлен: 02.12.2007, 16:16
Оценка за ответ: 5


Вопрос № 112.044
Привет всем!
Дана задачка:
var s: packed array [1...6] of char
Во входном файле input задано оот 1 до 6 букв, за которыми следует точка. Ввести эти буквы и записать их вначало строки s, дополнив конец этой строки пробелами.
Я написал так, но препод скалал, что это неправильно:
char a[6]
For (i=0;a[i]!='.';i++) scanf ("%c",&a[i]);
int strncat(char *a[i], char *s[i], int i);
Подскажите, как правильно?
Спасибо всем!
Отправлен: 02.12.2007, 19:17
Вопрос задал: LexXx (статус: Практикант)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ross
Здравствуйте, LexXx!

#include < iostream >

void main()
{
std::ifstream in_file("myinput.txt",ios::binary);

char s[7] = " ",ch;
for (int i = 0; i < 7; ++i)
{
in_file.get(ch);
if (ch != '.' && !in_file.eof())
s[i] = ch;
}

in_file.close();
}
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 03.12.2007, 21:36


Вопрос № 112.056
Здравствуйте, товарищи эксперты! У меня к вам вопрос: как можно осуществить удаление элемента из строки с заданным номером. Заранее спасибо за ответ!
Отправлен: 02.12.2007, 20:34
Вопрос задал: Мингараев Дмитрий (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 9)

Отвечает: Скрипин Слава
Здравствуйте, Мингараев Дмитрий!
Если вы используете класс STRING STL то в нем есть функция
erase(size_type pos=0,size_type n=pos);
Она удаляет из вызывающей строки n элементов с позиции pos.

Приложение:

Ответ отправил: Скрипин Слава (статус: 3-ий класс)
Ответ отправлен: 02.12.2007, 20:52

Отвечает: Boriss
Здравствуйте, Мингараев Дмитрий!
Ну тогда вот код в приложении :))
Если что-то не так - пишите

Приложение:

---------
Вывод - то место в тексте, где вы устали думать

Ответ отправил: Boriss (статус: Профессор)
Россия, Саранск
Организация: Мордовский госуниверситет, Саранск Факультет Электронной Техники
WWW: Программирование на Паскале
----
Ответ отправлен: 06.12.2007, 10:12
Оценка за ответ: 5
Комментарий оценки:
Все гуд щас только сделаю чтоб пользователь вводил данные для массива, алгоритм понял :)


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.65 от 04.12.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное