2016-12-07 8 views
-1

так моя программа должна работать так:Программа не работает должным образом

  1. ввода чисел п и т (например, п = 1, т = 10)
  2. ввода всех значений п до m (например, 1; 2; 3; 4; 5; 6; 7; 8; 9; 10) в динамическую матрицу
  3. Затем с помощью функции bool вам необходимо выполнить поиск динамического массива для двух чисел, которые квадратичны и (например, 1 * 1 + 1 * 1 = 2; 2 * 2 + 2 * 2 = 8 и т. д.)

Программа по какой-либо причине либо ограничивает только самую первую комбинацию, либо вообще не выводит ничего на печать (например, если n = 1 и m = 10, она ограничивает только 1 * 1 + 1 * 1 = 2, но она должна outprint 2 * 2 + 1 * 1 = 5; 2 * 2 + 2 * 2 = 8 и т. Д., Если n = 4 и m = 200, он даже не распечатывает ничего). Где могла быть проблема? Я застрял часами и, на мой взгляд, программа должна работать, но это не так. Большое спасибо.

#include <iostream> 

using namespace std; 

bool isSquared (int i){ 
    // bool result = false; 

    //int div; 
    //int *squares = new int [i]; 

    for (int j=1;j<=i;j++){ 
     for (int k=1;k<=i;k++){ 
      if (k*k + j*j == i) return true; 
      else return false; 
     } 
    } 
} 


int main() 
{ 
    int n,m,i,size; 

    cin >>n; 
    cin >>m; 

    size = m - n; 
    int *real = new int [m - n]; 

    for (int q=0, j=n; q<size, j<=m; q++, j++){ 
     real[q] = j; 
    } 

    for (int q=0; q<=size; q++){ 
     cout <<real[q] <<" | "; 
    } 

    cout <<endl; 

    for (int i=n; i<=m; i++){ 
     if (isSquared(i) == true){ 
      for (int j=0; j<=size; j++){ 
       for (int k=0; k<=size; k++){ 
        if (real[j]*real[j] + real[k]*real[k] == i){ 
         cout <<i <<"=" <<real[j] <<"*" <<real[j] <<"+" <<real[k] <<"*" <<real[k] <<endl; 
        } 
       } 

      } 


     } 
    } 

    return 0; 
} 
+1

Правильный инструмент для решения таких проблемы - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Подсказка: 'for (int k = 1; k <= i; k ++) {' Зачем вам этот цикл, если вы возвращаетесь на первое сравнение независимо? – drescherjm

+0

@drescherjm вот что, как я могу остановить функцию от возвращения, когда она получает первое сравнение. – jcoe

ответ

3

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

  1. Входные целые числа п и т (например, N = 1; т = 10)
  2. ввода все значения от п до т (например, 1, 2; 3; 4; 5; 6; 7; 8; 9; 10) в динамический массив
  3. Затем с помощью функции bool вам необходимо найти динамический массив для двух чисел, которые квадратизированы и суммированы вместе и образуют какое-то третье число (например, 1 * 1 + 1 * 1 = 2; 2 * 2 + 2 * 2 = 8 и т.д. и т.п.)

я не вижу (логический) р roblem с тем, как вы написали часть 1, но, ради ясности, я переименую их в start и end.

//I'm also getting rid of superfluous variables we don't need. 
int start, end; 

cin >> start; 
cin >> end; 

Часть 2, где мы начинаем сталкиваться с проблемами. Во-первых, вы сделали вашу программу излишне сложной, включив ручное управление динамической памятью. std::vector идеально подходит для нашей задачи (более чем по одной причине, как вы скоро увидите ...)

std::vector<int> data; 

Мы собираемся загрузить наши ценности в data. Исходя из вашего запроса, входы для start и end являются инклюзивный диапазон, так что мы будем писать так:

for(int i = start; i <= end; i++) { 
    data.emplace_back(i); 
} 

В версии кода, это просто сбивает с толку:

for (int q=0, j=n; q<size, j<=m; q++, j++){ 
    real[q] = j; 
} 

Вы определили size как m - n, который будет равен 9, но подсказка хочет все числа от 1 до 10, что означает, что должно быть 10 чисел; так что с места в карьер, у вас будут ошибки. Код, который я предложил, будет работать более надежно.

Наконец, давайте рассмотрим Шаг 3.Он может (и должен) быть разбита на несколько этапов:

  • Для каждого номера в data (z),
    • итерация через каждую пару чисел, которые предшествуют его (что, основываясь на ваших примерах, могут включать дубликаты), и для каждой пары (x и y)
    • определить, если x*x + y*y == z, и если да, напечатайте эти переменные пользователю.

Так давайте писать этот код.

//Note we're using data.size(), to ensure we stay in valid memory 
for(int i = 0; i < data.size(); i++) { 
    int z = data[i]; 
    //You can change the checks for j and k to "j <= i" and "k <= i" respectively 
    //if you want solutions where z*z + z*z = z, which can happen if z == 0. 
    for(int j = 0; j < i; j++) { 
     //We don't need to repeat identical pairs, so we're starting k at j. 
     for(int k = j; k < i; k++) { 
      int x = data[j]; 
      int y = data[k]; 
      if(x*x + y*y == z) { 
       std::cout 
       << x << "*" << x 
       << " + " 
       << y << "*" << y 
       << " = " 
       << z 
       << std::endl; 
      } 
     } 
    } 
} 

Для входа 1 10, я получаю следующий результат:

1*1 + 1*1 = 2 
1*1 + 2*2 = 5 
2*2 + 2*2 = 8 
1*1 + 3*3 = 10 

И для ввода 4 200 я получаю следующий результат:

4*4 + 4*4 = 32 
4*4 + 5*5 = 41 
5*5 + 5*5 = 50 
4*4 + 6*6 = 52 
5*5 + 6*6 = 61 
4*4 + 7*7 = 65 
6*6 + 6*6 = 72 
5*5 + 7*7 = 74 
4*4 + 8*8 = 80 
6*6 + 7*7 = 85 
5*5 + 8*8 = 89 
4*4 + 9*9 = 97 
7*7 + 7*7 = 98 
6*6 + 8*8 = 100 
5*5 + 9*9 = 106 
7*7 + 8*8 = 113 
4*4 + 10*10 = 116 
6*6 + 9*9 = 117 
5*5 + 10*10 = 125 
8*8 + 8*8 = 128 
7*7 + 9*9 = 130 
6*6 + 10*10 = 136 
4*4 + 11*11 = 137 
8*8 + 9*9 = 145 
5*5 + 11*11 = 146 
7*7 + 10*10 = 149 
6*6 + 11*11 = 157 
4*4 + 12*12 = 160 
9*9 + 9*9 = 162 
8*8 + 10*10 = 164 
5*5 + 12*12 = 169 
7*7 + 11*11 = 170 
6*6 + 12*12 = 180 
9*9 + 10*10 = 181 
4*4 + 13*13 = 185 
8*8 + 11*11 = 185 
7*7 + 12*12 = 193 
5*5 + 13*13 = 194 
10*10 + 10*10 = 200 
+0

@jcoe Если это решает все ваши проблемы, пожалуйста, отметьте это как решено. – Angelo

Смежные вопросы