Страница 1 из 1

Подкорректируйте пожалуйста мои наработки / C++ Builder

Добавлено: 29 апр 2014, 15:56
Fanta_MaCka

Код: Выделить всё

//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n; // Глобальная переменная
class Stack
{
  protected:
    int *stck; // Динамический массив 
    int tos;   // Текущий  номер элемента
    int length;// Размер стека = размер динамического массива
  public:
    Stack(int size); // Конструктор
    ~Stack(){delete [] stck;} //Деструктор
    void push(int item); // Поместить в стек
    int pop(); //Извлечь из стека
    int GetLen(){return length;} // Получить значение размера стека
    int GetCurrent() {return tos;} // Получить текущую позицию в стеке
};
Stack a(10); // Создание объекта класса стека размером 10 элементов
 
// Конструктор стека
Stack :: Stack(int size)
{
  stck = new int [size]; // Создание динамического массива
  if(!stck) // Если не выделена память под массив
  {
    ShowMessage("Unable to create STACK");
    return;
  }
  length=size;
  tos=0; // Текущая позиция в стеке при его создании равна 0
}
// Помещение объека в стек
void Stack:: push(int item)
{
  if(tos==length) // Если текущий номер равен длине стеке
  {
    ShowMessage("Стек полон");
    return;
  }
  stck[tos] = item; // Поместить значение в стек
  tos++; // Инкремент номера
}
int Stack :: pop() // Извлечение объекта из стека
{
  if(tos==0) // Если текущая позиция =0, стек пуст
  {
    ShowMessage("STACK is empty");
    return 0;
  }
  tos--;
  return stck[tos]; // Извлечь последнее значение
}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
 {
int chislo=Edit1->Text.ToIntDef(5)+1;
  AnsiString s;
   int *prov1;
        prov1 = new int [100];
           StringGrid1->ColCount=chislo;
  for(int i=0; i<chislo; i++){
 
prov1[i] = random(200)-100;
StringGrid1->Cells[i+1][1]=prov1[i];
}
 
  if(!prov1[0]=='\0'){
  delete []prov1;
  }
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  int num=StrToInt(Edit1->Text);
  a.push(num); // Поместить в стек
  lPush->Caption="Введенный элемент "+ IntToStr(num);
  lCurrent->Caption="Текущий номер = "+ IntToStr(a.GetCurrent());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  int num=a.pop();// Извлечь число из стека
  lPop->Caption="Считанный элемент "+IntToStr(num);
  lCurrent->Caption="Текущий номер = "+ IntToStr(a.GetCurrent());
}
//---------------------------------------------------------------------------
Стек. Создать динамический массив размерности n, заполнить его случайными числами. Создать два стека, в один занести все четные, в другой – все нечетные числа. Напечатать содержимое обоих стеков (описав в стеке вспомогательную функцию для чтения элементов стека без их уничтожения).

Re: Подкорректируйте пожалуйста мои наработки / C++ Builder

Добавлено: 29 апр 2014, 18:16
Romeo
Класс Stack уже есть, и, судя по всему, рабочий. Создание динамического массива тоже не должно вызывать проблем, если предоставленный код написан тобой. В чём именно сложность реализации задания, собственно? Проверка на чётность? Она делается так:

Код: Выделить всё

if (N % 2 == 0)
{
   ...
}

Re: Подкорректируйте пожалуйста мои наработки / C++ Builder

Добавлено: 29 апр 2014, 18:28
Fanta_MaCka
Создать динамический массив размерности n, заполнить его случайными числами. Это я сделала
Создать два стека, в один занести все четные, в другой – все нечетные числа. У меня создан 1 стек, а вот пример с двумя...куда это вставить? и еще нужно будет проводить изменения в кнопках я понимаю примерно какие, но не могу сделать

Код: Выделить всё

 Stack one(100), two(100); 

for (int i=1; i<StringGrid1->ColCount; i++)
{
if(StrToInt(StringGrid1->Cells[i][1]) % 2 == 0)
{
one.push(StrToInt(StringGrid1->Cells[i][1]));
} else
two.push(StrToInt(StringGrid1->Cells[i][1]));
}
Напечатать содержимое обоих стеков (описав в стеке вспомогательную функцию для чтения элементов стека без их уничтожения). наверное печатать в лейбл...вообще не представляю как все сделать вообщем(

Re: Подкорректируйте пожалуйста мои наработки / C++ Builder

Добавлено: 29 апр 2014, 20:21
Romeo
Ну с изменениями "в кнопках" я точно не помогу, так как Билдер сам сгенерирует код, когда ты в редакторе ресурсов подправишь форму и назначишь обработчик события.

А по поводу печати, я думаю, что позразумевалось, что задание будет оформлено не в качестве оконного приложения, а в качестве консольного. В случае консольного приложения, печать можно было бы реализовать через обычный printf или std::cout.

Re: Подкорректируйте пожалуйста мои наработки / C++ Builder

Добавлено: 29 апр 2014, 20:38
Fanta_MaCka

Код: Выделить всё

//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n; // Глобальная переменная
class Stack
{
  protected:
    int *stck; // Динамический массив 
    int tos;   // Текущий  номер элемента
    int length;// Размер стека = размер динамического массива
  public:
    Stack(int size); // Конструктор
    ~Stack(){delete [] stck;} //Деструктор
    void push(int item); // Поместить в стек
    int pop(); //Извлечь из стека
    int GetLen(){return length;} // Получить значение размера стека
    int GetCurrent() {return tos;} // Получить текущую позицию в стеке
};
Stack a(10); // Создание объекта класса стека размером 10 элементов
 
// Конструктор стека
Stack :: Stack(int size)
{
  stck = new int [size]; // Создание динамического массива
  if(!stck) // Если не выделена память под массив
  {
    ShowMessage("Unable to create STACK");
    return;
  }
  length=size;
  tos=0; // Текущая позиция в стеке при его создании равна 0
}
// Помещение объека в стек
void Stack:: push(int item)
{
  if(tos==length) // Если текущий номер равен длине стеке
  {
    ShowMessage("Стек полон");
    return;
  }
  stck[tos] = item; // Поместить значение в стек
  tos++; // Инкремент номера
}
int Stack :: pop() // Извлечение объекта из стека
{
  if(tos==0) // Если текущая позиция =0, стек пуст
  {
    ShowMessage("STACK is empty");
    return 0;
  }
  tos--;
  return stck[tos]; // Извлечь последнее значение
}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
 {
int chislo=Edit1->Text.ToIntDef(5)+1;
  AnsiString s;
   int *prov1;
        prov1 = new int [100];
           StringGrid1->ColCount=chislo;
  for(int i=0; i<chislo; i++){
 
prov1[i] = random(200)-100;
StringGrid1->Cells[i+1][1]=prov1[i];
}
 
  if(!prov1[0]=='\0'){
  delete []prov1;
  }
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  int num=StrToInt(Edit1->Text);
  a.push(num); // Поместить в стек
  lPush->Caption="Введенный элемент "+ IntToStr(num);
  lCurrent->Caption="Текущий номер = "+ IntToStr(a.GetCurrent());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  int num=a.pop();// Извлечь число из стека
  lPop->Caption="Считанный элемент "+IntToStr(num);
  lCurrent->Caption="Текущий номер = "+ IntToStr(a.GetCurrent());
}
//----------------------------------------------------------
вот этот код должен работать но нет( не сортирует(*
и не выводит стэки

Re: Подкорректируйте пожалуйста мои наработки / C++ Builder

Добавлено: 30 апр 2014, 14:38
Romeo
Это тот же самый код, что и в первом сообщении. Я не вижу отличия. Как может неисправленный код работать? Мы ведь вроде договорились, что нужно сделать ещё один стек, а так же что нужно проверять чётность/нечётность с помощью остатка от деления на 2.