Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2010, 19:16   #1
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
Вопрос Ошибка в программе

Код:
#include"stdafx.h" 
#include<iostream> 
#include<math.h> 
using namespace std; 
 
// Структура: 
struct tree 
{ 
char eng; //слово 
int count; //количество обращений 
tree *left; 
tree *right; 
}; 
char temp_eng; 
int temp_count; 
int level=0; 
// Функциясоздания первого элемента 
tree *first (char eng, int count); 
// Функцияпоиска и добавления элемента 
tree *search_insert (tree *root, char eng, int count); 
// Функцияпоказадерева 
void print_tree(tree *p, int level); 
 
// Функцияфрмирования первого элемента дерева: 
tree *first (char temp_eng, int count) 
{ 
tree *pv=new tree; 
pv->eng=temp_eng; 
pv->count=temp_count; 
pv->left=0; 
pv->right=0; 
return pv; 
} 
// Функцияпоиска и добавления элемента в дерево: 
tree *search_insert (tree *root, char temp_eng, int temp_count) 
{ 
tree *pv=root, *prev; 
bool found=true; 
//поиск подереву 
while(pv&&!found) { 
prev=pv; 
if(temp_eng==pv->eng) found = false; 
else if (temp_count < pv->count) pv=pv->left; 
else pv=pv->right; 
} 
if (found) return pv; 
//созданиенового узла 
tree *pnew=new tree; 
pnew->eng=temp_eng; 
pnew->count=temp_count; 
pnew->left=0; 
pnew->right=0; 
if(temp_count < prev->count) 
prev->left=pnew; //присоединение к левому поддереву предка 
else prev->right=pnew; //присоединение к правомуподдереву предка 
return pnew; 
} 
// Функция показа дерева 
void print_tree(tree *p, int level) 
{if (p) 
{ 
print_tree(p->left, level+1); 
for (int i=0; i<level; i++) 
cout<<" "; 
cout<<p->eng<<endl; 
for (int i=0; i<level; i++) 
cout<<" "; 
cout<<p->count<<endl; 
print_tree (p->right, level+1); 
} 
} 
 
// Главнаяфункция: 
int main() 
{ 
int vibor; 
tree *root=NULL; 
do { 
cout<<"Najmite: "<<endl; 
cout<<"1| Dobavitslovo v slovar"<<endl; 
cout<<"2| Vihod"<<endl; 
cout<<"3| Vivestiderevo na ekran"<<endl; 
cin>>vibor; 
switch (vibor) 
{ 
case 1:{cout<<"Vvedite angliskoe slovo: "<<endl; 
cin>>temp_eng; 
cout<<"Vvediteznachenie schetchika: "<<endl; 
cin>>temp_count; 
//создание первого элемента дерева 
if (!root)root=first(temp_eng, temp_count); 
//создание элементо-потомков дерева 
else tree*root=search_insert (root, temp_eng, temp_count); 
}; break; 
case 2: return 0; break; 
case 3: print_tree (root, 0); break; 
default: cout<<"Нужно нажать клавишу от 1 до4"<<endl; 
break; 
} 
} 
while(vibor!=3); 
system("pause"); 
return 0; 
}
когда выбираешь пункт 1 предлагает ввести слово но после того как ввёл выдаёт следующее (скрин на вложенном файле)

Не могу понять почему, где я так забиваю *root ...

может кто поможет, буду благодарен!)
Изображения
Тип файла: jpg Снимок.JPG (191.7 Кб, 156 просмотров)

Последний раз редактировалось Stilet; 01.10.2010 в 09:21.
LuBuMaster вне форума Ответить с цитированием
Старый 01.10.2010, 00:52   #2
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию

ты чтоли опиши что программа делает, ато ведь не знвешь на что смотреть. Но из того, что увидел:
1. Вводится чисто визуально слово, но в переменную temp заносится только 1-я буква (там по идее должен быть массив под слово, как и в структуре). Но опять же, мот оно тебе так и надо, так что опиши задачу.
2. При выборе
Код:
cout<<"Najmite: "<<endl; 
cout<<"1| Dobavitslovo v slovar"<<endl; 
cout<<"2| Vihod"<<endl; 
cout<<"3| Vivestiderevo na ekran"<<endl; 
cin>>vibor;
да и вообще после каждого cin впиши fflush(stdin)
3.и последнее, строка
Код:
else tree*root=search_insert (root, temp_eng, temp_count);
//должна иметь вид
else root=search_insert (root, temp_eng, temp_count); 
//что в принципе некритично, но кода на 5 букв меньше
и главное функция
Код:
tree *search_insert (tree *root, char temp_eng, int temp_count) 
{ 
tree *pv=root, *prev; 
bool found=true; 
//поиск подереву 
while(pv&&!found) { 
prev=pv; 
if(temp_eng==pv->eng) found = false; 
else if (temp_count < pv->count) pv=pv->left; 
else pv=pv->right; 
} 
if (found) return pv; 
//созданиенового узла 
tree *pnew=new tree; 
pnew->eng=temp_eng; 
pnew->count=temp_count; 
pnew->left=0; 
pnew->right=0; 
if(temp_count < prev->count) 
prev->left=pnew; //присоединение к левому поддереву предка 
else prev->right=pnew; //присоединение к правомуподдереву предка 
return pnew; 

//должна быть подправлена на

tree *search_insert (tree *root, char temp_eng, int temp_count) 
{ 
tree *pv=root, *prev; 
bool found=false; //если задать true поиск не будет работать
//поиск подереву 
while(pv&&!found) { 
prev=pv; 
if(temp_eng==pv->eng) found = false; 
else if (temp_count < pv->count) pv=pv->left; 
else pv=pv->right; 
} 
if (found) return pv; 
//созданиенового узла 
tree *pnew=new tree; 
pnew->eng=temp_eng; 
pnew->count=temp_count; 
pnew->left=0; 
pnew->right=0; 
if(temp_count < prev->count) 
prev->left=pnew; //присоединение к левому поддереву предка 
else prev->right=pnew; //присоединение к правомуподдереву предка 
return root;    //а если вернуть pnew ты потеряешь корень дерева
} 
}
Farrel вне форума Ответить с цитированием
Старый 01.10.2010, 00:58   #3
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
По умолчанию

Извиняюсь!)
действительно забыл задание

Англо-русский словарь построен как бинарный список (двоичное
дерево).
Каждая компонента содержит английское слово,соответствующее
ему русское слово и счетчик количества обращений к данной компоненте.
Первоначально бинарный список был сформирован согласно английскому алфавиту. В процессе эксплуатации словаря при каждом обращении
к компоненте в счетчик обращений добавлялась единица.

Составить программу, которая:

-обеспечивает начальный ввод словаря с конкретными значениями
счетчиков обращений;
-формирует новое представление словаря в виде двоичного дерева
по следующему алгоритму:
а) в старом словаре ищется компонента с наибольшим значением
счетчика обращений;
б) найденная компонента заносится в новый словарь и удаляется
из старого;
в) переход кп. а) до исчерпания исходного словаря.

-производит распечатку исходного и нового словарей.

Программа должна обеспечивать диалог с помощью меню ,
ввод/вывод в окна и контроль ошибок при вводе.

Указание: использовать динамические структуры.
LuBuMaster вне форума Ответить с цитированием
Старый 01.10.2010, 01:22   #4
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
По умолчанию

Код:
#include"stdafx.h" 
#include<iostream> 
#include<math.h> 
using namespace std; 

// Структура: 
struct tree 
{ 
char eng; //слово 
int count; //количество обращений 
tree *left; 
tree *right; 
}; 
char temp_eng; 
int temp_count; 
int level=0; 
// Функциясоздания первого элемента 
tree *first (char eng, int count); 
// Функцияпоиска и добавления элемента 
tree *search_insert (tree *root, char eng, int count); 
// Функцияпоказадерева 
void print_tree(tree *p, int level); 

// Функцияфрмирования первого элемента дерева: 
tree *first (char temp_eng, int count) 
{ 
tree *pv=new tree; 
pv->eng=temp_eng; 
pv->count=temp_count; 
pv->left=0; 
pv->right=0; 
return pv; 
} 
// Функцияпоиска и добавления элемента в дерево: 
tree *search_insert (tree *root, char temp_eng, int temp_count) 
{ 
tree *pv=root, *prev; 
bool found=false; 
//поиск подереву 
while(pv&&!found) { 
prev=pv; 
if(temp_eng==pv->eng) found = false; 
else if (temp_count < pv->count) pv=pv->left; 
else pv=pv->right; 
} 
if (found) return pv; 
//созданиенового узла 
tree *pnew=new tree; 
pnew->eng=temp_eng; 
pnew->count=temp_count; 
pnew->left=0; 
pnew->right=0; 
if(temp_count < prev->count) 
prev->left=pnew; //присоединение к левому поддереву предка 
else prev->right=pnew; //присоединение к правомуподдереву предка 
return root; 
} 
// Функция показа дерева 
void print_tree(tree *p, int level) 
{if (p) 
{ 
print_tree(p->left, level+1); 
for (int i=0; i<level; i++) 
cout<<" "; 
cout<<p->eng<<endl; 
for (int i=0; i<level; i++) 
cout<<" "; 
cout<<p->count<<endl; 
print_tree (p->right, level+1); 
} 
} 

// Главнаяфункция: 
int main() 
{ 
int vibor; 
tree *root=NULL; 
do { 
cout<<"Najmite: "<<endl; 
cout<<"1| Dobavitslovo v slovar"<<endl; 
cout<<"2| Vihod"<<endl; 
cout<<"3| Vivestiderevo na ekran"<<endl; 
cin>>vibor; 
switch (vibor) 
{ 
case 1:{cout<<"Vvedite angliskoe slovo: "<<endl; 
cin>>temp_eng; 
cout<<"Vvediteznachenie schetchika: "<<endl; 
cin>>temp_count; 
//создание первого элемента дерева 
if (!root)root=first(temp_eng, temp_count); 
//создание элементо-потомков дерева 
else root=search_insert (root, temp_eng, temp_count);  
}; break; 
case 2: return 0; break; 
case 3: print_tree (root, 0); break; 
default: cout<<"Нужно нажать клавишу от 1 до4"<<endl; 
break; 
} 
} 
while(vibor!=3); 
system("pause"); 
return 0; 
}
Изменил код согласно пункту 3 и 4
и программа перестала выдавать ту дурацкую ошибку, но появилась другая ( вложенный файл)


по пункту 2 есть вопрос, а зачем очищать буфер?
+ слышал что происходят такие вещи что программа выдаёт из-за этого ошибки

а вот что насчёт пункта 1, я скинул задание

и ещё один вопрос может использовать тип данных не char а string ?
и тогда проблемы уйдут?
просто столкнулся с проблемой что Visual Studio при подключении библиотеки <string.h> просто не признаёт тип данных string поэтому решил воспользоваться char
это не критично?
Изображения
Тип файла: jpg Снимок.JPG (34.8 Кб, 99 просмотров)

Последний раз редактировалось Stilet; 01.10.2010 в 09:21.
LuBuMaster вне форума Ответить с цитированием
Старый 01.10.2010, 15:14   #5
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию

буфер надо очищать по одной простой причине, после ввода, в буфере остаётся код кнопки enter и следующий cin подхватывает его, как если бы вы enter нажали, вседствие чего программа и циклится.
Теперь что касается самого слова. char- символ. паскалевского типа string в си нет. Чтобы записать слово надо выделить память под строку, и лучше всего динамически. Т.е.
Код:
char *c;
c=new char [5]
здесь выделена память на слово длиной ЧЕТЫРЕ символа, т.к. пятый символ обязательно должени быть \0 - ноль символ. Теперь со строкой c работаем как с обычным динамическим массивом.

Насчёт последней ошибки не врубился. Что не так то? Если после ввода слова невозможно ввесити значение счётчика(после нажатия enter сразу выскакивает меню), то это всё тот же буфер, по крайней мере похоже на то, так что fflush(stdin) в помощ

Последний раз редактировалось Farrel; 01.10.2010 в 15:20.
Farrel вне форума Ответить с цитированием
Старый 07.10.2010, 17:19   #6
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
По умолчанию

Код:
#include"stdafx.h" 
#include<iostream> 
#include<math.h> 
#include <sstream>
using namespace std; 

// Структура: 
struct tree 
{ 
char eng; //слово 
int count; //количество обращений 
tree *left; 
tree *right; 
}; 
char temp_eng; 
int temp_count; 
int level=0; 
// Функциясоздания первого элемента 
tree *first (char eng, int count); 
// Функцияпоиска и добавления элемента 
tree *search_insert (tree *root, char eng, int count); 
// Функцияпоказадерева 
void print_tree(tree *p, int level); 

// Функцияфрмирования первого элемента дерева: 
tree *first (char temp_eng, int count) 
{ 
tree *pv=new tree; 
pv->eng=temp_eng; 
pv->count=temp_count; 
pv->left=0; 
pv->right=0; 
return pv; 
} 
// Функцияпоиска и добавления элемента в дерево: 
tree *search_insert (tree *root, char temp_eng, int temp_count) 
{ 
tree *pv=root, *prev; 
bool found=false; 
//поиск подереву 
while(pv&&!found) { 
prev=pv; 
if(temp_eng==pv->eng) found = false; 
else if (temp_count < pv->count) pv=pv->left; 
else pv=pv->right; 
} 
if (found) return pv; 
//созданиенового узла 
tree *pnew=new tree; 
pnew->eng=temp_eng; 
pnew->count=temp_count; 
pnew->left=0; 
pnew->right=0; 
if(temp_count < prev->count) 
prev->left=pnew; //присоединение к левому поддереву предка 
else prev->right=pnew; //присоединение к правомуподдереву предка 
return root; 
} 
// Функция показа дерева 
void print_tree(tree *p, int level) 
{if (p) 
{ 
print_tree(p->left, level+1); 
for (int i=0; i<level; i++) 
cout<<" "; 
cout<<p->eng<<endl; 
for (int i=0; i<level; i++) 
cout<<" "; 
cout<<p->count<<endl; 
print_tree (p->right, level+1); 
} 
} 

// Главнаяфункция: 
int main() 
{ 
int vibor; 
tree *root=NULL; 
do { 
cout<<"Najmite: "<<endl; 
cout<<"1| Dobavitslovo v slovar"<<endl; 
cout<<"2| Vihod"<<endl; 
cout<<"3| Vivestiderevo na ekran"<<endl; 
fflush(stdin);
std::getline(cin,vibor,'\n');
switch (vibor) 
{ 
case 1:{cout<<"Vvedite angliskoe slovo: "<<endl; 
fflush(stdin);
std::getline(cin,temp_eng,'\n');
cout<<"Vvediteznachenie schetchika: "<<endl; 
fflush(stdin);
std::getline(cin,temp_count,'\n');
//создание первого элемента дерева 
if (!root)root=first(temp_eng, temp_count); 
//создание элементо-потомков дерева 
else root=search_insert (root, temp_eng, temp_count);  
}; break; 
case 2: return 0; break; 
case 3: print_tree (root, 0); break; 
default: cout<<"Нужно нажать клавишу от 1 до4"<<endl; 
break; 
} 
} 
while(vibor!=3); 
system("pause"); 
return 0; 
}
сори что замучал но теперь другая ошибка в компиляции программы, может я не верно записываю fflush(stdin) ?

ошибка во вложенном файле
Изображения
Тип файла: jpg Снимок.JPG (91.0 Кб, 148 просмотров)

Последний раз редактировалось Stilet; 07.10.2010 в 18:51.
LuBuMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе Vladislav514 Софт 0 13.07.2010 15:16
Ошибка в программе larin1974 Помощь студентам 7 06.03.2010 20:44
Ошибка в программе RoadTrain Общие вопросы Delphi 5 24.10.2007 22:16