Форум программистов, компьютерный форум CyberForum.ru

В какой последовательности выполняются действия вычисления ошибки исходя из кода - C++

Восстановить пароль Регистрация
 
nagorniy
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 26
16.07.2014, 21:50     В какой последовательности выполняются действия вычисления ошибки исходя из кода #1
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
// A program to implement a calculator accepting parentheses
 
#include <iostream>                   // For stream input/output
#include <cstdlib>                    // For the exit() function
#include <cctype>                     // For the isdigit() function
#include <cstring>                    // For the strcpy() function
using std::cin;
using std::cout;
using std::endl;
 
void eatspaces(char* str);            // Function to eliminate blanks
double expr(char* str);               // Function evaluating an expression
double term(char* str, int& index);   // Function analyzing a term
double number(char* str, int& index); // Function to recognize a number
char* extract(char* str, int& index); // Function to extract a substring
void error(char* str, int index);     // Function to identify an error
 
const int MAX = 80;                   // Maximum expression length, 
                                      // including '\0'
int main()
{
   char buffer[MAX] = {0};    // Input area for expression to be evaluated
 
   cout << endl
        << "Welcome to your friendly calculator."
        << endl
        << "Enter an expression, or an empty line to quit."
        << endl;
 
   for(;;)
   {
      cin.getline(buffer, sizeof buffer);   // Read an input line
      eatspaces(buffer);                    // Remove blanks from input
 
      if(!buffer[0])                        // Empty line ends calculator
         return 0;
 
      cout << "\t= " << expr(buffer)        // Output value of expression
           << endl << endl;
   }
}
 
 
// Function to eliminate spaces from a string
void eatspaces(char* str)
{
   int i = 0;                             // 'Copy to' index to string
   int j = 0;                             // 'Copy from' index to string
 
   while((*(str + i) = *(str + j++)) != '\0')  // Loop while character
                                               // copied is not \0
      if(*(str + i) != ' ')                    // Increment i as long as
         i++;                                  // character is not a space
   return;
}
 
// Function to evaluate an arithmetic expression
double expr(char* str)
{
  double value = 0.0;                  // Store result here
  int index = 0;                       // Keeps track of current character position
 
  value = term(str, index);            // Get first term
 
  for(;;)                              // Indefinite loop, all exits inside
  {
    switch(*(str + index++))           // Choose action based on current character
    {
      case '\0':                       // We're at the end of the string
         return value;                 // so return what we have got
 
      case '+':                        // + found so add in the
         value += term(str, index);    // next term
         break;
 
      case '-':                        // - found so subtract
         value -= term(str, index);    // the next term
         break;
 
      default:                         // If we reach here the string
         cout << endl                  // is junk
              << "Arrrgh!*#!! There's an error"
              << endl;
         error(str, index-1);
         exit(1);
    }
  }
}
 
// Function to get the value of a term
double term(char* str, int& index)
{
  double value = 0.0;                  // Somewhere to accumulate 
                                       // the result
 
  value = number(str, index);          // Get the first number in the term
 
  // Loop as long as we have a good operator
  while((*(str + index) == '*') || (*(str + index) == '/'))
  {
 
    if(*(str + index) == '*')          // If it's multiply,
      value *= number(str, ++index);   // multiply by next number
 
    if(*(str + index) == '/')          // If it's divide,
      value /= number(str, ++index);   // divide by next number
  }
  return value;                        // We've finished, so return what 
                                       // we've got
}
 
// Function to recognize a number in a string
double number(char* str, int& index)
{
  double value = 0.0;                  // Store the resulting value
 
  if(*(str + index) == '(')           // Start of parentheses
  {
    char* psubstr = 0;               // Pointer for substring
    psubstr = extract(str, ++index); // Extract substring in brackets
    value = expr(psubstr);           // Get the value of the substring
    delete[]psubstr;                 // Clean up the free store
    return value;                    // Return substring value
  }
 
  while(isdigit(*(str + index)))       // Loop accumulating leading digits
    value = 10*value + (*(str + index++) - '0');
 
                                       // Not a digit when we get to here
  if(*(str + index) != '.')            // so check for decimal point
    return value;                      // and if not, return value
 
  double factor = 1.0;                 // Factor for decimal places
  while(isdigit(*(str + (++index))))   // Loop as long as we have digits
  {
    factor *= 0.1;                     // Decrease factor by factor of 10
    value = value + (*(str + index) - '0')*factor;   // Add decimal place
  }
 
  return value;                        // On loop exit we are done
}
 
// Function to extract a substring between parentheses 
// (requires cstring)
char* extract(char* str, int& index)
{
  char buffer[MAX];                   // Temporary space for substring
  char* pstr = 0;                     // Pointer to new string for return
  int numL = 0;                       // Count of left parentheses found
  int bufindex = index;               // Save starting value for index
 
  do
  {
    buffer[index - bufindex] = *(str + index);
    switch(buffer[index - bufindex])
    {
      case ')':
        if(numL == 0)
        {
          size_t size = index - bufindex;
          buffer[index - bufindex] = '\0';  // Replace ')' with '\0' 
          ++index;
          pstr = new char[index - bufindex];
          if(!pstr)
          {
            cout << "Memory allocation failed,"
                 << " program terminated.";
            exit(1);
          }
          strcpy_s(pstr, index-bufindex, buffer); // Copy substring to new memory
          return pstr;                 // Return substring in new memory
        }
        else
          numL--;                      // Reduce count of '(' to be matched
          break;
 
      case '(':
        numL++;                        // Increase count of '(' to be 
                                   // matched
        break;
      }
  } while(*(str + index++) != '\0'); // Loop - don't overrun end of string
 
  cout << "Ran off the end of the expression, must be bad input."
       << endl;
  exit(1);
  return pstr;
}
 
// Function to identify an error
void error(char* str, int index)
{
   cout << str << endl;
   for (int i=0; i<index; i++)
      cout << ' ';
   cout << '^' << endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2014, 21:50     В какой последовательности выполняются действия вычисления ошибки исходя из кода
Посмотрите здесь:

Вычисления ряду с точностю!!! Исправить ошибки! C++
C++ В чем ошибки кода?
C++ В какой последовательности размещаются массива
C++ Ошибки в фрагменте кода
C++ Есть ли ошибки в следующем фрагменте кода?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2014, 23:00     В какой последовательности выполняются действия вычисления ошибки исходя из кода #2
nagorniy, в чем конкретно вопрос?
nagorniy
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 26
16.07.2014, 23:09  [ТС]     В какой последовательности выполняются действия вычисления ошибки исходя из кода #3
Я не могу разобраться в какой последовательности выполняются действия вычисления ошибки исходя из этого кода.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2014, 23:12     В какой последовательности выполняются действия вычисления ошибки исходя из кода #4
Цитата Сообщение от nagorniy Посмотреть сообщение
Я не могу разобраться в какой последовательности выполняются действия
Так может надо просто программу под отладчиком запустить?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
16.07.2014, 23:12     В какой последовательности выполняются действия вычисления ошибки исходя из кода #5
Цитата Сообщение от nagorniy Посмотреть сообщение
Я не могу разобраться в какой последовательности выполняются действия вычисления ошибки исходя из этого кода.
переведи
что есть "действие вычисления ошибки"

одну вижу
Цитата Сообщение от nagorniy Посмотреть сообщение
sizeof buffer
sizeof( buffer)
nagorniy
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 26
16.07.2014, 23:19  [ТС]     В какой последовательности выполняются действия вычисления ошибки исходя из кода #6
Данная программа находит ошибку при вводе выражения, тоесть если ввести запятую или букву. Так вот именно об этом я и спрашиваю, каким образом программа вычисляет эту ошибку?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2014, 23:25     В какой последовательности выполняются действия вычисления ошибки исходя из кода
Еще ссылки по теме:

C++ Ошибки кода, отличия синтаксиса C# и C++
Какие действия исполняет заданная часть программы? Если есть ошибки исправить их и объяснить исправления C++
Проверка XML кода на ошибки C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
16.07.2014, 23:25     В какой последовательности выполняются действия вычисления ошибки исходя из кода #7
Цитата Сообщение от nagorniy Посмотреть сообщение
void eatspaces(char* str)
удаляет лишние пробелы, вроде бы
Цитата Сообщение от nagorniy Посмотреть сообщение
double number(char* str, int& index)
переводит строку в число типа дубель
проверка на число вот она
Цитата Сообщение от nagorniy Посмотреть сообщение
isdigit
а вообще как говорил Tulosba, пройдись отладчиком
Yandex
Объявления
16.07.2014, 23:25     В какой последовательности выполняются действия вычисления ошибки исходя из кода
Ответ Создать тему
Опции темы

Текущее время: 20:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru