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

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


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

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

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

Выпуск № 1007
от 26.02.2008, 05:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 479, Экспертов: 49
В номере:Вопросов: 9, Ответов: 17

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 123978: Здравствуйте. Как в приложении на MS Visual C++ запустить таймер, определив для него время работы и выполнить опред. код по началу и завершению работы таймера?...
Вопрос № 123985: Здраствуйте уважаемые эксперты !!! Помогите мне пожалуйста со строками в C++: 1) Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. В каждом слове заменить первую букву на прописную ну или поменять размер...
Вопрос № 123997: Что означает оператор ++x (не x++, а именно ++x)? Поясните каждое из получающихся значений при выполнении следующего фрагмента программы: Char *s=”ИНФОРМАТИКА”, *s1, y; s1 = s; y=*s1; y=*s1++; y=++*s1; y=*++s1; y...
Вопрос № 124012: Здраствуйте. Среда разработки BDS 2006. В Edit1->Text становиться равным 0,0109999999999999, если прибавить 0.0000000000000001 то всё в порядке. Код в приложении. Почему 0,0109999999999999? И как ис...
Вопрос № 124049: Здраствуйте уважаемые эксперты !!! Загрузили кучей работ по C++, помогите мне пожалуйста c их решением : 1) Дана матрица размера M x N. Вывести ее элементы, расположенные в строках с четными номерами (2, 4, …). Вывод элементов производит...
Вопрос № 124098: Дали задание "Разработать класс, моделирующий работу с комплексными числами. Членами класса должны быть длинна вектора и угол наклона к оси реальных значений комплексного числа. Перегрузите для данного класса операторы ввода вывода, сложения, вы...
Вопрос № 124106: здравствуйте уважаемые эксперты помогите пажалуста решить Дана строка символов состояшая из произвольного текста слова разделены пробелами в каждом слове заменить первую букву на прописную...
Вопрос № 124107: Здраствуйте Уважаемые эксперты, помогите мне немножко разобратся с rand :) У меня задача создать 2 матрицы [1,N] [N,1] N вводится с клавиатуры, а сами матрицы заполняются при помощи rand, в приложении написано, как я это зделал, но почемуто э...
Вопрос № 124145: Здравствуйте, уважаемые специалисты! Очень сильно нужна ваша помощь в решении программ. По идее вроде бы все понятно но в тоже же время сделать не получается. 1. Написать программу для хранения в битовом поле информации о конфигурации компьютера....

Вопрос № 123.978
Здравствуйте. Как в приложении на MS Visual C++ запустить таймер, определив для него время работы и выполнить опред. код по началу и завершению работы таймера?
Отправлен: 20.02.2008, 09:00
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сандров Алекс
Здравствуйте, Blackie!

Есть функция SetTimer(HWND hWnd, UINT uiEvent, UINT uiTimeout, TIMERPROC tmpFunc);

Эта функция вешает на окно hWnd, таймер с идетификатором uiEvent, который будет присылать в окно hWnd сообщение WM_TIMER каждые uiTimeout миллисекунд. При этом в wParam будет указан идентификатор uiEvent, чтоб отличать этот таймер от другого.

Если хэндл окна hWnd не указан (ну или нету окна, или не надо в окно) надо указать функцию tmpFunc вида

VOID CALLBACK tmpFucn (HWND , UINT uiMsg, UINT_PTR uiEvent, DWORD dwTime)

uiMsg тут всегда будет WM_TIMER прилетать, а dwTime - текущее системное время, hWnd - будет NULL, елси он не указан в SetTimer вместе с функцией tmpFunc как первый парметр.

...и просто засунуть её в SetTimer
SetTimer(0, 1, 1000, (TIMERPROC)tmpFunc)

через секунду в tmpProc будет вызвана системой с параметрами :
(NULL, WM_TIMER, 1, <current_time>)
Ответ отправил: Сандров Алекс (статус: 5-ый класс)
Ответ отправлен: 20.02.2008, 09:12
Оценка за ответ: 4
Комментарий оценки:
Примерчик бы не помешал


Вопрос № 123.985
Здраствуйте уважаемые эксперты !!!
Помогите мне пожалуйста со строками в C++:
1) Дана строка символов, состоящая из произвольного текста, слова разделены пробелами.
В каждом слове заменить первую букву на прописную ну или поменять размер !!!
Отправлен: 20.02.2008, 09:34
Вопрос задала: Фидосеева Ольга Викторовна (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Фидосеева Ольга Викторовна!
Вариант решения вашей задачи смотрите в приложении. Обрабатывается введенная строка. Разделители слов содержатся в переменной const string delimiters(" .,:; ").

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 20.02.2008, 09:57
Оценка за ответ: 5


Вопрос № 123.997
Что означает оператор ++x (не x++, а именно ++x)?
Поясните каждое из получающихся значений при выполнении следующего фрагмента программы:
Char *s=”ИНФОРМАТИКА”, *s1, y;
s1 = s;
y=*s1;
y=*s1++;
y=++*s1;
y=*++s1;
y=(*s1)++;
y=++(*s1);
Отправлен: 20.02.2008, 10:18
Вопрос задал: Blackie (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Терсков Сергей
Здравствуйте, Blackie!
++x - это префиксный оператор инкремента. Т.е. Значение переменной будет инкрементировано перед этим выражением. Подробнее можете посмотреть здесь или здесь.

А второй вопрос лучше построчно разобрать.
сhar *s=”ИНФОРМАТИКА”, *s1, y; - далее мы не сможем модифицировать значение строки ”ИНФОРМАТИКА”, т.к. память под нее никак не выделена. Нужно выделить память динамически или статически. Например:

сhar s[12]=”ИНФОРМАТИКА”, *s1, y;

Далее:

s1 = s; // Указатель s1 указывает на начало строки s
y=*s1; // Переменная y получает значение разыменованного указателя s1, т.е. 'И'
y=*s1++; // Переменная y получает то же значение, указатель постфиксно инкрементируется
y=++*s1; // Переменная y получает значение инкрементрованного разыменованного указателя s1. Т.е. 'О'
y=*++s1; // Переменная y получает инкрементрова нное значение разыменованного указателя s1. Т.е. 'Ф'
y=(*s1)++; // Переменная y получает то же значение, значение разыменованного указателя s1 постфиксно инкрементируется
y=++(*s1); // Переменная y получает дважды инкрементрованное значение разыменованного указателя s1. Т.е. 'Ц'

Значение исходной строки после всего этого "ИОЦОРМАТИКА".
Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 20.02.2008, 10:52
Оценка за ответ: 5

Отвечает: Сандров Алекс
Здравствуйте, Blackie!

Здравствуйте, Blackie!

++х - это значит, что если используют в выражениях это, то сначала прибавляют 1, а потом берут значение.

то есть

а = х;
y = x++;
z = ++a;

то y != z
____________

s1 = s; // s1 указывает туда же, куда и указатель s, на строку ”ИНФОРМАТИКА”
y=*s1; // в y записали символ, который лежит по адресу s1 (*s1 - "разыменовали указатель") буква 'И'

y=*s1++; // разыменовать s1, присвоить к y, а потом прирастить указатель на 1 - s1 будет указывать на второй символ 'Н', а в y = 'И'

y=++*s1; // аксес виолэйшн. И вот почему, в данном случае. Если бы строка s1 была динамической, всё было бы ок. А так вот что: сначала разыменовывается указатель, потом то что получилось увеличивается на 1, результат пишется в y, и потом само разыменованное значение увеличивается на 1. А так как строка статическая - ошибка доступа к памяти... Иначе y = 'О', а s1 = 'ОФОРМАТИКА'

y=*++s1; //s1 приращается на 1, и потом разыменовывается; y='Ф' s1 = 'ФОРМАТИКА'

y=(*s1)++; // принудилеьно сначала разыменовывается значение по указателю (было там 'Ф')прописывается в y, а потом к нему прибаляется 1 = 'X',
в *s1 = 'Х', в y = 'Ф'

y=++(*s1); // сначала берётся символ, приращается на 1, а потом присваивается в y, в обоих местах = 'Ц'
s1 = 'ЦОРМАТИКА'
__________

есть классическая задачка на понимание:

x = 5;
y = ++x + ++x;

чему равен y?

ответ = 14, а х =7
разбор выражения:
1. первое слагаемое ++х - х становится равным 6
2. второе слагаемое ++х - х становится равным 7
3. 7 + 7 = 14

y = ++x + x++;

чему равен y? y = 12, а х = 7

разбор:
1. первое слагаемое ++х - х = 6
2. сумма у = х + х - у = 12
3. х++ - х = 7
Ответ отправил: Сандров Алекс (статус: 5-ый класс)
Ответ отправлен: 20.02.2008, 11:02
Оценка за ответ: 5

Отвечает: Garmash Dima
Здравствуйте, Blackie!
операторы ++x и x++ увеличиваю значение x на единицу с той разницей, что первое сначало увеличит раньше, чем возмет значение, а второе наоборот. т.е если x=0, то cout<<++x выведет 1, а cout<<x++ выведет 0, и приследующем выводе cout<<x выведет 1 в обоих случаях.
Давайте посмотрим действия в каждой строке.
Char *s=”ИНФОРМАТИКА”,*s1,y;//хочу заметить,чо char пишется с маленькой буквы и " английские
объявление инициализированой стрки s, указателя s1 на строку(символ), "содержащей мусор", и символ y.
s1 = s;
теперь s и s1 это одно и тоже.(обе равны и при изменении одного, изменяется второе)
y=*s1;
y равен первому символу строки s1, т.е. И
y=*s1++;
теперь s1=НФОРМАТИКА, y=И;т.е. y равен первому символу строки s1, т.е. И, и указатель стал указывать на второй символ в строке, и y равен первому символу строки s1. s еще никак не изменилась.
y=++*s1;
вызывает ошибку.способ убрать ошибку в приложении. первый символ строки s1 увеличивется на 1, и это значение присваевается y.s1=ОФОРМАТИКА, y=О, s=ИОФОРМАТИКА.
y=*++s1;
s1 начинается с Ф и равна ФОРМАТИКА, и y=Ф.строка s неизменилась.
y=(*s1)++;
y равна первому символу s1, и увеличивает первый символ на 1.y=Ф, s1=ХОРМАТИКА, s=ИОХОРМАТИКА
y=++(*s1);
тоже самое, что и y=++*s1. первый символ строки s1 увеличивется на 1, и это значение присваевается y. y=Ц, s1=ЦОРМАТИКА, s=ИОЦОРМАТИКА.
получаем :y=Ц, s1=ЦОРМАТИКА, s=ИОЦОРМАТИКА.

Приложение:

---------
Шизофрения это нормально

Ответ отправил: Garmash Dima (статус: 3-ий класс)
Ответ отправлен: 20.02.2008, 12:59
Оценка за ответ: 5

Отвечает: yatagan
Здравствуйте, Blackie!
при х++, создается временная переменная, которой присваивается значение х, послечего х увеличивается на 1, а возвращается сначение временной переменной, тоесть начальное значение х.
при ++х, х увеличивается на 1 и возвращается его новое значение.
тоесть последняя быстрее работает

y=*s1;= И
y=*s1++;=И
y=++*s1;=(Н+1) по таблице кодов ASCII
y=*++s1;=Ф
y=(*s1)++;=Ф
y=++(*s1);=О+1 по таблице ASCII

вроде так, удачи.
---------
Сало понад усе!
Ответ отправил: yatagan (статус: 5-ый класс)
Ответ отправлен: 20.02.2008, 19:30
Оценка за ответ: 5


Вопрос № 124.012
Здраствуйте.

Среда разработки BDS 2006.

В Edit1->Text становиться равным 0,0109999999999999,

если прибавить 0.0000000000000001 то всё в порядке.

Код в приложении.

Почему 0,0109999999999999?
И как исправить?
Спасибо.

Приложение:

Отправлен: 20.02.2008, 11:38
Вопрос задал: Yark1n9 (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Хватов Сергей
Здравствуйте, Yark1n9!

Потому что вещественные числа представляются в компьютерах не вполне адекватно.
Во-первых, компьютеры нынче двоичные, и ни 1.1, ни 1.111 в форматах float, double, long double,.. - точно не представляются.
Во-вторых, точность double примерно 13 десятичных знаков. Вы же печатаете больше. Вот ошибка и набежала.

Бороться с этим сложно. Вы можете использовать long double, но всё равно рано или поздно вы на такое можете нарваться.

Единственный реальный метод - работать с целыми подходящей длины, а входящие данные нужным образом масштабировать в эти целые. Способ хлопотный и капризный, но приходится его использовать, причём не так редко, например в финансовых расчётах.
Ответ отправил: Хватов Сергей (статус: Практикант)
Ответ отправлен: 20.02.2008, 12:48
Оценка за ответ: 4
Комментарий оценки:
а в консоли на cout коректное значение выводит!?


Вопрос № 124.049
Здраствуйте уважаемые эксперты !!!
Загрузили кучей работ по C++, помогите мне пожалуйста c их решением :

1) Дана матрица размера M x N. Вывести ее элементы, расположенные в строках с четными номерами (2, 4, …). Вывод элементов производить по строкам, условный оператор не использовать.

2) Дана квадратная матрица A порядка M (M — нечетное число). Начиная с элемента A1,1 и перемещаясь против часовой стрелки, вывести все ее элементы по спирали: первый столбец, последняя строка, последний столбец в обратном порядке, первая строка в обратном порядке, оставшиеся элементы второго столбца и т. д.; последним выводится центральный элемент матрицы.

3) Дана матрица размера M x N. В каждом столбце матрицы найти максимальный элемент.

4) Дана матрица размера M x N. Найти минимальный среди максимальных элементов ее столбцов.

5) Дана матрица размера M x N. Найти минимальный среди элементов тех строк, которые упорядочены либо по возрастанию, либо по убыванию. Если упорядоченные строки в матрице отсутствуют, то вывести 0.

6) Дана матрица размера M x N. Поменять местами столбец с номером N и первый из столбцов, содержащих только отрицательные элементы. Если требуемых столбцов нет, то вывести матрицу без изменений.

7) Дана матрица размера M x N и целое число K (1 Ј K Ј N). После столбца матрицы с номером K вставить столбец из единиц.

8) Дана квадратная матрица A порядка M. Зеркально отразить ее элементы относительно главной диагонали (при этом элементы главной диагонали останутся на прежнем месте, элемент A1,2 поменяется местами с A2,1, элемент A1,3 — с A3,1 и т. д.). Вспомогательную матрицу не использовать.
Отправлен: 20.02.2008, 16:04
Вопрос задала: Фидосеева Ольга Викторовна (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Попов А.С.
Здравствуйте, Фидосеева Ольга Викторовна!
В приложении решение 1,3,4 задачи

Приложение:

Ответ отправил: Попов А.С. (статус: 8-ой класс)
Ответ отправлен: 20.02.2008, 19:33
Оценка за ответ: 5

Отвечает: X-men
Здравствуйте, Фидосеева Ольга Викторовна!
А вот и остальные программы. Написаны на MS VC++ Express .NET

Приложение:

Ответ отправил: X-men (статус: 1-ый класс)
Ответ отправлен: 21.02.2008, 20:55


Вопрос № 124.098
Дали задание "Разработать класс, моделирующий работу с комплексными числами. Членами класса должны быть длинна вектора и угол наклона к оси реальных значений комплексного числа. Перегрузите для данного класса операторы ввода вывода, сложения, вычитания умножения, деления. Определить функцию преобразования комплексного числа в алгебраическую форму и его вывод."
ПОМОГИТЕ ДОПИСАТЬ.

Приложение:

Отправлен: 20.02.2008, 19:54
Вопрос задал: Неня Николай Николаевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ross
Здравствуйте, Неня Николай Николаевич!

Код в приложении. Дописывать нужно было довольно много =), поэтому я решил переписать полностью.

P.S: Не забудьте удалить копирайт в начале файла.

Приложение:

---------
Доступно только то, что видимо (c) Б. Керниган

Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 22.02.2008, 20:54


Вопрос № 124.106
здравствуйте уважаемые эксперты помогите пажалуста решить
Дана строка символов состояшая из произвольного текста слова разделены пробелами в каждом слове заменить первую букву на прописную
Отправлен: 20.02.2008, 20:19
Вопрос задал: Razum89 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Verena
Здравствуйте, Razum89!
Задача совсем простая. вы не указали, можно ли пользоваться строковыми функциями или string-ом, ну, предположим, что нет. Предположим также, что строку можно брать статическую - Вы, опять же, об этом не пишете. Пусть строка не будет превышать 255 символов (+1 символ под символ конца строки) и пусть эту строку в начальном виде сохранять не нужно. Тогда решение может выглядеть, например, так, как в приложении. Просматриваем строку и заменяем каждый строчный символ, стоящий после пробела, на прописной. Из комментариев всё, думаю, ясно.
Удачи!

Приложение:

---------
Эта история - не для истории, понимаешь?

Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 20.02.2008, 22:04
Оценка за ответ: 5

Отвечает: Терсков Сергей
Здравствуйте, Razum89!
Идентичный вопрос №123985. Наверное оба от одного преподавателя. Код повторно привожу в приложении.

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 21.02.2008, 02:51
Оценка за ответ: 5


Вопрос № 124.107
Здраствуйте Уважаемые эксперты,
помогите мне немножко разобратся с rand :)
У меня задача создать 2 матрицы [1,N] [N,1] N вводится с клавиатуры, а сами матрицы заполняются при помощи rand, в приложении написано, как я это зделал, но почемуто этот ранд генерирует случайные числа в одной матрице, но элементы этих двух матриц совпадают, например так: если в первой матрице 1 2 3 4 5 то во второй тоже 1 2 3 4 5, подскажите как зделать чтобы числа в матрицах несовпадали.
Заранее спасибо.
С Уважением, Станислав.

Приложение:

Отправлен: 20.02.2008, 20:25
Вопрос задал: Станислав (статус: 1-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Verena
Здравствуйте, Станислав!
У Вас нет инициализации генератора случайных чисел. Если добавить в начало функции main, например, такое выражение:
srand ((unsigned int)time(NULL)); (необходимо подключить time.h)
то распределение получится приближённым к нормальному. Инициализация необходима в связи с алгоритмом генерации псевдослучайного числа.
Удачи!
---------
Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 20.02.2008, 20:52
Оценка за ответ: 5

Отвечает: Dr_Andrew
Здравствуйте, Станислав!
Функция rand генерирует псевдослучайные (всегда одинаковая последовательность чисел) числа: это удобно для отладки. Для того, чтобы генерировались по настоящему случайные числа, необходимо до использования rand использовать функцию srand, в качестве аргумента принимающую время, генерируемое таймером, что-то вроде:

#include <stdlib.h>
#include <time.h>

//...

srand(time(NULL));

//...

int i = rand() % 6 + 1;
Ответ отправил: Dr_Andrew (статус: 7-ой класс)
Ответ отправлен: 20.02.2008, 20:57
Оценка за ответ: 4

Отвечает: yatagan
Здравствуйте, Станислав!
с самого начала программы вызови srand(time(0));
удачи
---------
Сало понад усе!
Ответ отправил: yatagan (статус: 5-ый класс)
Ответ отправлен: 20.02.2008, 21:23
Оценка за ответ: 4

Отвечает: shayen
Здравствуйте, Станислав!
Всё дело в том что функция rand() работает используя в качестве начальной точки-точку определённую при написании алгоритма генератора случайных чисел, то есть какое-то постоянное число, что у вас и получается. Для того чтобы значения были разными необходимо задавать начальную точку генерации, это делается с помощью функции srand() которая устанавливает начальную точку генерации и использует следующий синтаксис
void srand(unsigned int start).
Начальную точку start можно задавать вручную, но проще воспользоваться функцией времени time() которая находится в библиотеке time.h и если её вызвать с параметром NULL то функция вернёт количество милисекунд прошедших с 1 января 1970 года. Пример в приложении.

Приложение:

Ответ отправил: shayen (статус: 3-ий класс)
Ответ отправлен: 20.02.2008, 21:39
Оценка за ответ: 4


Вопрос № 124.145
Здравствуйте, уважаемые специалисты! Очень сильно нужна ваша помощь в решении программ. По идее вроде бы все понятно но в тоже же время сделать не получается.
1. Написать программу для хранения в битовом поле информации о конфигурации компьютера. Например: Корпус AT – 0, ATX – 1; Видео на борту – 0, карта – 1 и так далее.
2. Дан массив целых чисел. Воспользовавшись указателями, поменяйте местами элементы массива с четными и нечетными индексами (т.е. те элементы массива, которые стоят на четных местах, поменяйте с элементами, которые стоят на нечетных местах).
3. Создать битовое поле для хранения времени (часы, минуты, секунды, миллисекунды). Написать функции для установки и получения времени в(из) битовое(-го) поле(-я).
Отправлен: 21.02.2008, 01:03
Вопрос задала: Lana-N (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: shayen
Здравствуйте, Lana-N!
В приложении программы компилированные в VS 2003

Приложение:

Ответ отправил: shayen (статус: 3-ий класс)
Ответ отправлен: 21.02.2008, 11:59
Оценка за ответ: 5


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

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

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

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

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

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


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


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

В избранное