Вниз  Помогите разобраться с калькулятором
Тема закрыта
- 25.02.2012 / 19:06copy  #146191
Bobrosoft
  Пользователь

 
Сейчас: Offline
Я решил (в качестве упражнения) сделать консольный калькулятор на С#, который будет считывать пример, распознавать знаки и выполнять действия, причем сначала умножение и деление, а потом уже сложение и вычитание (без этого было бы куда проще). В общем, вот получившийся код. Проблема: программа ведет себя очень странно, иногда выдает правильный результат, иногда выбивает ошибку "индекс находится вне границ массива" в строке (эта строка встречается четыре раза, в одной из строк ошибка) tempResult = numbers[index] ^ numbers[index + 1]; где ^ - любой знак, встречается в строках 64, 67, 92, 95. Подскажите, как с этим бороться

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace CalculatorByBobrosoft
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             List<int> numbers = new List<int>();
  13.             List<char> signs = new List<char>();
  14.             string instance;
  15.             Queue<char> temp = new Queue<char>();
  16.             string temporaryNumber = "";
  17.  
  18.             Console.BackgroundColor = ConsoleColor.Black;
  19.             Console.ForegroundColor = ConsoleColor.Green;
  20.             Console.WriteLine("Вас приветствует калькулятор от Bobrosoft Corporation!");
  21.             Console.WriteLine("Разрешенные действия:\n+ Сложение\n- Вычитание\n* Умножение\n/ Деление");
  22.  
  23.             for (; ; )
  24.             {
  25.                 Console.WriteLine("Ваш пример:");
  26.                 instance = Console.ReadLine();
  27.  
  28.                 foreach (char chr in instance)
  29.                 {
  30.                     if (chr != '+' && chr != '-' && chr != '*' && chr != '/') temp.Enqueue(chr);
  31.                     else
  32.                     {
  33.                         signs.Add(chr);
  34.                         for (int i = 0; i < temp.Count; i++) temporaryNumber += temp.Dequeue();
  35.                         numbers.Add(Int32.Parse(temporaryNumber));
  36.                         temporaryNumber = "";
  37.                     }
  38.                     if (instance.IndexOf(chr) == (instance.Count<char>() - 1))
  39.                     {
  40.                         for (int i = 0; i < temp.Count; i++) temporaryNumber += temp.Dequeue();
  41.                         numbers.Add(Int32.Parse(temporaryNumber));
  42.                         temporaryNumber = "";
  43.                     }
  44.                 }
  45.  
  46.                 Stack<int> toRemove = new Stack<int>();
  47.  
  48.                 List<char> signs2 = new List<char>();
  49.  
  50.                 foreach (char sign in signs)
  51.                 {
  52.                     signs2.Add(sign);
  53.                 }
  54.  
  55.                 foreach (char sign in signs)
  56.                 {
  57.                     if (sign == '*' || sign == '/')
  58.                     {
  59.                         int index = signs2.IndexOf(sign);
  60.                         int tempResult = 0;
  61.                         switch (sign)
  62.                         {
  63.                             case '*':
  64.                                 tempResult = numbers[index] * numbers[index + 1];
  65.                                 break;
  66.                             case '/':
  67.                                 tempResult = numbers[index] / numbers[index + 1];
  68.                                 break;
  69.                         }
  70.  
  71.                         numbers.Insert(index, tempResult);
  72.                         numbers.RemoveAt(index + 2);
  73.                         numbers.RemoveAt(index + 1);
  74.  
  75.                         signs2.RemoveAt(index);
  76.                         toRemove.Push(index);
  77.                     }
  78.                 }
  79.  
  80.                 for (int i = 0; i < toRemove.Count; i++)
  81.                 {
  82.                     signs.RemoveAt(toRemove.Pop());
  83.                 }
  84.  
  85.                 foreach (char sign in signs)
  86.                 {
  87.                     int index = signs2.IndexOf(sign);
  88.                     int tempResult = 0;
  89.                     switch (sign)
  90.                     {
  91.                         case '+':
  92.                             tempResult = numbers[index] + numbers[index + 1];
  93.                             break;
  94.                         case '-':
  95.                             tempResult = numbers[index] - numbers[index + 1];
  96.                             break;
  97.                     }
  98.                     numbers.RemoveAt(index + 1);
  99.                     numbers.RemoveAt(index);
  100.                     numbers.Insert(index, tempResult);
  101.  
  102.                     signs2.RemoveAt(index);
  103.                     toRemove.Push(index);
  104.                 }
  105.  
  106.                 for (int i = 0; i < toRemove.Count; i++)
  107.                 {
  108.                     signs.RemoveAt(toRemove.Pop());
  109.                 }
  110.                 Console.WriteLine("Результат: {0}", numbers[0]);
  111.             }
  112.         }
  113.     }
  114. }


Изменено Bobrosoft (26.02 / 14:38) (всего 7 раз)
- 25.02.2012 / 19:42copy  #146208
DominaN
  Пользователь

 
Сейчас: Offline
Bobrosoft, Очевидно же, что иногда [index + 1] превышает размер массива. Например массив из 10 элементов, а у тебя [index + 1] пытается обратиться к несуществующему 11.
- 25.02.2012 / 19:47copy  #146212
Bobrosoft
  Пользователь

 
Сейчас: Offline
DominaN, да ладно? а я-то был не в курсе :facepalm: (сарказм)
мне нужно знать, почему происходит обращение к несуществующему индексу, ведь алгоритм этого не допускает. Что интересно, 6/2+3 дает правильный результат, а 6/3+3 выбивает ошибку
отладочный вывод индексов показал, что у тройки в этом случае иногда бывает индекс -1 (ОТКУДА?!)

Изменено Bobrosoft (25.02 / 19:47) (всего 1 раз)
- 25.02.2012 / 20:44copy  #146223
Az@
  Пользователь удален

Az@ 
О, братиш, привет:). Ничем помочь не могу:gg:
- 25.02.2012 / 21:11copy  #146237
Bobrosoft
  Пользователь

 
Сейчас: Offline
аза, а мне помощь реально нужна...
- 25.02.2012 / 23:26copy  #146278
Bobrosoft
  Пользователь

 
Сейчас: Offline
неужели никто не в состоянии помочь? :plak:
- 26.02.2012 / 00:58copy  #146295
Freddy
  Пользователь

Freddy 
Сейчас: Offline
Отладчиком пользуйся, создай точки остановки, где у тебя ошибка вылетает и смотри внимательно за значениями переменных.
- 26.02.2012 / 13:32copy  #146349
Bobrosoft
  Пользователь

 
Сейчас: Offline
Freddy, попробовал. В общем, почему-то при удалении из списка чисел (numbers) первой тройки удаляется и вторая...
это такое свойство списков или что?

Изменено Bobrosoft (26.02 / 13:34) (всего 1 раз)
Наверх  Всего сообщений: 8
Фильтровать сообщения
Поиск по теме
Поиск по форуму
Новые вверху
  © aNNiMON (Melnik Software)
Онлайн: 22 (1/21)
 
Яндекс.Метрика