2015-09-20 4 views
0

Я написал следующую программу, предназначенную для сравнения float на C++. Первоначально это было написано, пытаясь сравнить double, но вскоре я понял, насколько плоха проблема. В общем, должно случиться, что программа должна сравнить два числа заданного массива slot и поменять их по мере необходимости.Сравнение двойного в C++

#include<iostream> 

using namespace std; 

int swap(float[] , int, int); 

int main() { 
    float slot[10] = {8.25, 3.26, 1.20, 5.15, 7.99, 10.59, 4.36, 9.76, 6.29, 2.09}; 
    int n=10, i; 
    int lower, upper, sortflag, sml, scan; 
    lower = 0; 
    upper = n-1; 
    sortflag = 1; 

    float temp; 

    while((lower < upper) && (sortflag == 1)) { 
     sml = lower; 
     sortflag = 0; 
     scan = lower + 1; 
     while(scan <= upper - lower) { 
      if (slot[scan] > slot[scan + 1]) { 
       swap(slot, scan, scan + 1); 

       sortflag = 1; 
       if(slot[scan] < slot[sml]) sml = scan; 
      } 
      scan++; 
     } 

    swap(slot, lower, sml); 

    upper = upper - 1; 
    lower = lower + 1; 
    } 

    cout << "AFTER SORT: " << endl; 
    for (i= 0; i < n; i++) cout << slot[i] << " "; 

    cout << endl; 

    return 0; 

} 

void swap(float data[], int i, int j) { 

    float temp; 

    temp = data[i]; 
    data[j] = data[i]; 
    data[j] = temp; 

} 

Когда я запустил эту программу с double вместо поплавка, программа побежал бесконечно, пока я не должен был вызвать Ctrl+C разорвать его. После переключения на float я вместо того, чтобы получить следующий вывод:

AFTER SORT: 
8.25 8.25 3.26 5.15 7.99 10.59 10.59 10.59 10.59 10.59 
0 0 1 3 4 5 5 5 5 5 

-------------------------------- 
Process exited after 0.06651 seconds with return value 0 
Press any key to continue . . . 

Где идет не так логика?

EDIT: Поэтому после некоторого рассмотрения я пошел вперед и переписал программу, чтобы сравнить ее значения int.

int slot[10] = {8, 3, 1, 5, 7, 10, 4, 9, 6, 2}; 

и регулировать все необходимые функции по мере необходимости: // Объявление функции: недействительным своп (ИНТ [], Int, Int);

недействительным своп (ИНТ данных [], Int я, Int J) {

int temp; 

temp = data[i]; 
data[i] = data[j]; 
data[j] = temp; 

} 

И функция теперь придумывают правильно с правильным входом. Здесь нет проблем с выходом за границы.

AFTER SORT: 
1 2 3 4 5 6 7 8 9 10 


-------------------------------- 
Process exited after 0.05111 seconds with return value 0 
Press any key to continue . . . 

Вот новая модифицированная программа:

int main() { 
    int slot[10] = {8, 3, 1, 5, 7, 10, 4, 9, 6, 2}; 

    int n=10, i; 
    int lower, upper, sortflag, sml, scan; 
    lower = 0; 
    upper = n-1; 
    sortflag = 1; 

    while((lower < upper) && (sortflag == 1)) { 
     sml = lower; 
     sortflag = 0; 
     scan = lower + 1; 
     while(scan <= (upper-lower)) { 
      if (slot[scan] > slot[scan + 1]) { 
       swap(slot, scan, scan + 1); 

       sortflag = 1; 
       if(slot[scan] < slot[sml]) sml = scan; 
      } 
      scan++; 
     } 

    swap(slot, lower, sml); 

    upper = upper - 1; 
    lower = lower + 1; 
    } 

    cout << "AFTER SORT: " << endl; 
    for (i= 0; i < n; i++) cout << slot[i] << " "; 
    cout << endl; 
    //for (i= 0; i < n; i++) cout << index[i] << " "; 

    cout << endl; 

    return 0; 

} 

void swap(int data[], int i, int j) { 

    int temp; 

    temp = data[i]; 
    data[i] = data[j]; 
    data[j] = temp; 

} 

Так что теперь вопрос почему int версии работают без проблем, но ни в double ни float версии делать?

+2

Используйте отладчик и выполните пошаговый разбор. Убедитесь, что вы не получаете доступ за пределы. – vsoftco

+0

ваша программа работает и производит идентичные результаты, если вы выполняете текстовый поиск и заменяете «float» на «double» –

+0

@ManosNikolaidis. Может ли это быть моим компилятором, который генерирует ошибки? –

ответ

2

Ваша функция замены ошибочна. data[j] = data[i]; бесполезен, если за ним следует другая запись data[j] = temp;. Это должно быть, как это

int swap(float data[], int i, int j) { 

    float temp; 

    temp = data[i]; 
    data[i] = data[j]; // reverse this line 
    data[j] = temp; 

    return 0; 
} 

И нет никакого смысла делать функцию возвращающегося int, если вы не используете результат. Просто объявите его void

+1

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

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