Mnożenie liczby w warunku w pętli

0

Dlaczego dla kompilatora wyrażenie:

for(int i = 0; i < (24*ile); i++)

nie jest równoznaczne z tym:

int a = 24*ile;
for(int i = 0; i < a; i++)

? W pierwszym wypadku pętla jest wykonywana tylko raz, a w drugim 24, 48, itd. - zależnie od wartości ile. Dlaczego tak się dzieje? Dawałem Rebuild. IDE to C::B. Z góry dzięki za odpowiedzi :)

0

nie ma takiej opcji. pokaż cały kod.

0
#include <iostream>

using namespace std;

int main()
{
    int ile = 0;
    cin >> ile;
    for(int i = 0; i < (24*ile); i++)
    {
        char team1[512], team2[512], separator[1];
        int gol1 = 0, gol2 = 0;
        cin >> team1 >> gol1 >> separator >> gol2 >> team2;
        cout << team1 << gol1 << separator << gol2 << team2 << endl;
    }
    return 0;
}

Wykonuje się tylko raz...

#include <iostream>

using namespace std;

int main()
{
    int ile = 0;
    cin >> ile;
    int a = 24*ile;
    for(int i = 0; i < a; i++)
    {
        char team1[512], team2[512], separator[1];
        int gol1 = 0, gol2 = 0;
        cin >> team1 >> gol1 >> separator >> gol2 >> team2;
        cout << team1 << gol1 << separator << gol2 << team2 << endl;
    }
    return 0;
}

Wykona się 24*ile razy. Wiem, że to dziwne, i też uważałem że to bez sensu, no ale jednak pokonało mnie to :|

0
#include <iostream>

using namespace std;

int main()
{
    int ile = 0;
    cin >> ile;
    for(int i = 0; i < (24*ile); ++i)
    {
        cout<<i<<"\n";
    }
    return 0;
}

Ten kod działa, wiec po przeanalizowaniu problemu wychodzi, że coś jest nie tak w reszcie programu :) Polecam samemu potestować, znajdywanie bledow to praktyczna umiejetnosc :D

0

This is incredible. Wkleiłem twój kod, działał (do tego samego projektu). Potem nacisnąłem Ctrl+Z, i skompilowałem (jak prawdopodobnie się domyśliliście wróciło do mojego kodu ;)). I co? Działa tak jak miał działać. Niesamowite. Dzięki, chociaż dalej nie wiem, w czym był problem :)

PS> Sopelek, kompilowałeś pod C::B?

0

Musiałeś coś zmienić, bo mażesz po pamięci.

char Tab[CośTam]; // Uwaga!
cin>>Tab; // Nigdy tak nie robić!

Powiedz skąd wytrzasnąłeś takie obrzydlistwo?

0

Serio. Wkleiłem kod, skompilowałem, Ctrl+Z, skompilowałem, i już działa. Nie mam pojęcia czemu.

Szczerze mówiąc ten kod i tak już zastąpiłem std::string, bo łatwiej się nim operuje. A mógłbyś zrobić mały wykład czemu ten kod jest niepoprawny? (działa dobrze)

0

W poprzednich postach wkleiłem obydwa kody, działający i nie. A przecież separator a ile to 2 różne zmienne, więc czemu tam ma być błąd? Dodam, że jako separator zawsze podawany jest dwukropek.

0

Dlaczego pytasz? Zapewne ten sam blad byl u Ciebie.

Spojrzmy na taki kod.

#include <iostream>

using namespace std;

int main()
{
    char tab[5];
    int a = 10;
    cin >> tab;  // NIE WOLNO TAK ROBIC!!! NIGDY!
    cout << a;
    cout << endl;
    return 0;
}

No ladnie pieknie kompiluje sie i nawet dziala, ale czy jest poprawny? Nie!

Zmienne w pamieci sa zapisywane kolo siebie. Teraz zrobmy taki test dajmy mu wiecej liter niz moze pomiescic tablica. "aaaaaaaaaaaaaaaaaaa"
Co sie stanie? Jesli program wczesniej sie nie wywali z bledem SIGSEG to do a zostanie przypisana nieokreslona wartosc. Nie wolno operowac po nie swoim obszarze pamieci!

0

Ale separator to jest napis, składający się z liter napisu plus znak końca. Więc dwukropek w postaci napisu zajmuje dwa znaki. Więc nie mieści się w przydzielone przez ciebie 1 znak. Więc nadpisuje zmienną która idzie tuż po nim, pewnie wypadło na zmienną ile. A ponieważ niemieszczący się znak to znak o kodzie 0 to w młodszy bajt liczby ile wpisywało się 0, a więc robiło to ze zmienną ile mniej więcej coś takiego ile=(ile>>8)<<8;

0

Dzięki za wytłumaczenie :) Czyli jedynym bezpiecznym rozwiązaniem dla wczytywania tekstu jest std::string?

0
FirstTime napisał(a):

Czyli jedynym bezpiecznym rozwiązaniem dla wczytywania tekstu jest std::string?
A skąd?!

char Napis[10];
cin>>setw(10)>>Napis;
string Napis;
cin>>Napis;
char Napis[10];
scanf("%9s",Napis);

Oraz cin.getline(...);

Oraz wczytywanie znak po znaku przez cin.get() lub getchar().

0

Dobra, dzięki, będę pamiętał :) Temat do zamknięcia :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1