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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Borland C++ 3.1] Проверка скобок в мат. выражении 
:(
    Опции темы
Prophet
Дата 14.12.2007, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста. Начал программировать на Borland C++ недавно, а тут надо сделать программу, для создания которой моих знаний недостаточно. Алгоритм составить смог, а вот превратить его в код не в состоянии...
Мне надо написать программу, позволяющую проверить корректность расстановки скобок в математическом выражении. Математическое выражение вводится с клавиатуры в виде строки символов (не более 30 символов). Проверка оформляется в виде подпрограммы, которая должна выдавать на экран сообщения вида: "соответствует", "пропущено 2 закрывающих скобки"
PM MAIL   Вверх
baldina
Дата 14.12.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Так какой алгоритм придумал?  smile 
PM MAIL   Вверх
Sharkfire
Дата 14.12.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

Код

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++;
  }
///теперь анализируй полученные данные

 }

PM MAIL ICQ   Вверх
zkv
Дата 14.12.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Sharkfire, недостаточно просто посчитать количество тех и других скобок и сравнить количество. 
Необходимо также проверять их порядок например последовательность ")(" - неправильная, хотя скобок закрывающих столько же, сколько и открывающих.
Задача легко решается стеком, я выкладывал тут решение (в Центре помощи), просто кому-то влом искать.
PM MAIL   Вверх
xvr
Дата 14.12.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(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);
}

PM MAIL   Вверх
Prophet
Дата 15.12.2007, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое. Я написал вот так вот в конечном итоге:

Код


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

PM MAIL   Вверх
xvr
Дата 15.12.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(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( для нее правильная расстановка скобок

PM MAIL   Вверх
Prophet
Дата 15.12.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



xvr, Насчёт if всё правильно, так как тут уже не надо сравнения. Тут идёт вариант когда количество открывающих и закрывающих скобок одинаковое. Вот проблема с вариантом, когда выражение начинается с закрывающей скобки, действительно присутствует.
PM MAIL   Вверх
xvr
Дата 17.12.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



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

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

Код

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

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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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