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

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


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

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

Выпуск № 775
от 21.06.2007, 23:35

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


Вопрос № 91588: Здравствуйте, уважаемые эксперты! Как сортировать массивы на Паскале по убыванию и возрастанию, я знаю, а вот как это делается на C++? В какой книжке это можно прочесть? Спасибо....
Вопрос № 91594: У меня написана программа, которая реализует постфиксный калькулятор. Это все работает в оболочке C++ Builder 6.0. Помогите добавить на форму еще несколько кнопочек. Мне еще нужно одно окно, в которое будет выводится значение первого и после...
Вопрос № 91611: Здравствуйте. В отмеченном мною месте возникает ошибка, не пойму почему. Там я пытаюсь записать текстовые данные в структуру, не получается. А след. строка, запись не текстовых данных в структуру, работает. В чем ошибка? ...
Вопрос № 91656: Здравтсвуйте, у меня вопрос по C++Builder 6.0 В ходе работы с ним, у меня произошел какой-то глюк и теперь любый вносимые мной изменения не влияют на работу приложения. Я даже весь код удалил, а программа пашет только так! Пробовал переустановить...

Вопрос № 91.588
Здравствуйте, уважаемые эксперты!
Как сортировать массивы на Паскале по убыванию и возрастанию, я знаю, а вот как это делается на C++? В какой книжке это можно прочесть?
Спасибо.

Приложение:

Отправлен: 16.06.2007, 07:32
Вопрос задал: Alenkakiss (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Garmash Dima
Здравствуйте, Alenkakiss!
в приложении несколько кусков программ.
все(кроме одной)- функции. вставляйте, пользуйтесь.(я надеюсь вы знаетье как пользоваться функциями)Рекомендую использовать метод Шелла- он самый быстрый(ощущается при массивах длинной больше 10 000 элементов.
(q1- имя сортируемого массива, s- длинна массива)

Приложение:

Ответ отправил: Garmash Dima (статус: 1-ый класс)
Ответ отправлен: 16.06.2007, 08:20
Оценка за ответ: 5

Отвечает: Sov
Здравствуйте, Alenkakiss!
В приложении 2 примера. В первом используется функция qsort из stdlib. Благодаря тому что функцию сравнения вы пишите сами, можно сортировать объекты с произвольными свойствами.
Результат функции сравнения должен быть отрицательным, если первый аргумент меньше второго, нулем, если аргументы совпадают и положительным, если первый аргумент больше второго.
Второй пример писали вы, я лишь переписал его

Приложение:

Ответ отправил: Sov (статус: 4-ый класс)
Ответ отправлен: 16.06.2007, 09:22
Оценка за ответ: 5

Отвечает: Blohin Ole
Здравствуйте, Alenkakiss!
Д. Кнут - Искусство программирования. Второй том данного толмута посвящен полностью сортировке различных элементов и прочих структур.
Ответ отправил: Blohin Ole (статус: 3-ий класс)
Ответ отправлен: 16.06.2007, 18:00


Вопрос № 91.594
У меня написана программа, которая реализует постфиксный калькулятор. Это все работает в оболочке C++ Builder 6.0.
Помогите добавить на форму еще несколько кнопочек.
Мне еще нужно одно окно, в которое будет выводится значение первого и последнего элементов стека. У меня есть окно (называется “Преобразовано”), в котором пишется вся строка, после того, как введенная пользователем строка преобразуется в польскую запись. Но в этой строке пишутся только цифры, а мне бы еще нужно, чтобы в этом окошке еще были и знаки +,-,/,* в том порядке, как они преобразуются в виде польской записи.
И еще мне нужна строчка (на окне программы она должна находится под сточкой “Результат”), в которой будет выводиться первый элемент стека и последний. И это должно выглядеть примерно так: ***-это первый элемент стека, ***-это последний элемент. Если это цифра или знак операции, неважно, все равно должны выводится на экран значения перв.и посл.элементов и писать сообщение, что это и есть первый и последний элементы.
А еще у меня есть недоработка (ее тоже очень нужно исправить) – не воспринимаются скобки. Например, выражение (1+2)*4 программа считает как 1+2*4=9. А мне бы очень хотелось, чтобы она скобки воспринимала, т.е. (1+2)*4=12. Да и нет на форме кнопочек, чтобы можно было нажать и в строке, где пишется выражение, появилась скобка, ну и чтобы эти скобки воспринималась при вычислении выражения.
Помогите мне, пожалуйста, недоработки исправьте. Очень – очень нужно

Приложение:

Отправлен: 16.06.2007, 09:41
Вопрос задала: SergeevaLyudmila (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Sov
Здравствуйте, SergeevaLyudmila!
Начну с алгоритма преобразования инфиксной записи в постфиксную(без теории не могу)
Читаем очередной символ.
Если символ является числом, добавить его к выходной строке.
Если символ является оператором
1) пока…
…если приоритет o1 меньше либо равен приоритету оператора,
находящегося на вершине стека…
…выталкиваем верхние элементы стека c большим либо
равным приоритетом в выходную строку;
2) помещаем оператор в стек.
Если символ является открывающейся скобкой, помещаем его в стек.
Если символ является закрывающейся скобкой, выталкиваем элементы
из стека в выходную строку до тех пор, пока на вершине стека не
окажется открывающаяся скобка. При этом открывающаяся скобка удаляется из стека,
но в выходную строку не добавляется
Если стек закончился раньше, чем мы встретил открывающуюся скобку,
это означает, что в выражении несогласованы скобки.
Когда входная строка закончилась, вытолкнуть все символы из стека в выходную строку. (В стеке должны были остаться только символы операторов; если это не так, значит в выражении несогласованы скобки.)

Теперь практика
Я решал похожую задачу и потому ваш код я почти полностью удалил(извините разбираться с чужим кодом жутко не люблю,если есть аналогичный свой. Думаю вы запросто переделаете мой, если понадобится)
Стек реализовывайте как хотите лишь бы были методы
push
pop
Top-посмотреть на верхушку не извлекая
empty-проверка на пустоту
далее по коду
zzz-строка, содержащая введеное пользователем выражение, например
((100-85)^2)*(8/2+1)+4^2-3+2*2(берется из edit1)
Применяем к этой строке алгоритм,описанный выше(первый цикл по длине строки zzz)
Получаем постфиксную запись, содержащуюся в массиве строк res
10085-2^82/1+*42^+3-22*+ (выводится в edit2)
res[0]=100
res[1]=85
res[2]=-
res[3]=2
...
Все, дальше бегаем по элементам массива res
встретили число-положили в стек
встретили оператор-извлекли из стека 2 значения применили к ним оператор,результат снова в стек
В конце в стеке 1 число-наш результат
1142 (выводится в edit3)

Приложение:

Ответ отправил: Sov (статус: 4-ый класс)
Ответ отправлен: 16.06.2007, 18:41
Оценка за ответ: 4
Комментарий оценки:
спасибо Вам и на этом.
Но мне хотелось толкьо кнопочки чтоб Вы добавили.
Вот.
Ну я уж сама помудрила.
Чего сделала.
Но знаки операций у меня в стеке не выводтяс на экран.
Вот чего еще не хватает.


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

В отмеченном мною месте возникает ошибка, не пойму почему. Там я пытаюсь записать текстовые данные в структуру, не получается. А след. строка, запись не текстовых данных в структуру, работает. В чем ошибка?

Приложение:

Отправлен: 16.06.2007, 12:14
Вопрос задал: Шеменёв Михаил (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Garmash Dima
Здравствуйте, Шеменёв Михаил!
вместо array[1].nazv='Text'; надо писать array[1].nazv="Text";
''-в них пишется один символ(тип char)
""-строка(char*).
надеюсь в этом ошибка:)
Ответ отправил: Garmash Dima (статус: 1-ый класс)
Ответ отправлен: 16.06.2007, 12:18

Отвечает: Алексей Демаков
Здравствуйте, Шеменёв Михаил!

Поле структуры char nazv[20]; может хранить строку из 19 символов + терминирующий 0. Если вы пытаетесь заполнить это поле строкой "Text" (как уже было указано, для строковых литералов следует использовать двойные кавычки), то необходимо посимвольно скопировать это значение в поле, например, с помощью функций strcpy или strncpy. В вашем примере nazv - это неизвменяемый указатель на начало массива, поэтому возникает ошибка. Если поменять тип: char* nazv; то nazv будет указателем, который можно изменить, чтобы он указывал на необходимую область памяти. В этом случае присваивание
array[1].nazv="Text";
будет корректно. Но учтите, что в самой структуре память под массив не будет выделяться.
Ответ отправил: Алексей Демаков (статус: Студент)
Ответ отправлен: 16.06.2007, 13:38

Отвечает: Ilkras
Здравствуйте, Шеменёв Михаил!
У вас там одинарные кавычки стоят. С не воспринимает одинарные кавычки как тип "char *", стало быть возникает несоответствие типов, а отсюда и ошибка.
Ответ отправил: Ilkras (статус: Студент)
Ответ отправлен: 17.06.2007, 00:35

Отвечает: kool
Здравствуйте, Шеменёв Михаил!
Потому что копирование строки производится так
strcpy(array[1].nazv,"Text");
произвольного набора байт так:
memcpy(array[1].nazv,arr,len_arr);
Удачи!


---------
I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 17.06.2007, 11:24

Отвечает: Ross
Здравствуйте, Шеменёв Михаил!

Итак, давайте все-таки подытожим все ошибки которые вы здесь допустили:
1.В С++ нумерация массивов начинается с 0. Вы объявляете массив из одного элемента, а обращаетесь к элементу с индексом 1. Поэтому, если бы программа скомпилировалась, при выполнении скорее всего выскочила бы ошибка, т.к. произошла бы попытка записи в невыделенную область памяти.
2.Отдельные символы заключаются в одиночные кавычки, а строки в двойные.
3.Копирование строки нельзя производить, используя оператор =. Для этого существует функция strcpy: strcpy(array[0].nazv,"Text"); Как вариант можно использовать класс std::string, тогда так:
#include <string>

using namespace std;
void main()
{
string s; s = "text";
}
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: 10-ый класс)
Ответ отправлен: 17.06.2007, 23:57

Отвечает: Qazzy
Здравствуйте, Шеменёв Михаил!
Скорее всего вместо
array[1].nazv='Text';
надо
array[1].nazv="Text";
Ответ отправил: Qazzy (статус: 1-ый класс)
Ответ отправлен: 18.06.2007, 06:35


Вопрос № 91.656
Здравтсвуйте, у меня вопрос по C++Builder 6.0
В ходе работы с ним, у меня произошел какой-то глюк и теперь любый вносимые мной изменения не влияют на работу приложения. Я даже весь код удалил, а программа пашет только так! Пробовал переустановить C++Builder, бесполезно.

Помогите пожалуйста!!!
Отправлен: 16.06.2007, 18:49
Вопрос задал: Емельянов Данил Юрьевич (статус: 2-ой класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: kool
Здравствуйте, Емельянов Данил Юрьевич !
---------------------------------
Можно попробовать заново создать проект.
Внимательно посмотреть какое приложение запускается
Debug или Release.
Запустить приложения без среды разработки.
---------------------------------
Удачи!

---------
I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 17.06.2007, 11:23
Оценка за ответ: 5

Отвечает: Кайгородов Сергей Александрович
Здравствуйте, Емельянов Данил Юрьевич !
Я делал так:
Убирал файл проекта, затем создавал новый, и подключал к нему все юниты моего предыдущего проекта. Еще, есть проблема, когда проект ссылается на файлы в другом каталоге. Думаю что такой вариант вас спасет. Лучше всего, скопируйте все .dfm и .cpp файлы в отдельный каталог, исключая проектный файл (даже не стоит брать ресурсы, оних все равно потом создаст) и туда же сохраните свой новый проект.
Удачи.
Ответ отправил: Кайгородов Сергей Александрович (статус: 1-ый класс)
Ответ отправлен: 17.06.2007, 12:53
Оценка за ответ: 5
Комментарий оценки:
Спасибо за совет. Но у меня уже все работает, просто откомпилировал проект.


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

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

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

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

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


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


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

В избранное