# Week 7 - Maps ## Team Team name: Totally Useless Date: 2022/05/12 Members | Role | Name | |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------| | **Facilitator** keeps track of time, assigns tasks and makes sure all the group members are heard and that decisions are agreed upon. | Stefan | | **Spokesperson** communicates group’s questions and problems to the teacher and talks to other teams; presents the group’s findings. | Tautvydas | | **Reflector** observes and assesses the interactions and performance among team members. Provides positive feedback and intervenes with suggestions to improve groups’ processes. | Ines | | **Recorder** guides consensus building in the group by recording answers to questions. Collects important information and data. | Adelina | ## Activities ### Activity 1: The ctype header file * The ctype.h header file of the C Standard Library declares several functions that are useful for testing and mapping characters. * All the functions accepts int as a parameter, whose value must be EOF or representable as an unsigned char. * Some of tyhe most useful functions in this header file are: ```c int isalnum(int num) //This function identifies the alphanumeric characters int isalpha(int num) //This function identifies the alphabets from other characters int islower(int num) //This function identifies the lowercase alphabets. int isupper(int num) //This function identifies the uppercase alphabets. int isspace(int num) //This function identifies white-space characters. int tolower(int num) //This function converts uppercase alphabet to lowercase alphabet. int toupper(int num) //This function convert lowercase alphabet to uppercase alphabet. ``` ### Activity 2: Count letters in a string ```c unsigned long countLetters(unsigned long counts[static 26], const char* str) { int count = 0; for(int i = 0; str[i] != '\0'; ++i){ if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) { counts[tolower(str[i]) -'a']++; count++; } } return count; } int main(void){ unsigned long counts[26] = {0}; const char* text = "The Quick Brown Fox Jumps Over The Lazy Dog."; unsigned long total = countLetters(&counts[0], text); assert(35 == total); printCounts(&counts[0], false, true); } ``` ### Activity 3: Recognizing languages ```c const char* makeSignature(unsigned long counts[static 26]) { static char signature[7]; unsigned long temp[sizeof(signature)] = {0}; signature[6] = '\0'; for(unsigned long i = 0; i < sizeof(signature)-1; i++) { for(unsigned long j = 0; j < ('Z' - 'A' + 1); j++) { if(temp[i] < counts[j]) { unsigned long check = 0; for(unsigned long a = 0; a < i+1; a++) { if (check == i) { temp[i] = counts[j]; signature[i] = j + 'a'; } if(temp[a] != counts[j]) { check++; } } } } } return &signature[0]; } int main(void) { unsigned long counts1[26] = {15,3,4,5,16,6,7,8,9,7,6,3,2,11,14,1,2,12,13}; unsigned long counts2[26] = {16,4,7,5,20,7,4,3,14,5,9,1,2,18,6,12,9,13,9,15}; assert(strcmp("eaosrn", makeSignature(counts1)) == 0); assert(strcmp("enatir", makeSignature(counts2)) == 0); } ``` | File | Signature | Language | | ---------- | --------- | -------- | | alice0.txt | etaoin | en | | alice1.txt | iantes | fi | | alice2.txt | eaionr | it | | alice3.txt | enisra | de | ### Activity 4: Find out: dictionaries around us * The BSN number database which associates a person to a BSN number; * University databases: a database of student numbers associated with a student; * A database of OV Chipkaart numbers associated with a public transport user; * A collection of unique numbers associated with different shoe brands; * ID number databeses : a database of passport numbers associated to different travelers. ### Activity 5: Find out: dictionaries in other languages * Python: ```python mydict = {"name":"Max","age":28} print(mydict) ``` * C#: ```csharp In C# private static Dictionary<string,object> dict; dict = new Dictionary<string,object>(); ``` * Java: ```java Map<String, String> dictionary = new HashMap<String, String>(); dictionary.put("key", "value"); String value = dictionary.get("key"); ``` * C++ ```cpp map<string,string> dictho; cout << dictho.size(); //for example. ``` * Javascript: ```javascript var dict = new Object(); //or var dict = { FirstName: "Chris", "one": 1, 1: "some value" }; // using indexer var name = dict["FirstName"]; // as property var name = dict.FirstName; ``` * C++ functions: ```cpp //inserting map<string,string> dictho; dictho.insert(pair<string,string>("Strawberry"," Aardbei")); dictho.insert(pair<string,string>("Orange"," Oranje")); dictho.insert(pair<string,string>("Apple"," Appel")); dictho.insert(pair<string,string>("Banana"," banaan")); //Deleting dictho.erase("Orange"); //Checking if the key exists for(auto pair : dictho){ if(dictho.find("Orange") != dictho.end()){ cout << "key found"; }else{ cout << "They key is not Found"; } } //Retriving string key; cin >> key; for(const auto& pair : dictho){ if(pair.first == key){ cout << "key found and the value is " << pair.second; }else{ cout << "They key is not Found"; } } ``` * C# functions: ```csharp //Inserting Dictionary<string, Int16> AuthorList = new Dictionary<string, Int16>(); AuthorList.Add("Mahesh Chand", 35); //Deleting AuthorList.Remove("Mahesh Chand"); //Checking if key exists myDict.ContainsKey("India") if (AuthorList.ContainsKey("Mahesh Chand")) Console.WriteLine("Key : Mahesh Chand is present"); else Console.WriteLine("Key : Mahesh Chand is absent"); //Reteriving key int value; bool hasValue = AuthorList.TryGetValue("Mahesh Chand", out value); if (hasValue) { Console.WriteLine(value); } else { Console.WriteLine("Key is not present"); } ``` ### Activity 6: The ensureCapacity function ```c bool _ensureCapacity(counter_t* counter, const size_t minimumCapacity){ size_t new_capacity = counter->capacity; while (minimumCapacity > new_capacity){ new_capacity = new_capacity * GROWTH_FACTOR + 1; } if (new_capacity > counter->capacity){ pair_t * new_data = realloc(counter->data, new_capacity * sizeof(pair_t)); if(new_data != NULL){ counter->data = new_data; counter->capacity = new_capacity; return true; } } return false; } ``` ### Activity 7: insertAt function ```c static bool _insertAt(counter_t* counter, const size_t index, const char* key, unsigned long value){ if (_ensureCapacity(counter, counter->size + 1)) { memmove(counter->data+index+1,counter->data+index,(counter->size-index) * sizeof(pair_t)); counter->data[index] = makePair(key,value); counter->size++; return true; } return false; } int main() { counter_t counter; initCounter(&counter, 0); insert(&counter, "Bob", 3); insert(&counter, "Dave", 4); insert(&counter, "Alice", 5); insert(&counter, "Eva", 3); insert(&counter, "Charlie", 7); assert(strcmp(counter.data[0].key, "Alice") == 0); assert(counter.data[0].value == 5); assert(strcmp(counter.data[1].key, "Bob") == 0); assert(counter.data[1].value == 3); assert(strcmp(counter.data[2].key, "Charlie") == 0); assert(counter.data[2].value == 7); assert(strcmp(counter.data[3].key, "Dave") == 0); assert(counter.data[3].value == 4); assert(strcmp(counter.data[4].key, "Eva") == 0); assert(counter.data[4].value == 3); assert(counter.size == 5); assert(counter.capacity >= counter.size); destroyCounter(&counter); } ``` ### Activity 8: Increment function ```c unsigned long increment(counter_t* counter, const char* key){ if(key!=NULL && counter != NULL) { long temp = getOrDefault(counter,key,0); insert(counter,key,temp+1); return temp+1; } return 0; } int main(void) { counter_t counter; initCounter(&counter, 0); increment(&counter, "Alice"); increment(&counter, "Alice"); increment(&counter, "Alice"); increment(&counter, "Bob"); increment(&counter, "Bob"); assert(counter.size == 2); assert(counter.data[0].value == 3); assert(counter.data[1].value == 2); destroyCounter(&counter); } ``` ### Activity 9: Find out: function `strtok` Strtok is a function that takes a character array and a list of a char of separator characters as an argument and it is used to separate a string by checking the separator character and "breaking" the string into different "tokens". If a token is found, a pointer to the beginning of the token is returned. Otherwise, a null pointer. A null pointer is always returned when the end of the string is reached in the string being scanned. ```c void processLine(counter_t* counter, char* line) { // a const char variable of separator characters created const char* sep = "\t (),.;:?!\"\n'"; // calling strtok to split the line given as a parameter // and splitting it when catching a one of the "sep" characters char* token = strtok(line, sep); // a loop that goes through the line and // splits it into tokens until the end of the string is reached while (token) { if (strlen(token)) // increment the token count increment(counter, token); // overwriting token with NULL to terminate the current token token = strtok(NULL, sep); } } ``` ### Activity 10: How many words? Unique words: 4385 Times Alice appears: 393 Times the appears: 1549 Times rabbit appears: 3 ```c counter_t counter; counter = processFile("alice0.txt"); unsigned long temp1 = increment(&counter,"Alice"); unsigned long temp2 = increment(&counter,"the"); unsigned long temp3 = increment(&counter,"rabbit"); printf("%zu\n",counter.size); printf("%lu\n",temp1); printf("%lu\n",temp2); printf("%lu\n",temp3); destroyCounter(&counter); return 0; ``` ## Looking back ### What we've learnt We have learned more during this week to use dictionaries and mapping. ### What were the surprises We haven't had any big surprises. ### What problems we've encountered We haven't encountered any problems in the activities but we found problems in meeting up during exams and holidays. ### What was or still is unclear Nothing for this week. ### How did the group perform? The exam period and the holidays made it hard for us to meet and work on the activities since each one of us was in a different country. How was the collaboration? What were the reasons for hick-ups? What worked well? What can be improved next time? > Written with [StackEdit](https://stackedit.io/).