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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стек без STL, добавление в стек, печать стека и поиск  
:(
    Опции темы
TLandertinger
Дата 28.9.2014, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. У меня проблема. Вот задание
Описать массив записей "семья".
--------------------------------------------------------------
Отец ! Мать ! Ребенок ! ! Ребенок
--------------------------------------- -----------
Ф.И.О.!дата !Ф.И.О.!дата ! Имя !дата ! ...... ! Имя !дата
!рожд.! !рожд.! !рожд.! ! !рожд.
---------------------------------------------------------------
!__________________ ________________!
не более 5 детей

Найти и вывести имя младшего ребенка у Иванова И.И. по форме
_______________________________
имя ребенка ! дата рождения !
-------------------------------

Нужно оформить в виде стека.

Приложение консольное, C++ VS 2010 

Вот код:

Код

#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;


struct Date        
{
    unsigned day;        
    unsigned month;        
    unsigned year;
};

struct Children
{
    char name_of_child[30];
    Date d_birth_child;
};

struct T_family 
{
    char fio_father[30];
    Date d_birth_father;
    char fio_mother[30];
    Date d_birth_mother;
    Children ch[5];
    int k;//номер ребенка
}; 

//Структура, помещаемая в Стек
struct rec
{
T_family tf;
};

// Сам стек
rec *stack;
// Его вершина и максимум
int top=0,smax;

// Функция помещения в стек
bool push(){
 //Если не превышает пределы стека то норм, иначе вернуть false
 if (top==smax) return false;
 // Просим ввести данные
    int count;         
    char c;
    cout << endl << " Enter data of person\n ";
    cout << " fio of father ";
    cin.getline (stack[top++].tf.fio_father, 30);
    cout << "Enter date of father's birthday: \n";
    cout << " day (1-31) ";
    cin >> stack[top++].tf.d_birth_father.day;
    cin.get(c);
    cout << " month (1-12)";
    cin >> stack[top++].tf.d_birth_father.month;
    cin.get(c);
    cout << " year ";
    cin >> stack[top++].tf.d_birth_father.year;
    cin.get(c);
    cout << " fio of mother ";
    cin.getline (stack[top++].tf.fio_mother, 30);
    cout << endl <<"Enter date of mother's birthday: \n";
    cout <<" day (1-31) ";
    cin >> stack[top++].tf.d_birth_mother.day;
    cin.get(c);
    cout << " month (1-12)";
    cin >> stack[top++].tf.d_birth_mother.month;
    cin.get(c);
    cout << " year ";
    cin >> stack[top++].tf.d_birth_mother.year;
    cin.get(c);
    //запросить кол-во детей и запомнить в count
    cout << "Enter count of children" << endl;
    cin >> count;
    cin.get(c);
    if ((count > 5) && (count < 0)) cout << " Fatal error " << endl;
    stack[top].tf.k = count;
    for (int k=0; k < count; k++) {
        cout << endl << " Name of " " " << k+1 << " " " child ";
        cin.getline (stack[top++].tf.ch[k].name_of_child, 30);
        cout << endl << "Enter date of" " "<< k+1 << " " "child's birthday: \n";
        cout <<" day (1-31) ";
        cin >> stack[top++].tf.ch[k].d_birth_child.day;
        cin.get(c);
        cout << " month (1-12)";
        cin >> stack[top++].tf.ch[k].d_birth_child.month;
        cin.get(c);
        cout << " year ";
        cin >> stack[top++].tf.ch[k].d_birth_child.year;
        cin.get(c);
    }
 return true;
}

// Извлекаем из стека
bool pop(){
 //Если конечно есть что извлекать
 if (top<0) return false;
 //Передвигаем указатель с вершины на один вниз
 // показывая данные
 cout<<stack[--top].name<<'\n';
 return true;
}

int main()
{
    //Спрашиваем размер стека
    cout<<"Stack count items please: ";
    cin>>smax;
    stack=new rec[smax];
    //Забиваем в него данные
    int i;
    for(i=0;i<smax;i++) if(!push()) {cout<<"Problems pushing"<<'\n';break;}
    // Извлекаем из него данные
    for(i=0;i<smax;i++) if(!pop()) {cout<<"Problems popping"<<'\n';break;}
    //Освобождаем стек
    delete[] stack;
    cin.get();
    _getch();
    return 0;
}


Правда, стек не должен быть STL-вским, потому как STL'а в задании нет

P.S. Код не доработан, по крайней мере, в методе pop.
PM MAIL   Вверх
feodorv
Дата 28.9.2014, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Гм. Вы стек фактически реализовали как массив ограниченного размера. Не уверен в том, что это соответствует условию задачи. Самая простая реализация стека приведена в Википедии. По сути Вам нужна структура вида:
Код

struct rec
{
  rec *next;
  T_family *tf;
};


Тогда методы push и pop будут выглядеть совсем просто:
Код

rec *stack = 0;

void stack_push( T_family *tf )
{
  rec *r = new rec;
  r->tf = tf;
  r->next = stack;
  stack = r;
}

T_family *stack_pop()
{
  rec *r;
  T_family *tf;

  if( stack == 0 ) return 0;

  r = stack;
  stack = r->next;
  
  tf = r->tf;
  delete r;
  return tf;
}


По хорошему стоит ввести класс Stack с публичными методами push/pop и приватным полем stack.

Ну и соответственно, несколько меняется схема ввода данных:
Код

T_family *create_elem()
{
  T_family *tf = new T_family;

  cout << endl << " Enter data of person" << endl;
  cout << " fio of father ";
  cin.getline( tf->fio_father,  30);
  ...

  return tf;
}


При этом при применении метода pop нужно не забыть высвобождать данные:
Код

bool search()
{
  bool found = false;
  T_family *tf;

  while( (tf = stack_pop()) != 0 )
  {
    if( strcmp( tf->fio_father, "Иванов И.И.") == 0 )
    {
      found = true;
      ...
    }
    delete tf;
  }

  return found;
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
TLandertinger
Дата 30.9.2014, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Возникла непонятка: программа игнорирует ввод ФИО отца (код и скрин ниже).
Код

#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;


struct Date        
{
    unsigned day;        
    unsigned month;        
    unsigned year;
};

struct Children
{
    char name_of_child[30];
    Date d_birth_child;
};

struct T_family 
{
    char fio_father[30];
    Date d_birth_father;
    char fio_mother[30];
    Date d_birth_mother;
    Children ch[5];
    int k;//номер ребенка
}; 

// Сам стек
T_family *stack;
// Его вершина и максимум
int top=0,smax;

// Функция помещения в стек
bool push(){
 //Если не превышает пределы стека то норм, иначе вернуть false
 if (top==smax) return false;
 // Просим ввести данные
    int count;    
    T_family a; 
    char c;
    cout << endl << " Enter data of person\n ";
    cout << " fio of father\n";
    cin.getline (a.fio_father, 30);
    cout << "Enter date of father's birthday: \n";
    cout << " day (1-31) ";
    cin >> a.d_birth_father.day;
    cin.get(c);
    cout << " month (1-12)";
    cin >> a.d_birth_father.month;
    cin.get(c);
    cout << " year ";
    cin >> a.d_birth_father.year;
    cin.get(c);
    cout << " fio of mother ";
    cin.getline (a.fio_mother, 30);
    cout << endl <<"Enter date of mother's birthday: \n";
    cout <<" day (1-31) ";
    cin >> a.d_birth_mother.day;
    cin.get(c);
    cout << " month (1-12)";
    cin >> a.d_birth_mother.month;
    cin.get(c);
    cout << " year ";
    cin >> a.d_birth_mother.year;
    cin.get(c);
    //запросить кол-во детей и запомнить в count
    cout << "Enter count of children" << endl;
    cin >> count;
    cin.get(c);
    if ((count > 5) && (count < 0)) cout << " Fatal error " << endl;
    a.k = count;
    for (int k=0; k < count; k++) {
        cout << endl << " Name of " " " << k+1 << " " " child ";
        cin.getline (a.ch[k].name_of_child, 30);
        cout << endl << "Enter date of" " "<< k+1 << " " "child's birthday: \n";
        cout <<" day (1-31) ";
        cin >> a.ch[k].d_birth_child.day;
        cin.get(c);
        cout << " month (1-12)";
        cin >> a.ch[k].d_birth_child.month;
        cin.get(c);
        cout << " year ";
        cin >> stack[top++].ch[k].d_birth_child.year;
        cin.get(c);
        }
 return true;
}

// Извлекаем из стека
bool pop(){
 //Если конечно есть что извлекать
 if (top<0) return false;
 //Передвигаем указатель с вершины на один вниз
 // показывая данные
 cout   <<"Father: "<<stack[top].fio_father<<'\t'<<stack[top].d_birth_father.day<<'\n'
        <<"Mother: "<<stack[top].fio_mother<<'\t'<<stack[top].d_birth_mother.day<<'\n' 
        <<"Children: "<<stack[top].ch[0].name_of_child<<'\t'<<stack[top].ch[0].d_birth_child.day<<'\n'
                      <<stack[top].ch[1].name_of_child<<'\t'<<stack[top].ch[1].d_birth_child.day<<'\n'
                      <<stack[top].ch[2].name_of_child<<'\t'<<stack[top].ch[2].d_birth_child.day<<'\n'
                      <<stack[top].ch[3].name_of_child<<'\t'<<stack[top].ch[3].d_birth_child.day<<'\n'
                      <<stack[top].ch[4].name_of_child<<'\t'<<stack[top].ch[4].d_birth_child.day<<'\n';

top--;
 return true;
}

void search()
{
  int k_min = 0;
    if(strcmp(stack[top].fio_father, "Ivanov I.I.") == 0 )
    {
      for (int k = 0; k < stack[top].k; k++){
                    if (stack[top].ch[k].d_birth_child.year > stack[top].ch[k_min].d_birth_child.year) {
                        k_min=k;
                    }
                    else if (stack[top].ch[k].d_birth_child.year == stack[top].ch[k_min].d_birth_child.year)
                    {
                        if (stack[top].ch[k].d_birth_child.month > stack[top].ch[k_min].d_birth_child.month) {
                            k_min=k;
                        }
                        else if (stack[top].ch[k].d_birth_child.month == stack[top].ch[k_min].d_birth_child.month)
                            if (stack[top].ch[k].d_birth_child.day > stack[top].ch[k_min].d_birth_child.day) {
                                k_min=k;
                            }
                    }        
                            break;
    }
      printf("\n\n!  %10s  ! %2d.%2d.%4d !\n", stack[top].ch[k_min].name_of_child, stack[top].ch[k_min].d_birth_child.day, stack[top].ch[k_min].d_birth_child.month, stack[top].ch[k_min].d_birth_child.year);
  }
}

int main()
{
    //Спрашиваем размер стека
    cout<<"Stack count items please: ";
    cin>>smax;
    stack=new T_family[smax];
    //Забиваем в него данные
    int i;
    for(i=0;i<smax;i++) if(!push()) {cout<<"Problems pushing"<<'\n';break;}
    // Извлекаем из него данные
    for(i=0;i<smax;i++) if(!pop()) {cout<<"Problems popping"<<'\n';break;}
    //Освобождаем стек
    delete[] stack;
    cin.get();
    _getch();
    return 0;
}



Это сообщение отредактировал(а) TLandertinger - 30.9.2014, 18:36

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Das_Stack_3.jpg 35,24 Kb
PM MAIL   Вверх
feodorv
Дата 1.10.2014, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(TLandertinger @  30.9.2014,  19:35 Найти цитируемый пост)
Возникла непонятка: программа игнорирует ввод ФИО отца (код и скрин ниже).

А можно вопрос: почему у Вас после ввода целочисленных данных следует
Цитата(TLandertinger @  30.9.2014,  19:35 Найти цитируемый пост)
    cin.get©;

И почему после 
Цитата(TLandertinger @  30.9.2014,  19:35 Найти цитируемый пост)
    cout<<"Stack count items please: ";    cin>>smax;

оно не следует?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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