Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Borland C++ 3.1] Проверка скобок в мат. выражении


Автор: Prophet 14.12.2007, 02:25
Помогите пожалуйста. Начал программировать на Borland C++ недавно, а тут надо сделать программу, для создания которой моих знаний недостаточно. Алгоритм составить смог, а вот превратить его в код не в состоянии...
Мне надо написать программу, позволяющую проверить корректность расстановки скобок в математическом выражении. Математическое выражение вводится с клавиатуры в виде строки символов (не более 30 символов). Проверка оформляется в виде подпрограммы, которая должна выдавать на экран сообщения вида: "соответствует", "пропущено 2 закрывающих скобки"

Автор: baldina 14.12.2007, 11:15
Так какой алгоритм придумал?  smile 

Автор: Sharkfire 14.12.2007, 11:26
Так нужен твой алгоритм, для портирования, как же так мы тебе поможен... 
ну вообщем то так:

Писал не в компиляторе а пряма тут.

Код

void CheckEQ(String EQ)
 {
int otkr=0; //кол-во открывающихся
int zakr=0;//кол-во закрывающихся

for(int i=1;i<EQ.Lenght()-1;i++)
  { 
 if (EQ[i]=='(') otrk++;
 if (EQ[i]==')') zakr++;
  }
///теперь анализируй полученные данные

 }

Автор: zkv 14.12.2007, 11:35
Sharkfire, недостаточно просто посчитать количество тех и других скобок и сравнить количество. 
Необходимо также проверять их порядок например последовательность ")(" - неправильная, хотя скобок закрывающих столько же, сколько и открывающих.
Задача легко решается стеком, я выкладывал тут решение (в Центре помощи), просто кому-то влом искать.

Автор: xvr 14.12.2007, 16:14
Цитата(Prophet @ 14.12.2007,  02:25)
Помогите пожалуйста. Начал программировать на Borland C++ недавно, а тут надо сделать программу, для создания которой моих знаний недостаточно. Алгоритм составить смог, а вот превратить его в код не в состоянии...
Мне надо написать программу, позволяющую проверить корректность расстановки скобок в математическом выражении. Математическое выражение вводится с клавиатуры в виде строки символов (не более 30 символов). Проверка оформляется в виде подпрограммы, которая должна выдавать на экран сообщения вида: "соответствует", "пропущено 2 закрывающих скобки"

Код

void check(const char* str)
{
 int balance=0;
 for(;*str;++str)
  switch(*str)
   {
     case '(': ++balance; break;
     case ')': --balance; 
      if (balance<0) 
       {
         balance=0;
         printf("Лишняя закрывающая скобка");
       }
      break;
   }
 if (balance) printf("Не хватает %d закрывающих скобки",balance);
}

Автор: Prophet 15.12.2007, 04:10
Спасибо большое. Я написал вот так вот в конечном итоге:

Код


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

main()
{
clrscr();

  start: int i;
  int x=0;
  int y=0;
  char str[30];

  for(i=0;i<31;i++){
str[i]=0;
}

  printf("Vvediete mateticheskoe virazhenie (ne bolee 30 simvolov):\n");
  gets(str);

if (str[30]!=0){
printf("vi vveli bol`she 30 simvolov, poprobuite eshe raz\n");
goto start;
}

  for(i=0;i<30;i++)
  {
    if(str[i]=='(') x++;
    if(str[i]==')') y++;
  }
  if(x>y) {
  x=x-y;
  printf("Propusheno %d zakrivayushaya(ih) skobka(ok)\n", x);
  }
  else if(y>x) {
  y=y-x;
  printf("Propusheno %d otkrivayushaya(ih) skobka(ok)\n", y);
  }
  else if(x=y){
  printf("Sootvetstvuet\n");
}
  return 0;
}

Автор: xvr 15.12.2007, 11:20
Цитата(Prophet @ 15.12.2007,  04:10)
Спасибо большое. Я написал вот так вот в конечном итоге:

Код


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

main()
{
clrscr();

  start: int i;
  int x=0;
  int y=0;
  char str[30];

  for(i=0;i<31;i++){
str[i]=0;
}

  printf("Vvediete mateticheskoe virazhenie (ne bolee 30 simvolov):\n");
  gets(str);

if (str[30]!=0){
printf("vi vveli bol`she 30 simvolov, poprobuite eshe raz\n");
goto start;
}

  for(i=0;i<30;i++)
  {
    if(str[i]=='(') x++;
    if(str[i]==')') y++;
  }
  if(x>y) {
  x=x-y;
  printf("Propusheno %d zakrivayushaya(ih) skobka(ok)\n", x);
  }
  else if(y>x) {
  y=y-x;
  printf("Propusheno %d otkrivayushaya(ih) skobka(ok)\n", y);
  }
  else if(x=y){
  printf("Sootvetstvuet\n");
}
  return 0;
}

Два замечания:
1) В последнем if'е стоит присваивание вместо сравнения
2) Твоя программа не поймает случаев НЕПРАВИЛЬНОГО балансирования скобок. 
Например )a( для нее правильная расстановка скобок

Автор: Prophet 15.12.2007, 16:28
xvr, Насчёт if всё правильно, так как тут уже не надо сравнения. Тут идёт вариант когда количество открывающих и закрывающих скобок одинаковое. Вот проблема с вариантом, когда выражение начинается с закрывающей скобки, действительно присутствует.

Автор: xvr 17.12.2007, 13:24
Цитата(Prophet @ 15.12.2007,  16:28)
xvr, Насчёт if всё правильно, так как тут уже не надо сравнения. Тут идёт вариант когда количество открывающих и закрывающих скобок одинаковое.

Вообще то, когда видишь код

Код

  if(x=y){
  printf("Sootvetstvuet\n");
 }

Возникает законное подозрение, что автор хотел написать if(x==y), тем более, что по логике программы это так и есть. То, что этот if работает и с присваиванием вместо сравнения - чистая случайность, на самом деле он вообще не нужен - нужно было просто написать 
printf("Sootvetstvuet\n");

Кроме того, этот код (с присваиванием) все равно не правильный - при нулевом количестве скобок ВООБЩЕ ничего выведено не будет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)