Вопрос № 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 Паскальное вообще не понимаю хотельсьбы увидеть на С++
int main() {
//Поддержка русского языка setlocale(LC_CTYPE, "Russian");
//Объявляем массив целых чисел на 10 элементов; int mas[10]; //Объявляем переменную размерности и переменную для хранения результата int size = 0, res = 1;
//Оператор "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; }
//Вывод массива на экран 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) Преобразовать массив таким образом, чтобы сначала располагались все положительные элементы, а потом все отрицательные (элементы, равные нулю, считать положительными).
Отвечает: realbustard
Здравствуйте, Константиниус! Код задачи в приложении! Удачи!
Приложение:
--------- Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)
Ответ отправил: realbustard (статус: 5-ый класс)
Ответ отправлен: 17.10.2008, 00:28 Оценка за ответ: 5 Комментарий оценки: Спасибо!
Отвечает: Николай // МMM
Здравствуйте, Константиниус!
Предоставляю комментированый С++ код, для решения Вашей задачи. Конечно можно было бы с помощью функций и других средств написать код где-то в три раза короче этого, но тогда новичкам в С++ он будет сложнее для понимания. Скомпилировано в MS VS 2005 . Если возникнут какие-либо вопросы по этому коду - задавайте в мини-форум вопроса.
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): ";
--------- Не ошибается лишь тот, кто ничего не делает. Не бойтесь ошибаться. Бойтесь повторять ошибки. (Теодор Рузвельт, 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" );
у меня есть подозрение на какую-то несовместимость типов параметров, но что именно тут не так, не могу понять.... Пожалуйста, разъясните мне этот момент.
Отвечает: 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 Комментарий оценки: проблема не снята