Вопрос № 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. Да и нет на форме кнопочек, чтобы можно было нажать и в строке, где пишется выражение, появилась скобка, ну и чтобы эти скобки воспринималась при вычислении выражения.
Помогите мне, пожалуйста, недоработки исправьте. Очень – очень нужно
Отвечает: 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
Здравствуйте.
В отмеченном мною месте возникает ошибка, не пойму почему. Там я пытаюсь записать текстовые данные в структуру, не получается. А след. строка, запись не текстовых данных в структуру, работает. В чем ошибка?
Отвечает: 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, бесполезно.
Отвечает: kool
Здравствуйте, Емельянов Данил Юрьевич !
---------------------------------
Можно попробовать заново создать проект.
Внимательно посмотреть какое приложение запускается
Debug или Release.
Запустить приложения без среды разработки.
---------------------------------
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 17.06.2007, 11:23 Оценка за ответ: 5
Отвечает: Кайгородов Сергей Александрович
Здравствуйте, Емельянов Данил Юрьевич !
Я делал так:
Убирал файл проекта, затем создавал новый, и подключал к нему все юниты моего предыдущего проекта. Еще, есть проблема, когда проект ссылается на файлы в другом каталоге. Думаю что такой вариант вас спасет. Лучше всего, скопируйте все .dfm и .cpp файлы в отдельный каталог, исключая проектный файл (даже не стоит брать ресурсы, оних все равно потом создаст) и туда же сохраните свой новый проект.
Удачи.
Ответ отправил: Кайгородов Сергей Александрович (статус: 1-ый класс)
Ответ отправлен: 17.06.2007, 12:53 Оценка за ответ: 5 Комментарий оценки: Спасибо за совет. Но у меня уже все работает, просто откомпилировал проект.