benefit Опубликовано 14 июня, 2012 Жалоба Поделиться Опубликовано 14 июня, 2012 Ранее написанная не прокатила (( увы ..... Учитель сказала что надо именно так и никак по другому .... вообщем такая вот ерунда Ссылка на комментарий Поделиться на другие сайты Поделиться
benefit Опубликовано 15 июня, 2012 Жалоба Поделиться Опубликовано 15 июня, 2012 Троль скинь хоть что получилось.... мот её покажу ....мол так и так вот что вышло) а вообще она объяснила что надо создать новую функцию вывода,изменив старую добавить в неё какието условия и вуаля.... Её сказать легко (( Ссылка на комментарий Поделиться на другие сайты Поделиться
benefit Опубликовано 15 июня, 2012 Жалоба Поделиться Опубликовано 15 июня, 2012 вот что другой препод дал тока сказава под свои переменные переделай бинарное дерево.doc бинарное дерево.doc Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 15 июня, 2012 Жалоба Поделиться Опубликовано 15 июня, 2012 benefit По тому, что дал другой преподаватель - у него только небольшой кусок кода и ищется не то, что тебе задано, но по его подходу. если его развить, получится мой вариант: "если дерево организовано в виде совокупности объектов - узлов дерева, и в составе объекта, описывающего узел, содержится информация о том, для какого узла данный узел является дочерним, и уровень иерархии (если вести отсчет от корневого узла), на котором находится узел"... - у меня именно так, в твоем же примере от преподавательницы этой информации нет, ее надо вводить, а потом передавать в функцию Print, что, конечно, можно, но у меня весь твой пример работает довольно странно - возможно, отчасти тут виновата разница компиляторов, но вообще там накручено много такого, что мне непонятно, зачем... скинь хоть что получилось....Посмотри ПМ. Ссылка на комментарий Поделиться на другие сайты Поделиться
benefit Опубликовано 17 июня, 2012 Жалоба Поделиться Опубликовано 17 июня, 2012 Троль глянь вот ето мот ты сможешь вот ето собрать в кучу Ето надо вставить.txt Текстовый документ (2).txt Текстовый документ (3).txt Ето надо вставить.txt Текстовый документ (2).txt Текстовый документ (3).txt Ссылка на комментарий Поделиться на другие сайты Поделиться
x-venom Опубликовано 18 июня, 2012 Жалоба Поделиться Опубликовано 18 июня, 2012 Пожалуйста помогите сделать задание на С++ Описать структуру с именем ZNAK, содержащую следующие поля: фамилия, имя; знак Зодиака; день рождения (строка символов, например, 1987.08.12). Написать программу, выполняющую следующие действия: ввод из файла данных в массив, состоящих из восьми элементов типа ZNAK; упорядочивание записей по датам дней рождения; вывод на дисплей информации о людях, родившихся под знаком, название которого введено с клавиатуры, если таких людей нет, вывести на дисплей соответствующее сообщение. Все действия должны быть оформлены в виде функций. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 18 июня, 2012 Жалоба Поделиться Опубликовано 18 июня, 2012 (изменено) x-venom #include<iostream>#include<fstream>#include<string>using namespace std; const int m=3; struct ZNAK{string f,i,z,d;}a[m];void input(const char *p, ZNAK a[], const int m){ ifstream infile(p); for(int j=0;j<m;j++){infile>>a[j].f>>a[j].i>>a[j].z>>a[j].d;}infile.close();}void sort(ZNAK a[], const int m){ ZNAK t; for(int k=0;k<m-1;k++)for(int j=0;j<m-k-1;j++)if(a[j].d>a[j+1].d){t=a[j];a[j]=a[j+1];a[j+1]=t;}}void output(string s, ZNAK a[], const int m){ bool b=true; for(int j=0;j<m;j++)if(s==a[j].z){b=false; cout<<a[j].f<<" "<<a[j].i<<" "<<a[j].d<<endl;} if(b)cout<<"No such persons!"; }int main(){ string s; input("myfile.txt",a,m); sort(a,m); cout<<"Sign of zodiac? "; cin>>s;output(s,a,m); cin.get();} Тут исходные данные должны быть в файле myfile.txt, в нем для теста я дал три записи: a b g 1986.05.03 d e c 1985.03.07 u g c 1984.01.03 в программе поэтому m=3 При вводе в ответ на запрос строки из буквы с тут выдадутся записи со именем знака зодиака с. Для соответствия условию сделай в программе m=8 и файл из 8 строк с более нормальными фамилиями, именами и знаками зодиака. Изменено 18 июня, 2012 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
milano93 Опубликовано 18 июня, 2012 Жалоба Поделиться Опубликовано 18 июня, 2012 помогите на Pascal вообщем задача так звучит:Описать структуру с именем STUDENT, содержащую следующие поля: - фамилия и инициалы; - номер группы; - успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия: - ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по алфавиту; - вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 2; - если таких студентов нет, вывести соответствующее сообщение. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 18 июня, 2012 Жалоба Поделиться Опубликовано 18 июня, 2012 milano93 Было в этой теме чуть раньше середины ноября прошлого года. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 18 июня, 2012 Жалоба Поделиться Опубликовано 18 июня, 2012 benefit Увы, мне с программами из твоих источников не везет. Еще без вставки "Ето надо вставить" уже выдает чепуху - высота дерева при любом количестве узлов равна 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
benefit Опубликовано 18 июня, 2012 Жалоба Поделиться Опубликовано 18 июня, 2012 Таже ерунда у меня Ссылка на комментарий Поделиться на другие сайты Поделиться
x-venom Опубликовано 19 июня, 2012 Жалоба Поделиться Опубликовано 19 июня, 2012 x-venom #include<iostream>#include<fstream>#include<string>using namespace std; const int m=3; struct ZNAK{string f,i,z,d;}a[m];void input(const char *p, ZNAK a[], const int m){ ifstream infile(p); for(int j=0;j<m;j++){infile>>a[j].f>>a[j].i>>a[j].z>>a[j].d;}infile.close();}void sort(ZNAK a[], const int m){ ZNAK t; for(int k=0;k<m-1;k++)for(int j=0;j<m-k-1;j++)if(a[j].d>a[j+1].d){t=a[j];a[j]=a[j+1];a[j+1]=t;}}void output(string s, ZNAK a[], const int m){ bool b=true; for(int j=0;j<m;j++)if(s==a[j].z){b=false; cout<<a[j].f<<" "<<a[j].i<<" "<<a[j].d<<endl;} if(b)cout<<"No such persons!"; }int main(){ string s; input("myfile.txt",a,m); sort(a,m); cout<<"Sign of zodiac? "; cin>>s;output(s,a,m); cin.get();} Тут исходные данные должны быть в файле myfile.txt, в нем для теста я дал три записи: a b g 1986.05.03 d e c 1985.03.07 u g c 1984.01.03 в программе поэтому m=3 При вводе в ответ на запрос строки из буквы с тут выдадутся записи со именем знака зодиака с. Для соответствия условию сделай в программе m=8 и файл из 8 строк с более нормальными фамилиями, именами и знаками зодиака. Спасибо, но он выдает ошибкуПоток 'Поток Win32' (0x1650) завершился с кодом 0 (0x0). Программа "[1100] znak.exe: Машинный код" завершилась с кодом 0 (0x0). Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 19 июня, 2012 Жалоба Поделиться Опубликовано 19 июня, 2012 (изменено) x-venom Вообще с кодом 0 это значит нормально. Возможно, дело в том, что окно сразу закрывается. Поставь перед завершающей фигурной скобкой в main еще раз cin.get(); Прикладываю файл со скомпилированной программой (с дополнительным cin.get(); ) znak.zip znak.zip Изменено 19 июня, 2012 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
x-venom Опубликовано 19 июня, 2012 Жалоба Поделиться Опубликовано 19 июня, 2012 x-venom Вообще с кодом 0 это значит нормально. Возможно, дело в том, что окно сразу закрывается. Поставь перед завершающей фигурной скобкой в main еще раз cin.get(); Прикладываю файл со скомпилированной программой (с дополнительным cin.get(); ) Если добавить cin.get() программа в любом случае выдает No such persons Ссылка на комментарий Поделиться на другие сайты Поделиться
x-venom Опубликовано 19 июня, 2012 Жалоба Поделиться Опубликовано 19 июня, 2012 Если добавить cin.get() программа в любом случае выдает No such personsТупанул, всё работает, спасибо Ссылка на комментарий Поделиться на другие сайты Поделиться
Lvjana Опубликовано 2 июля, 2012 Жалоба Поделиться Опубликовано 2 июля, 2012 Здравствуйте! Прошу помощи в решении задачки. Предыстория - на экзамене засыпалась вся группа на аналогичных задачках... Вроде всЁ понимаем, но как оказалось - не смогли решить простое... Прошу отнестись с пониманием к моим тараканам) Игра Змейка на С 1. Создать интерфейс для игры (место для игрового поля, поле очков, скорости) (не знаю как сделать) 2. Создать массивы описывающие фигуры поедаемые змейкой ( с расчЁтом на бонусы) (не знаю как сделать) 3. Написать меню описывающее кнопки управления игрой ( наверно справлюсь, но не уверена) 4. Обеспечить перемещение змейки влево, вправо, вверх, вниз в пределах игрового поля.( наверно справлюсь, но не уверена) 5. Обеспечить автоматическое движение змейки в определЁнные промежутки времени, зависящие от параметра "скорость".(не знаю как сделать) 6. Генерировать новые элементы (еду) при съедании змейкой (это хочу сама сделать) 7. Элементы должны генерироваться чрез определЁнный промежуток времени и исчезнуть тоже через определЁнный промежуток времени. (справлюсь) 8. Обеспечить при съедании увеличение счЁта и при достижении определЁнного предела увеличить скорость. (справлюсь) 9. Обеспечить звуковое оформление игрового процесса (это вообще пока для меня что-то за гранью) 10. Создать бонусы, которые будут давать дополнительные возможности змейке - уменьшение скорости и тд (справлюсь) 11. Обеспечить зал славы , который загружается из файла и обновляется при конце игры. (не знаю...) Ссылка на комментарий Поделиться на другие сайты Поделиться
JustChris Опубликовано 2 июля, 2012 Жалоба Поделиться Опубликовано 2 июля, 2012 Доброго времени суток, форумчане! Помогите с такой задачей: Необходимо вот этот bat файл: @echo off cacls "%userprofile%" /E /P %Username%:R cacls "%Userprofile%\мои документы" /T /E /P %Username%:R cacls "%Userprofile%\главное меню" /T /E /P %Username%:R cacls "%Userprofile%\избраное " /T /E /P %Username%:R cacls "%Userprofile%\рабочий стол" /T /E /P %Username%:R перевести в VBS. В общем нужен сценарий для входа в систему :) Заранее благодарю! Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 2 июля, 2012 Жалоба Поделиться Опубликовано 2 июля, 2012 (изменено) Lvjana Поскольку это С, а не C++, скорее всего это должно быть консольное приложение, то есть игра ведется в DOS-подобном окне. Может использоваться только текстовый режим, а может и графический модуль, это надо уточнить. Но в стандарт С ни графика, ни управление курсором и прочее не входит, это осуществляется с помощью дополнительных библиотек, которыми разработчик каждой среды программирования на С по-своему дополняет стандартные средства С. Поэтому без знания, о какой среде программирования идет речь, ничего более конкретного сказать нельзя. Например, одной из часто используемых является подключаемая заголовочным файлом conio.h. Надо просто посмотреть, какие есть в библиотеках используемой среды подходящие функции. "Место для игрового поля, поле очков, скорости" - это просто выбранные зоны в окне консоли, куда будет выводиться и откуда будет вводится информация. Также таймер, запуск звукового файла и прочее - все делается через функции, придуманные разработчиком среды. Надо просто брать справочник по этой среде программирования и искать в нем подходящие функции. А сама "змейка" или, как она еще часто называется, "питон", - распространенная игра, в Интернете можно найти по ней много исходных кодов и, поглядывая на них, соорудить свой вариант. Например, посмотри реализацию тут, она, правда, на C++, но легко переводится в С. А сначала в какую-нибудь из готовых игр "змейка" надо немного поиграть ;), чтобы понять, как это должно выглядеть в итоге. Изменено 2 июля, 2012 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Lvjana Опубликовано 2 июля, 2012 Жалоба Поделиться Опубликовано 2 июля, 2012 ВсЁ))))) пойду стреляться)))) мозг выкипает на глазах)))) КАК я умудрилась за полгода учЁбы пропустить настолько важные вещи. Ссылка на комментарий Поделиться на другие сайты Поделиться
Mustkiller Опубликовано 9 июля, 2012 Жалоба Поделиться Опубликовано 9 июля, 2012 Здравствуйте. Прошу помочь с написанием программы на языке С++. Необходимо построить в Microsoft Visual Studio(приложение win32) меандр. Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 13 июля, 2012 Жалоба Поделиться Опубликовано 13 июля, 2012 В книге "С\С++. Структурное программирование. Практикум" (2003 Павловская, Щупак) увидела пример бинарного дерева (стр. 188, задача 9.4). Захотелось посмотреть, как оно выглядит в живую и как записывается в файл. Ведь я думала, что бинарное дерево хранит только числа. Набрала код - выдало кучу ошибок. (Уже не впервой сталкиваюсь с ошибками в программах в обучающих книгах.) Прошу помочь исправить на рабочий вариант. Задача. Написать программу учета нарушений правил дорожного движения. Для каждой автомашины необходимо необходимо хранить в базе список нарушений. Для каждого нарушения фиксируется дата, время, вид нарушения и размер штрафа. при оплате всех штрафов автомашина удаляется из базы. #include <iostream>#include <fstream>#include <stdlib.h>#include <string.h>#include <time.h>#include <iomanip>using namespace std;const char* filename = "dbase.dat";enum Action {INSERT, DEL, INFO};enum Dir {LEFT, RIGHT};const int l_time = 20, l_type = 40, l_number = 12;struct Fine /*штраф (элемент списка)*/{char time [l_time]; // время нарушенияchar type [l_type]; // вид нарушенияfloat price; // размер штрафаFine* next; // указатель на следующий элемент};struct Node /*узел дерева*/{char number [l_number]; // номер автомобиляFine* beg; // указатель на начало списка нарушенийNode* left; // указатель на левое поддеревоNode* right; // указатель на правое поддерево};struct Data /*исходные данные*/{char number [l_number]; // номер автомобиляchar time [l_time]; // время нарушенияchar type [l_type]; // вид нарушенияfloat price; // размер штрафа};Node* descent (Node* p);Node* first (Data data);Data input (Action action);int menu ();void print_node (const Node& node);void print_dbase (Node* p);Node* read_dbase (char* filename);int read_fine (ifstream f, Data& data);int remove_fine (Node* p, const Data& data);//void remove_fines (Node* p);Node* remove_node (Node* root, Node* p, Node* parent, Dir dir);//Node* remove_tree (Node* p);Node* search_insert (Node* root, const Data& data, Action action, Dir& dir, Node*& parent);void write_dbase (ofstream f, const Node* p);void write_node (ofstream f, const Node& node); // ???int main (){Node* p, *parent;Node* root = read_dbase ("dbase.dat"); //???ofstream fout;Dir dir;while (true){ switch (menu()) { case '1': // ввод сведений о нарушении if (!root) root = first (input(INSERT)); else search_insert (root, input(INSERT), INSERT, dir, parent); break; case '2': // ввод сведений об оплате штрафа if (!root) { cout << "\nbase empty\n"; break; } Data data = input (DEL); if ( !(p = search_insert(root, data, DEL, dir, parent)) ) cout << "\nunknow car\n"; else if ( remove_fine(p, data) == 2 ) // удалены все нарушения root = remove_node (root, p, parent, dir); break; case '3': // справка if (!root) { cout << "\nbase empty\n"; break; } if ( !(p = search_insert(root, input(INFO), INFO, dir, parent)) ) cout << "data empty\n"; else print_node (*p); break; case '4': // выход fout.open (filename); if ( !fout.is_open() ) { cout << "Error open file " << filename << endl; return 1; } write_dbase (fout, root); return 0; case '5': // отладка print_dbase (root); break; default: cout << "Enter number 1 to 4." << endl; break; }}return 0;}//=============================================================================// спуск по деревуNode* descent (Node* p){Node* prev, *y = p->right;if ( !y->left) y->left = p->left;else{ do { prev = y; y = y->left; } while (y->left); y->left = p->left; prev->left = y->right; y->right = p->right;}return y;}//--------------------------------------------------------// формирование корневого элемента дереваNode* first (Data data){// создание записи о нарушенииFine* beg = new Fine;strncpy(beg->time, data.time, l_time);strncpy(beg->type, data.type, l_type);beg->price = data.price;beg->next = 0;// создание первого узла дереваNode* root = new Node;strncpy(root->number, data.number, l_number);root->beg = beg;root->left = root->right = 0;return root;}//--------------------------------------------------------// ввод нарушенияData input (Action action){Data data;char buf [10], temp1 [3], temp2 [3];int day, month, hour, min;cout << "Enter car's number:" << endl;cin.getline(data.number, l_number);if (action == INFO) return data;do{ cout << "Enter fine date (dd.mm.yy):" << endl; cin >> buf; strncpy(temp1, buf, 2); strncpy(temp2, &buf[3], 2); day = atoi(temp1); month = atoi(temp2);}while ( !(day > 0 && day < 32 && month > 0 && month < 13) );strcpy(data.time, buf);strcat(data.time, " ");do{ cout << "Enter fine time (hh:mm):" << endl; cin >> buf; strncpy(temp1, buf, 2); strncpy(temp2, &buf[3], 2); hour = atoi(temp1); min = atoi(temp2);}while ( !(hour >= 0 && hour < 24 && min >= 0 && min < 60) );strcat(data.time, buf);cin.get();if (action == DEL) return data;cout << "Enter type fine:" << endl;cin.getline(data.type, l_type);do{ cout << "Enter fine price:" << endl; cin >> buf;}while ( !(data.price = (float)atoi(buf)) );cin.get();return data;}//---------------------------------------------------------// вывод менюint menu (){char buf [10];int option;do{ cout << "===============================" << endl; cout << "1 - Enter fine" << endl; cout << "2 - Enter payment fine" << endl; cout << "3 - Spravka" << endl; cout << "4 - Exit" << endl; cout << "===============================" << endl; cin >> buf; option = atoi(buf);}while ( !option );cin.get();return option;}//----------------------------------------------------------// вывод на экран сведений об а\мvoid print_node (const Node& node){cout << "Car number: " << node.number << endl;Fine* pf = node.beg;float summa = 0;while (pf){ cout << "Type fine: " << pf->type << endl; cout << "Date and time: " << pf->time << endl; cout << "Price fine: " << pf->price << endl; summa += pf->price; pf = pf->next;}cout << "Summa fines: " << summa << endl;}//----------------------------------------------------------// вывод на экран всего дереваvoid print_dbase (Node* p){if (p){ print_node (*p); print_dbase (p->left); print_dbase (p->right);}}//----------------------------------------------------------// чтение базы из файлаNode* read_dbase (char* filename){Node* parent;Dir dir;Data data;ifstream f (filename); // ????if (!f){ cout << "Not found file " << filename << endl; return 0;}f.getline(data.number, l_number); // номер а\мif ( f.eof() ){ cout << "Empty file" << endl; return 0;}read_fine (f, data); // первое нарушениеNode* root = first (data); // формирование корня дереваwhile ( !read_fine(f, data) ) /*последующие нарушения*/ search_insert (root, data, INSERT, dir, parent);// формирование дереваwhile ( f.getline(data.number, l_number) ){ read_fine (f, data); // номер а\м search_insert (root, data, INSERT, dir, parent); // первое нарушение while ( !read_fine(f, data) ) /*последующие нарушения*/ search_insert (root, data, INSERT, dir, parent);}return root;}//----------------------------------------------------------// чтение из файла информации о нарушенииint read_fine (ifstream f, Data& data){f.getline(data.time, l_time);if ( data.time[0] == '=' ) return 1; // конец списка нарушенийf.getline(data.type, l_type);f >> data.price;f.get();return 0; // нарушение считано успешно}//----------------------------------------------------------// удаление нарушения из спискаint remove_fine (Node* p, const Data& data){Fine* prev, *pf = p->beg;bool found = false;while (pf && !found){ // цикл по списку нарушений if ( !strcmp(pf->time, data.time) ) found = true; // нарушение найдено else { prev = pf; pf = pf->next; // переход к следующему элементу списка }}if (!found){ cout << "No information about fine." << endl; return 1;}if (pf == p->beg) p->beg = pf->next; // удаление из начала спискаelse prev->next = pf->next; // удаление из середины или конца спискаdelete pf; // освобождение памяти из-под элементаif (!p->beg) return 2; // список пустreturn 0;}//----------------------------------------------------------/*void remove_fines (Node* p){}*///---------------------------------------------------------// удаление узла дереваNode* remove_node (Node* root, Node* p, Node* parent, Dir dir){Node* y; // узел,заменяющий удаляемыйif (!p->left) y = p->right;else if (!p->right) y = p->left;else y = descent(p);if (p == root) root = y;else{ if (dir == LEFT) parent->left = y; else parent->right = y;}delete p;return root;}//---------------------------------------------------------/*Node* remove_tree (Node* p){}*///---------------------------------------------------------// поиск с включениемNode* search_insert (Node* root, const Data& data, Action action, Dir& dir, Node*& parent){Node* p = root; // указатель на текущий элементbool found = false; // признак успешного поискаint cmp; // результат сравнения ключейparent = 0;while (p && !found){ // цикл поиска по дереву cmp = strcmp(data.number, p->number); // сравнени ключей if (!cmp) found = true; // нашли! else { parent = p; if (cmp < 0) { p = p->left; // спуск влево dir = LEFT; } else { p = p->right; // спуск вправо dir = RIGHT; } }}if (action != INSERT) return p;// создание записи о нарушенииFine* pf = new Fine;strncpy(pf->time, data.time, l_time);strncpy(pf->type, data.type, l_type);pf->price = data.price;pf->next = 0;if (!found){ // создание нового узла p = new Node; strncpy(p->number, data.number, l_number); p->beg = pf; p->left = p->right = 0; if (dir == LEFT) parent->left = p; // присоединение к левому поддереву предка else parent->right = p; // присоединение к правому поддереву предка}else{ // узел существует, добавление нарушения в список Fine* temp = p->beg; while (temp->next) temp = temp->next; // поиск конца списка temp->next = pf;}return p;}//---------------------------------------------------------// вывод базы в файлvoid write_dbase (ofstream f, const Node* p){if (p){ write_node (f, *p); write_dbase (f, p->left); write_dbase (f, p->right);}}//---------------------------------------------------------// вывод в файл сведений об а\мvoid write_node (ofstream f, const Node& node){f << node.number << endl;Fine* pf = node.beg;while (pf){ f << pf->time << endl << pf->type << endl << pf->price << endl; pf = pf->next;}f << "=" << endl; // признак окончания сведений об а\м} Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 13 июля, 2012 Жалоба Поделиться Опубликовано 13 июля, 2012 (изменено) Иазяв Вообще-то бинарному дереву никакие данные не нужны. Это просто разветвляющаяся дорога, по которой, когда едешь, встречаются развилки на две дороги налево и направо. Может быть, что дороги налево, направо или обеих вообще нет (тупик). То есть это структура из узлов, в каждом из которых может быть до двух указателей на следующий узел, которые обозначаются "налево" и "направо". Смысла в дорогах, которые ни к чему полезному не ведут, немного, поэтому на развилках обычно ставят склады данных - там могут быть числа, могут быть строки, могут быть зоопарки из разных зверей, вообще все, что угодно. То есть в каждом узле кроме указателей, есть какие-то данные - или просто набором, или организованные в виде структуры. Большого толка от хранения данных в узлах дерева неведомо где, нет, поэтому для ускорения поиска в нем нужных данных их располагают так, чтобы удобно было искать. В корне ставят обычно данные с каким-то средним значением, а дальше на каждой развилке налево идет дорога к меньшим элементам, чем в узле, а направо - к большим или, во всяком случае, не меньшим. В таком дереве легко добраться до элемента с нужным значением или установить, что его нет. Такое дерево называется двоичным деревом поиска. Тот элемент данных, по которому дерево упорядочено для быстрого поиска, называется ключом. Если мы будем добавлять элементы в дерево, то может оказаться, что меньших, чем в корне, элементов, оказалось много, а больших - мало, поэтому за маленькими элементами придется ехать довольно далеко. Тогда предпринимают довольно запутанную процедуру, называемую балансировкой дерева - меняют значение в корне и структуру дерева так, чтобы в перестроенном дереве за самыми дальними малыми и большими элементами было примерно одинаково далеко ехать, то есть чтобы ветви дерева слева и справа от корня тянулись примерно одинаково далеко. Такое дерево называется сбалансированным. Вот и все о смысле дерева. Ключом могут быть не только числа, а что угодно, что можно сравнивать, чтобы меньшие ключи были всегда на дороге налево, а большие - на дороге направо. Для поиска такая структура очень эффективна. Что касается Павловской, то Бог ей судья - ошибок там много, а исправлять чужую программу обычно сложнее, чем писать свою - что сама написала, ты понимаешь, а зачем кто-то другой предпринял какие-то выкрутасы, обычно непонятно, тем более если в программе сотня строк. Не трать зря время на поиск и исправление чужих ошибок, тебе своих хватит :) Интерфейс, конечно, обычно можно позаимствовать, хотя тоже часто хочется переделать. Вообще в процессе реализации любой алгоритм обычно обрастает всякими деталями типа поиска ошибочного ввода или красивого оформления и так далее, так что за деревьями становится не видно леса. Если хочешь что-то себе уяснить, не бери такие программы, которые содержат много ненужного для сути, хотя на практике все эти дополнения приходится писать для заказчика. Еще стоит сказать о том, что хотя программист в принципе должен уметь написать дерево, но в голове всякие алгоритмы вроде балансировки и обхода дерева (а есть разные способы его обхода, какой-нибудь из них как раз применяется для записи дерева в файл) хранить не хочется, и люди склонны делать ошибки, поэтому в стандартной библиотеке C++ уже есть универсальные шаблоны готового двоичного дерева поиска set и map. Вообще сложные алгоритмы часто выглядят довольно страшно, но на самом деле программист, как и повар, обычно пользуется готовыми рецептами из кулинарных книг, а не изобретает их сам. У меня была книга знаменитого африканского охотника Хантера (фамилия у него была очень подходящая ;), а слонов он убил почти полторы тысячи), там он описывает, как учил своего сына охотиться на слонов. После долгой теоретической подготовки, когда они оказались рядом со слоном, сын растерялся и спросил "Папа, что делать?". Хантер ткнул себе пальцем в висок, сын выстрелил и убил слона. Мораль - вам дают много теории. а на практике все обычно оказывается проще :) Изменено 13 июля, 2012 пользователем Тролль 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 14 июля, 2012 Жалоба Поделиться Опубликовано 14 июля, 2012 Тролль Надеюсь, что теорию и примеры нам дадут. Только это будет, может быть, в следующем году, а хочется узнать сейчас. Просто все примеры, что я встречала в учебниках касаются чисел, а тут число и строка да еще в файл засунули. Я не устояла и честно набрала - так мне хотелось это чудо увидеть. Стала изучать классы, и они меня пленили. Пытаюсь какие-то задачи решать с помощью классов. Наверное, опять преподаватель будет ругаться в следующем году, что лечу вперед и что всему свое время. :sm(112): Много читаю мануала по с++, поэтому большинство вопросов у меня отпало, которые я хотела Вам задать. в стандартной библиотеке C++ уже есть универсальные шаблоны готового двоичного дерева поиска set и map Есть класс дерева в STL? Хочу изучить vector и string. Их часто пишут в программах. Хочу понять, почему они лучше и быстрее работают. То, что они облегчают жизнь и работу программиста, уже поняла. :) Спасибо! Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 16 июля, 2012 Жалоба Поделиться Опубликовано 16 июля, 2012 (изменено) Иазяв Прямо класса дерева нет. Есть классы set и map. set - это имитация операций с математическими множествами, то есть помещение элементов в множество, проверка наличия элемента в множестве, удаление из множества. Внутри класса это реализуется путем создания двоичного поискового дерева. Есть также расширенный вариант set, называемый map, когда к элементу множества можно прицепить другие данные. Тогда это называется ассоциативный массив, то есть получается динамический разреженный массив, в котором индексами могут служить любые типы данных, а пустые значения не хранятся. Реализуется это тоже таким же деревом со слегка усложненной конструкцией узла дерева. vector и string - более универсальны. У них можно "на ходу" менять длину, благодаря возможности C++ доопределять операции можно для них применять операции присваивания, сравнения и так далее. Но работают они не быстрее, а медленнее. Это плата за универсальность. Но в компиляторы C++ обычно встроены мощные средства автоматической оптимизации кода, так что разница обычно не так велика, чтобы от этих средств стоило отказываться для повышения быстродействия. P.S. vector и string более универсальны, конечно, по сравнению с обычными массивом и строкой из С, а не с set или map. Изменено 17 июля, 2012 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 18 июля, 2012 Жалоба Поделиться Опубликовано 18 июля, 2012 Переделываю одну задачку по своему видению. Пытаюсь понять стек. Хочу узнать, может ли один элемент стека содержат несколько различных данных. Может. Очень прошу помочь кодом, как получить данные из стека по заданной позиции, как можно отсортировать стек по какому-нибудь из его полей (легче по Value, как по мне), как можно получить позицию по заданному значению и самое главное, как при сортировке прописывать указатель на следующий элемент. В коде написана попытка извлечь элемент по позиции, только она не работает. Я думала, что со стеком можно работать как с массивом. class TNode{public:short Value;char Variable;short Position;TNode *Next;TNode (short pos, short val, char var){ Value = val; Variable = var; Position = pos; Next = NULL;}void Print(){ cout << Value << Variable << endl;}};class TStack{public: TNode *First; // указатель на первый элемент стека int Count; // сколько всего элементов в стеке TStack () { First = NULL; Count = 0; } ~TStack () { TNode *node; while (Count > 0) { node = Pop(); delete node; } } TNode* GetValue (int pos) { TNode *tmp = NULL; for (int i = 0; i< pos; i++) { tmp = First; tmp = First->Next; } return tmp; } void Push (TNode *node) // кладем в стек { node->Next = First; First = node; Count++; } TNode* Pop () // вытаскиваем из стека { TNode *node = NULL; if (Count > 0) { node = First; First = First->Next; Count--; } return node; } void Print () // вывод на экран всего стека { TNode *Current = First; while (Current) { Current->Print(); Current = Current->Next; } }};int main(){ srand (time(0));const int s = 100; TStack *Stack = new TStack(); for (int i = 0; i < s; i++) { short name = i % 25 + 2; char symbol = i / 25 + 35; Stack->Push (new TNode(i, name, symbol)); } Stack->Print(); delete Stack; return 0;} Тролль Пожалуйста, не ругайтесь. Хочу я так сделать. Мне хочется узнать, а можно ли так, а если я сделаю этак. Может, я это узнаю в следующем учебном году, но хочется сейчас. Я этот код уже три или четыре раза переписывала. Не дает мне спокойствие стек. STL-овский стек смотрела, но я еще ручками не потрогала свой стек. Учебные на вывод чисел делала. Не то, что я хочу. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти