Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
batyr
1 / 1 / 1
Регистрация: 19.10.2012
Сообщений: 64
1

Напечатать попарно порядковые номера соответствующих открывающих и закрывающих скобок в выражении

12.04.2013, 21:31. Просмотров 760. Ответов 1
Метки нет (Все метки)

Дано скобочное выражение длиной до 50 символов, оканчивающееся пробелом. Напечатать попарно порядковые номера соответствующих открывающих и закрывающих скобок в выражении. Помогите пожалуйста.
Пример.
1 4 8 10 14 19 27
Вх. текст: (a+(b+c)/(a-b)*(x+(y+2)**3))/2
Результат: 4 8
10 14
19 23
16 27
1 28

Указание. Для запоминания номеров открывающих скобок использовать стек.

Примерный код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
     #include <stdio.h>
     #include <conio.h>
         /*в”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђ*/
         /*   Функция выделения числа и преобразования его из     */
         /*    символьной формы представления в целочисленную  */
         /*в”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђ*/
     int Сhislo ( char text [], int *i )
            /* Входные данные:                                               */
            /*      text - символьная строка,                            */
            /*      *i - индекс первой цифры числа в строке text.  */
            /* Выходные данные:                                          */
            /*      *i - индекс следующего после числа символа.  */
            /* Функция возвращает целое число                         */
     {   int c=0;   /* возвращаемое значение  */
          while (text[*i]>='0' && text[*i]<='9')
          {  c=c*10+(text[*i]-'0');
              (*i)++;
          }
          return c;
      }
 
              /*в”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђ*/
              /*       Главная функция                 */
              /*в”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђв”Ђ*/
 
     main()
     {   char  text [80]; /* вх. текст - арифм. выражение */
          int   i ;              /* индекс массива text */
          float  opd [3];  /* стек операндов   */
          char   opc [3];  /* стек операций    */
          int    pr [3] ;     /* стек приоритетов */
          int    j = -1 ;     /* указатель стека */
          printf ("\nВведите арифметическое выражение.\n");
          gets (text);
          i=-1;
          do
          {  i++;
                /* запись числа, операции и ее приоритета в стек */
              opd[++j] = Сhislo(text,&i);  opc[j] = text[i];
              switch  (text[i])
              {
                  case '+':
                  case '-': pr[j]=1; break;
                  case '*':
                  case '/': pr[j]=2; break;
                  case ' ' /* пробел */: pr[j]=0;
              }
              while  (j>0 && pr[j]<=pr[j-1])
              {       /* выполнение соответствующей операции */
                  switch  (opc[j-1])
                  {  case '+' :  opd[j-1] = opd[j-1] + opd[j]; break;
                      case '-' :   opd[j-1] = opd[j-1] - opd[j];  break;
                      case '*' :  opd[j-1] = opd[j-1] * opd[j]; break;
                      case '/' :   opd[j-1] = opd[j-1] / opd[j];
                  }
                      /* удаление выполненной операции из стека */
                  opc[j-1]=opc[j];  pr[j-1]=pr[j];  j=j-1;
              }
          }
          while (text[i]!=' ');
          printf ("Результат:%.2f\n",opd[0]);
          getch();
    }
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2013, 21:31
Ответы с готовыми решениями:

Проверить текст на несоответствие числа открывающих и закрывающих круглых скобок
Дан текстовый файл f, содержащий программу на языке Си. Проверить эту программу...

Для каждой пары скобок напечатать номера их позиций в тексте
В текстовом фале записан текст, сбалансированный по круглым скобкам:...

Стеки: для каждой пары скобок напечатать номера их позиций в тексте
В строке записан текст что сбалансированный за круглыми скобками:...

Проверить код на наличие всех закрывающих скобок
вот задачка: вот собственно и сама программа которую я написал в с#, тока...

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

1
anmartex
...
1711 / 1204 / 909
Регистрация: 12.02.2013
Сообщений: 1,978
13.04.2013, 19:44 2
Лучший ответ Сообщение было отмечено batyr как решение

Решение

batyr, я не понял, а зачем всё выражение разбирать? Вам же только соответствие скобок нужно вывести.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct node_t
{
   unsigned pos;
   struct node_t* next;
}  TStack;
 
//-----------------------------------------------------------------------------
TStack* Push(TStack** stack, unsigned pos)
{
   TStack* node = (TStack*) malloc(sizeof(TStack));
   node->pos = pos;
   node->next = *stack;
 
   *stack = node;
 
   return *stack;
}
//-----------------------------------------------------------------------------
TStack* Pop(TStack** stack)
{
   if (*stack)
   {
      TStack* node = *stack;
      *stack = (*stack)->next;
      free(node);
   }
 
   return *stack;
}
//-----------------------------------------------------------------------------
void Clear(TStack** stack)
{
   while (Pop(stack)) { ; }
}
//-----------------------------------------------------------------------------
void PrintPosBrackets(const char expr[])
{
   TStack* stack = NULL;
   unsigned i;
   unsigned length = strlen(expr);
   int error = 0;
 
   for (i = 0; (i < length) && (error == 0); ++i)
   {
      switch (expr[i])
      {
         case '(':
            Push(&stack, i + 1);
            break;
 
         case ')':
            if (stack)
            {
               printf("%2d %2d\n", stack->pos, i + 1);
               Pop(&stack);
            }
            else
            {
               error = 1;
            }
            break;
      }
   }
 
   if (error || stack)
   {
      printf("error parsing expression ...\n");
   }
 
   Clear(&stack);
}
//-----------------------------------------------------------------------------
 
int main()
{
   PrintPosBrackets("(a+(b+c)/(a-b)*(x+(y+2)**3))/2");
 
   system("pause");
 
   return 0;
}
Напечатать попарно порядковые номера  соответствующих  открывающих и закрывающих скобок в выражении


Результат выполнения на codepad.org

Бинарник + исходник: program.7z
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2013, 19:44

Найти наименьшие элементы массива и их порядковые номера
Люди добрые, все надежда только на вас! Я в этом деле новичек( И первое же что...

Найти в массиве максимальный и минимальный элементы, вывести их и их порядковые номера
Ребята, кто может, помогите пожалуйста... не можем найти ошибку... задача...

Зашифровать слово, подставив вместо букв их порядковые номера в алфавите
Зашифровать слово, поставив букве её номер в алфавите. Если можно, то не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru