From c4d164d8c33022f4a2b8e04486f2b3dbc4672169 Mon Sep 17 00:00:00 2001 From: Christian Ohlsson Date: Thu, 5 Mar 2026 13:39:39 +0100 Subject: [PATCH] Startpunkten --- AVL_tree/header.hpp | 76 +++ AVL_tree/huvud.cpp | 273 +++++++++ AVL_tree/run_me | Bin 0 -> 24760 bytes AVL_tree/tree.cpp | 344 +++++++++++ Dijkstra/NeverNeverLand.doc | Bin 0 -> 38400 bytes Dijkstra/dijkstra.exe | Bin 0 -> 136952 bytes Dijkstra/graf.cpp | 285 ++++++++++ Dijkstra/graf.h | 75 +++ Dijkstra/header.h | 36 ++ Dijkstra/list.h | 240 ++++++++ Dijkstra/main.cpp | 191 +++++++ Dijkstra/map.gif | Bin 0 -> 16564 bytes Dijkstra/network.txt | 1068 +++++++++++++++++++++++++++++++++++ Dijkstra/read_me | 17 + Hashing/hash.cpp | 292 ++++++++++ Hashing/header.hpp | 83 +++ Hashing/huvud.cpp | 294 ++++++++++ Simulering/lab1.cpp | 144 +++++ Simulering/lab1.hpp | 57 ++ Simulering/main.cpp | 123 ++++ 20 files changed, 3598 insertions(+) create mode 100644 AVL_tree/header.hpp create mode 100644 AVL_tree/huvud.cpp create mode 100644 AVL_tree/run_me create mode 100644 AVL_tree/tree.cpp create mode 100644 Dijkstra/NeverNeverLand.doc create mode 100644 Dijkstra/dijkstra.exe create mode 100644 Dijkstra/graf.cpp create mode 100644 Dijkstra/graf.h create mode 100644 Dijkstra/header.h create mode 100644 Dijkstra/list.h create mode 100644 Dijkstra/main.cpp create mode 100644 Dijkstra/map.gif create mode 100644 Dijkstra/network.txt create mode 100644 Dijkstra/read_me create mode 100644 Hashing/hash.cpp create mode 100644 Hashing/header.hpp create mode 100644 Hashing/huvud.cpp create mode 100644 Simulering/lab1.cpp create mode 100644 Simulering/lab1.hpp create mode 100644 Simulering/main.cpp diff --git a/AVL_tree/header.hpp b/AVL_tree/header.hpp new file mode 100644 index 0000000..dd5a123 --- /dev/null +++ b/AVL_tree/header.hpp @@ -0,0 +1,76 @@ +//################################################################## +// PROGRAMMERINGSUPPGIFT 2 +// DATASTRUKTURER OCH ALGORITMER +// AVL TRÄD +//================================================================== +// HEADER.HPP +// Filen innehåller definition som används i programmet +// Christian Ohlsson +// Karlstad 980927 +//================================================================== +#ifndef _header_ +#define _header_ + +#include +#include +#include +#include +#include +//#include +#include + +const int FALSE = 0; //boolsk variabel +const int TRUE = !FALSE; //boolsk variabel +const int BUFFERSIZE = 100; //för säker inmatning +const int FILENAMESIZE = 8; //för MS-DOS 6.0 +const int NAMESIZE = 20; //antal tecken som kan matas in som namn +const int NUMBERSIZE = 20; //antal tecken som kan matas in som nummer +const int ENTER = 13; //ASCII kod för enter +const int BACKSPACE = 8; //ASCII kod för backspace + +//typedef int bool; //definierar boolsk variabel +typedef char nameType[NAMESIZE]; //sätter nametypen till char +typedef char numberType[NUMBERSIZE]; //sätter numberTypen till char +struct treeNode; //förvarnar datorn om en struct +typedef treeNode* ptrType; //ger en pekartype till en struct +struct treeNode{ //en nod i trädet + + nameType name; + numberType number; + ptrType left; + ptrType right; + int height; + treeNode(nameType oneName,numberType number, + ptrType left, ptrType right, + int height); +}; + +class treeClass +{ +public: + treeClass(); + ~treeClass(){}; + ptrType node; + ptrType seek(ptrType node, nameType value); + bool isEmpty(); + void destroyTree(ptrType &node); + void setHeight(ptrType &node); + void rotation(ptrType &node); + void inOrder(ptrType treeNode); + void del(ptrType &node, nameType oneName); + void insert(ptrType &node,nameType oneName,numberType number, int height); + void save(ptrType node, fstream &fil); +private: + int balance(ptrType &node); + int maxHeight(ptrType &node); + int size; + void singleLeft(ptrType &node); + void singleRight(ptrType &node); + void doubleRL(ptrType &node); + void doubleLR(ptrType &node); + void delLeft(ptrType &node, nameType oneName, numberType oneNumber); + void delRoot(ptrType &node); +}; +#endif + + diff --git a/AVL_tree/huvud.cpp b/AVL_tree/huvud.cpp new file mode 100644 index 0000000..45739d9 --- /dev/null +++ b/AVL_tree/huvud.cpp @@ -0,0 +1,273 @@ +//################################################################## +// PROGRAMMERINGSUPPGIFT 2 +// DATASTRUKTURER OCH ALGORITMER +// AVL TRÄD +//================================================================== +// HUVUD.CPP +// Filen innehåller huvudprogrammet +// Christian Ohlsson +// Karlstad 980927 +//================================================================== + +#include "header.hpp" + +//############################################################### +// SÄKER INMATNING AV MENYVAL +// ser till att bara en character matas in +// som menyval som dessutom måste vara en siffra +//=============================================================== +/* +char mataInChar() +{ + bool test = FALSE; + char temp, svar; + do { + temp = getch(); + if(isalnum(temp) && test == FALSE) { + cout << temp; + svar = temp; + test = TRUE; + } + else if(temp == BACKSPACE && test == TRUE) { + gotoxy(wherex()-1, wherey()); + cout << " "; + gotoxy(wherex()-1, wherey()); + test = FALSE; + } + }while(temp != ENTER || test == FALSE); + return svar; +} +*/ +//################################################################## +// SÄTTER IN EN NOD I TRÄD +// calls: treeClass::insert, treeclass::seek, treeClass::setHeight +// treeClass::rotation +//================================================================== +void _insert(treeClass &myTree) +{ + nameType oneName; + numberType number; + int height=0; + + cout <<"\n Ange namn: "; + cin >> oneName; + if(strlen(oneName) > NAMESIZE) + cout << "\n Man kan högst ange namnet med " << NAMESIZE << " tecken"; + else { + if(myTree.seek(myTree.node, oneName) != NULL) + cout << "\n Du har redan satt in " + << oneName << " i katalogen"; + else { + cout <<"\n Ange telefonnummer: "; + cin >> number; + if (strlen(number) > NUMBERSIZE) + cout << "\n Man kan högst ange nummret med " << NUMBERSIZE << " tecken"; + else { + myTree.insert(myTree.node,oneName,number,height); + myTree.setHeight(myTree.node); + myTree.rotation(myTree.node); + myTree.setHeight(myTree.node); + return; + } + } + } +// getch(); +} +//################################################################## +// TAR BORT EN NOD UR TRÄD +// calls: treeClass::del, treeClass::isEmpty, treeclass::seek +// treeClass::setHeight, treeClass::rotation +//================================================================== +void _del(treeClass &myTree) +{ + if(!myTree.isEmpty()) { + nameType oneName; + + cout << "\n Vem vill du ta bort: "; + cin >> oneName; + if(strlen(oneName) > NAMESIZE) + cout << "\n Man kan högst ange namnet med " << NAMESIZE << " tecken"; + else { + if(myTree.seek(myTree.node, oneName) == NULL) + cerr << "\n " << oneName << " finns inte i katalogen. "; + else { + myTree.del(myTree.node, oneName); + myTree.setHeight(myTree.node); + myTree.rotation(myTree.node); + myTree.setHeight(myTree.node); + return; + } + } + } + else + cerr << "\n Telefonkatalogen är tom... "; +// getch(); +} +//################################################################## +// SKRIVER UT I INORDER +// calls: treeClass::inOrder, treeClass::isEmpty +//================================================================== +void _inOrder(treeClass myTree) +{ + if(!myTree.isEmpty()) { +// clrscr(); + cout << setw(NAMESIZE) + << "Namn" + << setw(NAMESIZE) + << "Telefon" + << setw(NAMESIZE) + << "Höjd \n" + << setw(NAMESIZE) + << " ------------------------------------------------------------------ \n"; + myTree.inOrder(myTree.node); + } + else + cerr << "\n Telefonkatalogen är tom... "; +// getch(); +} +//################################################################## +// SÖKER I TRÄDET +// calls: treeClass::seek, treeClass::isEmpty +//================================================================== +void _seek(treeClass myTree) +{ + if(!myTree.isEmpty()) { + nameType oneName; + cout << "\n Mata in namn: "; + cin >> oneName; + ptrType tempNode = myTree.seek(myTree.node, oneName); + if(tempNode != NULL) + cout << "\n " << tempNode->name + << " har telefonnummer: " + << tempNode->number; + else + cout << "\n " << oneName << " fanns inte med i katalogen..."; + } + else + cerr << "\n Telefonkatalogen är tom... "; +// getch(); +} +//################################################################## +// SPARAR TRÄDET PÅ FIL +// calls: treeClass::save, treeClass::isEmpty +//================================================================== +void _save(treeClass myTree) +{ + if(!myTree.isEmpty()) { + fstream fil; + char filnamn[FILENAMESIZE]; + cout << "\n Ange filnamn att spara: "; + cin >> filnamn; + fil.open(filnamn,ios::out|ios::binary); + myTree.save(myTree.node, fil); + fil.close(); + } + else { + cerr << "\n Telefonkatalogen är tom..."; +// getch(); + } +} +//################################################################## +// HÄMTAR ETT TRÄD FRÅN EN FIL +// läser in värdet i varje nod i preorder +// och sätter in det i trädet i preoder +// calls treeClass::insert, treeClass::isEmpty, treeClass::setHeight +// treeClass::rotation +//================================================================== +void _load(treeClass &myTree) +{ + if(myTree.isEmpty()) { + fstream fil; + numberType number; + nameType oneName; + char filnamn[FILENAMESIZE]; + + cout << "\n Ange filnamn att hämta: "; + cin >> filnamn; + fil.open(filnamn,ios::in|ios::binary); + if(fil) + while(fil.peek() != EOF) { + fil.read((char*)&oneName,sizeof(oneName)); + fil.read((char*)&number,sizeof(number)); + myTree.insert(myTree.node, oneName,number,0); + myTree.setHeight(myTree.node); + myTree.rotation(myTree.node); + myTree.setHeight(myTree.node); + } + else { + cerr << "\n Filen finns inte..."; +// getch(); + } + fil.close(); + } + else { + cerr << "\n Det finns redan personer i katalogen. \n" + << " Du måste ta bort samtliga personer \n" + << " genom att välja detta i menyn. \n"; +// getch(); + } +} +//################################################################## +// DESTROYTREE +// tar bort hela trädet +// calls: treeClass::isEmpty, treeClass::destroyTree +//================================================================== +void _destroyTree(treeClass &myTree) +{ + if(!myTree.isEmpty()) + myTree.destroyTree(myTree.node); + else { + cerr << "\n Telefonkatalogen är tom..."; +// getch(); + } +} +//################################################################## +// MENY ITEMS +// skriver ut menyn på skärmen +//================================================================== +void meny() +{ +// clrscr(); + cout << " \n TELEFON KATALOGEN " + << " \n ----------------- " + << " \n 1. Lägg till person " + << " \n 2. Ta bort person " + << " \n 3. Sök efter person " + << " \n 4. Skriv ut i bokstavsordning " + << " \n 5. Spara på fil " + << " \n 6. Hämta från fil " + << " \n 7. Radera hela trädet " + << " \n 0. Avsluta " + << " \n "; +// gotoxy(2,12); //ställer markören under menyn +} +//################################################################## +// MAIN FUNCTION +// skapar trädet myTree av typen treeClass +// calls: alla drivrutiner +//================================================================== +void main() +{ + treeClass myTree; + char val; + do { + meny(); + cin >> val; +// val = mataInChar();; + switch (val) + { + case '1' : _insert(myTree);break; + case '2' : _del(myTree);break; + case '3' : _seek(myTree);break; + case '4' : _inOrder(myTree);break; + case '5' : _save(myTree);break; + case '6' : _load(myTree);break; + case '7' : _destroyTree(myTree);break; + case '0' : cout << "\n Programmet avslutat";break; + default : cerr << "\n Felaktigt val"; +// getch(); + } + }while(val != '0'); +} + + diff --git a/AVL_tree/run_me b/AVL_tree/run_me new file mode 100644 index 0000000000000000000000000000000000000000..eb953915894a4c7d45577a0baa6580079481dc44 GIT binary patch literal 24760 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 literal 0 HcmV?d00001 diff --git a/AVL_tree/tree.cpp b/AVL_tree/tree.cpp new file mode 100644 index 0000000..a9df706 --- /dev/null +++ b/AVL_tree/tree.cpp @@ -0,0 +1,344 @@ +//################################################################## +// PROGRAMMERINGSUPPGIFT 2 +// DATASTRUKTURER OCH ALGORITMER +// AVL TRÄD +//================================================================== +// TREE.CPP +// Filen innehåller funktioner för trädet +// Christian Ohlsson +// Karlstad 980927 +//================================================================== + +#include "header.hpp" + +//################################################################## +// SKAPAR ETT TRÄD & SÄTTER NODE TILL NULL +//================================================================== +treeClass::treeClass():node(NULL) +{ +} +//################################################################## +// DESTROYTREE +// traverserar genom trädet rekursivt +// och raderar hela trädet +// pre: att det finns ett träd +// post: samtliga noder i trädet är borttagna +// calls: destroyTree (rekursivt) +//================================================================== +void treeClass::destroyTree(ptrType &node) +{ + if(node->left != NULL) + destroyTree(node->left); + if(node->right != NULL) + destroyTree(node->right); + delete node; + node = NULL; +} +//################################################################## +// SKAPAR EN NOD +// pre: TRUE +// post: en ny nod har skapats +//================================================================== +treeNode::treeNode(nameType oneName,numberType oneNumber, + ptrType L, ptrType R, int H) : left(L),right(R),height(H) +{ + strcpy(name, oneName); + strcpy(number,oneNumber); +} +//################################################################## +// SÖKER EFTER ETT ELEMENT I TRÄDET +// pre: att trädet inte är tomt +// post: NULL om noden inte fanns +// post: sökta noden om den fanns med +// calls: seek (rekursivt) +//================================================================== +ptrType treeClass::seek(ptrType node, nameType oneName) +{ + ptrType treeNodeFound; + if(node == NULL) + treeNodeFound = NULL; + else if (strcmp(node->name, oneName) == 0) + treeNodeFound = node; + else if (strcmp(node->name, oneName) > 0) + treeNodeFound = seek(node->left, oneName); + else + treeNodeFound = seek(node->right, oneName); + return treeNodeFound; +} +//################################################################## +// KOLLAR OM DET FINNS NODER I TRÄDET +// pre: TRUE +// post: TRUE om trädet är tomt +// post: FALSE om det finns noder i trädet +//================================================================== +bool treeClass::isEmpty() +{ + if (node==NULL) + return TRUE; + return FALSE; +} +//################################################################## +// SKRIVER UT TRÄDET I INORDER +// pre: att trädet inte är tomt +// post: trädet har skrivits ut i bokstavsordning +// calls: inOrder (rekursivt) +//================================================================== +void treeClass::inOrder(ptrType treeNode) +{ + if(treeNode) { + inOrder(treeNode->left); + cout << setw(NAMESIZE) + << treeNode->name + << setw(NAMESIZE) + << treeNode->number + << setw(NAMESIZE) + << treeNode->height << endl; + inOrder(treeNode->right); + } +} +//################################################################## +// SÄTTER IN EN NOD I TRÄDET +// pre: att personen inte redan finns +// post: trädet har fått en ny nod insatt +// på rätt plats. +// calls: insert (rekursivt) +//================================================================== +void treeClass::insert(ptrType &node,nameType oneName,numberType number, int height) +{ + if(node==NULL) + node=new treeNode(oneName,number,NULL,NULL,height); + else if(strcmp(oneName, node->name) < 0) + insert(node->left,oneName,number,height); + else + insert(node->right,oneName,number,height); +} +//################################################################## +// SÖKER SIG FRAM TILL NODEN SOM SKALL TAS BORT +// pre: att det finns ett träd +// pre: att noden finns +// post: noden har hittats +// calls: delRoot, del (rekursivt) +//================================================================== +void treeClass::del(ptrType &node, nameType oneName) +{ + if(strcmp(oneName,node->name) == 0) + delRoot(node); + else if(strcmp(oneName,node->name) < 0) + del(node->left, oneName); + else + del(node->right,oneName); +} +//################################################################## +// TAR BORT EN NODEN OM DEN INT HAR TVÅ BARN +// pre: att det finns ett träd +// pre: att noden finns +// post: noden har tagits ur trädet och +// de andra noderna sitter nu rätt placerade +// calls: delLeft +//================================================================== +void treeClass::delRoot(ptrType &node) +{ + ptrType delPtr; + nameType nyItem; + numberType nyNumber; + + if(node != NULL) { + if((node->left == NULL) && (node->right == NULL)) { + delete node; + node = NULL; + } + else if(node->left == NULL) { + delPtr = node; + node = node->right; + delPtr->right = NULL; + delete delPtr; + } + else if(node->right == NULL) { + delPtr = node; + node = node->left; + delPtr->left = NULL; + delete delPtr; + } + else { + delLeft(node->right, nyItem, nyNumber); + strcpy(node->name, nyItem); + strcpy(node->number, nyNumber); + } + } +} +//################################################################## +// TAR BORT EN NOD TILL VÄNSTER +// pre: att det finns ett träd +// pre: att noden finns +// post: noden har tagits ur trädet och +// de andra noderna sitter nu rätt placerade +// calls: delLeft (rekursivt) +//================================================================== +void treeClass::delLeft(ptrType &node, nameType oneName, numberType oneNumber) +{ + if((node != NULL) && (node->left == NULL)) { + strcpy(oneName, node->name); + strcpy(oneNumber, node->number); + ptrType delPtr = node; + node = node->right; + delPtr->right = NULL; + delete delPtr; + } + else + delLeft(node->left, oneName, oneNumber); +} +//################################################################## +// ROTATI0N +// roterar trädet så att det blir ett AVL träd +// pre: att det finns ett träd +// post: trädets alla noder sitter balanserade +// calls: rotation (rekursivt), balance, +// singleLeft, singleRight, doubleRL, doubleLR +//================================================================== +void treeClass::rotation(ptrType &node) +{ + if(node) { + rotation(node->left); + rotation(node->right); + if(balance(node) == 2) { + if(balance(node->right) >= 1) + singleLeft(node); + else if(balance(node->right) <= -1) + doubleRL(node); + } + else if(balance(node) == -2) { + if(balance(node->left) >= 1) + doubleLR(node); + else if(balance(node->left) <= -1) + singleRight(node); + } + } +} +//################################################################## +// BALANSERAR TRÄDET +// returnerar högerbarnets höjd minus vänsterbarnets +// pre: att trädet inte är tomt +// post: höjddifferansen är returnerad +// calls: none +//================================================================== +int treeClass::balance(ptrType &node) //eg root +{ + int leftValue, rightValue; + if(node->left == NULL) + leftValue = -1; + else + leftValue = node->left->height; + if(node->right == NULL) + rightValue = -1; + else + rightValue = node->right->height; + return (rightValue - leftValue); +} +//################################################################## +// SINGLE LEFT ROTATION +// roterar åt vänster +// pre: att det finns ett träd +// post: trädet är vänsterroterat +// calls: none +//================================================================== +void treeClass::singleLeft(ptrType &node) +{ + ptrType oldNode = node; + node = node->right; + oldNode->right = node->left; + node->left = oldNode; +} +//################################################################## +// SINGLE RIGHT ROTATION +// roterar åt höger +// pre: att det finns ett träd +// post: trädet är högerroterat +// calls: none +//================================================================== +void treeClass::singleRight(ptrType &node) +{ + ptrType oldNode = node; + node = node->left; + oldNode->left = node->right; + node->right = oldNode; +} +//################################################################## +// DOUBLE RIGHT-LEFT ROTATION +// Utför en dubbel höger-vänster rotation +// pre: att det finns ett träd +// post: trädet är höger-vänster roterat +// calls: singleRight, singleLeft +//================================================================== +void treeClass::doubleRL(ptrType &node) +{ + singleRight(node->right); + singleLeft(node); +} +//################################################################## +// DOUBLE LEFT-RIGHT ROTATION +// Utför en dubbel vänster-höger rotation +// pre: att det finns ett träd +// post: trädet är vänster-höger roterat +// calls: singleLeft, singleRight +//================================================================== +void treeClass::doubleLR(ptrType &node) +{ + singleLeft(node->left); + singleRight(node); +} +//################################################################## +// SÄTTER ALLA HÖJDER I TRÄDET I POSTORDER +// pre: att trädet inte är tomt +// post: noderna i trädet har alla rätt höjd +// calls: setHeight (rekursivt), maxHeight +//================================================================== +void treeClass::setHeight(ptrType &node) +{ + if(node) { + setHeight(node->left); + setHeight(node->right); + node->height = maxHeight(node) +1; + } +} +//################################################################## +// FINNER MAXIMAL HÖJD EN NOD BEFINNER SIG PÅ +// pre: att trädet inte är tomt +// post: maxhöjden har returnerats +// calls: inget +//================================================================== +int treeClass::maxHeight(ptrType &node) +{ + int max; + if(node->left && node->right) { + max = node->left->height; + if(node->right->height > max) + return (node->right->height); + else + return max; + } + else if(node->left) + return (node->left->height); + else if(node->right) + return (node->right->height); + else + return (-1); +} +//################################################################## +// SPARAR TRÄDET PÅ FIL +// läser av nodens namn och nummer i alla noder i +// preorder och skriver de på filen. +// pre: att det finns ett träd +// post: trädet har sparats på fil +// calls: save (rekursivt) +//================================================================== +void treeClass::save(ptrType node, fstream &fil) +{ + if(node) { + fil.write((char*)&node->name,sizeof(node->name)); + fil.write((char*)&node->number,sizeof(node->number)); + save(node->left,fil); + save(node->right,fil); + } +} + + diff --git a/Dijkstra/NeverNeverLand.doc b/Dijkstra/NeverNeverLand.doc new file mode 100644 index 0000000000000000000000000000000000000000..3d80696b4f8c1204d4b7a8d84dd602eebb6a38ae GIT binary patch literal 38400 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 McCSFT|7EKG2d+&AI{*Lx literal 0 HcmV?d00001 diff --git a/Dijkstra/dijkstra.exe b/Dijkstra/dijkstra.exe new file mode 100644 index 0000000000000000000000000000000000000000..89e3f0a4294c3414cad576bd38f0f8a0ad606b9b GIT binary patch literal 136952 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 +* Operatoröverlagring +-------------------------------------------------*/ +int graphNode::operator>(graphNode node) { + if(Start <= node.Start) + return false; + return true; +} + +/*=============================================== +* dijkstraNode +* Construktor. +* Skapar en Dijkstra node +-------------------------------------------------*/ +dijkstraNode::dijkstraNode() { + deleted = false; + lastCity = 0; + Totaltime = MAXINT; //Tiden sätts till max +} + +/*=============================================== +* ~dijkstraNode +* Destruktor. +* Tar bort en nod +-------------------------------------------------*/ +dijkstraNode::~dijkstraNode() {} + +/*=============================================== +* graph +* Construktor +* Skapar en graph +-------------------------------------------------*/ +graph::graph() { + visitedCities = 0; + table = NULL; + lastPath = NULL; + prevSize = 0; + lastTime = 0; +} + +/*=============================================== +* ~graph +* Destruktor +* Anropar deleteGraph +-------------------------------------------------*/ +graph::~graph() { deleteGraph(); } + +/*=============================================== +* deleteGraph +* Tömmer grafen på info +-------------------------------------------------*/ +void graph::deleteGraph() { + if(table != NULL) + delete[] table; + if(lastPath != NULL) + delete[] lastPath; + table = NULL; + lastPath = NULL; + visitedCities = 0; + prevSize = 0; + lastTime = 0; +} + +/*=============================================== +* makeGraph +* Skapar en graf med size stycken städer. +* Tar först bort eventuell gammal graf. +* Returnerar true om allt gick bra +-------------------------------------------------*/ +int graph::makeGraph(int size) { + deleteGraph(); + table = new list*[size]; + if(table == NULL) + return false; + for(int index = 0; index < size; index++) + table[index] = new list[size]; + if(table == NULL) + return false; + visitedCities = size; + return true; +} + +/*=============================================== +* connect +* Skapar förbindelse mellan noderna i grafen +-------------------------------------------------*/ +void graph::connect(int startvertex, int endvertex, graphNode node) { + if(startvertex < 0 || startvertex > visitedCities-1 || + endvertex < 0 || endvertex > visitedCities-1) + return; + node.startCity = startvertex; + node.endCity = endvertex; + table[startvertex][endvertex].insert(node); +} + +/*=============================================== +* shortestPath +* Letar reda på den kortaste +* vägen mellan två noder +-------------------------------------------------*/ +graphNode graph::shortestPath(int startvertex, int endvertex, int time) { + int index, time1, time2; + graphNode node1, node2; + if(startvertex < 0 || startvertex > visitedCities-1 || + endvertex < 0 || endvertex > visitedCities-1) + return node1; + int connections = table[startvertex][endvertex].listLength(); + if(connections == 0) return node1; + node1 = table[startvertex][endvertex].printElement(1); + time1 = getTime(node1, time); + for(index = 2; index <= connections; index++) { + node2 = table[startvertex][endvertex].printElement(index); + time2 = getTime(node2, time); + if(time1 > time2) { + node1 = node2; + time1 = time2; + } + } + return node1; +} + +/*=============================================== +* getTime +* Returnerar antalet timmar mellan tiden +* time och tiden som finns i noden +-------------------------------------------------*/ +int graph::getTime(graphNode node, int time) { + int total; + if(node.Start >= time && node.End > time && node.Start < node.End) + total = node.End - time; + else if(node.Start > node.End) + total = ( (24 - time + node.Start) + (24 - node.Start + node.End) ); + else + total = (24 - time + node.End); + return total; +} + +/*=============================================== +* dijkstra +* Beräknar den kortaste sträckan dvs. tiden +* mellan två städer i NeverNeverLand +-------------------------------------------------*/ +void graph::dijkstra(int startvertex, int endvertex, int time) { + delPath(); + if(startvertex == endvertex || startvertex < 0 || + startvertex > visitedCities-1 || endvertex < 0 || + endvertex > visitedCities-1) + return; + + dijkstraNode *temparray = new dijkstraNode[visitedCities]; + if(temparray == NULL) return; + int min, index, parent = 0, temptime; + graphNode tempnode; + temparray[startvertex].Totaltime = 0; + temparray[startvertex].deleted = true; + min = startvertex; + while(min != endvertex) { + for(index = 0; index < visitedCities; index++) { + if(!temparray[index].deleted) { + tempnode = shortestPath(min, index, time); + if(tempnode.startCity != -1) { + temptime = getTime(tempnode, time); + if((temptime + temparray[min].Totaltime) + < temparray[index].Totaltime) { + temparray[index].Totaltime = + temptime + temparray[min].Totaltime; + if(parent == 0) + temparray[index].lastCity = 0; + else + temparray[index].lastCity = min; + temparray[index].Node = tempnode; + } + } + } + } + min = getMinTime(temparray); + temparray[min].deleted = true; + time = temparray[min].Node.End; + parent++; + } + calcPath(temparray, min); +} + +/*=============================================== +* calcPath +* Skapar en array med information +* om den kortaste vägen. +-------------------------------------------------*/ +void graph::calcPath(dijkstraNode *array, int start) { + graphNode *path = new graphNode[visitedCities]; + if(path == NULL) + return; + int temp = 1, index = start; + while(array[index].lastCity > 0) { + temp++; + index = array[index].lastCity; + } + prevSize = temp; + lastTime = array[start].Totaltime; + for(index = temp-1; index >= 0; index--) { + path[index] = array[start].Node; + start = array[start].lastCity; + } + lastPath = path; +} + +/*=============================================== +* getMinIndex +* Hittar den minsta noden i en array och +* returnerar dess index i arrayen +-------------------------------------------------*/ +int graph::getMinTime(dijkstraNode *temptable) { + int temp = 0, index; + while(temptable[temp].deleted) + temp++; + for(index = temp+1; index < visitedCities; index++) { + if(!temptable[index].deleted) { + if(temptable[temp].Totaltime > temptable[index].Totaltime) + temp = index; + } + } + return temp; +} + +/*=============================================== +* delPath +* Tar bort det som lastpath pekar på +-------------------------------------------------*/ +void graph::delPath() { + if(lastPath != NULL) + delete[] lastPath; + lastPath = NULL; + prevSize = 0; +} diff --git a/Dijkstra/graf.h b/Dijkstra/graf.h new file mode 100644 index 0000000..6250c81 --- /dev/null +++ b/Dijkstra/graf.h @@ -0,0 +1,75 @@ +/************************************************ +* Laboration 4 i +* Datastrukturer och Algoritmer +* Dijkstras Shortest Path +************************************************* +* Christian Ohlsson +* Karlstads universitet, 1999 +* +* Graph.h +* Innehåller de definitioner och klasser +* som används för att beräkna kortaste +* vägen mellan två städer +*************************************************/ + +#ifndef _GRAPH_H_ +#define _GRAPH_H_ +#include "list.h" + +/*=============================================== +* graphNode +* Nod mellan två städer +-------------------------------------------------*/ +class graphNode { + public: + graphNode(); //Construktor + ~graphNode() {}; //Destruktor + int startCity; //Stad man åker ifrån + int endCity; //Stad man kommer till + int Start; //Starttid + int End; //Ankomsttid + void operator=(graphNode node); //Operator-överlagring + int operator>(graphNode node); //för noder + int operator==(graphNode node); //... +}; + +/*=============================================== +* dijkstraNode +* Speciell nod för Dijkstra +-------------------------------------------------*/ +class dijkstraNode { + public: + int deleted; //Märkning för noden + int lastCity; //Föregående besökt stad + int Totaltime; //TotaL restid + dijkstraNode(); //Construktor + ~dijkstraNode(); //Destruktor + graphNode Node; //En nod +}; + +/*=============================================== +* graph +* Skapar en graf och sköter uträkningen +-------------------------------------------------*/ +class graph { + private: + int visitedCities; //Antalet traverserade städer + list **table; //Resväg + graphNode shortestPath(int startvertex, int endvertex, int time); + void delPath(); + int getTime(graphNode node, int time); + int getMinTime(dijkstraNode *temptable); + void calcPath(dijkstraNode *array, int start); + public: + int lastTime; //Tid som ökas när vi reser + int prevSize; //Antalet städer i arrayen + graphNode *lastPath; //Traverserad väg + graph(); //Construktor + ~graph(); //Destruktor + void deleteGraph(); + void connect(int startvertex, int endvertex, graphNode node); + int makeGraph(int size); + void dijkstra(int startvertex, int endvertex, int time); +}; +#endif + diff --git a/Dijkstra/header.h b/Dijkstra/header.h new file mode 100644 index 0000000..fb3bdfa --- /dev/null +++ b/Dijkstra/header.h @@ -0,0 +1,36 @@ +/************************************************ +* Laboration 4 i +* Datastrukturer och Algoritmer +* Dijkstras Shortest Path +************************************************* +* Christian Ohlsson +* Karlstads universitet, 1999 +* +* Header.h +* Innehåller definitioner och includes +* som används i programmet. +*************************************************/ + +#ifndef ___HEADER___ +#define ___HEADER___ + +#include +#include +#include +#include +#include +#include + +#include "graf.h" +#include "list.h" + +const int false=0; //boolsk variabel +const int true=!false; //boolsk variabel +const int citySize=25; //Max antal tecken i en stad +const int numOfCities=13; //Antalet städer +const int FORWARD=2; //För inläsning +const int MAXTIME = 6; //Max antal tkn +const int BASE=10; //Talbas +const int BUFFERSIZE=20; //Buffer för säker inmatning + +#endif diff --git a/Dijkstra/list.h b/Dijkstra/list.h new file mode 100644 index 0000000..911eb7c --- /dev/null +++ b/Dijkstra/list.h @@ -0,0 +1,240 @@ +/************************************************ +* Laboration 4 i +* Datastrukturer och Algoritmer +* Dijkstras Shortest Path +************************************************* +* Christian Ohlsson +* Karlstads universitet, 1999 +* +* list.h +* Innehåller definitioner och funktioner +* för en templatelista. +*************************************************/ + +#ifndef _LISTA_H_ +#define _LISTA_H_ + +#include "header.h" + +/*=============================================== +* list +* Denna klass skapar en templatelista. +* Varje nod innehåller ett godtyckligt data- +* fält och en pekare till nästa nod. +-------------------------------------------------*/ +template +class list { + private: + struct nod { // En template nod + T data; + nod *next; + }; + int size; // Storleken på listan. + nod *head; // Pekar på första elementet i listan. + public: + list(); + ~list(); + int listLength(); //Storleken på listan + void insert(T data); //Sätter in en nod + void del(int place); //Tar bort en nod + void sort(void); //Sorterar listan + int seek(T data); //Söker i listan + int isFree(void); //Kollar om det finns element i listan + void delAll(void); //Tar bort allt i listan + int occupiedExist(T data); //Kollar om inmatat värde existerar + int occupied(int place); //Testar om det finns plats + void setNode(nod *dat, T data); //Mata in data i den nya noden + T printElement(int place); //Visar Innehållet på bestämd plats. + T *getPtr(int place); //Returnera platsen på place position +}; + + +/*=============================================== +* list +* Construktor, skapar en lista +-------------------------------------------------*/ +template +list::list() { + head = NULL; + size = 0; +} + +/*=============================================== +* ~list +* Destruktor. Anropar delAll +-------------------------------------------------*/ +template +list::~list() { delAll(); } + +/*=============================================== +* insert +* Sätter in en ny nod i listan +-------------------------------------------------*/ +template +void list::insert(T data) { + nod *newNode = new nod; + newNode->next = head; + head = newNode; + size++; + newNode->data = data; +} + +/*=============================================== +* del +* Tar bort ett element på en viss +* position i listan +-------------------------------------------------*/ +template +void list::del(int place) { + int i = 1; + nod *temp1; + temp1 = head; + nod *temp2; + temp2 = head->next; + if(temp2 == NULL || place == 1) { //Bara ett element i listan + head = temp1->next; + delete temp1; + size--; + } + else { //Flera element i listan + temp2 = head; + while(i < place) { + temp1 = temp2; + temp2 = temp1->next; + i++; + } + temp1->next = temp2->next; + delete temp2; + size--; + } +} + +/*=============================================== +* isFree +* Kollar om listan är tom. Returnerar +* true om listan är tom +-------------------------------------------------*/ +template +int list::isFree() { + if(size == 0) return true; + else return false; +} + +/*=============================================== +* occupied +* Kollar om plats finns på en angiven +* position. +-------------------------------------------------*/ +template +int list::occupied(int place) { + if( (place < 1) || (place > size) ) return false; + else return true; +} + +/*=============================================== +* listLength +* Returnerar antalet element i listan +-------------------------------------------------*/ +template +int list::listLength() { return size; } + +/*=============================================== +* sort +* Sorterar elementen i listan +-------------------------------------------------*/ +template +void list::sort() { + nod *temp; + T sop; + int changed; + do { + changed = 0; + for(temp = head; temp != NULL; temp = temp->next) + if(temp->data > temp->next->data) { + sop = temp->data; + temp->data = temp->next->data; + temp->next->data = sop; + changed = 1; + } + }while(changed); +} + +/*=============================================== +* delAll +* Tar bort alla element i listan. +* Sätter sedan storleken till 0 +-------------------------------------------------*/ +template +void list::delAll() { + nod *temp1 = head; + nod *temp2; + head = NULL; + while(temp1 != NULL) { + temp2 = temp1; + temp1 = temp1->next; + delete temp2; + } + size = 0; +} + +/*=============================================== +* +* +-------------------------------------------------*/ +template +int list::occupiedExist(T data) { //Kollar om inmatat värde existerar + nod *temp; + for(temp = head; temp != NULL; temp = temp->next) + if(temp->data == data) + return true; + return false; +} + +/*=============================================== +* +* +-------------------------------------------------*/ +template +int list::seek(T data) { //Söker efter ett element i listan + nod *temp; + int position = 0; + for(temp = head; temp != NULL; temp = temp->next) { + position++; + if(temp->data == data) + return position; //Funnet! Returnera positionen + } + position = 0; + return position; //Inget hittades, returnera 0 +} + +/*=============================================== +* printElement +* Hämtar element på en angiven plats +-------------------------------------------------*/ +template +T list::printElement(int place) { + nod *temp1 = head; + int i = 1; + while(i < place && i < size) { + temp1 = temp1->next; + i++; + } + return temp1->data; +} + +/*=============================================== +* getPtr +* Returnera adressen till ett element +* på en angiven plats +-------------------------------------------------*/ +template +T *list::getPtr(int place) { + nod *temp1 = head; + int i = 1; + while(i < place && i < size) { + temp1 = temp1->next; + i++; + } + return &(temp1->data); +} +#endif \ No newline at end of file diff --git a/Dijkstra/main.cpp b/Dijkstra/main.cpp new file mode 100644 index 0000000..31d5b6d --- /dev/null +++ b/Dijkstra/main.cpp @@ -0,0 +1,191 @@ +/************************************************ +* Laboration 4 i +* Datastrukturer och Algoritmer +* Dijkstras Shortest Path +************************************************* +* Christian Ohlsson +* Karlstads universitet, 1999 +* +* main.cpp +* Innehåller drivrutiner för +* Dijkstra labben. +* Skapat med Borland C++ 4.0 +* Låt main.cpp och graph.cpp +* finnas i projektet. +* Kompilera för Easywin, Windows 3.x +* 16-bitar, target: Small +* Se till att filen network.txt finns +* i samma katalog som dijkstra.exe +*************************************************/ + +#include "header.h" + +/*=============================================== +* cities +* Alla städer i NeverNeverLand +-------------------------------------------------*/ +const char cities[numOfCities][citySize] = { + {"Wonderland"}, + {"Sanctuary"}, + {"Battlefield"}, + {"Octopus's Garden"}, + {"Paradise City"}, + {"Strawberry Fields"}, + {"Chaos"}, + {"El Dorado"}, + {"Kozmic Place"}, + {"Oz"}, + {"Nowhereland"}, + {"Shangrila"}, + {"Southbound"} +}; + +graph myGraph; //Global klass för grafen + +/*=============================================== +* mataIn +* Ser till att bara tal matas in +-------------------------------------------------*/ +int mataIn() { + char buffer[BUFFERSIZE]; + int f; + do { + cin >> buffer; + if (strcmp(buffer,"0") == 0) return 0; + else { + f = atoi(buffer); + if (f!=0) return f; + else cout <<"NAN, try again: "; + } + }while (!f); + return 0; +} + +/*=============================================== +* getName +* Hämtar namn på stad, dvs det nummer staden +* motsvarar +-------------------------------------------------*/ +int getName(char *text) { + int i = 0; + while(strcmp(text, cities[i]) !=0 && i < numOfCities) + i++; + if(i >= numOfCities) return -1; + else return i; +} + +/*=============================================== +* readGraph +* Läser in alla städer och tider från fil. +-------------------------------------------------*/ +void readGraph() +{ + graphNode node; + ifstream myFile; + char temp[citySize]; + if(!myGraph.makeGraph(numOfCities)) { //Skapar en graf + cout<<"Could not make graph";getch(); + return; + } + myFile.open("network.txt"); //Öppnar filen + do { + myFile.get(temp, citySize); + node.startCity = getName(temp); //Hämtar startstad + myFile.seekg(FORWARD, ios::cur); + myFile.get(temp, citySize); + node.endCity = getName(temp); //Hämtar slutstad + myFile.seekg(FORWARD, ios::cur); + myFile.get(temp, citySize); + node.Start = atoi(temp); //Hämtar starttid + myFile.seekg(FORWARD, ios::cur); + myFile.get(temp, citySize); + node.End = atoi(temp); //Hämtar sluttid + myFile.seekg(FORWARD, ios::cur); + myGraph.connect(node.startCity, node.endCity, node); //Sätter in noden + } while(myFile.peek() != EOF); +} + +/*=============================================== +* printPath +* Skriver ut kortaste vägen +-------------------------------------------------*/ +void printPath() { + int index; + char text[citySize * 4], time[MAXTIME]; + cout << "The shortest path is:" + << "\n________________________________________________________"; + for(index = 0; index < myGraph.prevSize; index++) { + text[0] = 0; + time[0] = 0; + cout << "\nFrom " << cities[myGraph.lastPath[index].startCity]; + itoa(myGraph.lastPath[index].Start, time, BASE); + cout << " "<< time << ":00\t"; + time[0] = 0; + + cout << "to "; + cout << cities[myGraph.lastPath[index].endCity]; + itoa(myGraph.lastPath[index].End, time, BASE); + cout << " " << time << ":00\t"; + } + text[0] = 0; time[0] = 0; + itoa(myGraph.lastTime, time, BASE); + cout << "\n________________________________________________________"; + cout << "\nThe total travelling time is "<" + << "\n Welcome to the RailWay Company" + << "\n in the NeverNeverLand..." + << "\n ____________________________________________________" + << "\n | 0. Wonderland 7. El Dorado |" + << "\n | 1. Sanctuary 8. Kozmic Place |" + << "\n | 2. Battlefield 9. Oz |" + << "\n | 3. Octopus's Garden 10. Nowhereland |" + << "\n | 4. Paradise City 11. Shangrila |" + << "\n | 5. Strawberry Fields 12. Southbound |" + << "\n | 6. Chaos |" + << "\n |__________________________________________________|" + << "\n"; +} + +/*=============================================== +* main +* Huvudfunktionen för programmet. +* Läser in grafen och ber användaren +* mata in mellan vilka städer han skall resa +-------------------------------------------------*/ +void main() { + int start, end, time; + char playAgain; + readGraph(); //Läs in filen + do{ + printTowns(); //Skriv ut städerna + do { + cout <<"\nFrom wich town (0-"<<(numOfCities-1)<<"): "; + start=mataIn(); + }while(start<0 || start>numOfCities-1); + do { + cout <<"To wich town (0-"<<(numOfCities-1)<<"): "; + end=mataIn(); + }while(end<0 || end>numOfCities-1); + do { + cout <<"Time of departure (0-24): "; + time=mataIn(); + }while(time<0 || time>24); + myGraph.dijkstra(start, end, time); //Beräkna kortaste väg + if(myGraph.prevSize > 0) + printPath(); //Skriv ut vägen + else + cout <<"\nStarttown and arrivaltown are the same! Are you stupid?"; + cout <<"\n\nPlay Again (Y/N)? "; + cin >> playAgain; + }while(playAgain == 'y' || playAgain == 'Y'); +} + + diff --git a/Dijkstra/map.gif b/Dijkstra/map.gif new file mode 100644 index 0000000000000000000000000000000000000000..daf8121da520fbd3a46c5c6a7bc770268c1a4d1c GIT binary patch literal 16564 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 TC|`#wOOdb8MC=C)4FCTD*U^I7 literal 0 HcmV?d00001 diff --git a/Dijkstra/network.txt b/Dijkstra/network.txt new file mode 100644 index 0000000..09d4d51 --- /dev/null +++ b/Dijkstra/network.txt @@ -0,0 +1,1068 @@ +Wonderland +Sanctuary +6 +11 +Wonderland +Sanctuary +10 +15 +Wonderland +Sanctuary +14 +19 +Wonderland +Battlefield +7 +14 +Wonderland +Battlefield +9 +16 +Wonderland +Battlefield +14 +21 +Wonderland +Octopus's Garden +9 +15 +Wonderland +Octopus's Garden +12 +18 +Wonderland +Octopus's Garden +15 +21 +Sanctuary +Wonderland +7 +12 +Sanctuary +Wonderland +11 +16 +Sanctuary +Wonderland +15 +20 +Sanctuary +Octopus's Garden +6 +9 +Sanctuary +Octopus's Garden +8 +11 +Sanctuary +Octopus's Garden +10 +13 +Sanctuary +Octopus's Garden +12 +15 +Sanctuary +Octopus's Garden +14 +17 +Sanctuary +Octopus's Garden +16 +19 +Sanctuary +Octopus's Garden +18 +21 +Sanctuary +Octopus's Garden +20 +23 +Battlefield +Wonderland +5 +11 +Battlefield +Wonderland +10 +15 +Battlefield +Wonderland +15 +22 +Battlefield +Octopus's Garden +7 +12 +Battlefield +Octopus's Garden +10 +15 +Battlefield +Octopus's Garden +13 +18 +Battlefield +Octopus's Garden +16 +21 +Battlefield +Octopus's Garden +19 +24 +Battlefield +Octopus's Garden +24 +5 +Battlefield +Paradise City +6 +9 +Battlefield +Paradise City +7 +9 +Battlefield +Paradise City +8 +11 +Battlefield +Paradise City +10 +13 +Battlefield +Paradise City +12 +15 +Battlefield +Paradise City +14 +17 +Battlefield +Paradise City +15 +17 +Battlefield +Paradise City +16 +19 +Battlefield +Paradise City +18 +21 +Battlefield +Paradise City +20 +23 +Battlefield +Paradise City +21 +23 +Battlefield +Paradise City +22 +1 +Battlefield +Strawberry Fields +5 +11 +Battlefield +Strawberry Fields +9 +15 +Battlefield +Strawberry Fields +12 +16 +Battlefield +Strawberry Fields +13 +19 +Battlefield +Strawberry Fields +17 +23 +Battlefield +Strawberry Fields +20 +24 +Battlefield +Strawberry Fields +21 +3 +Battlefield +Chaos +23 +7 +Octopus's Garden +Wonderland +8 +14 +Octopus's Garden +Wonderland +11 +17 +Octopus's Garden +Wonderland +14 +20 +Octopus's Garden +Sanctuary +5 +8 +Octopus's Garden +Sanctuary +7 +10 +Octopus's Garden +Sanctuary +9 +12 +Octopus's Garden +Sanctuary +11 +14 +Octopus's Garden +Sanctuary +13 +16 +Octopus's Garden +Sanctuary +15 +18 +Octopus's Garden +Sanctuary +17 +20 +Octopus's Garden +Sanctuary +19 +22 +Octopus's Garden +Sanctuary +21 +24 +Octopus's Garden +Battlefield +6 +13 +Octopus's Garden +Battlefield +9 +14 +Octopus's Garden +Battlefield +12 +17 +Octopus's Garden +Battlefield +15 +20 +Octopus's Garden +Battlefield +18 +23 +Octopus's Garden +Battlefield +24 +5 +Octopus's Garden +Strawberry Fields +8 +12 +Octopus's Garden +Strawberry Fields +10 +14 +Octopus's Garden +Strawberry Fields +12 +16 +Octopus's Garden +Strawberry Fields +14 +18 +Octopus's Garden +Strawberry Fields +16 +20 +Octopus's Garden +Strawberry Fields +18 +22 +Octopus's Garden +Strawberry Fields +20 +24 +Octopus's Garden +Chaos +9 +14 +Octopus's Garden +Chaos +15 +20 +Octopus's Garden +Chaos +19 +24 +Octopus's Garden +Chaos +24 +5 +Paradise City +Battlefield +5 +8 +Paradise City +Battlefield +7 +10 +Paradise City +Battlefield +8 +10 +Paradise City +Battlefield +9 +12 +Paradise City +Battlefield +11 +14 +Paradise City +Battlefield +13 +16 +Paradise City +Battlefield +15 +18 +Paradise City +Battlefield +16 +18 +Paradise City +Battlefield +17 +20 +Paradise City +Battlefield +19 +22 +Paradise City +Battlefield +21 +24 +Paradise City +Battlefield +22 +24 +Paradise City +Strawberry Fields +6 +11 +Paradise City +Strawberry Fields +9 +14 +Paradise City +Strawberry Fields +12 +17 +Paradise City +Strawberry Fields +15 +20 +Paradise City +Strawberry Fields +18 +23 +Paradise City +Strawberry Fields +21 +2 +Paradise City +Strawberry Fields +24 +5 +Paradise City +Chaos +7 +13 +Paradise City +Chaos +13 +17 +Paradise City +Chaos +24 +6 +Paradise City +El Dorado +7 +11 +Paradise City +El Dorado +10 +14 +Paradise City +El Dorado +13 +17 +Paradise City +El Dorado +16 +20 +Paradise City +El Dorado +19 +23 +Paradise City +Kozmic Place +9 +14 +Paradise City +Kozmic Place +15 +20 +Strawberry Fields +Battlefield +6 +12 +Strawberry Fields +Battlefield +10 +16 +Strawberry Fields +Battlefield +11 +15 +Strawberry Fields +Battlefield +14 +20 +Strawberry Fields +Battlefield +18 +24 +Strawberry Fields +Battlefield +19 +23 +Strawberry Fields +Battlefield +22 +4 +Strawberry Fields +Octopus's Garden +7 +11 +Strawberry Fields +Octopus's Garden +9 +13 +Strawberry Fields +Octopus's Garden +11 +15 +Strawberry Fields +Octopus's Garden +13 +17 +Strawberry Fields +Octopus's Garden +15 +19 +Strawberry Fields +Octopus's Garden +17 +21 +Strawberry Fields +Octopus's Garden +19 +23 +Strawberry Fields +Paradise City +5 +10 +Strawberry Fields +Paradise City +8 +13 +Strawberry Fields +Paradise City +11 +14 +Strawberry Fields +Paradise City +14 +19 +Strawberry Fields +Paradise City +17 +22 +Strawberry Fields +Paradise City +20 +1 +Strawberry Fields +Paradise City +23 +4 +Strawberry Fields +Chaos +7 +11 +Strawberry Fields +Chaos +10 +14 +Strawberry Fields +Chaos +13 +17 +Strawberry Fields +Chaos +16 +20 +Strawberry Fields +Chaos +19 +23 +Strawberry Fields +El Dorado +6 +9 +Strawberry Fields +El Dorado +8 +11 +Strawberry Fields +El Dorado +10 +13 +Strawberry Fields +El Dorado +12 +15 +Strawberry Fields +El Dorado +14 +17 +Strawberry Fields +El Dorado +16 +19 +Strawberry Fields +El Dorado +18 +21 +Strawberry Fields +El Dorado +20 +23 +Strawberry Fields +El Dorado +22 +1 +Strawberry Fields +Oz +8 +12 +Strawberry Fields +Oz +11 +15 +Strawberry Fields +Oz +14 +18 +Strawberry Fields +Oz +17 +21 +Strawberry Fields +Oz +20 +24 +Chaos +Battlefield +24 +8 +Chaos +Octopus's Garden +10 +15 +Chaos +Octopus's Garden +16 +21 +Chaos +Octopus's Garden +20 +1 +Chaos +Octopus's Garden +24 +5 +Chaos +Paradise City +7 +13 +Chaos +Paradise City +13 +17 +Chaos +Paradise City +24 +6 +Chaos +Strawberry Fields +8 +12 +Chaos +Strawberry Fields +11 +15 +Chaos +Strawberry Fields +14 +18 +Chaos +Strawberry Fields +17 +21 +Chaos +Strawberry Fields +20 +24 +Chaos +Nowhereland +6 +11 +Chaos +Nowhereland +10 +15 +Chaos +Nowhereland +14 +19 +Oz +Strawberry Fields +8 +12 +Oz +Strawberry Fields +11 +15 +Oz +Strawberry Fields +14 +18 +Oz +Strawberry Fields +17 +21 +Oz +Strawberry Fields +20 +24 +Oz +Nowhereland +7 +12 +Oz +Nowhereland +10 +15 +Oz +Nowhereland +13 +18 +Oz +Nowhereland +16 +21 +Oz +Nowhereland +19 +24 +Oz +Nowhereland +24 +5 +Oz +Shangrila +8 +10 +Oz +Shangrila +12 +14 +Oz +Shangrila +15 +17 +Oz +Shangrila +18 +20 +Oz +Shangrila +21 +23 +Nowhereland +Chaos +7 +12 +Nowhereland +Chaos +11 +16 +Nowhereland +Chaos +15 +20 +Nowhereland +Oz +7 +12 +Nowhereland +Oz +10 +15 +Nowhereland +Oz +13 +18 +Nowhereland +Oz +16 +21 +Nowhereland +Oz +19 +24 +Nowhereland +Oz +24 +5 +El Dorado +Paradise City +8 +12 +El Dorado +Paradise City +11 +15 +El Dorado +Paradise City +14 +18 +El Dorado +Paradise City +17 +21 +El Dorado +Paradise City +20 +24 +El Dorado +Strawberry Fields +5 +8 +El Dorado +Strawberry Fields +7 +10 +El Dorado +Strawberry Fields +9 +12 +El Dorado +Strawberry Fields +11 +14 +El Dorado +Strawberry Fields +13 +16 +El Dorado +Strawberry Fields +15 +18 +El Dorado +Strawberry Fields +17 +20 +El Dorado +Strawberry Fields +19 +22 +El Dorado +Strawberry Fields +21 +24 +El Dorado +Shangrila +7 +11 +El Dorado +Shangrila +9 +13 +El Dorado +Shangrila +11 +15 +El Dorado +Shangrila +13 +17 +El Dorado +Shangrila +15 +19 +El Dorado +Shangrila +17 +21 +El Dorado +Shangrila +19 +23 +El Dorado +Kozmic Place +5 +8 +El Dorado +Kozmic Place +7 +10 +El Dorado +Kozmic Place +9 +12 +El Dorado +Kozmic Place +11 +14 +El Dorado +Kozmic Place +13 +16 +El Dorado +Kozmic Place +15 +18 +El Dorado +Kozmic Place +17 +20 +El Dorado +Kozmic Place +19 +22 +El Dorado +Kozmic Place +21 +24 +Shangrila +Oz +6 +8 +Shangrila +Oz +9 +11 +Shangrila +Oz +12 +14 +Shangrila +Oz +15 +17 +Shangrila +Oz +18 +20 +Shangrila +El Dorado +8 +12 +Shangrila +El Dorado +10 +14 +Shangrila +El Dorado +12 +16 +Shangrila +El Dorado +14 +18 +Shangrila +El Dorado +16 +20 +Shangrila +El Dorado +18 +22 +Shangrila +El Dorado +20 +24 +Shangrila +Southbound +7 +11 +Shangrila +Southbound +9 +13 +Shangrila +Southbound +11 +15 +Shangrila +Southbound +13 +17 +Shangrila +Southbound +15 +19 +Shangrila +Southbound +17 +21 +Shangrila +Southbound +19 +23 +Kozmic Place +Paradise City +9 +14 +Kozmic Place +Paradise City +15 +20 +Kozmic Place +El Dorado +6 +9 +Kozmic Place +El Dorado +8 +11 +Kozmic Place +El Dorado +10 +13 +Kozmic Place +El Dorado +12 +15 +Kozmic Place +El Dorado +14 +17 +Kozmic Place +El Dorado +16 +19 +Kozmic Place +El Dorado +18 +21 +Kozmic Place +El Dorado +20 +23 +Kozmic Place +El Dorado +22 +1 +Kozmic Place +Southbound +7 +12 +Kozmic Place +Southbound +10 +15 +Kozmic Place +Southbound +13 +18 +Kozmic Place +Southbound +16 +21 +Kozmic Place +Southbound +19 +24 +Kozmic Place +Southbound +24 +5 +Southbound +Shangrila +8 +12 +Southbound +Shangrila +10 +14 +Southbound +Shangrila +12 +16 +Southbound +Shangrila +14 +18 +Southbound +Shangrila +16 +20 +Southbound +Shangrila +18 +22 +Southbound +Shangrila +20 +24 +Southbound +Kozmic Place +6 +11 +Southbound +Kozmic Place +9 +14 +Southbound +Kozmic Place +12 +17 +Southbound +Kozmic Place +15 +20 +Southbound +Kozmic Place +18 +23 +Southbound +Kozmic Place +24 +5 diff --git a/Dijkstra/read_me b/Dijkstra/read_me new file mode 100644 index 0000000..89edf22 --- /dev/null +++ b/Dijkstra/read_me @@ -0,0 +1,17 @@ +Laboration 4 i +Datastrukturer och Algoritmer +Dijkstra's shortest path +------------------------------------------------ +Stort OBS! +Denna lab är utvecklad under windows +med Borland C++ 5.0 +Kompilering under Linux kommer ej +att fungera utan lite trix. +Tex finns inte funktioner som clrscr() +i Linux. +Exe-filen borde gå att köra på en windows- +dator. Se till att network.txt finns i samma +katalog som exe-filen. +Labben är provkörd och klar. +------------------------------------------------ +Christian Ohlsson, di7chro@cse.kau.se, 1999 diff --git a/Hashing/hash.cpp b/Hashing/hash.cpp new file mode 100644 index 0000000..f694fcd --- /dev/null +++ b/Hashing/hash.cpp @@ -0,0 +1,292 @@ +//################################################################## +// PROGRAMMERINGSUPPGIFT 3 +// DATASTRUKTURER OCH ALGORITMER +// HASH TABELL +//================================================================== +// HASH.HPP +// Filen innehåller hashfunktionerna +// Christian Ohlsson +// Ingela Johansson +// Anna-Maria Haglund +// Karlstad 981007 +//================================================================== + +#include "header.hpp" +//################################################################## +//Function: hashClass() +//Task: constuctorn +//Calls: nothing +//================================================================== +hashClass::hashClass() +{ + prime(); + PRIMENUMBER=0; + ARRAYSIZE = DEFAULTSIZE; + hashPtr = new hashNode[ARRAYSIZE]; + for(int i=0; i ARRAYSIZE) + location = location - ARRAYSIZE; + if(strcmp(hashPtr[location].name, name) == 0) + return TRUE; + } + return FALSE; +} +//################################################################## +//Function: getNode() +//Task: hämtar en nod ur tabellen, d.v.s. namn telefonnummer och +// "deleted-flaggan" +//Calls: hash1() och hash2() +//================================================================== +hashNode hashClass::getNode(nameType &oneName) +{ + int location = hash1(oneName); + if(strcmp(hashPtr[location].name, oneName) == 0) + return (hashPtr[location]); + else + do { + location = location + hash2(hash1(oneName)); + if(location>ARRAYSIZE) { + location = (location-ARRAYSIZE); + if(strcmp(hashPtr[location].name, oneName) == 0) + return hashPtr[location]; + } + }while(hashPtr[location].exist == FALSE); +} +//################################################################## +//Function: biggerHash() +//Task: kollar om en större tabell behövs (om 80% av positionerna +// är upptagna) +//Calls: checkOccupied() +//================================================================== +bool hashClass::biggerHash() +{ + float siz = INSERTFACTOR*getSize(); + int occ = checkOccupied(); + if(occ>=siz) + return TRUE; + return FALSE; +} +//################################################################## +//Function: newHashArray() +//Task: +//Calls: reHash() +//================================================================== +void hashClass::newHashArray() +{ + int oldSize = ARRAYSIZE; + ARRAYSIZE = nextPrime(); + reHash(oldSize); +} +//################################################################## +//Function: +//Task: +//Calls: +//================================================================== +bool hashClass::anotherHash() +{ + int del=0; + float siz = DELETEFACTOR*getSize(); + for(int i=0; i=siz) + return TRUE; + return FALSE; +} +//################################################################## +//Function: +//Task: +//Calls: +//================================================================== +void hashClass::reHash(int oldSize) +{ + int location; + hashNode *tempPtr = new hashNode[ARRAYSIZE]; + for(int j=0; j ARRAYSIZE) + location = location - ARRAYSIZE; + if(hashPtr[location].exist == FALSE) + insert(location, tempPtr[i]); + } + } + delete tempPtr; +} +//################################################################## +//Function: +//Task: +//Calls: +//================================================================== +int hashClass::hash1(nameType name) +{ + int sum = 0; + for(int i=0 ; i //för in och utmatning +#include //för filhantering +#include //för textmanipulation +#include //för strängmanipulation +#include //för getch() +#include //för isalnum +#include //för en massa saker + +const int FALSE = 0; //boolsk variabel +const int TRUE = !FALSE //boolsk variabel +const int FILENAMESIZE = 8; //för MS-DOS 6.0 +const int NAMESIZE = 20; //antal tecken som kan matas in som namn +const int NUMBERSIZE = 20; //antal tecken som kan matas in som nummer +const int ENTER = 13; //ASCII kod för enter +const int BACKSPACE = 8; //ASCII kod för backspace +const int PRIMEARRAYSIZE = 30; //storlek på primtalsarrayen +const int DEFAULTSIZE = 11; //hasharrayens defaultstorlek +const int TABSIZE = 20; //antal steg som motsvarar TAB +const int STEPSIZE = 7; //antal steg hash2 max stegar fram +const int DEFAULTPRIMENUMBER = 4; //minsta primtalet i arrayen +const int FIRSTPRIME = 3; //första talet som man jämför med +const int STARTPRIME = 2; //första primtalet i arrayen +const int PRIMESTEP = 2; //antal steg som man hoppar fram +const float INSERTFACTOR = 0.8; //ger en omhashning när 80% är upptaget +const float DELETEFACTOR = 0.3; //ger en omhashning när 30% är märkta deleted + +typedef int bool; //definierar boolesk variabel +typedef char nameType[NAMESIZE]; //sätter nametypen till char +typedef char numberType[NUMBERSIZE]; //sätter numberTypen till char + +struct hashNode{ //en nod + nameType name; + numberType number; + bool exist; +}; + +class hashClass +{ +public: + hashClass(); + ~hashClass(); + bool search(nameType name); + hashNode getNode(nameType &oneName); + int hash1(nameType name); + int hash2(int key); + int getSize(); + void newHashArray(); + void reHash(int oldSize); + void print(); + void prime(); + int checkOccupied(); + void destroyHash(int oldSize); + bool biggerHash(); + bool anotherHash(); + void del(int location); + void insert(int location, hashNode &newNode); + void save(fstream &fil); + hashNode *hashPtr; + int nextPrime(); +private: + void delHash(int location); + bool isPrime(int nummer, int antal, int primeArray[PRIMEARRAYSIZE]); + int ARRAYSIZE; + int primeArray[]; + int PRIMENUMBER; +}; +#endif + diff --git a/Hashing/huvud.cpp b/Hashing/huvud.cpp new file mode 100644 index 0000000..3cae551 --- /dev/null +++ b/Hashing/huvud.cpp @@ -0,0 +1,294 @@ +//################################################################## +// PROGRAMMERINGSUPPGIFT 3 +// DATASTRUKTURER OCH ALGORITMER +// HASH TABELL +//================================================================== +// HUVUD.CPP +// Filen innehåller huvudprogrammet +// Christian Ohlsson +// Ingela Johansson +// Anna-Maria Haglund +// Karlstad 981007 +//================================================================== + +#include "header.hpp" + +//############################################################### +// SÄKER INMATNING AV MENYVAL +// ser till att bara en character matas in +// som menyval som dessutom måste vara en siffra +//=============================================================== +char mataInChar() +{ + bool test = FALSE; + char temp, svar; + do { + temp = getch(); + if(isalnum(temp) && test == FALSE) { + cout << temp; + svar = temp; + test = TRUE; + } + else if(temp == BACKSPACE && test == TRUE) { + gotoxy(wherex()-1, wherey()); + cout << " "; + gotoxy(wherex()-1, wherey()); + test = FALSE; + } + }while(temp != ENTER || test == FALSE); + return svar; +} +//################################################################## +//Function: +//Task: +//Calls: +//================================================================== +void _insert(hashClass &hashTable) +{ + nameType name; + numberType number; + hashNode newNode; + int location; + if(hashTable.biggerHash() == FALSE) { + cout << "\n Skriv in namn: "; + cin >> name; + if(hashTable.search(name) == FALSE) { + cout << "\n Skriv in nummer: "; + cin >> number; + strcpy(newNode.name, name); + strcpy(newNode.number, number); + location = hashTable.hash1(name); + + if(hashTable.hashPtr[location].exist == FALSE) + hashTable.insert(location, newNode); + else + while(hashTable.hashPtr[location].exist == TRUE) { + location = location + hashTable.hash2(hashTable.hash1(newNode.name)); + if(location > hashTable.getSize()) + location = location - hashTable.getSize(); + if(hashTable.hashPtr[location].exist == FALSE) { + hashTable.insert(location, newNode); + return; + } + } + } + else { + cout << "\n Du har redan satt in " << name << " i katalogen"; + getch(); + } + } + else + hashTable.newHashArray(); +} +//################################################################## +//Function: +//Task: +//Calls: +// TAR BORT EN NOD UR TRÄD +// calls: hashClass::del, getSize, search, hash1, hash2 +//================================================================== +void _del(hashClass &hashTable) +{ + nameType name; + int location; + + cout << "\n Vem vill du ta bort: "; + cin >> name; + if(hashTable.search(name)) { + if(hashTable.anotherHash() == FALSE) { + location = hashTable.hash1(name); + if(strcmp(hashTable.hashPtr[location].name, name) == 0) + hashTable.del(location); + else { + while(hashTable.hashPtr[location].exist == TRUE) { + location = location + hashTable.hash2(hashTable.hash1(name)); + if(location > hashTable.getSize()) + location = location - hashTable.getSize(); + if(strcmp(hashTable.hashPtr[location].name, name) == 0) + hashTable.del(location); + } + } + } + else + hashTable.reHash(hashTable.getSize()); + } + else { + cout << " " << name << " finns inte i telefonkatalogen"; + getch(); + } +} +//################################################################## +//Function: +//Task: +//Calls: +// SKRIVER UT I INORDER +// calls: hashClass::print +//================================================================== +void _print(hashClass &hashTable) +{ + int size = hashTable.getSize(); + clrscr(); + cout << "Plats" + << setw(TABSIZE-3) + << "Namn" + << setw(TABSIZE) + << "Nummer" + << "\n-------------------------------------------"; + for(int i=0 ; i < size ; i++) + if(hashTable.hashPtr[i].exist == TRUE && hashTable.hashPtr[i].name[0]) + cout << endl + << i + << setw(TABSIZE) + << hashTable.hashPtr[i].name + << setw(TABSIZE) + << hashTable.hashPtr[i].number; + cout << "\n\n\n\n Arrayen är nu " << size << " stor" + << "\n och " << hashTable.checkOccupied() << " platser är upptagna."; + getch(); + +} +//################################################################## +//Function: +//Task: +//Calls: +// SÖKER I TRÄDET +// calls: hashClass::search +// calls: hashClass::isEmpty +//================================================================== +void _search(hashClass &hashTable) +{ + hashNode newNode; + nameType name; + + cout << "\n Mata in namn: "; + cin >> name; + if(hashTable.search(name)) { + newNode = hashTable.getNode(name); + cout << "\n " + << newNode.name + << " har telefonnummer " + << newNode.number + << "."; + } + else + cout << " " << name << " finns inte i telefonkatalogen"; + getch(); +} +//################################################################## +//Function: +//Task: +//Calls: +// SPARAR TRÄDET PÅ FIL +// calls: hashClass::save +// calls: hashClass::isEmpty +//================================================================== +void _save(hashClass &hashTable) +{ + fstream fil; + char filnamn[FILENAMESIZE]; + cout << "\n Ange filnamn att spara: "; + cin >> filnamn; + fil.open(filnamn,ios::out|ios::binary); + hashTable.save(fil); + fil.close(); +} +//################################################################## +//Function: +//Task: +//Calls: +// HÄMTAR ETT TRÄD FRÅN EN FIL +// läser in värdet i varje nod i preorder +// och sätter in det i trädet i preoder +// calls hashClass::insert +// calls: hashClass::isEmpty +//================================================================== +void _load(hashClass &hashTable) +{ + fstream fil; + int i = 0; + char filnamn[FILENAMESIZE]; + cout << "\n Ange filnamn att hämta: "; + cin >> filnamn; + hashTable.destroyHash(hashTable.getSize()); + fil.open(filnamn,ios::in|ios::binary); + if(fil) { + while(fil.peek() != EOF) { + fil.read((char*)& hashTable.hashPtr[i],sizeof(hashTable.hashPtr[i])); + hashTable.insert(i, hashTable.hashPtr[i]); + i++; + } + } + else { + cerr << "\n Filen finns inte..."; + getch(); + } + hashTable.reHash(hashTable.getSize()); + fil.close(); +} +//################################################################## +//Function: +//Task: +//Calls: +// DESTROYTREE +// tar bort hela trädet +// calls: hashClass::isEmpty +// calls: hashClass::destroyHash +//================================================================== +void _destroyHash(hashClass &hashTable) +{ + hashTable.destroyHash(hashTable.getSize()); + cerr << "\n Telefonkatalogen är tom..."; + getch(); +} +//################################################################## +//Function: +//Task: +//Calls: +// MENY ITEMS +// skriver ut menyn på skärmen +//================================================================== +void meny() +{ + clrscr(); + cout << " \n TELEFON KATALOGEN " + << " \n ----------------- " + << " \n 1. Lägg till person " + << " \n 2. Ta bort person " + << " \n 3. Sök efter person " + << " \n 4. Skriv ut " + << " \n 5. Spara på fil " + << " \n 6. Hämta från fil " + << " \n 7. Radera hela katalogen " + << " \n 0. Avsluta "; + gotoxy(2,12); //ställer markören under menyn +} +//################################################################## +//Function: +//Task: +//Calls: +// MAIN FUNCTION +// skapar trädet hashTable av typen hashClass +// calls: alla drivrutiner +//================================================================== +void main() +{ + hashClass hashTable; + char val; + do { + meny(); + val = mataInChar(); + switch (val) + { + case '1' : _insert(hashTable);break; + case '2' : _del(hashTable);break; + case '3' : _search(hashTable);break; + case '4' : _print(hashTable);break; + case '5' : _save(hashTable);break; + case '6' : _load(hashTable);break; + case '7' : _destroyHash(hashTable);break; + case '0' : cout << "\n Programmet avslutat";break; + default : cerr << "\n Felaktigt val";getch(); + } + }while(val != '0'); + exit(0); +} diff --git a/Simulering/lab1.cpp b/Simulering/lab1.cpp new file mode 100644 index 0000000..82e16f6 --- /dev/null +++ b/Simulering/lab1.cpp @@ -0,0 +1,144 @@ +/* *********************************************************************** */ +/* lab1.cpp 980910 */ +/* Innehåller köhantering */ +/* *********************************************************************** */ +/* Daniel Westerberg */ +/* Christian Ohlsson */ +/* Anna-Maria Haglund */ +/* Ingela Johansson */ +/* Charlotta Lagerkvist */ +/* *********************************************************************** */ +#include "lab1.hpp" + +/* *********************************************************************** */ +/* constructorn */ +/* Nollställer variabler */ +/* INPUT: inget */ +/* OUTPUT: inget */ +/* *********************************************************************** */ +queue::queue() +{ + first = NULL; + last = NULL; + cur = NULL; + r = 0; +} + +/* *********************************************************************** */ +/* destructorn */ +/* Tömmer listan */ +/* INPUT: inget */ +/* OUTPUT: inget */ +/* *********************************************************************** */ +queue::~queue() +{ + cur = first; + while (cur) + { + first = cur; + cur = cur->next; + delete first; + } + first = NULL; + last = NULL; + cur = NULL; + r = 0; +} + +/* *********************************************************************** */ +/* enqueue() */ +/* ställer en person med ett antal varor i kön */ +/* INPUT: antal varor */ +/* OUTPUT: bool */ +/* *********************************************************************** */ +bool queue::enqueue(int v) +{ + if (cur = new kund) + { + cur->next=NULL; + cur->varor = v; + if (first == NULL) + first = cur; + else + last->next = cur; + last = cur; + return TRUE; + } + return FALSE; +} + +/* *********************************************************************** */ +/* dequeue() */ +/* tar bort en person ur kön */ +/* INPUT: inget */ +/* OUTPUT: bool */ +/* *********************************************************************** */ +bool queue::dequeue() +{ + if (cur = first) + { + if ((first = first->next) == NULL) + last=NULL; + delete cur; + return TRUE; + } + return FALSE; +} + +/* *********************************************************************** */ +/* warez() */ +/* kollar hur lång varje kö är, tidsmässigt! */ +/* INPUT: inget */ +/* OUTPUT: tiden för varje kund baserad på antal varor */ +/* *********************************************************************** */ +int queue::warez() +{ + int x=0; + cur = first; + while (cur) + { + x += cur->varor*R + B; // räknar ut tiden för varje kund + 'x' + cur = cur->next; + } + return x; +} + +/* *********************************************************************** */ +/* pay() */ +/* betalningsfunktion, returnerar antalet varor kvar att betala */ +/* INPUT: antal varor att läggas till */ +/* OUTPUT: antal varor för första kunden i kön */ +/* *********************************************************************** */ +int queue::pay(int v) +{ + if (first) + return (first->varor += v); // lägger till 'v' och returnerar + else + return 0; +} + +/* *********************************************************************** */ +/* queueSize() */ +/* returnerar antalet kunder i kön */ +/* INPUT: inget */ +/* OUTPUT: Antal kunder i kön */ +/* *********************************************************************** */ +int queue::queueSize() +{ + int x=0; + cur = first; + while (cur) + { + cur = cur->next; + x++; + } + return x; +} + +/* *********************************************************************** */ +/* isEmpty() */ +/* kollar om en kö är tom */ +/* INPUT: inget */ +/* OUTPUT: TRUE om listan är tom */ +/* *********************************************************************** */ +bool queue::isEmpty() { return (first == NULL) ; } diff --git a/Simulering/lab1.hpp b/Simulering/lab1.hpp new file mode 100644 index 0000000..8bda024 --- /dev/null +++ b/Simulering/lab1.hpp @@ -0,0 +1,57 @@ +/* *********************************************************************** */ +/* lab1.hpp 980910 */ +/* Headerfil för lab1 */ +/* *********************************************************************** */ +/* Daniel Westerberg */ +/* Christian Ohlsson */ +/* Anna-Maria Haglund */ +/* Ingela Johansson */ +/* Charlotta Lagerkvist */ +/* *********************************************************************** */ + +#include +#include +#include +#include + +typedef int bool; +const bool TRUE=-1, FALSE=0; + +const int K=6; //Konstant för antal kassor +const int R=8; //Konstant för antal sekunder per vara +const int B=20; //Konstant för betalning +const int T=100; //Konstant för hur mycket snabbare än real-time det går +const int MS=1000; //Konstant för antal ms på en sekund +const int SPM=60; //Antal sekunder per minut +const int STARTTID=9*SPM*SPM+SPM; //Gör att programmet startar 9.01 +const int MOVEX=5; //Antal steg att flytta i X-led +const int CENT=100; //Ger 100% att starta med +const int FALL1=10; //Ger 10% chans +const int FALL2=40; //Ger 30% chans +const int FALL3=90; //Ger 50% chans +const int MAV=40; //Ger slumptal mellan 1 - 40 + +class queue +{ + private: + typedef struct kund + { + struct kund *next; + int varor; + } kund; + + kund *first; + kund *last; + kund *cur; + + public: + char r; + queue(); + ~queue(); + bool enqueue(int); + bool dequeue(); + int warez(); + int pay(int); + int queueSize(); + bool isEmpty(); +}; diff --git a/Simulering/main.cpp b/Simulering/main.cpp new file mode 100644 index 0000000..5378243 --- /dev/null +++ b/Simulering/main.cpp @@ -0,0 +1,123 @@ +/* *********************************************************************** */ +/* main.cpp 980910 */ +/* Innehåller huvudprogram för köhantering */ +/* *********************************************************************** */ +/* Daniel Westerberg */ +/* Christian Ohlsson */ +/* Anna-Maria Haglund */ +/* Ingela Johansson */ +/* Charlotta Lagerkvist */ +/* *********************************************************************** */ +#include "lab1.hpp" + +/* *********************************************************************** */ +/* Klassarray */ +/* *********************************************************************** */ +class queue q[K]; + +/* *********************************************************************** */ +/* funktionsprototyper som denna fil innehåller */ +/* *********************************************************************** */ +void betala(int); +void print(long); +void addkund(void); + +/* *********************************************************************** */ +/* main med huvud-loop och delay */ +/* *********************************************************************** */ +void main() +{ + long clock=STARTTID; + int kund=0; + + while(!kbhit()) + { + print(clock++); + if (++kund == SPM) + { + addkund(); + kund=0; + } + for(int x=0; x0) + q[pos].r--; + else + q[pos].dequeue(); +} + +/* *********************************************************************** */ +/* addkund() */ +/* lägger till en kund med ett slumpmässigt antal varor i den minsta kön */ +/* INPUT: inget */ +/* OUTPUT: inget */ +/* *********************************************************************** */ +void addkund() +{ + int in, x, min, pos=0; + unsigned int slumptal; + srand((unsigned) time(NULL)); + slumptal = rand()%CENT; + if (slumptal < FALL1) + in=0; + else if (slumptal < FALL2) + in=1; + else if (slumptal < FALL3) + in=2; + else + in=3; + while(in) + { + min=q[0].warez(); + for(x=1; xq[x].warez()) + { + min=q[x].warez(); + pos=x; + } + q[pos].enqueue(rand()%MAV+1); + in--; + } +}