Niepoprawne działanie programu przez nieużywaną zmienną.

0

Witam, mam dość dziwny problem, otóż program nie działa poprawnie bez nic niewnoszącej zmiennej "odp2". Zamiast nadpisywać dane wartości zapisuje pokolei "4". Ze zmienną odp2 działa poprawnie. Czym jest to spowodowane?

Program to zastępowanie stron w pamięci metodą FIFO.
www.cs.jhu.edu/~yairamir/cs418/os6/sld015.htm

KOD:

#include <iostream>
#include <cstdlib>
//https://www.cs.jhu.edu/~yairamir/cs418/os6/sld015.html
using namespace std;

void wyswietl(int &rozmiar, int *dane, int &glowa, int &ogon)
{
    system("CLS");
    cout<<endl;
    cout<<"---------------"<<endl;
    cout<<"ZAWARTOSC: "<<endl;
    cout<<"---------------"<<endl;
    int indeks;
    for (int i=0; i<rozmiar; i++)
    {
        indeks=glowa+i;
        if (glowa+i>=5) indeks=glowa+i-5;
        cout<<dane[indeks]<<"    f";
        cout<<endl;
    }
    cout<<endl<<"---------------"<<endl;
}

int main()
{
    int dane[4];
    int wybor;
    int rozmiar=0;
    int glowa=0;
    int ogon=0;
    int max=0;
    do
    {
        cout<<"MENU"<<endl;
        cout<<"1. Dodaj "<<endl;
        cout<<"2. Wyjscie "<<endl;
        cout<<endl;
        cout<<"Wybor: ";
        cin>>wybor;
        system("cls");
        switch (wybor)
        {
        case 1:
        {
            cin>>dane[ogon];
            bool odp=false;
            bool odp2=false;
            if (rozmiar==0)
            {
                ogon=(ogon+1)%5;
                rozmiar=rozmiar+1;
            }
            else if(rozmiar<4 && rozmiar>0)
            {
                for(int i=0; i<rozmiar; i++)
                {
                    if(dane[i]==dane[ogon]) odp=true;
                }
                if (odp==false)
                {
                    ogon=(ogon+1)%5;
                    rozmiar=rozmiar+1;
                }
            }

            else if(rozmiar>=4)
            {
                for(int i=0; i<4; i++)
                {
                    if(dane[i]==dane[ogon]) odp=true;
                }
                if(max>4) max=0;
                if(odp==false)
                {
                    swap(dane[max], dane[ogon]);
                    max++;
                }
            }
            break;
        }
        }
        wyswietl(rozmiar,dane,glowa,ogon);
    }

    while (wybor != 2);

    return 0;
}

0

Jakie są dane wejściowe? Jakie oczekiwane wyjściowe? Jakie otrzymane wyjściowe?

0

Wpisuję liczby jak w załączonym linku. Po pełnym obiegu (gdy rozmiar osiągnie maksimum czyli 4), chcę wpisać "5", które ma tę wartość(jeśli już nie występuje w kolejce), nadpisać w miejsce najdawniej użytej wartości (czyli w tym przypadku "1").
Ze zmienną "odp2" program działa poprawnie, bez niej, nie działa. Zmienna nic nie wnosi do żadnej linijki kodu, prócz tego że jest zadeklarowana.

0

W tym kodzie zmienna odp2 jest tylko zainicjowana i raz przypisano do niej wartość. nigdzie poza tą linijką nie jest wykorzystywana.
Nie może ona mieć wpływu na działanie programu. Jeszcze zainicjuj zmienną int wybor; na zero

0

Niezbyt chce mi się zgadywać o co chodzi w zadaniu, ale masz 4-elementową tablicę, do której wykorzystujesz ogon jako indeks, nadając tej zmiennej wartości modulo 5. Czyli zapewne gdzieś wychodzisz poza zakres.

0

Zainicjowałem zmienną int wybor; na zero, usunąłem odp2 i program chyba dobrze pracuje:
title
Wprowadziłem 1,2,3,2,4,3,5,1,5,2

0

Kiedy pisze się poza dostępnym zakresem tablicy, można spodziewać się właśnie takiego zachowania programu.

ogon=(ogon+1)%5;

Masz świadomość, że zmienna ogon przyjmuje wartości z zakresu od 0 do 4, a indeks 4 leży poza dostępnym zakresem tablicy?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.