Форум: Форум C++Разное
Новые темы: 00
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проверка расстановки скобок в математическом выражении.
 
 автор: Prophet   (13.12.2007 в 10:30)   письмо автору
 
 

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

  Ответить  
 
 автор: alex19921992   (13.12.2007 в 11:26)   письмо автору
 
   для: Prophet   (13.12.2007 в 10:30)
 

заводим переменную Х=0. идем слева направо в выражении. если встречаем "(", то Х=Х+1, если встречаем ")",то Х=Х-1.
На каждом шаге проверяем условие: Х>=0, если оно не выполнено, то выводим ошибку.
В самом конце: если Х!=0 то опять же ошибка.
Во всех ост. случаях скобки верные.

  Ответить  
 
 автор: cheops   (13.12.2007 в 11:51)   письмо автору
 
   для: Prophet   (13.12.2007 в 10:30)
 

Ваш алгоритм совпадает с тем, что предложил alex19921992?

  Ответить  
 
 автор: Prophet   (13.12.2007 в 15:24)   письмо автору
 
   для: cheops   (13.12.2007 в 11:51)
 

Впринципе подходит, только условие X>=0 не нужно, так как в конце программа должна выводить сообщения о количестве пропущеных открывающий/закрывающих скобок. То есть, если X<0, то пропущены закрывающие. Если X>0 - пропущены открывающие. X=0 - количество и тех и тех совпадает.

  Ответить  
 
 автор: cheops   (13.12.2007 в 16:28)   письмо автору
 
   для: Prophet   (13.12.2007 в 15:24)
 

Можно поступить следующим образом
#include <stdio.h>
using namespace std;

int main()
{
  // Строка с выражением
  char input[30];
  
  printf("%s""Введите выражение: ");
  // Читаем введённую строку
  fgets(input, 30, stdin);

  int basket = 0;
  for(int i = 0; i < 30; i++)
  {
    if(input[i] == '(') basket++;
    if(input[i] == ')') basket--;
  }
  if(basket > 0) printf("%s""Пропущена закрывающая скобка");
  if(basket < 0) printf("%s""Пропущена открывающая скобка");

  return 0;
}

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

  Ответить  
 
 автор: Prophet   (13.12.2007 в 16:38)   письмо автору
 
   для: cheops   (13.12.2007 в 16:28)
 

Честно говоря я даже не задумывался, когда составлял алгоритм, что первая скобка может оказаться закрывающей... Возможно это окажется проблемой.

  Ответить  
 
 автор: cheops   (13.12.2007 в 18:05)   письмо автору
 
   для: Prophet   (13.12.2007 в 16:38)
 

Хм... это ведь классическая задача на стек...

  Ответить  
 
 автор: alex19921992   (13.12.2007 в 23:27)   письмо автору
 
   для: cheops   (13.12.2007 в 16:28)
 

cheops, конечно недостаточно. неужели я не сказал, что надо:

for(int i = 0; i < 30; i++)
  {
    if(input[i] == '(') basket++;
    if(input[i] == ')') basket--;
    if(basket<0){printf("neverno");} // вот что надо! ну или там что-то подобное в фигурных скобках?
  }


И ВСЕ БУДЕТ РАБОТАТЬ!!! НИКАКОГО СТЕКА!!! ВСЕ ПРОСТО!!! И ДАЖЕ ЕСЛИ ПЕРВАЯ СКОБКА ")" то мой алгоритм сработает.

  Ответить  
 
 автор: cheops   (14.12.2007 в 03:42)   письмо автору
 
   для: alex19921992   (13.12.2007 в 23:27)
 

Этого не достаточно - алгоритм засыпится на проверке выражения ((((...))) - basket будет +1.

  Ответить  
 
 автор: alex19921992   (14.12.2007 в 04:23)   письмо автору
 
   для: cheops   (14.12.2007 в 03:42)
 

А вообще то я говорил проверять в конце basket на равенство нулю. если равно - то все верно!
Я даже могу сюда кинуть свою прогу считающую вырвжения типа 8^sin(7)+3*56+tg(sqrt(2.87))

  Ответить  
 
 автор: cheops   (14.12.2007 в 05:03)   письмо автору
 
   для: alex19921992   (13.12.2007 в 23:27)
 

Выражение нужно проверить на правильность, а у вас как только скобка откроется - цикл начнёт печатать "neverno", а нужно проверить всё выражение на правильность или неправильность перед вычислением, а не во время.

  Ответить  
 
 автор: Prophet   (13.12.2007 в 21:29)   письмо автору
 
   для: Prophet   (13.12.2007 в 10:30)
 

В общем попробовал с вашей помощью написать сам. Подскажите, пожалуйста, есть ли у меня ошибки?


#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;
}

  Ответить  
 
 автор: cheops   (14.12.2007 в 03:45)   письмо автору
 
   для: Prophet   (13.12.2007 в 21:29)
 

В синтаксисе ошибок нет.

  Ответить  
 
 автор: Prophet   (25.12.2007 в 14:07)   письмо автору
 
   для: Prophet   (13.12.2007 в 21:29)
 

Не могли бы вы мне помочь ещё с выносом вот этой части программы в отдельную функцию?
А то у меня самого этого не получается...

 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");
}

  Ответить  
 
 автор: cheops   (26.12.2007 в 04:52)   письмо автору
 
   для: Prophet   (25.12.2007 в 14:07)
 

Можно как-то так поступить
void check(char * str)
{
  int i, x = 0, y = 0;
  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");
}

  Ответить  
 
 автор: Prophet   (27.12.2007 в 15:44)   письмо автору
 
   для: cheops   (26.12.2007 в 04:52)
 

Спасибо огромное.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования