Авторизация



Счетчики

Обмен ссылками

Блог программиста
Главная Форум Последние сообщения
 Форум
Добро пожаловать Гость   [Зарегистрироваться]  Войти
 Тема :Re:Односвязный список-реализация стека.. 03-03-2010 03:26:38 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

сделал так, как написано сверху(ну мне показалось, что так). Но в момент сортировки по адресу просто ничего не происходит
вот код:
Code:
void cList::SortByAdress() { node* temp=new node; node* current,*first,*second; bool isSorted=false; while(!isSorted) { isSorted=true; current=top; first=current->next; while(first->next) { second=first->next; if(first->value > second->value) { isSorted=false; temp=first; current=first; first=second; second=temp; } else { first=first->next; } } } delete temp; }

где ошибка?"
IP сохранен
 Тема :мнение о сайте.. 03-03-2010 02:31:35 
Nexx
Hello, world!
Онлайн с: 02-03-2010 22:42:58
Сообщения: 1
Среда обитания
Форум : Обсуждение сайта
Тема : мнение о сайте

сайт оч понравился, аффтору +5 за язык изложения, юморно и непринужденно, как со старым дружбаном общаешься
готов помочь в наполнении сайта всякими полезностями, исходниками, статьями и т.п.

для связи со мной: nexx_mp@mail.ru

чё требуется могу написать, можем принять общее участие в разработке чего-нибудь сложного, ну короче предлагаю свою посидьную помощь

Да здравствует С++ и Делфи!!!
IP сохранен
 Тема :Re:Русские символы в консоле... 02-03-2010 14:37:10 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Проблемы и обсуждение программ
Тема : Русские символы в консоле.

Добавлю еще, что статья дополнена - описано решение обратной задачи (перекодировка из кодировки ASCII (DOS) в ANSI (Windows)), приведен полный пример работы с русскими символами (ввод и вывод), а также к статье прикреплен архив полностью работоспособного проекта работы со строками русских символов (в том числе и ввод таких строк).
IP сохранен
 Тема :Re:Односвязный список-реализация стека.. 28-02-2010 12:20:28 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

А, ну тоже вариант. Просто я делал исходя из своих соображений. А таким методом, действительно, будет хотя бы переход к следующему элементу прозрачнее. Тогда, скажем, первый элемент обзовем current, следующий за ним first, следующий за ним - second (чтоб не путаться), и каждый раз работать с ними: сравниваем их значения, по необходимости меняем. current используем только в начале каждой итерации цикла, заменяя его на current -> next.
Только нужно будет использовать operator* (оператор рызыменовывания) при обмене, чтобы это был именно обмен значениями. Если не использовать, то будет обмен адресами.
И еще, в качестве условия завершения внутреннего while будет уже не current -> next, а first -> next. Ну и вначале надо проверить, что first -> next не равен нулю (изначально есть хотя бы два элемента).

Программирование как раз тем и хорошо, что одну задачу можно решить несколькими разными способами.;) Выбирайте, который вам больше нравится!:)
IP сохранен
 Тема :Re:Односвязный список-реализация стека.. 28-02-2010 04:58:19 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

По поводу обмена адресами в метод.пособии написано:
Обмен адресами - перестановка адресов 2ух соседних элементов, следующих за элементом с известным указателем. Первый элемент стека в этом случае не сортируеться. Для того, что бы и первый элемент сортировался следует добавить, перед обращением к методу, один любой элемент в стек, а после сортировки его удалить.
В вашем методе вроде и первый элемент стека будет сортироваться.
По поводу моего замечения, извиняюсь, не заметил сначала этой строки.
IP сохранен
 Тема :Re:Односвязный список-реализация стека.. 28-02-2010 04:26:45 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

Цитата:
пропустили строку

Почему же? Эти шесть строк (не считаю строки с Sorted) представляют собой функцию swap:
Code:
temp -> value = current -> value; //Эти две строки присваивают значению temp temp -> next = current -> next; //значение current current -> value = currnext -> value; //Эти две - значению current current -> next = currnext -> next; //значение currnext currnext -> value = temp -> value; //А эти две - значению currnext currnext -> next = temp -> next; //значение temp

По поводу if: здесь я осуществлял обмен значениями - значения всех полей одного объекта копируются в соответствующие поля другого объекта. Это можно было реализовать и по-другому, присваивая сразу весь объект другому. В данном случае генерируемый компилятором operator= для структуры node сделал бы все правильно. Тогда бы вместо приведенных выше шести строк было бы следующее:
Code:
(*temp) = (*current); (*current) = (*currnext); (*currnext) = (*temp);

Разыменовывание здесь необходимо, чтобы копировалось именно все содержимое объекта. Если убрать звездочки - получится простое присваивание указателей и это будет уже обмен адресами.
IP сохранен
 Тема :Re:Односвязный список-реализация стека.. 28-02-2010 02:08:54 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

Спасибо, только после строк
Code:
temp->value=current->value; current->next=current->next;
вы пропустили строку
Code:
currNext->value=temp->value;





И не могли бы вы объяснить, почему вы написали блок if именно так, как вы написали? Ведь можно было и так:
Code:
Sorted=false; temp->value=current->value; current->value=currNext->value; currNext->value=temp->value;








в чем "приемущество"(если можно так выразиться) вашего кода?
IP сохранен
Последний раз редактировалось: 28-02-2010 02:08:54 Автор rudolf т.к. Добавление в сообщение новой информации
 Тема :Re:Односвязный список-реализация стека.. 27-02-2010 19:40:08 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

Во-первых, не забывайте про парность new-delete. Любые выделенные ресурсы в конце концов должны быть освобождены когда в них отпадет нужда.
Во-вторых, у вас тут много лишнего и странного... Нам достаточно создать один объект типа node (тот самый temp).
Кроме того, не забываем, что в нашем стеке все начинается с top, от него мы и идем вглубь, а вовсе не от bot (поскольку bot -> next == 0, то цикл while вообще в вашем варианте не будет выполняться).
Также для сортировки одного прохода будет мало, нам нужно будет совершать проходы по списку до тех пор, пока не получим удовлетворительный результат. Таким образом, если мы используем метод пузырьковой сортировки с условием остановки что весь список отсортирован должным образом, то код будет примерно следующий:
Code:
void cList::SortByValue() { node* temp=new node; //Нам понадобится только один объект типа node node* current; //И два указателя на объекты такого типа node* currnext; //Следующий за current элемент bool Sorted = false; //Отсортирован ли список while (!Sorted) { Sorted = true; //Если в дальнейшем не случится неправильных расположений - значит отсортирован current = top; //Снова и снова начинаем проход с начала while(current->next) //Пока не дойдем до конца { currnext = current -> next; if(current -> value > currnext -> value) { Sorted = false; //Обнаружено неправильное расположение - значит все еще не отсортирован temp -> value = current -> value; temp -> next = current -> next; current -> value = currnext -> value; current -> next = currnext -> next; //Заодно теперь current указывает на следующий //элемент списка, что обеспечивает продвижение по списку currnext -> value = temp -> value; currnext -> next = temp -> next; } else current = current -> next; //В этом случае мы вручную продвигаемся к следующему элементу } } delete temp; //Не забываем освобождать память }

Кстати, в вашем варианте с new получается следующее: мы выделили память для двух объектов, а затем тут же потеряли к ней доступ, т.к. адрес в указателях, ссылавшихся на них были замещены адресами других объектов и в итоге мы уже не можем использовать память по назначению, но при этом она считается занятой и больше никто не сможет получить к ней доступ.
IP сохранен
 Тема :Re:Односвязный список-реализация стека.. 27-02-2010 15:58:10 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

Я решил реализовать сортировку этого списка(я с вами согласен, что в стеке не должно быть сортировки, но все же по заданию надо), сортировку надо сделать 2умя способами перестоновки элементов: обмен адресами(1) и обмен значеиями(2).
Я начал пробывать реализовать второй способ, вот, что из этого вышло:
Code:
void cList::SortByValue() { node* next=new node; node* temp=new node; node* current=bot; while(current->next) { next=current->next; if(current->value < previous->value) { temp=current; current=next; next=temp; } current=temp->next; } }
но этот вариант не работает, хотя, мне кажется, что тут все верно.
Не могли бы указать на ошибку?
IP сохранен
 Тема :Re:Односвязный список-реализация стека.. 27-02-2010 14:11:14 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

Спасибо, помогли.
IP сохранен
 Тема :Re:Односвязный список-реализация стека.. 26-02-2010 01:01:56 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

Теперь по поводу функции push. Тут вы, кажется, немного напутали. Поэтому сначала кратко опишу, как будет работать стек. В стеке нас интересует главным образом только самых верхний элемент (т.е. top). Функцией push мы будем добавлять новый элемент, превращая его в top, а бывший top станет next для нового. Функция pop удаляет верхний элемент, делая top'ом его next. Стало быть,
Code:
void cList::push(int val) //Лучше не давать переменным, пусть даже из разных областей видимости, одинаковые имена - value в нашем случае { node* temp = new temp; temp -> value = val; temp -> next = top; //Мы в любом случае добавляем новый элемент top = temp; //Если стек был пуст, то temp -> next == 0, ничего особенного if (bot == 0) //Если до выполнения функции не было даже нижнего элемента (стек был пуст) bot = top; }

Функция pop будет такой:
Code:
int cList::pop() { if (bot == 0) {/*Ошибка! Стек пуст!*/} else { int val = top -> value; if (top != bot) //Если осталось больше одного элемента { node* temp = top; top = top -> next; delete temp; } else { delete top; top = bot = 0; } return val; } }

Для сохранения единообразия это можно записать и так:
Code:
int cList::pop() { if (bot == 0) {/*Ошибка! Стек пуст!*/} else { int val = top -> value; node* temp = top; top = top -> next; delete temp; if (temp == bot) bot = 0; return val; } }

Функция DeleteAll, стало быть, извлекает элементы по одному до тех пор, пока не станет равным нулю bot:
Code:
void cList::DeleteAll() { while (bot) //Эквивалентно while (bot != 0), т.е. до тех пор, пока есть хоть один элемент pop(); }

Вот вроде бы и все, что я хотел бы сказать по этому поводу!:)

Статью по спискам, возможно, добавлю как руки дойдут!;)

Удачного программирования!:)
IP сохранен
 Тема :Re:Односвязный список-реализация стека.. 26-02-2010 00:00:40 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

Давайте посмотрим...
Во-первых, в стеке необходимо реализовать стандартный интерфейс - функции push и pop. Первая у вас реализована под именем Add, но я вам советую привести к общепринятому наименованию. Вторую можно сделать на основе вашей функции Delete, добавив только возвращение значения удаляемого элемента.
Во-вторых, в силу своей природы стек не может быть отсортирован и его значения не могут быть выведены на печать без освобождения всего стека (получение значения элемента неизбежно влечет за собой изъятие элемента из стека). Функции DeleteAll() и переменная itsCount не являются необходимыми для реализации стека, но, возможно, вы захотите их использовать где-то в программе.
Таким образом, интерфейс стека у нас будет выглядеть следующим образом:
Code:
struct node { int value;/ node *next; }; class cList { public: cList(); ~cList(); void push(int value); //Добавляет элемент в стек int pop(); //Возвращает верхний элемент, извлекая его из стека void DeleteAll(); //Извлекает все элементы private: node *top; //Верхний элемент, последним помещенный в стек, первым будет извлекаться node *bot; //Самый нижний элемент, будет извлечен в последнюю очередь int itsCount; //Возможно, вы захотите реализовать функцию GetCount() };

Теперь пойдем по реализации. Первым делом предостерегу вас от использования макроса NULL. Как и любой макрос, он таит в себе потенциальную опасность и может привести к очень тонким и трудно уловимым ошибкам. Поскольку макрос представляет собой вставляемый фрагмент кода, то 0, который скрывается за ним, не имеет типа, поэтому его использование небезопасно с точки зрения типов. Лучше либо явно указывайте в коде 0, либо используйте константу навроде
Code:
const void* Null = 0;

Теперь по поводу конструктора. Лучше всего вместо вашего варианта
Code:
cList::cList() { top=NULL; bot=NULL; itsCount=0; }

использовать список инициализации:
Code:
cList::cList(): top(0), bot(0), itsCount(0) { }

поскольку ваш вариант равнозначен следующему:
Code:
cList::cList(): top(), bot(), //Инициализация по умолчанию itsCount() { top=NULL; bot=NULL; itsCount=0; }

Во-первых, переменным лишний раз присваивается значение (что для больших объектов в качестве членов класса чревато излишними накладными расходами), во-вторых, у некоторых из членов может не быть конструктора по умолчанию и тогда код, подобный вашему, не сработает.
IP сохранен
 Тема :Односвязный список-реализация стека.. 25-02-2010 21:38:43 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Улучшение программ
Тема : Односвязный список-реализация стека

Пишу реализацию класса стека через односвязный список. В C++Builder должен быть шаблон стандартный, но надо знать самому как это работает.
вот, то, что есть у меня:
Code:
struct node { int value;/ node *next; }; class cList { public: cList(); ~cList(); void Add(int value); void Delete(); void DeleteAll(); void SortByValue(); void Print(); int GetCount() const; private: node *top; node *bot; int itsCount; }; cList::cList() { top=NULL; bot=NULL; itsCount=0; } cList::~cList() { DeleteAll(); } void cList::Add(int value) { node *temp=new node; temp->value=value; if(top == NULL) { temp->next=NULL; top=bot=temp; } else//иначе { top=temp; temp->next=bot; bot=temp; } itsCount++; } void cList::Delete() { node *temp=top; top=top->next; delete temp; itsCount--; } void cList::DeleteAll() { while(top!=NULL) { Delete(); } } void cList::Print() { node *temp=top; while(temp!=NULL) { coutnext; if(Next->value value) { int TmpValue=Current->value; Current->value=Next->value; Next->value=TmpValue; isChange=false; } Current=Current->next; } } }
вот. Я хочу попросить автора этих статей http://www.trivialcoding.ru/Programs/Borland-C-Builder/ (а как я понимаю это Captain), что бы рассказал как изменить код, что бы он был более "элегантным" и "красивым". И еще, если не трудно, откомментировать функцию добавления.
И еще, я думаю, было бы полезно добавить подобную статью(реализацию стека, можно и очереди, ну вобщем по спискам) в раздел "Стандартный С++"
IP сохранен
 Тема :Re:Русские символы в консоле... 25-02-2010 18:20:08 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Проблемы и обсуждение программ
Тема : Русские символы в консоле.

Спасибо.
Я подключал iostream.h, но, неизвестно почему, все равно не работало.
То, что скинули вы работает. Спасибо.
IP сохранен
 Тема :Re:Русские символы в консоле... 25-02-2010 18:11:07 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Проблемы и обсуждение программ
Тема : Русские символы в консоле.

Чтобы преобразовать полученный в WordPad файл в работающую программу, нужно, переименовав его в Unit1.cpp (по умолчанию) и заменив им исходный файл, открыть проект в C++ Builder, а затем непосредственно перед уже имеющимися неразборчивыми символами вставить
Code:
#include iostream const int N = 66; const char DosABC[N] =

а непосредственно после них -
Code:
; //Точка с запятой после объявления массива const char WinABC[N] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя" //Эти две строки должны быть разборчивы "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; //Скорее всего, вам придется набрать их вручную в текстовом редакторе Билдера std::string ToDosStr(std::string input) { std::string output = ""; bool Ok; for (unsigned i = 0; i input.length(); i++) { Ok = false; for (int j = 0; j N; j++) if (input[i] == WinABC[j]) { output += DosABC[j]; Ok = true; } if (!Ok) output += input[i]; } return output; } int main() //Функция main может быть, например, такой { std::cout ToDosStr("Если вы меня видите, значит, все хорошо!;)"); std::cin.get(); }

Использование этой функции выглядит так: во всех случаях, когда вам нужно вывести какой-то строковой литерал, то вы вместо, например,
Code:
std::cout "Это - строка!";

пишите
Code:
std::cout ToDosStr("Это - строка!");
Цитата:
И еще Builder ошибку кидает, мол string не являеться объектом класса std.

Возможно, вы забыли включить (include) заголовочный файл iostream:
Code:
#include iostream

Во вложении находится проект консольного приложения C++ Builder, в котором используется функция ToDosStr(). Вы можете, открыв этот проект в C++ Builder, копировать функцию (вместе с обоими массивами) в другие проекты. Копирование извне Билдера скорее всего даст неудовлетворительный результат.
Прикрепленные файлы
 RussianSymbols.rar [2 KB] :: Пример использования функции ToDosStr
IP сохранен
 Тема :Re:Программистский юмор.. 25-02-2010 18:05:02 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Курилка
Тема : Программистский юмор

старая шутка с баша:
-девушки такие же существа, как и мы, только у них в голове вместо if-then-else прописан randomize();
IP сохранен
 Тема :Re:Русские символы в консоле... 25-02-2010 17:49:24 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Проблемы и обсуждение программ
Тема : Русские символы в консоле.

у меня еще возникают проблемы с std::string
Если не турдно, можно ссылку на готовую функцию(я имею ввиду сам .cpp-файл с работающей функцией)?
IP сохранен
 Тема :Русские символы в консоле... 24-02-2010 14:11:03 
rudolf
char
Онлайн с: 24-02-2010 11:03:24
Сообщения: 31
Среда обитания
Форум : Проблемы и обсуждение программ
Тема : Русские символы в консоле.

прочитал вот эту http://www.trivialcoding.ru/Programs/Borland-C-Builder/russian-symbols-c-builder.html статью.
Только у меня не получаеться реализовать эту функцию.
Я делал как написано там:
1)поместил русский алфавит в WordPad и сохранил как текстовый документ MS-DOS
2)создал в Builder'е новое консольное приложение и, ничего туда не добавляя, сохранил его, после чего закрыл билдер.
3)вместо файла unit1.cpp вставил свой файл с алфавитом(п.1).
4)запускаю проект, а там нчиего кроме несовсем понятных символов нету(впринципе что и следовало ожидать)
а вот что потом делать с функцией, которя приведена в статье я не понял. Пытался копировать ее туда, создавал полностью новое приложение и вставлял туда эту функцию - ничего не вышло. И еще Builder ошибку кидает, мол string не являеться объектом класса std.
Вобщем, если у кого-то уже получилось написать эту функцию - скиньте пожалуйста мне на sdbox@tut.by
IP сохранен
 Тема :Re:График в полярный координатах графи.. 23-12-2009 14:43:43 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Улучшение программ
Тема : График в полярный координатах график...

Тема :Re:График в полярный координатах график...

Как я понял, p = [формула] - это полярная координата r?
Тогда тут все тривиально. Для каждого значения phi находите r(phi), и исходя из них получаете координаты x и y.
Code:
double r(double phi) { return /*формула*/; } void DrawPoint(phi) { double x, y; x = r(phi) * cos(phi); y = r(phi) * sin(phi); //А здесь рисуете точку с координатами x и y, которые только что нашли. //Например, PaintBox1 -> Canvas -> Pixels[x][y] = clGreen; }
IP сохранен
 Тема :Re:График в полярный координатах графи.. 23-12-2009 14:43:42 
Captain
int main()
Онлайн с: 28-03-2009 11:37:34
Сообщения: 39
Среда обитания
Форум : Улучшение программ
Тема : График в полярный координатах график...

Тема :Re:График в полярный координатах график...

Как я понял, p = [формула] - это полярная координата r?
Тогда тут все тривиально. Для каждого значения phi находите r(phi), и исходя из них получаете координаты x и y.
Code:
double r(double phi) { return /*формула*/; } void DrawPoint(phi) { double x, y; x = r(phi) * cos(phi); y = r(phi) * sin(phi); //А здесь рисуете точку с координатами x и y, которые только что нашли. //Например, PaintBox1 -> Canvas -> Pixels[x][y] = clGreen; }
IP сохранен
Страница #  « ПерваяПредыдущая1234567СледующаяПоследняя »


Powered by ccBoard