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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Переписать программу с Pascal на С++ 
:(
    Опции темы
L1nkin
Дата 13.12.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

const
 znak:array [1..3] of char=('+','-','*');
var
  Form1: TForm1;
  N, M : Integer;
  S,K : Longint;
  B:string;
  a: array [1..15] of integer;

implementation

{$R *.dfm}
Function GetMul(var p: integer):Longint; //long int I FYNKCIA!!! return <переменная типа long>
var tm:Longint;
begin
  tm:=a[p];
  while (p<N) and (B[p]='*') do begin
    tm:=tm*a[p+1];
    inc(p);
  end;
  GetMul:=tm;
end;

function GetRes:longint; //longint i FYNKCIA!!!
var tm: Longint;
  p:integer;
begin
  p:=1;
  tm:=GetMul(p);
  while (p<N) And (B[p] In ['+','-']) do begin
    inc(p);
    case B[p-1] of
      '+': tm:=tm+GetMul(p);
      '-': tm:=tm-GetMul(p);
    end;
  end;
  GetRes:=tm;
end;

procedure Arrange(Nabor: string; Place: Integer); // VOID i FYNKCIA!!!
  var
    i: Integer;
    s1:Longint;
  begin
    if (Place > M) then begin
        B:=Nabor;
        s1:=GetRes;
        if s1=s then
          Form1.Memo1.Lines.Add(inttostr(s1)+'='+Nabor);
    end
    else
      for i := 1 to 3 do begin
        Arrange(Nabor + znak[i], Place + 1);
      end;
  end;


Пожалуйста, помогите!
PM MAIL   Вверх
Sannis
Дата 14.12.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

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



Хм, а в чём у вас возникла сложность? Нужно то всего лишь заменить begin/end на {/} и вспомнить что в C массивы индексируются с нуля.


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
L1nkin
Дата 14.12.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Sannis @ 14.12.2008,  00:53)
Хм, а в чём у вас возникла сложность? Нужно то всего лишь заменить begin/end на {/} и вспомнить что в C массивы индексируются с нуля.

Нужно сделать это в максимально сжатые сроки... А я это буду делать долго(
PM MAIL   Вверх
Sannis
Дата 15.12.2008, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

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



И какие они? smile Начните, больше будет шанс на помощь smile


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
L1nkin
Дата 15.12.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Sannis @ 15.12.2008,  04:08)
И какие они? smile Начните, больше будет шанс на помощь smile

Начал...Возникли сложности с функцией GetRes. Помогите пожалуйста.
Вот пока какой код имею)

Код

const char znak[3]={'+','-','*'};
int N,M,a[15];
long S,K;
CString B;


long GetMul(int p)
{
    long tm;
    tm=a[p];
    while( (p<N)&&(B[p]=='*') )
    {tm=tm*a[p+1]; p++;}
    return tm;
}

long GetRes()
{
    long tm; int p=0;
    tm=GetMul(p);
    while( (p<N)&&(B[p] in ['+','-']) )
    {p++;
     case B[p-1] of
         '+': tm=tm+GetMul(p);
         '-': tm=tm-GetMul(p);
     }
    return tm;
}


void Arrange(CString nabor; int Place)
{
    int i; long s1;
    if(Place>M)
    {B=Nabor;
     s1=GetRes;
     if(s1==s)
         B=Nabor;// steret
    }
    else
    {for(i=0;i<3;i++)
      Arrange(Nabor+znak[i],Place+1);
    }
}

PM MAIL   Вверх
Sannis
Дата 15.12.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

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



Код

    while( (p<N)&&(B[p] in ['+','-']) )
    {p++;
     case B[p-1] of
         '+': tm=tm+GetMul(p);
         '-': tm=tm-GetMul(p);
     }

должно выглядеть так:
Код

    while( (p<N) && ( B[p] == '+' || B[p] == '-' ) )
    {
        p++;
        switch( B[p-1] )
        {
            '+': tm=tm+GetMul(p); break;
            '-': tm=tm-GetMul(p); break;
        }
     }



--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
L1nkin
Дата 15.12.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое!
Только вот компилятор ругается.


'+': tm=tm+GetMul(p); break;    {error C2143: syntax error : missing ';' before ':'}
 '-': tm=tm-GetMul(p); break;     {error C2143: syntax error : missing ';' before ':'}
}                                                {warning C4060: switch statement contains no 'case' or 'default' labels}
PM MAIL   Вверх
Sannis
Дата 16.12.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

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



Пардон,
Код

    while( (p<N) && ( B[p] == '+' || B[p] == '-' ) )
    {
        p++;
        switch( B[p-1] )
        {
            '+': tm=tm+GetMul(p); break;
            '-': tm=tm-GetMul(p); break;
            default: tm=tm;
        }
     }
. Но это ещё не всё, И должно иметь тип, который приводится к числовому, например char. Собственно я бы так и объявлял его:
Код

char B[128];



Кстати, полезная вещь: http://abyss-group.narod.ru/docs/articles/pas2c.htm


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
Dmi3ev
Дата 16.12.2008, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Sannis,  может не так
Цитата

    while( (p<N) && ( B[p] == '+' || B[p] == '-' ) )
    {
        p++;
        switch( B[p-1] )
        {
            '+': tm=tm+GetMul(p); break;
            '-': tm=tm-GetMul(p); break;
            default: tm=tm;
        }
     }

а так хотя бы (особо не разбирался), но:
Код

    while( (p<N) && ( B[p] == '+' || B[p] == '-' ) )
    {
        p++;
        switch( B[p-1] )
        {
           case '+': tm=tm+GetMul(p); break;
           case '-': tm=tm-GetMul(p); break;
            default: tm=tm;
        }
     }


Добавлено через 4 минуты и 57 секунд
и зачем там default, если в первоисточнике его нет)))

Добавлено через 5 минут и 42 секунды
Цитата

Хм, а в чём у вас возникла сложность? Нужно то всего лишь заменить begin/end на {/} и вспомнить что в C массивы индексируются с нуля.

у Вас тоже сложности похоже возникают)))

Добавлено через 6 минут и 53 секунды
есть в интернете проги, которые могут переводить из pascal в c++, я не пользовался, но знаю о их существовании...


--------------------

PM MAIL   Вверх
Sannis
Дата 16.12.2008, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

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



Цитата(Dmi3ev @  16.12.2008,  00:42 Найти цитируемый пост)
у Вас тоже сложности похоже возникают)))

Привычка к подсветке, да и время уже не то smile Тем более, что у автора есть компилятор под рукой, а в моём распоряжении только codepad.org, так что предпочитаю оставлять автору возможность и самому подумать smile

Приведённый кусок можно привести с минимальными ошибками к такому виду:
Код

#include<iostream>
#include<string>

char znak[] = {'+', '-', '*'};
int N, M;
long s;
string B;

int a[15];
int a_len = 15;

long GetMul(int p)
{
  long tm = a[p];

  while( p < N && B[p] == '*' )
  {
    tm *= a[p];
    p++;
  }

  return tm;
}

long GetRes()
{
  int p = 1;
  long tm = GetMul(p);

  while( (p < N) && ( B[p] == '+' || B[p] == '-' ) )
  {
    p++;
    switch( B[p-1] )
    {
      case '+': tm = tm+GetMul(p); break;
      case '-': tm = tm-GetMul(p); break;
    }
  }
  return tm;
}

void Arrange(string Nabor, int Place)
{
  int i;
  long s1;
  if (Place > M)
  {
    B = Nabor;
    s1 = GetRes();

    if( s1 == s )
    {
      cout << s1 << ' = ' << Nabor;
    }
  }
  else
  {
      for( i = 0; i < 2; i++)
        Arrange(Nabor + znak[i], Place + 1);
  }
}

Вот только как он состыкуется с остальным кодом? smile


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
Dmi3ev
Дата 16.12.2008, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Да я так понимаю он в билдере фигачит, потому что это не весь код, наверное. А если это консольное приложение, то без функции MAIN тут не обойтись. Ладно, я так, для прикола заглянул, удачи, разбирайтесь...


--------------------

PM MAIL   Вверх
Sannis
Дата 16.12.2008, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

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



Цитата(Dmi3ev @  16.12.2008,  01:52 Найти цитируемый пост)
Ладно, я так, для прикола заглянул, удачи, разбирайтесь... 

Заходите ещё smile


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
L1nkin
Дата 16.12.2008, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Разрабатываю я приложение в Visual.
Да это не полный код, это основные процедуры. Сегодня опять работал над кодом....Правда в итоге программа не работает. Стал проверять этапы выполнения с помощью MessageBox. Останавливается в GetMul на while второе условие(где элемент строки проверяет)и как только решил посмотреть собственно элемент вот этим AfxMessageBox(B[p]); методом, программа стала вылетать на нем...Чует мое сердце что со строкой что-то не так.
Вот код(MessageBoxы не удалял...)
Код

const char znak[3]={'+','-','*'};
int N,M,a[15];
long S,K;
CString B;

long GetMul(int p)
{
    long tm; char text[10],*b;
    itoa(p,text,10);
    AfxMessageBox(text);
    tm=a[p-1];
    AfxMessageBox("123");
    AfxMessageBox(B[p]);
    AfxMessageBox("123");
    while( (p<N)&&(B[p]=='*') )
    {AfxMessageBox("GetMUl");tm=tm*a[p]; p++;}
    return tm;
}

long GetRes()
{
    long tm; int p=1;
    tm=GetMul(p);
    while( (p<N) && (B[p]=='+'||B[p]=='-') )
    {p++;
     if(B[p-1]=='+') 
        tm=tm+GetMul(p);
             if(B[p-1]=='-')
        tm=tm-GetMul(p);
    
     /*switch(B[p-1]) 
     {
         '+': tm=tm+GetMul(p); break;
         '-': tm=tm-GetMul(p); break;
     }*/
    }
    
    return tm;
}


void Arrange(CString Nabor, int Place)
{
    int i; long s1; char *text;
    AfxMessageBox("4");
    if(Place>M)
    {B=Nabor;
     s1=GetRes();
     if(s1==S)
     {B=Nabor;
      text=Nabor.GetBuffer(0);
      AfxMessageBox(text);
     }
      
        
    }
    else
    {
      for(i=0;i<3;i++)
    
      Arrange(Nabor+znak[i],Place+1);
    }
}

void dlg::OnButton2() 
{
    char *text,text2[5];
    UpdateData(true);
    N=m_Edit2;
    S=m_Edit1;
    m_Grid1.SetRow(0);
    for(int i=0;i<2;i++)
    {   m_Grid1.SetCol(i);
        itoa(i+1,text2,10);
        m_Grid1.SetText(text2);}
    
    for(i=0;i<N;i++)
    {m_Grid1.SetCol(i);
     text1=m_Grid1.GetText();
     text=text1.GetBuffer(0);
     a[i]=atoi(text);
     //itoa(a[i],text,10);
    AfxMessageBox(text);}
    M=N-1;
    B="";
    Arrange("",1);
    
}


Sannis, большое спасибо, буду пробывать с этим кодом... Так же могли бы вы мне подсказать, какие ошибки я допустил в своем коде.


Это сообщение отредактировал(а) L1nkin - 16.12.2008, 19:13
PM MAIL   Вверх
L1nkin
Дата 16.12.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Немного подредактировал код... Все равно вылеает с какой то странной ошибкой: Debug Assertion Failed!  File: afx.inl    Line: 177


Вот код полность:
Код

#include "stdafx.h"
#include "Podgoni.h"
#include "dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const char znak[3]={'+','-','*'};
int N,M,a[15];
long S,K;
CString B;
/////////////////////////////////////////////////////////////////////////////
// dlg dialog


dlg::dlg(CWnd* pParent /*=NULL*/)
    : CDialog(dlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(dlg)
    m_Edit1 = 0;
    m_Edit2 = 0;
    //}}AFX_DATA_INIT
}


void dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(dlg)
    DDX_Control(pDX, IDC_MSFLEXGRID1, m_Grid1);
    DDX_Text(pDX, IDC_EDIT1, m_Edit1);
    DDX_Text(pDX, IDC_EDIT2, m_Edit2);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(dlg, CDialog)
    //{{AFX_MSG_MAP(dlg)
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// dlg message handlers

void dlg::OnButton1() 
{

    UpdateData(true);
    m_Grid1.SetCols(m_Edit2);
    UpdateData(false);
}

long GetMul(int p)
{
    long tm;
    tm=a[p-1];
    while( (p<N)&&(B[p]=='*') )
    {tm=tm*a[p+1]; p++;}
    return tm;
}

long GetRes()
{
    long tm; int p=1;
    tm=GetMul(p);
    while( (p<N) && (B[p]=='+'||B[p]=='-') )
    {p++;
     switch(B[p-1]) 
     {
         case '+': tm=tm+GetMul(p); break;
         case '-': tm=tm-GetMul(p); break;
     }
    }
    return tm;
}


void Arrange(CString Nabor, int Place)
{
    int i; long s1; char *text;
    if(Place>M)
    {B=Nabor;
     s1=GetRes();
     if(s1==S)
     {B=Nabor;
      text=Nabor.GetBuffer(0);
      AfxMessageBox(text);
     }  
    }
    else
    {for(i=0;i<3;i++)
      Arrange(Nabor+znak[i],Place+1);
    }
}

void dlg::OnButton2() 
{
    char *text,text2[5]; int i; CString text1;
    UpdateData(true);
    N=m_Edit2;
    S=m_Edit1;
    m_Grid1.SetRow(0);
    for(i=0;i<2;i++)
    {   m_Grid1.SetCol(i);
        itoa(i+1,text2,10);
        m_Grid1.SetText(text2);}
    
    
    for(i=0;i<N;i++)
    {m_Grid1.SetCol(i);
     text1=m_Grid1.GetText();
     text=text1.GetBuffer(0);
     a[i]=atoi(text);
     AfxMessageBox(text);
    }
    M=N-1;
    B="";
    Arrange("",1);
    
}


Сейчас буду пробывать вашу версию, Sannis.

UPD: Попробывал-та же ошибка...


Это сообщение отредактировал(а) L1nkin - 16.12.2008, 19:47
PM MAIL   Вверх
Sannis
Дата 16.12.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

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



Попробуйте вывести значение p, оно может выходить за границы строки, в этом случае нужно проверять индексы.
MFC я не знаю, так что с привязкой алгоритма к визуально части помочь не смогу.


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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