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

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


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

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

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

Выпуск № 1140
от 22.10.2008, 18:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 416, Экспертов: 42
В номере:Вопросов: 3, Ответов: 6

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


Вопрос № 147460: Здравствуйте уважаемые эксперты! Нужно решение задачи в C++ В одномерном массиве, состоящем из n целочисленных элементов, вычислить: <font color="blue"> 1) произведение элементов массива с четными номерами; Готово </font> 2) сумму ...
Вопрос № 147481: Добрый вечер! Нужно решение задачи в C++ Задача должна содержать в себе меню по 3-м задачам которые предоставлены и сообственно и их решение, есть приблизительное решение (возможно есть ошибки) этих задач но к сожелению решена только 1 зад...
Вопрос № 147532: Здравствуйте. Я изучаю MFC на VS2008 по книге Visual C++ .NET. Библия пользователя(правда, книга написана под версию VS .Net, и поэтому приходится имеющиеся в ней примеры корректировать по новым "правилам" VS)... Так вот я там столкнулся со...

Вопрос № 147.460
Здравствуйте уважаемые эксперты!
Нужно решение задачи в C++

В одномерном массиве, состоящем из n целочисленных элементов, вычислить:
1) произведение элементов массива с четными номерами; Готово
2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.
3) Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом все отрицательные (элементы, равные нулю, считать положительными).
Приложение имеетсо но не доделано 2 и 3 задания
PS Паскальное вообще не понимаю хотельсьбы увидеть на С++

Приложение:

Отправлен: 16.10.2008, 19:50
Вопрос задал: Константиниус (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 16)

Отвечает: Николай // МMM
Здравствуйте, Булынин!

Произведение элементов массива с чётными номерами:

Код:
 
//Заголовок потокового ввода/вывода
#include <iostream>
//Заголовок манипуляторов ввода/вывода
#include <iomanip>

using namespace std;

int main()
{
//Поддержка русского языка
setlocale(LC_CTYPE, "Russian");

//Объявляем массив целых чисел на 10 элементов;
int mas[10];
//Объявляем переменную размерности и переменную для хранения результата
int size = 0, res = 1;

//Приглашение ввести значение размерности
cout << " Введите размерность массива: ";

//Ввод значения размерности
cin >> size;

cout << endl;
cout << " Заполнить массив: "
<< " ---------------- "
<< " Вручную - 1 "
<< " Автоматически - 2 "
<< " : ";

//Объяаляем переменную выбора
int sw;

//Вводим значение выбора
cin >> sw;

cout << endl;

//Оператор "switch"
switch(sw)
{
//Если значение переменной выбора 1, то вводим элементы массива вручную
case 1: for(int i = 0; i < size; i++)
{
cout << " el.of mas[" << i << "]: ";

cin >> mas;
}

break;

//Если значение переменной выбора 2, то заполнение массива будет атоматическим
case 2: for(int i = 0; i < size; i++)
{
mas[i] = rand() % 100 - 50;
}

break;
}

cout << endl << " Исходный массив: " << endl << endl;

//Вывод массива на экран
for(int i = 0; i < size; i++)
{
cout << " " << mas[i] << set w(3);
}

cout << endl;

//Цикл для поиска чётных значений и умножения
for(int i = 0; i < size; i++)
{
if ((mas[i] % 2) == 0)
{
res *= mas[i];
}
}

//Вывод значения на экран
cout << endl <<" Произведение всех чётных элементов: " << res << endl << endl;

return 0;
}


[i] Подсчёт суммы элементов массива, расположенных между первым и последним нулевыми элементами.


Код:

//Заголовок потокового ввода/вывода
#include <iostream>
//Заголовок манипуляторов ввода/вывода
#include <iomanip>

using namespace std;

int main()
{
//Поддержка русского языка
se tlocale(LC_CTYPE, "Russian");

//Объявляем массив целых чисел на 10 элементов;
int mas[10];
//Объявляем переменную размерности
int size = 0;

//Приглашение ввести значение размерности
cout << " Введите размерность массива: ";

//Ввод значения размерности
cin >> size;

cout << endl;

cout << " Введите элементы массива: " << endl << endl;

int zero = 0;

//Цикл для ввода значений массива
for(int i = 0; i < size; i++)
{
cout << " el.of mas[" << i << "]: ";

cin >> mas[i];
}

//Цикл для получения номера ячейки, в которой хранится первый 0
for(int i = 0; mas[i]; i++)
{
zero++;
}

cout << endl << " Исходный массив: " << endl << endl;

//Вывод массива на экран
for(int i = 0; i < size; i++)
{
cout << " " << mas[i] << setw(3);
}

cout << endl;

//Объявляем переменную "summa" с начальным значением 0
int summa = 0;

//Цикл для подсчёта суммы
for(int i = (zero + 1); mas[i]; i++)
{
summa += mas[i];
}

//Вывод значения на экран
cout << endl <<" Сумма всех элементов массива в диапазоне между двумя нолями: " << summa << endl << endl;

return 0;
}


Во второй задаче обязательный ввод двух 0.


Удачи Вам!!!

---------
Не ошибается лишь тот, кто ничего не делает. Не бойтесь ошибаться. Бойтесь повторять ошибки. (Теодор Рузвельт, 1858 - 1919)
Ответ отправил: Николай // МMM (статус: Студент)
Ответ отправлен: 16.10.2008, 21:40
Оценка за ответ: 5
Комментарий оценки:
СПАСИБО!

Отвечает: realbustard
Здравствуйте, Булынин!
Код в приложении. Чтобы реализовать последний пункт, я применил сортировку пузырьком, не самый быстрый алгоритм. Если надо, чтобы элементы шли в той же последовательности, что и в мсходном массиве, надо создать такойже массив и скопировать туда элементы в необходимой последовательности.
Удачи!

Приложение:

---------
Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)

Ответ отправил: realbustard (статус: 5-ый класс)
Ответ отправлен: 16.10.2008, 22:27


Вопрос № 147.481
Добрый вечер!

Нужно решение задачи в C++
Задача должна содержать в себе меню по 3-м задачам которые предоставлены и сообственно и их решение, есть приблизительное решение (возможно есть ошибки) этих задач но к сожелению решена только 1 задача. Приложение прилагается с 1 решенно задачей.

В одномерном массиве, состоящем из n целочисленных элементов, вычислить:
1) произведение элементов массива с четными номерами; Готова
2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.
3) Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом все отрицательные (элементы, равные нулю, считать положительными).

Приложение:

Отправлен: 16.10.2008, 23:19
Вопрос задал: Константиниус (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: realbustard
Здравствуйте, Константиниус!
Код задачи в приложении!
Удачи!

Приложение:

---------
Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)

Ответ отправил: realbustard (статус: 5-ый класс)
Ответ отправлен: 17.10.2008, 00:28
Оценка за ответ: 5
Комментарий оценки:
Спасибо!

Отвечает: Николай // МMM
Здравствуйте, Константиниус!

Предоставляю комментированый С++ код, для решения Вашей задачи. Конечно можно было бы с помощью функций и других средств написать код где-то в три раза короче этого, но тогда новичкам в С++ он будет сложнее для понимания. Скомпилировано в MS VS 2005 . Если возникнут какие-либо вопросы по этому коду - задавайте в мини-форум вопроса.

Удачи Вам!!!

Код:

//Заголовок потокового ввода/вывода
#include <iostream>
//Заголовок манипуляторов ввода/вывода
#include <iomanip>

using namespace std;

int main()
{
//Поддержка русского языка
setlocale(LC_CTYPE, "Russian");

//Объявляем массив целых чисел на 10 элементов;
in t mas[50];
//Объявляем переменную размерности и переменную выбора
int size = 0, select;

//Меню
cout << endl << " Выберите нужное действие и нажмите клавишу ENTER: " << endl << endl;

cout << " 1: Произведение элементов массива с чётными номерами. " << endl
<< " 2: Подсчёт суммы элементов массива, расположенных между первым и cледующим 0. " << endl
<< " 3: Размещение элементов массива начиная от положытельных к отрицательным. " << endl
<< " 4: Для выхода з программы " << endl << endl;

//Цикл с послеусловие. Ввод будет производиться до тих пор, пока НЕ будет введено значение 1, 2, 3 или 4
do
{
cout << " >>> ";

//Ввод переменной выбора
cin >> select;

if((select != 1) && (select != 2) && (select != 3) && (select != 4))
{
cout << endl << " Неверный ввод!!! Только значения от 1 до 4 - попробуйте снова!!! " << endl << endl;
}

switch(select)
{
case 1:
{
//Заголовок
cout << endl << " Произведение элементов массива с чётными номерами. " << endl << endl;

//Приглашение ввести значение размерности
cout << " Введите размерность массива (не больше 50): ";

//Ввод значения размерности
cin >> size;

cout << endl << " Введите элементы массива: " << endl << endl;

//Цикл для ввода элементов массива
for(int i = 0; i < size; i++)
{
cout << " Элемент индекса [" << i << "]: ";

cin >> mas[i];
}

//Вывод массива на экран

cout << endl << " Исходный массив: " << endl << endl;

for(int i = 0; i < size; i++)
{
cout << " " << mas[i];
}

cout << endl;

//Объявляем переменную результата с начальным значение 1
int res = 1;

//Цикл для поиска чётных значений и умножения
for(int i = 0; i < size; i++)
{
if ((mas[i] % 2) == 0)
{
res *= mas[i];
}
}

//Вывод значения произведения на экран
cout << endl <<" Произведение всех чётных элементов: " << res << endl << endl;

}

break;

case 2:
{
//Заголовок
cout << endl & lt;< " Подсчёт суммы элементов массива, расположенных между первым и следующим 0. " << endl << endl;

//Приглашение ввести значение размерности
cout << " Введите размерность массива (не больше 50): ";

//Ввод значения размерности
cin >> size;

cout << endl << " Введите элементы массива: " << endl << endl;

//Цикл для ввода элементов массива
for(int i = 0; i < size; i++)
{
cout << " Элемент индекса [" << i << "]: ";

cin >> mas[i];
}

//Вывод массива на экран
cout << endl << " Исходный массив: " << endl << endl;

for(int i = 0; i < size; i++)
{
cout << " " < < mas[i];
}

cout << endl;

//Объявляем переменную "zero" с начальным значением 0
int zero = 0;

//Цикл для получения номера ячейки, в которой хранится первый 0
for(int i = 0; mas[i]; i++)
{
zero++;
}

cout << endl;

//Объявляем переменную "summa" с начальным значением 0
int summa = 0;

//Цикл для подсчёта суммы
for(int i = (zero + 1); mas[i]; i++)
{
summa += mas[i];
}

//Вывод значения на экран
cout << endl <<" Сумма всех элементов массива в диапазоне между двумя нолями: " << summa << endl << endl;

}

break;

case 3:
{
//Заголовок
cout << ; endl << " Размещение элементов массива начиная от положытельных к отрицательным. " << endl << endl;

//Приглашение ввести значение размерности
cout << " Введите размерность массива (не больше 50): ";

//Ввод значения размерности
cin >> size;

cout << endl << " Введите элементы массива: " << endl << endl;

//Цикл для ввода элементов массива
for(int i = 0; i < size; i++)
{
cout << " Элемент индекса [" << i << "]: ";

cin >> mas[i];
}

//Вывод массива на экран
cout << endl << " Исходный массив: " << endl << endl;

for(int i = 0; i < size; i++)
{
cout << " " << mas[i];
}

cout << endl;

//Объявляем переменные для сортировки массива методом пузырька
int a, i, temp;

for(a = 1; a < size; a++)

for(i = (size - 1); i >= a; i--)
{
if(mas[i - 1] < mas[i])
{
temp = mas[i - 1];
mas[i - 1] = mas[i];
mas[i] = temp;
}
}

//Вывод массива на экран
cout << endl << " Массив, в котором элементы размещены начиная от положительных к отрицательным: " << endl;

for(int i = 0; i < size; i++)
{
cout << " " << mas[i];
}

cout << endl << endl;

}

break;

}

}
while((select != 4) && (select != 3) && (select != 2) && (select != 1));

cout & lt;< endl;

return 0;

}





---------
Не ошибается лишь тот, кто ничего не делает. Не бойтесь ошибаться. Бойтесь повторять ошибки. (Теодор Рузвельт, 1858 - 1919)
Ответ отправил: Николай // МMM (статус: Студент)
Ответ отправлен: 17.10.2008, 01:34
Оценка за ответ: 5
Комментарий оценки:
Выручил!


Вопрос № 147.532
Здравствуйте. Я изучаю MFC на VS2008 по книге Visual C++ .NET. Библия пользователя(правда, книга написана под версию VS .Net, и поэтому приходится имеющиеся в ней примеры корректировать по новым "правилам" VS)... Так вот я там столкнулся со следующей проблемой...

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

Код:

void CSimpleTextTransferDlg::OnBnClickedCopy()
{
if (UpdateData())
{
CString strData;
m_edtToClipboard.GetWindowTextW(strData);

//Проверить, можно ли открыть буфер обмена перед выполнением циклов по распределению памяти
if (OpenClipboard())
{
//Опустошить буфер обмена. В результате Windows получит разрешение освободить память, ассоциированную с
//любыми данными, находящимися в буфер е обмена
EmptyClipboard();
//ОК. Буфер обмена пуст и блокирован. Теперь распределим память для данных.
//Здесь просто используется функция GlobalAlloc для выделения блока данных, равного размеру текста
//в поле ввода "ToClipboard" плюс завершающий символ null, необходимый для пересылки
//текста ANSI в буфер обмена
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc (GMEM_DDESHARE, strData.GetLength()+1);
//Вызов функции GlobalLock возвращает указатель на данные, ассоциированные с дескриптором, возвращённым
//функцией GlobalAlloc
char *pchData;
pchData = (char*)GlobalLock(hClipboardData);
//В этом месте нужно использовать стандартную функцию С/С++ strcpy для копирования данных из локальной
//переменной в глобальную память
strcpy (pchData ,LPCSTR(*strData));
//Это снимает блокировку памяти. Помните, не следует вызывать функцию GlobalFree, так как Windows //автоматически освободит память при следующем вызове функции EmptyClipboard
GlobalUnlock(hClipboardData);
//Теперь установим данные буфера обмена, указав, что используется текст ANSI, и передав дексриптор
//глобальной памяти
SetClipboardData(CF_TEXT, hClipboardData);
//И наконец, при завершении работы приложения просто закроем буфер обмена. В результате блокировка
//окажется снята, а другие приложения смогут просматривать и модифицировать его содержимое.
CloseClipboard();
}
}
}


при работе в таком виде, есcтественно, идёт переполнение и стоп в работе строки:

Код:
  strcpy (pchData ,LPCSTR(*strData));


с указанием стопа в файле strcat.asm на участке:

Код:
src_misaligned:                    ; simple byte loop until string is aligned
mov dl,byte ptr [ecx]
add ecx,1
test dl,dl
je short byte_0
mov [edi],dl
add edi,1
test ecx,3
jne short src_misaligned
jmp short main_loop_entrance


Если поменять strcpy на strcpy_s, то компилятор говорит, что функция strcpy_s не может принимать 2 параметра (error C2660: 'strcpy_s' : function does not take 2 arguments), хотя MSDN говорит о возможных 3 и имеется нормальная работа примера:
Код:

char string[80];
strcpy_s( string, "123456789" );


у меня есть подозрение на какую-то несовместимость типов параметров, но что именно тут не так, не могу понять.... Пожалуйста, разъясните мне этот момент.
Отправлен: 17.10.2008, 13:22
Вопрос задал: Loststranger (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 12)

Отвечает: Sergey A. Wedensky
Здравствуйте, Loststranger!

Переполнение здесь не при чем. Конструкция

strcpy (pchData ,LPCSTR(*strData));

вообще непонятна и абсолютно неверна.
При попытке взятия значения по адресу (оператор *) компилятор пытается преобразовать CString к какому-то указателю. Такое преобразование возможно только к LPCTSTR (char* для ANSI-конфигураций и wchar_t* для Unicode), т.к. у CString есть оператор LPCTSTR().
Соответственно, оператор * возвращает первый символ строки (его код), который принудительно преобразуется к указателю (указывающему куда-то в первые 256 байт памяти). Далее, при попытке доступа по этому указателю - Access violation, естественно.

Судя по использованию strcpy и типа char*, Unicod не имеется ввиду. Соответственно,

strcpy (pchData , (LPCTSTR) strData);

и все!

Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 17.10.2008, 14:25
Оценка за ответ: 4
Комментарий оценки:
проблема не снята

Отвечает: Alexandr A. Rakunov
Здравствуйте, Loststranger!
Помоему нужно просто:
strcpy(pchData, static_cast<LPCSTR>(strData));
т.е. не надо разыменовывать strData - вообще не совсем понятно, что при этом происходит, скорее всего вы получаете значение первого символа строки, который потом жёстко приводится к указателю куда-то в начало памяти. но это в случае, если в strData действительно char данные.
У Вас же судя по GetWindowTextW - юникодная компиляция и в strData - лежат не char, а wchar_t - они двухбайтовые, соответственно при выделении памяти надо это учитывать. Количество байт которые нужны для хранения такой строки: (strData.GetLength() * 2 + 2), т.к. GetLength() - возвращает количество символов, а не байт.
И в дальнейшем нужно использовать уже юникодные функции и/или везде пользоваться макросами TCHAR
Ответ отправил: Alexandr A. Rakunov (статус: 7-ой класс)
Ответ отправлен: 17.10.2008, 14:31
Оценка за ответ: 4
Комментарий оценки:
проблема не снята


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

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

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

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

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

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


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


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.6 от 14.10.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru
RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

В избранное