Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С++] дерево, ... 
:(
    Опции темы
Jolia
Дата 22.5.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 12.3.2007

Репутация: нет
Всего: нет



Доброго всем времени суток. В последний раз обращаюсь за помощью....Не ладится у меня что-то с "древесиной". Посмотрите пожалста smile 

На междугородной телефонной станции картотека абонентов, содержащая сведе¬ния о телефонах и их владельцах, организована как двоичное дерево.
Составить программу, которая:
•    обеспечивает начальное формирование картотеки в виде двоичного дерева;
•    производит вывод всей картотеки;
•    вводит номер телефона и время разговора;
•    выводит извещение на оплату телефонного разговора.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.


Вот что я смогла наделать по этому поводу
Код

#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

struct STATION
{ long nomer;
  char *FIO;
  int  time;
  STATION *left, *right;
};

STATION* dobav(STATION *pttr, STATION kart)
{if (!pttr)
  {pttr=(STATION*) malloc(sizeof(STATION));
  pttr->nomer=kart.nomer;
  pttr->FIO=kart.FIO;
  pttr->time=0;
  pttr->left=0;
  pttr->right=0;
  }
  else
  if (kart.nomer<pttr->nomer)
  pttr->left=dobav(pttr->left,kart);
  else pttr->right=dobav(pttr->right,kart)  ;
  return pttr;
}

STATION* pechat(STATION* pttr)
{
STATION* root;
root=pttr;
  if(pttr)
  {pechat(pttr->left);
  cout<<"Nomer telefona: "<<pttr->nomer<<"\nVladelec: "<<pttr->FIO<<"\n";
  pechat(pttr->right);}
  cout<<"\n";
  return root;
}

void main()
{clrscr();
STATION kart,*pttr;
char c;
cout<<"Zapolnenie kartoteki, ESC=vihod\n";
pttr=NULL;
c=getch();
  while(c!=27)
    {cout<<"Vvedite nomer telefona: \n";
    cin>>kart.nomer;
    cout<<"Vvedite FIO vladelca: \n";
    kart.FIO=new char[100];
    gets(kart.FIO);
    kart.left=NULL;
    kart.right=NULL;
    pttr=dobav(pttr,kart);
    c=getch();
    cout<<"\n";
    }

  cout<<"Viberite dalneishee deistvie:\n";
  cout<<"1 - vivod vsei kartoteki\n";
  cout<<"2 - poisk po kartoteke i vidacha scheta\n";
  cout<<"Vash vibor: " ;
  int k;
  cin>>k;
  cout<<"\n";
  switch(k)
  {case 1:{
       pttr=pechat(pttr);
       getchar();
       break;
  };
  case 2:{ long tel;
  int t;
  cout<<"Vvedite nomer telefona: \n";
  cin>>tel;
  cout<<"Vvedite vremya razgovora: \n";
  cin>>t;
  int q=0;
  while (pttr)
  {if(pttr->nomer==tel)
  {q=1;
  pttr->time=t;
  cout<<"Grazhdanin "<<pttr->FIO<<" dolzhen oplatit schet v "<<pttr->time*1.5<<" rublei\n";
  }
  pttr=pttr->left;
  if(!pttr)
  pttr=pttr->right;
  }
  if(q==0) cout<<"Takogo nomera net v kartoteke";
  break;}
  default:cout<<"Takogo deistviya net";
  };
  getchar();
}




Самая проблема в этом поиске абонента по его номеру, никак не допру(((
PM MAIL   Вверх
Rockie
Дата 22.5.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Jolia, если это ты наделала, smile то возьми функцию печати и измени ее. Она уже рекурсивно обходит дерево. Передавай в нее номер 
Код
STATION* pechat(STATION* pttr, long number)

и в функции сравнивай переданный номер с номерами в стркуктурах. Если равны, возвращаешь указатель на найденную структуру. 




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
dizzy1984
Дата 23.5.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Написал приблизительно, не факт что работает.

Код

#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

struct STATION
{ long nomer;
char *FIO;
int time;
STATION *left, *right;
};

STATION * dobav(STATION *pttr, STATION kart)
{if (!pttr)
{pttr=(STATION*) malloc(sizeof(STATION));
pttr->nomer=kart.nomer;
pttr->FIO=kart.FIO;
pttr->time=0;
pttr->left=0;
pttr->right=0;
}
else {
if (kart.nomer<pttr->nomer)
pttr->left=dobav(pttr->left,kart);
else pttr->right=dobav(pttr->right,kart) ;
}
return pttr;
}

STATION* pechat(STATION* pttr)
{
STATION* root;
root=pttr;
if(pttr)
{pechat(pttr->left);
cout<<"Nomer telefona: "<<pttr->nomer<<"\nVladelec: "<<pttr->FIO<<"\n";
pechat(pttr->right);}
cout<<"\n";
return root;
}

void main()
{clrscr();
STATION kart,*pttr;
char c;
cout<<"Zapolnenie kartoteki, ESC=vihod\n";
pttr=NULL;
c=getch();
char bFirstTime = 1;
while(c!=27)
{cout<<"Vvedite nomer telefona: \n";
cin>>kart.nomer;
cout<<"Vvedite FIO vladelca: \n";
kart.FIO=new char[100];
gets(kart.FIO);
kart.left=NULL;
kart.right=NULL;
if (bFirstTime)
{
    bFirstTime = 0;
    pttr = dobav(pttr,kart);
}
else
{
    dobav(pttr,kart);
}
c=getch();
cout<<"\n";
}

cout<<"Viberite dalneishee deistvie:\n";
cout<<"1 - vivod vsei kartoteki\n";
cout<<"2 - poisk po kartoteke i vidacha scheta\n";
cout<<"Vash vibor: " ;
int k;
cin>>k;
cout<<"\n";
switch(k)
{case 1:{
pttr=pechat(pttr);
getchar();
break;
};
case 2:long tel;
int t;
cout<<"Vvedite nomer telefona: \n";
cin>>tel;
cout<<"Vvedite vremya razgovora: \n";
cin>>t;
int q=0;
while (pttr)
{
    if(pttr->nomer==tel)
    {q=1;
    pttr->time=t;
    cout<<"Grazhdanin "<<pttr->FIO<<" dolzhen oplatit schet v "<<pttr->time*1.5<<" rublei\n";
    break;
    }
    if (tel < pttr->nomer)
    {
        pttr = pttr->left;
    }
    else
    {
        pttr = pttr->right;
    }
}
if(q==0) cout<<"Takogo nomera net v kartoteke";
break;
default:cout<<"Takogo deistviya net";
};
getchar();
}


Это сообщение отредактировал(а) dizzy1984 - 23.5.2007, 15:20
PM MAIL   Вверх
Jolia
Дата 23.5.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 12.3.2007

Репутация: нет
Всего: нет



dizzy1984, а что это за условие?
Код

if (bFirstTime)
{
    bFirstTime = 0;
    pttr = dobav(pttr,kart);
}
else
{
    dobav(pttr,kart);
}



кст, работает)
PM MAIL   Вверх
Jolia
Дата 23.5.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 12.3.2007

Репутация: нет
Всего: нет



СПАСИБО БОЛЬШОЕ!!!
PM MAIL   Вверх
dizzy1984
Дата 24.5.2007, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(Jolia @  23.5.2007,  20:07 Найти цитируемый пост)
dizzy1984, а что это за условие?

Это условие заставляет pttr указывать на начальный элемент дерева, который будет сформирован в
Код

dobav()

У тебя (все еще на ты? smile) же pttr после добавления всех элементов указывает на последний элемент, делая тем самым невозможным (ну в теории, конечно, можно) поиск элемента.

Это сообщение отредактировал(а) dizzy1984 - 24.5.2007, 05:35
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.