Operowanie na kolejkach - kolejki czasowe

0

Witam wszystkich użytkowników forum. Mam spory problem z moim programem w C. Nie będę wam ściemniał ze robie to dla siebie itp. Jestem studentem i wykładowca zadał nam program do napisania w C. Na co dzień zajmuje się tworzeniem stron www i z programowaniem nie miałem wiele wspólnego dlatego zwracam się do was. Ile potrafiłem tyle zrobiłem, zostało mi jeszcze do ogarnięcia kilka błędów.

Do zrobienia mam program według tematu:
Temat: Struktury danych - operowanie na kolejkach

  • wyswietlenie wszystkich procesow
  • wyswietlenie miejsca procesow w kolejce
  • wyswietlenie stanu procesow
  • wyswietlenie ktory proces jest obecnie wykonywany

Będę wdzięczny za każdą nawet najmniejszą pomoc.
Poniżej kod który do tej pory udało mi się zlepić, poprawiłem już kilka błędów, które pokazał mi wykładowca, oraz ogarnąłem kilka błędów, które wskazał mi kompilator.

 

#include <stdio.h>
#include <string>
using namespace std;

typedef struct _opis_proc
{
int proces;
int status;	/* stan procesu, np. 0-aktywny, 1 – gotowy, 2 – zawieszony, 3- czeka na zasób, -1 (ujemny) – tablica nieprzypisana */
int prior;	//priorytet 0-najwyższy
int got_pop;	// kolejka gotowych – poprzednik 
int got_nast;	// kolejka gotowych - następny
int zas_pop;	// kolejka czekania na zasób - poprzednik
int zas_nast;	// kolejka czekania na zasób - następny
int zasób;	// nr urządzenia na które czeka lub już ma
int tim_pop;	// kolejka czasowa - poprzednik
int tim_nast;	// kolejka gotowych - następny
int tim_odstep;	// odstęp do poprzednika w kolejce
int tim_limit;	// limit czasu czekania (przepisane z opisu)

} p[20];

int got_pk;		// kolejka gotowych - poczatek kolejki
int zas_pk;		// kolejka czekania na zasób - poczatek kolejki
int got_kk;		// kolejka gotowych - koniec kolejki
int zas_kk;		// kolejka czekania na zasób - koniec kolejki
int tim_pk;		// poczatek kolejki czasowej
int tim_kk;	// koniec kolejki czasowej
int czeka_pk = -1;
int czeka_kk = -1; 

int nazwa="default";
int czastrwania=0;
int czasoczekiwania=0;
int czasprzybycia=0;  

int i=0;
int k=0;
int z=0;
int j=0;

typedef struct _opis_zadania
{
int kanal;	//skad lub dokad przesłać
int kier;		//kierunek transmisji 0-czytaj z urz, 1 –pisz do
int co;		// nr urz. Zewn do pobrania lub wpisania
int gdzie;	// gdzie wpisać lub pobrać – adres zmiennej w SK
int czas;		// co ile sekund ponawiać operacje
int ile;		// ile razy ponawiać próby, gdy urz. nieaktywne

} zad[15];



//////////////// sprawdzanie czy kolejka jest pusta

namespace kolejka
{
int pusta(void)
{ 
  if (tim_kk > -1) 
    	printf ("Kolejka jest pusta \n");
	return 1;
}
}

while(1);   //pętla wyświetla w kółko zawartość kolejek
{
         i = tim_pk;           //wpisanie do i numeru pierwszego procesu//tim - czas
         printf("Kolejka czasowa\n");
         printf("nr_proc \t tim_odstep \t tim_pop \t tim_nast  \n");
          while(i != proces[i].tim_nast){   
	//wyświetla zawartość kolejki czasowej (pętla się wykonuje dopóki nie dojdzie do końca kolejki)
                 printf("%d \t %d \t %d \t %d \n",i, proces[i].tim_odstep, proces[i].tim_pop, proces[i].tim_nast);         
		//wyświetla na ekranie kolejne wartości z kolejki
                 i = proces[i].tim_nast;
                 }

         i = got_pk;           //wpisanie do i numeru pierwszego procesu//got - kolejka gotowych
         printf("Kolejka priotytetowa\n");
         printf("nr_proc \t prior \t got_pop \t got_nast  \n");
          while(i != proces[i].got_nast){             
	//pętla wyświetla zawartość kolejki priorytetowej (pętla się wykonuje dopóki nie dojdzie do końca kolejki)
                 printf("%d \t %d \t %d \t %d \n",i, proces[i].prior, proces[i].got_pop, proces[i].got_nast);         
		 //wyświetla na ekranie kolejne wartości z kolejki
                 i = proces[i].got_nast;
                 }


         i = zas_pk;           //wpisanie do i numeru pierwszego procesu//zas - zasob
         printf("Kolejka oczekiwania na zasób\n");
         printf("nr_procesu \t got_pop \t got_nast \n");
          while(i != proces[i].zas_nast){ 
	//pętla wyświetla zawartość kolejki oczekiwania na zasób (pętla się wykonuje dopóki nie dojdzie do końca kolejki)
                 printf("%d \t %d \t %d \n",i, proces[i].zas_pop, proces[i].zas_nast);          
		//wyświetla na ekranie kolejne wartości z kolejki
                 i = proces[i].zas_nast;
                 }


	void wyswietl_fifo (int nazw_kol_fifo[])
	{
	printf("tim_pk \t got_pk \t zas_pk");
	} 

}
return 0;


////////////////// ile czasu pozostalo do odczekania

class proces
{
public:
string nazwa;


 
proces()
        {
        nazwa="default";
        czastrwania=0;
        czasoczekiwania=0;
        czasprzybycia=0;  
        }
proces (string name, int duration, int wait, int come)
       {
       czastrwania=duration;
       czasoczekiwania=wait;
       nazwa=name;
       czasprzybycia=come;
       }
};
 
namespace kolejka2
{
proces kolejka [5];
for(i<liczbaprocesow; i++);
for( j<liczbaprocesow[i].czastrwania; j++);
{
if (tablicaprocesow[i+1].czasprzybycia<tablicaprocesow[i].czastrwania) //sprawdzenie czy w czasie trwania i-tego procesu pojawią się kolejne
{
kolejka[j]=tablicaprocesow[j+1] //dopisanie procesów które pojawią się w trakcie trwania i-tego procesu do kolejki
}
}
for ( z<dlugosckolejki; z++)
kolejka[z].czasoczekiwania=kolejka[z].czasoczekiwania+(tablicaprocesow[i].czastrwania-kolejka[z].czasprzybycia) //dodanie procesom w kolejce roznicy miedzy czasem wykonania się procesu aktualnego a czasem przybycia
prior=kolejka[0]; //wyszukiwanie procesu o najwiekszym priorytecie
for ( k<liczbaprocesow;k++)
if (kolejka[k].czastrwania<prior)
prior=kolejka[k];

Oto uwagi od wykładowcy, których nie za bardzo rozumiem.

-kiedy petla while(1) sie skonczy?- brak warunku sprawdzajacego wyjscie (break)

-kawalki kodu sluzace do wyswietlania zawartosci kolejek prosze napisac jako odrebne funkcje ,dla kazdej kolejki (czasowej i wskazanej fifo- nie wiadomo, kiedy co sie konczy

kolejke fifo wyswietlamy, podajac w wywolaniu zmienne globalne tej koleki - pocz i koniec, bowiem kazdy semafor ma swoja FIFO wiec to powinno wygladac tak:

int wyswietl_FIFO(int poc_kol, int kon_kol);

Jeśli ktoś byłby w stanie mi pomóc od początku do końca i wykładowca by mi to zaliczył to przewiduję nagrodę pieniężną za pomoc. Pozdrawiam

0

czego tu nie rozumieć. wartość inna niż zerowa oznacza "true" Zatem pętla będzie się wykonywała w nieskończoność, ponieważ za każda iteracją warunek będzie spełniony. break po prostu wychodzi z pętli w której bezpośrednio tkwi

0

C a nie C++?

class proces

0

czysty c, mozliwe ze moze być troche kodu zaczeprniętego z c++ oczywiście przypadkowo, musi być w c, postaram sie to poprawic, jak już mówiłem jestem w tym zielony.

Robcio to rozumiem, a powiesz mi o co chodzi dokładnie z warunkiem sprawdzającym wyjście ? Bo jeśli wstawie 0 to raz tylko sie wykona, według mojego myślenia chodzi mu o to żeby wykonywała się ciągle aż do momentu jak coś nie wiadomo co pojawi się na wyjściu.

0

Nikt nie potrafi mi pomóc ?

0

To niemożliwe, żeby aż takie trudne rzeczy były na studiach...

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