|
|
|
| Помогите пожалуйста. Начал программировать на Borland C++ недавно, а тут надо сделать программу, для создания которой моих знаний недостаточно. Алгоритм составить смог, а вот превратить его в код не в состоянии...
Мне надо написать программу, позволяющую проверить корректность расстановки скобок в математическом выражении. Математическое выражение вводится с клавиатуры в виде строки символов (не более 30 символов). Проверка оформляется в виде подпрограммы, которая должна выдавать на экран сообщения вида: "соответствует", "пропущено 2 закрывающих скобки" | |
|
|
|
|
|
|
|
для: Prophet
(13.12.2007 в 10:30)
| | заводим переменную Х=0. идем слева направо в выражении. если встречаем "(", то Х=Х+1, если встречаем ")",то Х=Х-1.
На каждом шаге проверяем условие: Х>=0, если оно не выполнено, то выводим ошибку.
В самом конце: если Х!=0 то опять же ошибка.
Во всех ост. случаях скобки верные. | |
|
|
|
|
|
|
|
для: Prophet
(13.12.2007 в 10:30)
| | Ваш алгоритм совпадает с тем, что предложил alex19921992? | |
|
|
|
|
|
|
|
для: cheops
(13.12.2007 в 11:51)
| | Впринципе подходит, только условие X>=0 не нужно, так как в конце программа должна выводить сообщения о количестве пропущеных открывающий/закрывающих скобок. То есть, если X<0, то пропущены закрывающие. Если X>0 - пропущены открывающие. X=0 - количество и тех и тех совпадает. | |
|
|
|
|
|
|
|
для: 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 Только мне кажется этого будет недостаточно, так как выражение )))((( по сути являясь неправильным, будет засчитываться таким алгоритмом как правильное. | |
|
|
|
|
|
|
|
для: cheops
(13.12.2007 в 16:28)
| | Честно говоря я даже не задумывался, когда составлял алгоритм, что первая скобка может оказаться закрывающей... Возможно это окажется проблемой. | |
|
|
|
|
|
|
|
для: Prophet
(13.12.2007 в 16:38)
| | Хм... это ведь классическая задача на стек... | |
|
|
|
|
|
|
|
для: 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");} // вот что надо! ну или там что-то подобное в фигурных скобках?
}
|
И ВСЕ БУДЕТ РАБОТАТЬ!!! НИКАКОГО СТЕКА!!! ВСЕ ПРОСТО!!! И ДАЖЕ ЕСЛИ ПЕРВАЯ СКОБКА ")" то мой алгоритм сработает. | |
|
|
|
|
|
|
|
для: alex19921992
(13.12.2007 в 23:27)
| | Этого не достаточно - алгоритм засыпится на проверке выражения ((((...))) - basket будет +1. | |
|
|
|
|
|
|
|
для: cheops
(14.12.2007 в 03:42)
| | А вообще то я говорил проверять в конце basket на равенство нулю. если равно - то все верно!
Я даже могу сюда кинуть свою прогу считающую вырвжения типа 8^sin(7)+3*56+tg(sqrt(2.87)) | |
|
|
|
|
|
|
|
для: alex19921992
(13.12.2007 в 23:27)
| | Выражение нужно проверить на правильность, а у вас как только скобка откроется - цикл начнёт печатать "neverno", а нужно проверить всё выражение на правильность или неправильность перед вычислением, а не во время. | |
|
|
|
|
|
|
|
для: 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;
}
|
| |
|
|
|
|
|
|
|
для: Prophet
(13.12.2007 в 21:29)
| | В синтаксисе ошибок нет. | |
|
|
|
|
|
|
|
для: 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");
}
|
| |
|
|
|
|
|
|
|
для: 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");
} |
| |
|
|
|
|
|
|
|
для: cheops
(26.12.2007 в 04:52)
| | Спасибо огромное. | |
|
|
|