Автор Тема: Проблем с компилирането на програма на C++  (Прочетена 1307 пъти)

Ogg1

  • Напреднали
  • *****
  • Публикации: 32
    • Профил
Ползвам Fedora 14 2.6.35.13-91.fc14.i686 #1 SMP Tue May 3 13:36:36 UTC 2011 i686 i686 i386 GNU/Linux

Написал съм една проста програмка на C++, но имам проблем с компилирането.
Като я компилирам под Ubuntu няма проблем, но с Fedora не ми смята правилно.

Поствам кода за всеки случайл:

Код
GeSHi (C++):
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.  
  6.    int m[30];
  7.    int dni, result;
  8.  
  9.    do {
  10.        cout << "Въведете брой на дни в месеца (между 28 и 31): ";
  11.        cin >> dni;
  12.  
  13.    } while  ( dni < 28 || dni > 31 );
  14.  
  15.    int min, max; // мин и макс температура
  16.    int sum, count, sredna_stoinost[4], dni_za_sredna_stoinost;
  17.  
  18.    dni_za_sredna_stoinost = 7;
  19.    sum = 0;
  20.    count = 0;
  21.  
  22.    for ( int i=0; i < dni; i++ ) {
  23.        do {
  24.            cout << "Въведете температура за ден номер " << i+1 << ": ";
  25.            cin >> m[i];
  26.        } while ( m[i] < -100 || m[i] > 100 );
  27.        result += m[i];
  28.  
  29.        sum += m[i];
  30.        count++;
  31.        //смятане средна стойност за дните от месеца
  32.        if ( ! ( ( i + 1 ) % dni_za_sredna_stoinost ) || ( i == ( dni - 1 ) ) ) {
  33.            int calc_index = i / dni_za_sredna_stoinost;
  34.            sredna_stoinost[calc_index] = sum / count;
  35.            sum = 0;
  36.            count = 0;
  37.        }
  38.        //Ако нямат стойност мин и макс т.е. на първия ден от седмицата се присвояват и двата на първия ден
  39.        if ( i == 0 ) {
  40.            min = m[i];
  41.            max = m[i];
  42.        } else {
  43.            if ( m[i] < min ) {
  44.                min = m[i];
  45.            }
  46.            if ( m[i] > max ) {
  47.                max = m[i];
  48.            }
  49.        }
  50.    }
  51.  
  52.    int sw;
  53.    do {
  54.  
  55.        cout << "\n==============================================\n";
  56.        cout << "==================== MENU ====================\n";
  57.        cout << "==============================================\n";
  58.        cout << "1) Средна стойност за месеца.\n";
  59.        cout << "2) Средна стоиност за седмиците от месеца.\n";
  60.        cout << "3) Минимална температура за месеца.\n";
  61.        cout << "4) Максимална температура за месеца.\n";
  62.        cout << "5) Exit" << endl;
  63.        cout << "Изберете опция: ";
  64.        cin >> sw;
  65.  
  66.        switch ( sw ) {
  67.            case 1: cout << "Средната стойност на температурата за месеца е: " << result/dni << " градуса."<< endl; break;
  68.            case 2:
  69.                cout << "Средна стойност на температурата за месеца на първите " << dni_za_sredna_stoinost << " дена :" << sredna_stoinost[0] << endl;
  70.                cout << "Средна стойност на температурата за месеца на вторите " << dni_za_sredna_stoinost << " дена :" << sredna_stoinost[1] << endl;
  71.                cout << "Средна стойност на температурата за месеца на третите " << dni_za_sredna_stoinost << " дена :" << sredna_stoinost[2] << endl;
  72.                cout << "Средна стойност на температурата за месеца на четвъртите " << dni_za_sredna_stoinost << " дена :" << sredna_stoinost[3] << endl;
  73.                //Остатък от целоцислено делене ако има значи има оставащи дни които са по малко от 7
  74.                if ( dni % dni_za_sredna_stoinost ) {
  75.                    cout << "Средна стойност на температурата за месеца за последните " << dni % dni_za_sredna_stoinost << " дена :" << sredna_stoinost[4] << endl;
  76.                }
  77.                break;
  78.            case 3: cout << "Минимална температура за месеца е: " << min; break;
  79.            case 4: cout << "Максимална температура за месеца е: " << max; break;
  80.            case 5: cout << "Довиждане!!!" << endl; break;
  81.        }
  82.  
  83.    } while (sw != 5);
  84.  
  85.    return 0;
  86. }
  87.  


При самото компилиране няма грешки, но като я изпълня и въведа стойности, изчисленията ми ги прави грешно.
Поствам и аутпут от изхода на програмата:

Код:
# c++ vremeto.cpp
# ./a.out
Въведете брой на дни в месеца (между 28 и 31): 30
Въведете температура за ден номер 1: 3
Въведете температура за ден номер 2: 3
Въведете температура за ден номер 3: 3
Въведете температура за ден номер 4: 3
Въведете температура за ден номер 5: 3
Въведете температура за ден номер 6: 3
Въведете температура за ден номер 7: 3
Въведете температура за ден номер 8: 3
Въведете температура за ден номер 9: 3
Въведете температура за ден номер 10: 3
Въведете температура за ден номер 11: 3
Въведете температура за ден номер 12: 3
Въведете температура за ден номер 13: 3
Въведете температура за ден номер 14: 3                                                                                       
Въведете температура за ден номер 15: 3                                                                                       
Въведете температура за ден номер 16: 3                                                                                       
Въведете температура за ден номер 17: 3
Въведете температура за ден номер 18: 3
Въведете температура за ден номер 19: 3
Въведете температура за ден номер 20: 3
Въведете температура за ден номер 21: 3
Въведете температура за ден номер 22: 3
Въведете температура за ден номер 23: 3
Въведете температура за ден номер 24: 3
Въведете температура за ден номер 25: 3
Въведете температура за ден номер 26: 3
Въведете температура за ден номер 27: 3
Въведете температура за ден номер 28: 3
Въведете температура за ден номер 29: 3
Въведете температура за ден номер 30: 3

==============================================
==================== MENU ====================
==============================================
1) Средна стойност за месеца.
2) Средна стоиност за седмиците от месеца.
3) Минимална температура за месеца.
4) Максимална температура за месеца.
5) Exit
Изберете опция: 1
Средната стойност на температурата за месеца е: 2600986 градуса.

Както виждате средната температура за месеца е някакво супер голямо число. Според това което намерих в нета, трябва да си инсталирам "Development Libraries", както и направих, но проблема си остана. Поствам и списък с инталираните ми пакети, които се отнасят за C++

# rpm -qa |grep c++
compat-gcc-34-c++-3.4.6-20.fc14.i686
gcc-objc++-4.5.1-4.fc14.i686
libstdc++-4.5.1-4.fc14.i686
uuid-c++-1.6.2-2.fc14.i686
libsigc++20-devel-2.2.4.2-1.fc12.i686
libsigc++20-2.2.4.2-1.fc12.i686
uuid-c++-devel-1.6.2-2.fc14.i686
gcc-c++-4.5.1-4.fc14.i686
libstdc++-devel-4.5.1-4.fc14.i686
compat-libstdc++-33-3.2.3-68.i686

# rpm -qa |grep gcc
compat-gcc-34-c++-3.4.6-20.fc14.i686
gcc-objc++-4.5.1-4.fc14.i686
gcc-c++-4.5.1-4.fc14.i686
gcc-gnat-4.5.1-4.fc14.i686
gcc-gfortran-4.5.1-4.fc14.i686
libgcc-4.5.1-4.fc14.i686
gcc-java-4.5.1-4.fc14.i686
gccxml-0.9.0-0.6.20110211.fc14.i686
compat-gcc-34-3.4.6-20.fc14.i686
gcc-objc-4.5.1-4.fc14.i686
gcc-4.5.1-4.fc14.i686


Инсталирал съм и make и automake, както пишеше в някой сайтове.Дайте идея защо се получава така.
П.С. Ако кача променливите преди функцията "int main ()", сметките стават както трябва, но това не ми се струва да е редно :)
« Последна редакция: Jun 07, 2011, 00:32 от VladSun »
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Явно не си зануляваш нещо променливите. Като ги изнесеш пред main, те стават глобални и сами се зануляват, за това тогава ти работи.

Също така излизаш от масивите си:

 int calc_index = i / dni_za_sredna_stoinost;
 sredna_stoinost[calc_index] = sum / count;

при i >= 28, calc_index е 4 и тогава sredna_stoinost[calc_index] сощи петият елемент на масива ти, а той е 4 елемента.

Колкото повече гледам тоя код, толкова повече се чудя как работи въобще.

result += m; ???? Това реално е: увеличи result с указателя към масива m. Предполагам имаш впредвид m.

 cin >> m; и тук би трябвало да е m
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg

Ogg1

  • Напреднали
  • *****
  • Публикации: 32
    • Профил
Явно не си зануляваш нещо променливите. Като ги изнесеш пред main, те стават глобални и сами се зануляват, за това тогава ти работи.

Също така излизаш от масивите си:

 int calc_index = i / dni_za_sredna_stoinost;
 sredna_stoinost[calc_index] = sum / count;

при i >= 28, calc_index е 4 и тогава sredna_stoinost[calc_index] сощи петият елемент на масива ти, а той е 4 елемента.

Колкото повече гледам тоя код, толкова повече се чудя как работи въобще.

result += m; ???? Това реално е: увеличи result с указателя към масива m. Предполагам имаш впредвид m.

 cin >> m; и тук би трябвало да е m

Объркал съм кода при copy-paste.
Сега съм постнал кода както трябва :)

П.С. Пак да отбележа, че като се компилира под Ubuntu няма никакви проблеми.
Дали не е възможно да се получава така заради някоя липстваща библиотека ?
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Е дебъгни я де!
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

Ogg1

  • Напреднали
  • *****
  • Публикации: 32
    • Профил
Дебъг:

Във for-а след result += m
съм добавил следните редове (проверявам стойностите при вкарването им):
Код
GeSHi (C++):
  1. cout << "\n m[i] = " << m[i];                                                                                                                                              
  2. cout << "\n result = " << result << endl;


Изход от въвеждането на данните:

Код:
Въведете брой на дни в месеца (между 28 и 31): 30
Въведете температура за ден номер 1: 2

 m[i] = 2
 result = 1189896182
Въведете температура за ден номер 2: 2

 m[i] = 2
 result = 1189896184
Въведете температура за ден номер 3: 2

 m[i] = 2
 result = 1189896186
Въведете температура за ден номер 4: 2

 m[i] = 2
 result = 1189896188
Въведете температура за ден номер 5: 2

 m[i] = 2
 result = 1189896190
Въведете температура за ден номер 6: 2

 m[i] = 2
 result = 1189896192
Въведете температура за ден номер 7: 2

 m[i] = 2
 result = 1189896194
Въведете температура за ден номер 8: 2

 m[i] = 2
 result = 1189896196
Въведете температура за ден номер 9: 2

 m[i] = 2
 result = 1189896198
Въведете температура за ден номер 10: 2

 m[i] = 2
 result = 1189896200
Въведете температура за ден номер 11: 2

 m[i] = 2
 result = 1189896202
Въведете температура за ден номер 12: 2

 m[i] = 2
 result = 1189896204
Въведете температура за ден номер 13: 2

 m[i] = 2
 result = 1189896206
Въведете температура за ден номер 14: 2

 m[i] = 2
 result = 1189896208
Въведете температура за ден номер 15: 2

 m[i] = 2
 result = 1189896210
Въведете температура за ден номер 16: 2

 m[i] = 2
 result = 1189896212
Въведете температура за ден номер 17: 2

 m[i] = 2
 result = 1189896214
Въведете температура за ден номер 18: 2

 m[i] = 2
 result = 1189896216
Въведете температура за ден номер 19: 2

 m[i] = 2
 result = 1189896218
Въведете температура за ден номер 20: 2

 m[i] = 2
 result = 1189896220
Въведете температура за ден номер 21: 2

 m[i] = 2
 result = 1189896222
Въведете температура за ден номер 22: 2

 m[i] = 2
 result = 1189896224
Въведете температура за ден номер 23: 2

 m[i] = 2
 result = 1189896226
Въведете температура за ден номер 24: 2

 m[i] = 2
 result = 1189896228
Въведете температура за ден номер 25: 2

 m[i] = 2
 result = 1189896230
Въведете температура за ден номер 26: 2

 m[i] = 2
 result = 1189896232
Въведете температура за ден номер 27: 2

 m[i] = 2
 result = 1189896234
Въведете температура за ден номер 28: 2

 m[i] = 2
 result = 1189896236
Въведете температура за ден номер 29: 2

 m[i] = 2
 result = 1189896238
Въведете температура за ден номер 30: 2

 m[i] = 2
 result = 1189896240
« Последна редакция: Jun 07, 2011, 00:33 от VladSun »
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Дали не е възможно да се получава така заради някоя липстваща библиотека ?

Ти не ползваш нищо друго освен стандартната библиотека, а тя сама си се включва.

Както ти казах не си зануляваш променливите. result никъде не е занулена. Така при първият result += m имаш нещо коеот е седяло в паметта, която result заема и го събираш с 2. За това с глобални променливи ти работи.
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg

Ogg1

  • Напреднали
  • *****
  • Публикации: 32
    • Профил
Дали не е възможно да се получава така заради някоя липстваща библиотека ?

Ти не ползваш нищо друго освен стандартната библиотека, а тя сама си се включва.

Както ти казах не си зануляваш променливите. result никъде не е занулена. Така при първият result += m имаш нещо коеот е седяло в паметта, която result заема и го събираш с 2. За това с глобални променливи ти работи.

Мерси много. Занулих променливата веднага след като съм я декларирал и сега всичко е ОК.
Активен