commit 0c74d10f0daf5d678d0a4f2582201ed444883260 Author: Idan Cohen Date: Fri Feb 25 15:33:16 2022 +0200 First Upload diff --git a/1/PDF/debug.log b/1/PDF/debug.log new file mode 100644 index 0000000..9dbfc00 --- /dev/null +++ b/1/PDF/debug.log @@ -0,0 +1,9 @@ +[0909/152255.414:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0909/152314.222:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0909/152314.239:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0909/152314.267:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0909/152314.326:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0909/152314.336:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0909/152314.360:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0909/153314.223:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0909/153314.223:ERROR:crash_report_database_win.cc(469)] failed to stat report diff --git a/1/PDF/ex1.pdf b/1/PDF/ex1.pdf new file mode 100644 index 0000000..9ffa4bb Binary files /dev/null and b/1/PDF/ex1.pdf differ diff --git a/1/PDF/ex2.pdf b/1/PDF/ex2.pdf new file mode 100644 index 0000000..8dc36d8 Binary files /dev/null and b/1/PDF/ex2.pdf differ diff --git a/1/PDF/ex2_2.pdf b/1/PDF/ex2_2.pdf new file mode 100644 index 0000000..95ee532 Binary files /dev/null and b/1/PDF/ex2_2.pdf differ diff --git a/1/PDF/ex3.pdf b/1/PDF/ex3.pdf new file mode 100644 index 0000000..b944d13 Binary files /dev/null and b/1/PDF/ex3.pdf differ diff --git a/1/PDF/ex4.pdf b/1/PDF/ex4.pdf new file mode 100644 index 0000000..dacca82 Binary files /dev/null and b/1/PDF/ex4.pdf differ diff --git a/1/PDF/ex5.pdf b/1/PDF/ex5.pdf new file mode 100644 index 0000000..1cb8d55 Binary files /dev/null and b/1/PDF/ex5.pdf differ diff --git a/1/PDF/זימונים לימי מיון.pdf b/1/PDF/זימונים לימי מיון.pdf new file mode 100644 index 0000000..eb566ae Binary files /dev/null and b/1/PDF/זימונים לימי מיון.pdf differ diff --git a/1/ex1 b/1/ex1 new file mode 100644 index 0000000..18e602a Binary files /dev/null and b/1/ex1 differ diff --git a/1/ex1.c b/1/ex1.c new file mode 100644 index 0000000..8e4755c --- /dev/null +++ b/1/ex1.c @@ -0,0 +1,50 @@ +#include + +#define DIGITS 3 +#define TEN 10 +#define ZERO 0 +//--------------------------------------------------------------------------------------- +// Exercise 1 +// ---------- +// +// General : The program recognize if all digits are same. +// +// Input : Number with 3 digits. +// +// Process : The program summarizes all the digits and divie by last digit. +// +// Output : '0' if is it True, else is false. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 09.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + short num, + temp, + sum = ZERO; + + printf("Enter number with 3 digits: "); + scanf("%hd", &num); + + // Take the first digit from right and add to sum + temp = num / TEN; + sum += num - (temp * TEN); + num = temp; + + temp = num / TEN; + sum += num - (temp * TEN); + num = temp; + + sum += num; + + // Divie the sum by last digit from right and check if (Rest == 0) and + // (result == (count of digits)) + temp = sum / num; + sum %= num; + sum = sum + DIGITS - temp; + + printf("If you got '0' then it is True, else is False: %hd\n", sum); +} \ No newline at end of file diff --git a/1/ex2 b/1/ex2 new file mode 100644 index 0000000..f1aa98d Binary files /dev/null and b/1/ex2 differ diff --git a/1/ex2.c b/1/ex2.c new file mode 100644 index 0000000..9c38192 --- /dev/null +++ b/1/ex2.c @@ -0,0 +1,49 @@ +#include + +#define TEN 10 +#define ZERO 0 +//--------------------------------------------------------------------------------------- +// Exercise 2 +// ---------- +// +// General : The program change order digits - reverse order. +// +// Input : Number with 3 digits. +// +// Process : The program take the digits from right to left and multiplier the digit +// by 10. +// +// Output : Same number like input just reverse order. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 09.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + short num, + temp, + result = ZERO; + + printf("Enter number with 3 digits: "); + scanf("%hd", &num); + + // Take the first digit from right to left and add to result + temp = num / TEN; + result += num - (temp * TEN); + num = temp; + + temp = num / TEN; + + // Multiplie the result by 10 + result *= TEN; + result += num - (temp * TEN); + num = temp; + + temp = num / TEN; + result *= TEN; + result += num - (temp * TEN); + + printf("%hd\n", result); +} \ No newline at end of file diff --git a/1/ex2_2 b/1/ex2_2 new file mode 100644 index 0000000..71a3509 Binary files /dev/null and b/1/ex2_2 differ diff --git a/1/ex2_2.c b/1/ex2_2.c new file mode 100644 index 0000000..45a9162 --- /dev/null +++ b/1/ex2_2.c @@ -0,0 +1,54 @@ +#include + +#define TEN 10 +#define ZERO 0 +//--------------------------------------------------------------------------------------- +// Exercise 2_2 +// ------------ +// +// General : The program change order digits - reverse order. +// +// Input : Number with 4 digits. +// +// Process : The program take the digits from right to left and multiplier the digit +// by 10. +// +// Output : Same number like input just reverse order. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 09.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + short num, + temp, + result = ZERO; + + printf("Enter number with 4 digits: "); + scanf("%hd", &num); + + // Take the first digit from right to left and add to result + temp = num / TEN; + result += num - (temp * TEN); + num = temp; + + temp = num / TEN; + + // Multiplie the result by 10 + result *= TEN; + result += num - (temp * TEN); + num = temp; + + temp = num / TEN; + result *= TEN; + result += num - (temp * TEN); + num = temp; + + temp = num / TEN; + result *= TEN; + result += num - (temp * TEN); + + printf("%hd\n", result); +} \ No newline at end of file diff --git a/1/ex3 b/1/ex3 new file mode 100644 index 0000000..78e4285 Binary files /dev/null and b/1/ex3 differ diff --git a/1/ex3.c b/1/ex3.c new file mode 100644 index 0000000..93319ee --- /dev/null +++ b/1/ex3.c @@ -0,0 +1,59 @@ +#include + +#define SIXTY 60 +//--------------------------------------------------------------------------------------- +// Exercise 3 +// ---------- +// +// General : The program calculates difference between 2 times. +// +// Input : 2 times by HH:MM:SS format. +// +// Process : The program coverts the hours and minutes to seconds and calculate +// the seconds by subtraction. +// +// Output : Time by format HH:MM:SS. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 09.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + short hours1, + minutes1, + hours2, + minutes2; + int seconds1, + seconds2; + printf("Enter the first time (HH:MM:SS): "); + scanf("%hd:%hd:%d", &hours1, &minutes1, &seconds1); + printf("Enter the second time (HH:MM:SS): "); + scanf("%hd:%hd:%d", &hours2, &minutes2, &seconds2); + + // Change the hours to minutes + minutes1 += hours1 * SIXTY; + minutes2 += hours2 * SIXTY; + + // Change the minutes to seconds + seconds1 += minutes1 * SIXTY; + seconds2 += minutes2 * SIXTY; + + // Subtraction between times as seconds + seconds1 -= seconds2; + + // Change the seconds to minutes + minutes1 = seconds1 / SIXTY; + + // Rest for seconds + seconds1 %= SIXTY; + + // Change the minutes to hours + hours1 = minutes1 / SIXTY; + + // Rest for minutes + minutes1 %= SIXTY; + + printf("%02hd:%02hd:%02d\n", hours1, minutes1, seconds1); +} \ No newline at end of file diff --git a/1/ex4 b/1/ex4 new file mode 100644 index 0000000..27af463 Binary files /dev/null and b/1/ex4 differ diff --git a/1/ex4.c b/1/ex4.c new file mode 100644 index 0000000..e220af4 --- /dev/null +++ b/1/ex4.c @@ -0,0 +1,26 @@ +#define APPLE_COUNT 10 +#define APPLE_COST 5 +#define TWO 2 +//--------------------------------------------------------------------------------------- +// Exercise 4 +// ---------- +// +// General : The program calculates what is the cost for bananas and apples. +// +// Input : None. +// +// Process : The program calculate price by multiply and amount. +// +// Output : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 09.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned char bananas = APPLE_COUNT + TWO; + unsigned short sum_cost = (APPLE_COUNT * APPLE_COST) + + (bananas * APPLE_COST * TWO); +} \ No newline at end of file diff --git a/1/ex5 b/1/ex5 new file mode 100644 index 0000000..cbd11f7 Binary files /dev/null and b/1/ex5 differ diff --git a/1/ex5.c b/1/ex5.c new file mode 100644 index 0000000..9096008 --- /dev/null +++ b/1/ex5.c @@ -0,0 +1,30 @@ +#include + +#define TWO 2 +//--------------------------------------------------------------------------------------- +// Exercise 5 +// ---------- +// +// General : The program calculates right angled triangular area. +// +// Input : 2 ribs of the right angled triangle. +// +// Process : The program calculate rib * rib / 2. +// +// Output : The right angled triangular area. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 09.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short rib1, + rib2, + area; + printf("Enter 2 ribs of right angled triangle: "); + scanf("%hd%hd", &rib1, &rib2); + area = rib1 * rib2 / TWO; + printf("The area is: %hd\n", area); +} \ No newline at end of file diff --git a/1/test b/1/test new file mode 100644 index 0000000..6fcd4ff Binary files /dev/null and b/1/test differ diff --git a/1/test.c b/1/test.c new file mode 100644 index 0000000..b590a8e --- /dev/null +++ b/1/test.c @@ -0,0 +1,9 @@ +#include + +void main(void) +{ + short num = 2; + num = !-2; + printf("%hd", num); + +} \ No newline at end of file diff --git a/10/IdanStringPointersLib b/10/IdanStringPointersLib new file mode 100644 index 0000000..47c8739 Binary files /dev/null and b/10/IdanStringPointersLib differ diff --git a/10/IdanStringPointersLib.h b/10/IdanStringPointersLib.h new file mode 100644 index 0000000..d27b8a3 --- /dev/null +++ b/10/IdanStringPointersLib.h @@ -0,0 +1,449 @@ +#include "PointersLibs.h" + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInString +// ----------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short IndexCharInString(char text[], char c) +{ + unsigned short counter = ZERO; + while (text[counter++] != c); + + return (--counter); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +/*BOOLEAN StringBInStringA(char textA[], char textB[]) +{ + BOOLEAN exist = FALSE; + unsigned short textA_lenght = StringLenght(textA); + unsigned short textB_lenght = StringLenght(textB); + char temp_textA[textA_lenght]; + unsigned short counter; + unsigned short loop_length = textA_lenght - textB_lenght; + for (counter = ZERO; (counter < loop_length) * !exist; counter++) + { + CopyString(temp_textA, textA, ZERO); + CutString(temp_textA, counter, textB_lenght); + exist = StringCompare(temp_textA, textB); + } + + return (exist); +}*/ + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} diff --git a/10/PointersLibs.h b/10/PointersLibs.h new file mode 100644 index 0000000..a1d91ce --- /dev/null +++ b/10/PointersLibs.h @@ -0,0 +1,1169 @@ +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + BOOLEAN answer = !(num % TWO); + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} diff --git a/10/ex1 b/10/ex1 new file mode 100644 index 0000000..207ac4e Binary files /dev/null and b/10/ex1 differ diff --git a/10/ex1.c b/10/ex1.c new file mode 100644 index 0000000..cee62a4 --- /dev/null +++ b/10/ex1.c @@ -0,0 +1,66 @@ +#include +#include "IdanStringPointersLib.h" + +#define STRING_MAX_SIZE 256 + + + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//----------------------------------------------------------------- +// exe 1 +// ----- +// General : the program goes over the string and checks how many +// appearences the substring makes. +// +// Input : a string and a word/sub-string to search for. +// +// Process : the program takes the sub-string and checks if the +// string has the same sequence of chars in it. +// +// Output : The times it has shown up in the string. +//----------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main(void) +{ + char stringA[STRING_MAX_SIZE] = "aaaaaaaaaaaababbbbbbbbbab"; + char stringB[STRING_MAX_SIZE] = "ab"; + printf("Count: %d\n", CountStringBInStringA(&stringA[ZERO], &stringB[ZERO])); + +} \ No newline at end of file diff --git a/10/ex2 b/10/ex2 new file mode 100644 index 0000000..30ca83b Binary files /dev/null and b/10/ex2 differ diff --git a/10/ex2.c b/10/ex2.c new file mode 100644 index 0000000..28be38d --- /dev/null +++ b/10/ex2.c @@ -0,0 +1,58 @@ +#include +#include "IdanStringPointersLib.h" + +#define STRING_MAX_SIZE 256 + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, *start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//----------------------------------------------------------------- +// exe 2 +// ----- +// General : the program checks which char repeats itself the most +// in a string and shows how many times it shows up. +// +// Input : a string. +// +// Process : goes over every letter and checks the amount of it. +// +// Output : the highest repeating char and the times it appeared +// in string. +// +//----------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main(void) +{ + char stringA[STRING_MAX_SIZE] = "aaaaaaaaaaaaababbbbbbbbbabbbbbbbb"; + printf("Count: %u\n", MaxCountCharInString(&stringA[ZERO])); + +} \ No newline at end of file diff --git a/10/ex3 b/10/ex3 new file mode 100644 index 0000000..5dd3a63 Binary files /dev/null and b/10/ex3 differ diff --git a/10/ex3.c b/10/ex3.c new file mode 100644 index 0000000..a8651f1 --- /dev/null +++ b/10/ex3.c @@ -0,0 +1,145 @@ +#include +#include "IdanStringPointersLib.h" + +#define STRING_MAX_SIZE 256 + + +//--------------------------------------------------------------------------------------- +// SortedInDescendingOrder +// ----------------------- +// +// General : Checks whether the string characters are in descending order. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : If the string string is descending (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +BOOLEAN SortedInDescendingOrder(char *start_string_index) +{ + while (*start_string_index && + (*(start_string_index) >= *(start_string_index++ + ONE))); + + return !(*(start_string_index)); +} + +//--------------------------------------------------------------------------------------- +// SortedInAscendingOrder +// ---------------------- +// +// General : Checks whether the string characters are in ascending order. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : If the string characters are in ascending order (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +BOOLEAN SortedInAscendingOrder(char *start_string_index) +{ + while (*start_string_index && + (*(start_string_index) <= *(start_string_index++ + ONE))); + + return !(*(start_string_index)); +} + +//--------------------------------------------------------------------------------------- +// CopyEvenPlacesStringAToStringB +// ------------------------------ +// +// General : Transcribes the same places in the first set to another. +// +// Parameters : +// *start_stringA_index - Pointer of first string (char[]) +// *start_stringB_index - Pointer of second string (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +void CopyEvenPlacesStringAToStringB(char *start_stringA_index, char *start_stringB_index) +{ + while (*start_stringA_index) + { + *(start_stringB_index++) = *(start_stringA_index++); + start_stringA_index++; + } + *(start_stringB_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned short StringIsSortedAlternately(char *start_string_index) +{ + unsigned short flag = ZERO; + unsigned int lenght_string = StringLenght(start_string_index); + char even_places[lenght_string]; + char odd_places[lenght_string - ONE]; + unsigned short even_array_mode = ZERO; // 0 - Not sorted, 1 - asce sorted, 2 - desc sorted, 3 - both + unsigned short odd_array_mode = ZERO; // 0 - Not sorted, 1 - asce sorted, 2 - desc sorted, 3 - both + CopyEvenPlacesStringAToStringB(start_string_index, &even_places[ZERO]); + CopyEvenPlacesStringAToStringB(start_string_index + ONE, &odd_places[ZERO]); + + even_array_mode = SortedInAscendingOrder(&even_places) * TWO + SortedInDescendingOrder(&even_places); + odd_array_mode = SortedInAscendingOrder(&odd_places) * TWO + SortedInDescendingOrder(&odd_places); + + flag += (even_array_mode == ONE && odd_array_mode == TWO) * TWO; + flag += (even_array_mode == TWO && odd_array_mode == ONE); + flag += (even_array_mode == THREE && odd_array_mode == ONE); + flag += (even_array_mode == ONE && odd_array_mode == THREE) * TWO; + flag += (even_array_mode == THREE && odd_array_mode == THREE) * THREE; + flag += (even_array_mode == THREE && odd_array_mode == TWO)* TWO; + flag += (even_array_mode == ONE && odd_array_mode == TWO)* TWO; + + return (flag); +} +//----------------------------------------------------------------- +// exe 3 +// ----- +// General : the program checks if the string is ordered by the +// given standard. +// +// Input : a string. +// +// Process : goes over every even and odd space and checks if it +// falls under the criteria of a sorted string. +// +// Output : if it is a sorted string or not and what type. +// +//----------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main(void) +{ + + char stringA[STRING_MAX_SIZE] = "aaaaaaa\0"; + printf("Count: %u\n", StringIsSortedAlternately(&stringA[ZERO])); +} \ No newline at end of file diff --git a/10/ex4.c b/10/ex4.c new file mode 100644 index 0000000..94b07a9 --- /dev/null +++ b/10/ex4.c @@ -0,0 +1,71 @@ +#include +#include "IdanStringPointersLib.h" + +#define STRING_MAX_SIZE 256 + + +int LenghtString(char *ptrStr) +{ + char *ptrEndStr = LastCharOfString(ptrStr); + int DifferenceStr = (ptrEndStr - ptrStr); + return (DifferenceStr); +} + +void Revers(char * ptrStr) +{ + //puts(ptrStr); + char * ptrEnd = LastCharOfString(ptrStr); + int length = ZERO; + while (ptrEnd > ptrStr) + { + Swap(ptrStr++, ptrEnd--); + length++; + } + *(ptrStr + length ) = ZERO; + ptrStr -= length + ONE; + +} + +void Itoa(int num , char *ptrStr, unsigned short base) +{ + char sign ; + int diff; + int length =ZERO; + while (num > ZERO) + { + sign = '0'; + diff = num % base; + sign += (diff > TEN) ? SEVEN + diff : diff; + *(ptrStr++) = sign; + num /= base; + length++; + } + *ptrStr = ZERO; + ptrStr -= length + ONE; + Revers(ptrStr); +} + +//----------------------------------------------------------------- +// exe 4 +// ----- +// General : the program turns a num into string. +// +// Input : num and base. +// +// Process : the program takes each number and adds the value in +// computer code of '0' to it, to turn it to a char. +// +// Output : the num as a string. +// +//----------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main(void) +{ + char stringA[STRING_MAX_SIZE] = "aaaaaaaaaaaababbbbbbbbbab"; + char stringB[STRING_MAX_SIZE] = "ab"; + printf("Count: %d\n", CountStringBInStringA(&stringA[ZERO], &stringB[ZERO])); + +} \ No newline at end of file diff --git a/10/ex5.c b/10/ex5.c new file mode 100644 index 0000000..a85134b --- /dev/null +++ b/10/ex5.c @@ -0,0 +1,126 @@ +#include +#include "IdanStringPointersLib.h" + +#define BACKSLASH_ZERO '\0' +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define ZERO 0 +#define ONE 1 +#define TWO 2 + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//----------------------------------------------------------------- +// exe 5 +// ----- +// General : the program takes out all the appearnces of a word, +// from another string. +// +// Input : two strings. +// +// Process : goes over each word in the second string, and deletes +// the words that appear from the first one. +// +// Output : the original string, the second string, new string, and +// amount of changes made. +// +//----------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main(void) +{ + char stringA[100] = "abgjskababababablgjkljab"; + char stringB[100] = "ab"; + RemoveAllStringBFromStringA(&stringA[0], &stringB[0]); + printf("Lenght: %s\n", stringA); + +} diff --git a/10/test b/10/test new file mode 100644 index 0000000..c0f89c4 Binary files /dev/null and b/10/test differ diff --git a/10/test.c b/10/test.c new file mode 100644 index 0000000..eec8241 --- /dev/null +++ b/10/test.c @@ -0,0 +1,11 @@ +#include +#include "IdanStringPointersLib.h" + +void main(void) +{ + char stringA[100] = "abgjskababababablgjkljab"; + char stringB[100] = "ab"; + RemoveAllStringBFromStringA(&stringA[0], &stringB[0]); + printf("Lenght: %s\n", stringA); + +} \ No newline at end of file diff --git a/10/תיעוד/Homework - 12/Debug/Homework - 12.exe b/10/תיעוד/Homework - 12/Debug/Homework - 12.exe new file mode 100644 index 0000000..631860a Binary files /dev/null and b/10/תיעוד/Homework - 12/Debug/Homework - 12.exe differ diff --git a/10/תיעוד/Homework - 12/Debug/Homework - 12.ilk b/10/תיעוד/Homework - 12/Debug/Homework - 12.ilk new file mode 100644 index 0000000..3fe45a4 Binary files /dev/null and b/10/תיעוד/Homework - 12/Debug/Homework - 12.ilk differ diff --git a/10/תיעוד/Homework - 12/Debug/Homework - 12.pdb b/10/תיעוד/Homework - 12/Debug/Homework - 12.pdb new file mode 100644 index 0000000..722033d Binary files /dev/null and b/10/תיעוד/Homework - 12/Debug/Homework - 12.pdb differ diff --git a/10/תיעוד/Homework - 12/Homework - 12.sln b/10/תיעוד/Homework - 12/Homework - 12.sln new file mode 100644 index 0000000..f2508a6 --- /dev/null +++ b/10/תיעוד/Homework - 12/Homework - 12.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.572 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Homework - 12", "Homework - 12\Homework - 12.vcxproj", "{ED24374E-80FE-4D58-84D3-CAA154075EB6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {ED24374E-80FE-4D58-84D3-CAA154075EB6}.Debug|x64.ActiveCfg = Debug|x64 + {ED24374E-80FE-4D58-84D3-CAA154075EB6}.Debug|x64.Build.0 = Debug|x64 + {ED24374E-80FE-4D58-84D3-CAA154075EB6}.Debug|x86.ActiveCfg = Debug|Win32 + {ED24374E-80FE-4D58-84D3-CAA154075EB6}.Debug|x86.Build.0 = Debug|Win32 + {ED24374E-80FE-4D58-84D3-CAA154075EB6}.Release|x64.ActiveCfg = Release|x64 + {ED24374E-80FE-4D58-84D3-CAA154075EB6}.Release|x64.Build.0 = Release|x64 + {ED24374E-80FE-4D58-84D3-CAA154075EB6}.Release|x86.ActiveCfg = Release|Win32 + {ED24374E-80FE-4D58-84D3-CAA154075EB6}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5F88B4C9-0452-4A20-AC8A-93BC16D123B9} + EndGlobalSection +EndGlobal diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.log b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.log new file mode 100644 index 0000000..cfc9320 --- /dev/null +++ b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.log @@ -0,0 +1,5 @@ + hw.c +c:\users\tal levin\desktop\college\c things\homework - 12\homework - 12\hw.c(220): warning C4047: 'initializing': 'char *' differs in levels of indirection from 'char (*)[100]' +c:\users\tal levin\desktop\college\c things\homework - 12\homework - 12\hw.c(382): warning C4013: '_getch' undefined; assuming extern returning int +c:\users\tal levin\desktop\college\c things\homework11pointer\homework11pointer\pointer.c(201): warning C4716: 'IsPerfect': must return a value + Homework - 12.vcxproj -> C:\Users\Tal Levin\Desktop\College\C things\Homework - 12\Debug\Homework - 12.exe diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.command.1.tlog b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.command.1.tlog new file mode 100644 index 0000000..7376854 Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.command.1.tlog differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.read.1.tlog b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.read.1.tlog new file mode 100644 index 0000000..6d8d841 Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.read.1.tlog differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.write.1.tlog b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.write.1.tlog new file mode 100644 index 0000000..77d1c2b Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/CL.write.1.tlog differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/Homework - 12.lastbuildstate b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/Homework - 12.lastbuildstate new file mode 100644 index 0000000..251990f --- /dev/null +++ b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/Homework - 12.lastbuildstate @@ -0,0 +1,2 @@ +#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.17763.0 +Debug|Win32|C:\Users\Tal Levin\Desktop\College\C things\Homework - 12\| diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.command.1.tlog b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.command.1.tlog new file mode 100644 index 0000000..043887b Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.command.1.tlog differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.read.1.tlog b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.read.1.tlog new file mode 100644 index 0000000..cda1596 Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.read.1.tlog differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.write.1.tlog b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.write.1.tlog new file mode 100644 index 0000000..453cc4b Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/Homework - 12.tlog/link.write.1.tlog differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/Pointer.obj b/10/תיעוד/Homework - 12/Homework - 12/Debug/Pointer.obj new file mode 100644 index 0000000..14607cb Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/Pointer.obj differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/hw.obj b/10/תיעוד/Homework - 12/Homework - 12/Debug/hw.obj new file mode 100644 index 0000000..a52f4ef Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/hw.obj differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/hw.obj.enc b/10/תיעוד/Homework - 12/Homework - 12/Debug/hw.obj.enc new file mode 100644 index 0000000..41703ad Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/hw.obj.enc differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/vc141.idb b/10/תיעוד/Homework - 12/Homework - 12/Debug/vc141.idb new file mode 100644 index 0000000..48dc2ef Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/vc141.idb differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Debug/vc141.pdb b/10/תיעוד/Homework - 12/Homework - 12/Debug/vc141.pdb new file mode 100644 index 0000000..3931a43 Binary files /dev/null and b/10/תיעוד/Homework - 12/Homework - 12/Debug/vc141.pdb differ diff --git a/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj b/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj new file mode 100644 index 0000000..90751b4 --- /dev/null +++ b/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj @@ -0,0 +1,123 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {ED24374E-80FE-4D58-84D3-CAA154075EB6} + Homework12 + 10.0.17763.0 + + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + Application + true + v141 + MultiByte + + + Application + false + v141 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + true + + + + + Level3 + Disabled + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + + + true + true + + + + + + + + + \ No newline at end of file diff --git a/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj.filters b/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj.filters new file mode 100644 index 0000000..b0061f4 --- /dev/null +++ b/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj.user b/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj.user new file mode 100644 index 0000000..6e2aec7 --- /dev/null +++ b/10/תיעוד/Homework - 12/Homework - 12/Homework - 12.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/10/תיעוד/Homework - 12/Homework - 12/hw.c b/10/תיעוד/Homework - 12/Homework - 12/hw.c new file mode 100644 index 0000000..9c140ca --- /dev/null +++ b/10/תיעוד/Homework - 12/Homework - 12/hw.c @@ -0,0 +1,383 @@ +#pragma once +#define _CRT_SECURE_NO_WARNINGS +#include +#include "C:\Users\Tal Levin\Desktop\College\C things\Homework11Pointer\Homework11Pointer\Pointer.c" +#define Numbers 10 +#define Hundred 100 +#define Zero 0 +#define Ten 10 +#define One 1 +typedef char string[Hundred]; +void Nullify(char *string) +{ + //sets the string to blanks + short count = Zero; + while (count < Hundred-One) + { + *(string + count) = ' '; + count++; + } + *(string + count + One) = '\0'; +} +char *itoa(int *num) +{ + //turns int to char/string + char *newString; + char a[Hundred] = { Zero }; + newString = &a[Zero]; + int k = NumReversal(num); + while(k>Zero) + { + *(newString++) = k % Ten + '0'; + k /= Ten; + } + *(++newString) = '\0'; + return &a[Zero]; +} +int Length(char arr[]) +{ + //checks the length of a string + int count = Zero; + while (arr[count++]!='\0'); + return count-One; +} +int SubString(char *string, char *substring, + char *new_string) +{ + //checks how many times substring shows up in + //main string and deletes them + short len = Length(substring); + short replaced = Zero; + while (*(string)) + { + short pos = 0; + while (*(string + pos)!='\0' + && *(substring + pos)!='\0' + && *(string+pos) == *(substring+pos) + && pos < len) + { + pos++; + } + if (pos == len) + { + string += len; + replaced++; + } + else + { + *new_string = *string; + new_string++; + string++; + } + } + return replaced; +} +int HowManyTimes(char *string, char *substring) +{ + //checks how many times substring shows up in + //main string + short len = Length(substring); + short showups = Zero; + while (*(string)) + { + short pos = 0; + while (*(string + pos) != '\0' + && *(substring + pos) != '\0' + && *(string + pos) == *(substring + pos) + && pos < len) + { + pos++; + } + if (pos == len) + { + string += len; + showups++; + } + else + { + string++; + } + } + return showups; +} +short HowManySeqChars(char *str,char *frequent) +{ + //checks which char appears the most and + //how many times + short max_count_chars = Zero; + while (*str) + { + int count_chars = Zero; + while (*(str + count_chars + One) + && *(str + count_chars) == + *(str + count_chars + One)) + { + count_chars++; + } + if (count_chars > max_count_chars) { + max_count_chars = count_chars; + *frequent = *str; + } + str++; + } + return max_count_chars + One; +} +void StringCut(char * string, char *even, char*odd) +{ + //copies the even places to the even string + //and the odd places to the odd string + unsigned int counter = Zero; + while (*(string + counter) != '\0') + { + if (counter % Two == Zero) + { + *even = *(string + counter); + even++; + counter++; + } + else + { + *odd = *(string + counter); + odd++; + counter++; + } + } + *even = '\0'; + *odd = '\0'; +} +Bool MemoyanLeserogin(char *even, char *odd) +{ + //checks if even places are going down, and odd are going up + int lengthEven = Length(even); + int lengthOdd = Length(odd); + Bool found = True; + for (int counter = Zero; counter < lengthEven - One; counter++) + { + if (*(even + counter) > *(even + counter + One)) + { + found = False; + } + + } + for (int counter = Zero; counter < lengthOdd - One; counter++) + { + if (*(odd + counter) < *(odd + counter + One)) + { + found = False; + } + + } + return found; +} +Bool MemoyanLeserogin2(char *even, char*odd) +{ + //checks if odd places are going down, and even are going up + int lengthEven = Length(even); + int lengthOdd = Length(odd); + Bool found = True; + for (int counter = Zero; counter < lengthEven - One; counter++) + { + if (*(even + counter) < *(even + counter + One)) + { + found = False; + } + + } + for (int counter = Zero; counter < lengthOdd - One; counter++) + { + if (*(odd + counter) > *(odd + counter + One)) + { + found = False; + } + + } + return found; +} +void isStringMemoyan(char* a, char * even, char*odd) +{ + //This function checks if the string given + //stands by the criteria of sorted string + StringCut(a, even, odd); + Bool check = MemoyanLeserogin(even, odd); + Bool check1 = MemoyanLeserogin2(even, odd); + if (check == One) + { + printf("Memuyan Le Serugin\n"); + } + if (check1 == One) + { + printf("Memuyan Le Serugin Hafuh\n"); + } + if(!check1 && !check) + { + printf("Lo Memuyan\n"); + } +} +int DeleteSameInstances(char *string, char *sub,char *new_s) +{ + //deletes all the same words of the second string from the first + char str[Hundred]; + char *temp = &str; + int count = Zero; + *temp = '\0'; + while (*(sub-One) != '\0') + { + Cut(sub, temp); + count += SubString(string,temp,new_s); + Copy(string,new_s); + sub += Length(temp)+One; + } + return count; +} +/* +//----------------------------------------------------------------- +// exe 1 +// ----- +// General : the program goes over the string and checks how many +// appearences the substring makes +// Input : a string and a word/sub-string to search for +// Process : the program takes the sub-string and checks if the +// string has the same sequence of chars in it. +// Output : The times it has shown up in the string +//----------------------------------------------------------------- +// Proggramer : Tal Levin +// Student No : 212204176 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main() +{ + string str1; + string str2; + char *origin = &str1[Zero]; + char *sub = &str2[Zero]; + Nullify(origin); + Nullify(sub); + printf("Enter source string: "); + scanf("%[^\n]%*c", str1); + printf("Enter replace string: "); + scanf("%[^\n]%*c", str2); + short count = HowManyTimes(origin, sub); + printf("Number of times: %hd\n", count); + +} +//----------------------------------------------------------------- +// exe 2 +// ----- +// General : the program checks which char repeats itself the most +// in a string and shows how many times it shows up +// Input : a string +// Process : goes over every letter and checks the amount of it +// Output : the highest repeating char and the times it appeared +// in string. +//----------------------------------------------------------------- +// Proggramer : Tal Levin +// Student No : 212204176 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main() +{ + string arr; + char f; + short count = Zero; + char *frequent = &f; + char *str = &arr[Zero]; + printf("Enter string: "); + scanf("%[^\n]%*c", str); + count = HowManySeqChars(str, frequent); + printf("the most frequent letter: %c \n", *frequent); + printf("anount of times in: %hd", count); + _getch(); +} +//----------------------------------------------------------------- +// exe 3 +// ----- +// General : the program checks if the string is ordered by the +// given standard +// Input : a string +// Process : goes over every even and odd space and checks if it +// falls under the criteria of a sorted string +// Output : if it is a sorted string or not and what type +//----------------------------------------------------------------- +// Proggramer : Tal Levin +// Student No : 212204176 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main() +{ + string arr; + char *str = &arr[Zero]; + string arr1; + char *str1 = &arr1[Zero]; + string arr2; + char *str2 = &arr2[Zero]; + printf("Enter string: "); + scanf("%[^\n]%*c", str); + isStringMemoyan(str, str1, str2); + _getch(); +} +//----------------------------------------------------------------- +// exe 4 +// ----- +// General : the program turns a num into string +// Input : a num +// Process : the program takes each number and adds the value in +// computer code of '0' to it, to turn it to a char +// Output : the num as a string +//----------------------------------------------------------------- +// Proggramer : Tal Levin +// Student No : 212204176 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main(void) +{ + char *converted; + char b[Hundred]; + converted = &b[Zero]; + Nullify(converted); + int *num; + int toconvert = 2103; + num = &toconvert; + converted = itoa(num); + _getch(); +} +*/ +//----------------------------------------------------------------- +// exe 5 +// ----- +// General : the program takes out all the appearnces of a word, +// from another string +// Input : two strings +// Process : goes over each word in the second string, and deletes +// the words that appear from the first one +// Output : the original string, the second string, new string, and +// amount of changes made. +//----------------------------------------------------------------- +// Proggramer : Tal Levin +// Student No : 212204176 +// Date : 12.11.19 +//----------------------------------------------------------------- +void main() +{ + string str1; + string str2; + string str3; + string str4; + char *s = &str1[Zero]; + char *sub = &str2[Zero]; + char *new_s = &str3[Zero]; + char *origin = &str4[Zero]; + Nullify(s); + Nullify(sub); + Nullify(new_s); + printf("Enter source string: "); + scanf("%[^\n]%*c", s); + printf("Enter replace string: "); + scanf("%[^\n]%*c", sub); + Copy(origin, s); + int changes = DeleteSameInstances(s, sub, new_s); + printf("Origin String: %s\n",origin); + printf("Sub string: %s\n", sub); + printf("New string: %s\n",new_s); + printf("Number of changes: %hd\n", changes); + _getch(); +} diff --git a/10/תיעוד/Homework_-_12.rar b/10/תיעוד/Homework_-_12.rar new file mode 100644 index 0000000..1888a94 Binary files /dev/null and b/10/תיעוד/Homework_-_12.rar differ diff --git a/11/IdanStringPointersLib.h b/11/IdanStringPointersLib.h new file mode 100644 index 0000000..ccbcd16 --- /dev/null +++ b/11/IdanStringPointersLib.h @@ -0,0 +1,479 @@ +#include "PointersLibs.h" + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInString +// ----------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short IndexCharInString(char text[], char c) +{ + unsigned short counter = ZERO; + while (text[counter++] != c); + + return (--counter); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, *start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} \ No newline at end of file diff --git a/11/PointersLibs.h b/11/PointersLibs.h new file mode 100644 index 0000000..7d94c65 --- /dev/null +++ b/11/PointersLibs.h @@ -0,0 +1,1167 @@ +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + BOOLEAN answer = !(num % TWO); + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} diff --git a/11/ex1 b/11/ex1 new file mode 100644 index 0000000..a37fde5 Binary files /dev/null and b/11/ex1 differ diff --git a/11/ex1.c b/11/ex1.c new file mode 100644 index 0000000..a2c5107 --- /dev/null +++ b/11/ex1.c @@ -0,0 +1,95 @@ +#include "IdanStringPointersLib.h" +#include + +//--------------------------------------------------------------------------------------- +// Highest CountTheLongestIdenticalCharacterSequence +// ------------------------------------------------- +// +// General : The function checks the highest sequence of chars in a string +// +// Parameters : +// *ptr_start - Pointer to a place in a vector(char) +// +// Return Value : Highest sequence +// +//--------------------------------------------------------------------------------------- +unsigned short CountTheLongestIdenticalCharacterSequence(char * ptr_start) +{ + unsigned short max_sum = ONE, + temp_sum = ONE; + ptr_start++; + while (*(ptr_start++)) + { + if (*ptr_start != *(ptr_start - ONE)) + { + max_sum = (max_sum < temp_sum) ? temp_sum : max_sum; + temp_sum = ZERO; + } + temp_sum++; + } + + return (max_sum); +} + +unsigned short IndexOfStringWithLongestIdenticalCharacterSequence(char *ptr_mat_start) +{ + unsigned short max_sum = ZERO, + temp_sum = ZERO, + counter = ZERO, + index = ZERO; + unsigned int string_amount = (unsigned int)(ptr_mat_start) + (MAX_SIZE_STRING * TEN); + for (counter = ZERO; (unsigned int)(ptr_mat_start) < string_amount; counter++) + { + temp_sum = CountTheLongestIdenticalCharacterSequence(ptr_mat_start); + if (temp_sum > max_sum) + { + max_sum = temp_sum; + index = counter; + } + ptr_mat_start += MAX_SIZE_STRING; + } + + return (index); +} + +//--------------------------------------------------------------------------------------- +// EX #1 +// ----- +// +// General : The program gets 10 strings and checks what string is with the highest +// sequence of chars +// +// Input : 10 strings +// +// Process : The program runs on a string and checks what is the highest sequence than +// it compares it to the max +// +// Output : the highest sequence in a the 10 strings +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date: 19.11.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + typedef char string[MAX_SIZE_STRING]; + + string s1 = "aaaabbbbbccccccccccccccc\0"; + string s2 = "aaaabbbbbccccvcccccccccc\0"; + string s3 = "aaaabbbbbccccycccccccccc\0"; + string s4 = "aaaabbbbbcccgccccccccccc\0"; + string s5 = "aaaabbbbbccccckccccccccc\0"; + string s6 = "aaaabbbbbccccchccccccccc\0"; + string s7 = "aaaabbbbbccccncccccccccc\0"; + string s8 = "aaaabbbbbccccjcccccccccc\0"; + string s9 = "aaaabbbbbcccmccccccccccc\0"; + string s10 = "aaaabbbbbccccucccccccccc\0"; + + string arr[10] = {*s5, *s2, *s3, *s4, *s1, *s6, *s7, *s8, *s9, *s10}; + + unsigned short max = PointerOfStringWithLongestIdenticalCharacterSequence(&arr[0]); + + printf("%hu\n", max); + +} diff --git a/11/ex2 b/11/ex2 new file mode 100644 index 0000000..dedb8f9 Binary files /dev/null and b/11/ex2 differ diff --git a/11/ex2.c b/11/ex2.c new file mode 100644 index 0000000..4677d60 --- /dev/null +++ b/11/ex2.c @@ -0,0 +1,84 @@ +#include "IdanStringPointersLib.h" +#include + +#define ROW 5 +#define COL 5 + +unsigned short SumValuesInPointers(BOOLEAN * ptr_start, BOOLEAN * ptr_end) +{ + unsigned short sum; + for (sum = ZERO; ptr_start <= ptr_end; sum += *(ptr_start++)); + + return (sum); +} + +unsigned short CountNeighbors(BOOLEAN *ptr_mat, BOOLEAN *ptr_player) +{ + unsigned short neighbords_count = ZERO; + unsigned short player_row = (ptr_player - ptr_mat) / ROW; + unsigned short player_col = (ptr_player - ptr_mat) % COL; + + // Add the sum of the vector above the cell + neighbords_count += (player_row > ZERO) * SumValuesInPointers(ptr_mat + (MAX(player_row - ONE, ZERO)) * ROW + (MAX(player_col - ONE, ZERO)), + ptr_mat + (MAX(player_row - ONE, ZERO)) * ROW + (MIN(player_col + ONE, COL - ONE))); + + // Add the sum of the vector middle the cell + neighbords_count += SumValuesInPointers(ptr_mat + (player_row) * ROW + (MAX(player_col - ONE, ZERO)), + ptr_mat + (player_row) * ROW + (MIN(player_col + ONE, COL - ONE))) - *ptr_player; + + // Add the sum of the vector below the cell + neighbords_count += (player_row < ROW) * SumValuesInPointers(ptr_mat + (MIN(player_row + ONE, ROW - ONE)) * ROW + (MAX(player_col - ONE, ZERO)), + ptr_mat + (MIN(player_row + ONE, ROW - ONE)) * ROW + (MIN(player_col + ONE, COL - ONE))); + + return (neighbords_count); +} + +void OneLive(BOOLEAN *ptr_mat) +{ + BOOLEAN *ptr_mat_start = ptr_mat; + BOOLEAN *ptr_mat_end = ptr_mat_start + (ROW * COL); + for (; ptr_mat_start < ptr_mat_end; *(ptr_mat_start++) = (CountNeighbors(ptr_mat, ptr_mat_start) == TWO)); +} + +void GameLife(BOOLEAN *ptr_mat, unsigned short lives) +{ + for (; lives; lives--) + { + OneLive(ptr_mat); + PrintMatrix(ptr_mat); + printf("\n"); + } +} + +void ResetMatrix(BOOLEAN *ptr_mat) +{ + BOOLEAN *end_mat = ptr_mat + (ROW * COL); + for (; ptr_mat < end_mat; *(ptr_mat++) %= TWO); +} + +void PrintVector(BOOLEAN *ptr_vec) // Lenght = COL +{ + BOOLEAN *end_vec = ptr_vec + COL; + for (; ptr_vec < end_vec; ptr_vec++) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(BOOLEAN *ptr_mat) // Lenght = ROW +{ + BOOLEAN *end_mat = ptr_mat + (ROW * COL); + for (; ptr_mat < end_mat; ptr_mat += COL) + { + PrintVector(ptr_mat); + printf("\n"); + } +} + +void main(void) +{ + BOOLEAN mat[ROW][COL] = {{1,1,1,0,1}, {1,1,1,1,1}, {1,1,1,1,1}, {1,0,1,0,1}, {1,0,1,0,1}}; + PrintMatrix(mat); + printf("\n"); + GameLife(mat, THREE); +} \ No newline at end of file diff --git a/11/ex3 b/11/ex3 new file mode 100644 index 0000000..3c437fd Binary files /dev/null and b/11/ex3 differ diff --git a/11/ex3.c b/11/ex3.c new file mode 100644 index 0000000..8435a7e --- /dev/null +++ b/11/ex3.c @@ -0,0 +1,68 @@ +#include "IdanStringPointersLib.h" +#include + +#define ROW 2 +#define COL 2 + + +BOOLEAN StringIsSubstringInVec(char * ptr_vec, char * ptr_string) // Lenght vector = COL +{ + char *strings_amount = ptr_vec + (COL * MAX_SIZE_STRING); + for (;ptr_vec < strings_amount && !(ptr_vec != ptr_string) * StringBInStringA(ptr_vec, ptr_string); ptr_vec += MAX_SIZE_STRING); + + return ((ptr_vec != ptr_string) * StringBInStringA(ptr_vec, ptr_string)); +} + +BOOLEAN StringIsSubstringInMat(char * ptr_mat, char * ptr_string) // Lenght = ROW +{ + unsigned int step = COL * MAX_SIZE_STRING; + char *vectors_amount = ptr_mat + (ROW * step); + for (; ptr_mat < vectors_amount && !((ptr_mat != ptr_string) * StringIsSubstringInVec(ptr_mat, ptr_string)); ptr_mat += step); + + return ((ptr_mat != ptr_string) * StringIsSubstringInVec(ptr_mat, ptr_string)); +} + +BOOLEAN HaveSubstringInVec(char * ptr_mat, char * ptr_vec) // בודק בווקטור אם אחד האיברים הוא תת מחרוזת במטריצה +{ + char *strings_amount = ptr_vec + (COL * MAX_SIZE_STRING); + for (; ptr_vec < strings_amount && !(StringIsSubstringInMat(ptr_mat, ptr_vec)); ptr_vec += MAX_SIZE_STRING); + + return (StringIsSubstringInMat(ptr_mat, ptr_vec)); +} + +BOOLEAN HaveSubstringInMat(char * ptr_mat) // בודק אם קיימת תת מחרוזת במטריצה למחרוזת במטריצה +{ + unsigned int step = COL * MAX_SIZE_STRING; + char *vectors_amount = ptr_mat + (ROW * step); + char *ptr_temp_mat = ptr_mat; + for (; ptr_mat < vectors_amount && !(HaveSubstringInVec(ptr_temp_mat, ptr_mat)); ptr_mat += step); + + return (HaveSubstringInVec(ptr_temp_mat, ptr_mat)); +} + +//--------------------------------------------------------------------------------------- +// EX #3 +// ----- +// +// General : The program gets a matrix of string and checks if one of the string is a +// substring to another string +// +// Input : matrix of string +// +// Process : The program runs on a string and if he is a substring of one of the other +// string till it is out of string to check +// +// Output : True or False +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date: 19.11.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + typedef char string[MAX_SIZE_STRING]; + string mat[ROW][COL] = { {"hello", "world"} , { "idan", "hel"}}; + + printf("%hu\n", HaveSubstringInMat(mat)); +} \ No newline at end of file diff --git a/12/PointersLibs.h b/12/PointersLibs.h new file mode 100644 index 0000000..e87568b --- /dev/null +++ b/12/PointersLibs.h @@ -0,0 +1,1677 @@ +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} \ No newline at end of file diff --git a/12/ex1.c b/12/ex1.c new file mode 100644 index 0000000..24f427e --- /dev/null +++ b/12/ex1.c @@ -0,0 +1,44 @@ +#include +#include +#include "PointersLibs.h" + +int * EvenSubArray(int vec[], int len, int *ptr_even) +{ + int * ptr_even_vec = (int)malloc(sizeof(int)); + unsigned int counter; + for (counter = ZERO; counter < len; counter++) + { + if (!(vec[counter] % TWO)) + { + (*ptr_even)++; + ptr_even_vec = realloc(ptr_even_vec, (*ptr_even)); + *(ptr_even_vec++) = vec[counter]; + } + } + + return (ptr_even_vec); +} + +//--------------------------------------------------------------------------------------- +// exe 1 +// ----- +// +// General : The program gets an array and separates the even +// numbers from it to the pointer. +// +// Input : an array of numbers, its length. +// +// Process : the program goes over the array and puts the even nums +// in the pointer array. +// +// Output : if there are even nums, and if there are, print them. +// +//--------------------------------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 21.11.19 +//--------------------------------------------------------------------------------------- +void main(void) +{ + +} \ No newline at end of file diff --git a/12/ex2 b/12/ex2 new file mode 100644 index 0000000..6b00f4b Binary files /dev/null and b/12/ex2 differ diff --git a/12/ex2.c b/12/ex2.c new file mode 100644 index 0000000..3da2bba --- /dev/null +++ b/12/ex2.c @@ -0,0 +1,58 @@ +#include +#include +#include "PointersLibs.h" + +void SearchLongestWord(char s[], char **l) +{ + *l = malloc(sizeof(char)); + char *ptr_s = s, + *ptr_temp_s, + *ptr_last_char = LastCharOfString(s); + unsigned short max_lenght = ZERO; + while (ptr_s < ptr_last_char) + { + + ptr_temp_s = IndexCharInPointers(ptr_s, ptr_last_char, ' '); + if (ptr_temp_s - ptr_s > max_lenght) + { + max_lenght = ptr_temp_s - ptr_s; + *l = realloc(*l, max_lenght); + CopyPointers(*l, ptr_s, ptr_temp_s); + (*LastCharOfString(*l)) = BACKSLASH_ZERO; + } + ptr_s = ptr_temp_s + ONE; + } +} + +//--------------------------------------------------------------------------------------- +// exe 2 +// ----- +// +// General : the program gets a string and searches for the longest +// word in it and saves it. +// +// Input : a string and a pointer of pointers. +// +// Process : the program goes over the array and checks if each +// word finds is longer than the last one that +// was longest. +// +// Output : the longest word. +// +//--------------------------------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 21.11.19 +//--------------------------------------------------------------------------------------- +void main(void) +{ + typedef char string[MAX_SIZE_STRING]; + + string s = "Your feedback plays an important role in helping other buyers choose products and sellers."; + char f; + char *f1 = &f; + char *f2 = &f1; + SearchLongestWord(s, f2); + printf("%s\n", f1); + free(f1); +} \ No newline at end of file diff --git a/12/ex3 b/12/ex3 new file mode 100644 index 0000000..8429b32 Binary files /dev/null and b/12/ex3 differ diff --git a/12/ex3.c b/12/ex3.c new file mode 100644 index 0000000..692b845 --- /dev/null +++ b/12/ex3.c @@ -0,0 +1,47 @@ +#include +#include +#include "PointersLibs.h" + +void InsertNumberToRowInMat(int *ptr_mat, unsigned short mat_col, unsigned short custom_row, int number) +{ + ptr_mat = ptr_mat + (custom_row * (mat_col)); + while (mat_col) + { + *(ptr_mat + mat_col--) = number % TEN; + number /= TEN; + } +} + +//--------------------------------------------------------------------------------------- +// exe 3 +// ----- +// +// General : The program takes the last digits according to input +// from each number inputted. +// +// Input : how many numbers to take and input, and how many digits +// at least for the input. +// +// Process : the program gets input from user, then takes the +// last numbers according to input, and makes a char +// matrix out of it. +// +// Output : numbers in a matrix looking form. +// +//--------------------------------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 21.11.19 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short HowManyNums = 4, + HowManyDigits = 3; + int *mat = malloc(sizeof(int) * HowManyNums * HowManyDigits); + + InsertNumberToRowInMat(mat, HowManyDigits, 0, 167367); + InsertNumberToRowInMat(mat, HowManyDigits, 1, 6376); + InsertNumberToRowInMat(mat, HowManyDigits, 2, 2462172); + InsertNumberToRowInMat(mat, HowManyDigits, 3, 64036); + free(mat); +} \ No newline at end of file diff --git a/12/ex4 b/12/ex4 new file mode 100644 index 0000000..d15303a Binary files /dev/null and b/12/ex4 differ diff --git a/12/ex4.c b/12/ex4.c new file mode 100644 index 0000000..b96b18c --- /dev/null +++ b/12/ex4.c @@ -0,0 +1,48 @@ +#include +#include +#include "PointersLibs.h" + +void EvenAndOddToTwoVec(int vec[], unsigned short vec_size, int *evensize, int *oddsize, int **even, int **odd) +{ + *even = malloc(sizeof(int)); + *odd = malloc(sizeof(int)); + *evensize = ZERO; + *oddsize = ZERO; + unsigned short counter; + for (counter = ZERO; counter < vec_size; counter++) + { + if (!(vec[counter] % TWO)) + { + *even = realloc(*even, ++(*evensize)); + *((*even) + (*evensize) - ONE) = vec[counter]; + } + else + { + *odd = realloc(*odd, ++(*oddsize)); + *((*odd) + (*oddsize) - ONE) = vec[counter]; + } + } +} + +//--------------------------------------------------------------------------------------- +// exe 4 +// ----- +// General : the program gets an array of numbers, and breaks it +// down to even numbers and odd numbers. +// +// Input : an array of numbers. +// +// Process : goes over the arrau and adds the even num to the even +// pointer and the odd to odd pointer. +// +// Output : The even array and odd array. +// +//--------------------------------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 21.11.19 +//--------------------------------------------------------------------------------------- +void main(void) +{ + +} \ No newline at end of file diff --git a/12/ex5 b/12/ex5 new file mode 100644 index 0000000..3914835 Binary files /dev/null and b/12/ex5 differ diff --git a/12/ex5.c b/12/ex5.c new file mode 100644 index 0000000..3d72b18 --- /dev/null +++ b/12/ex5.c @@ -0,0 +1,48 @@ +#include +#include +#include "PointersLibs.h" + + +BOOLEAN SentenceALowerThenSentenceB(char *ptr_sentence_a, char *ptr_sentence_b) +{ + while (*(ptr_sentence_a++) == *(ptr_sentence_b++) && *ptr_sentence_a && *ptr_sentence_b); + + return ((*(--ptr_sentence_a) <= *(--ptr_sentence_b))); +} + +void SwapPointers(char **first_pointer, char **second_pointer) +{ + char *temp_pointer = *first_pointer; + *first_pointer = *second_pointer; + *second_pointer = temp_pointer; +} + +void SortStringAsDictionary(char **ptr_vec, unsigned short lenght) +{ + char **low_sentence = ptr_vec; + unsigned short counter_loop1, counter_loop2; + for (counter_loop1 = ZERO; counter_loop1 < lenght; counter_loop1++) + { + for (counter_loop2 = counter_loop1; counter_loop2 < lenght; counter_loop2++) + { + (SentenceALowerThenSentenceB(*ptr_vec ,*low_sentence) ? ZERO : SwapPointers(ptr_vec, low_sentence)); + *low_sentence = LastCharOfString(*low_sentence); + } + *ptr_vec = LastCharOfString(*ptr_vec) + ONE; + *low_sentence = *ptr_vec; + } +} +// -------------------------------------------------------------------------------------- +// Exe 5 +// ----- +// +// +//--------------------------------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 21.11.19 +//--------------------------------------------------------------------------------------- +void main(void) +{ + +} \ No newline at end of file diff --git a/12/ex6.c b/12/ex6.c new file mode 100644 index 0000000..a0e08f4 --- /dev/null +++ b/12/ex6.c @@ -0,0 +1,116 @@ +#include "PointersLibs.h" +#include +#include + +void Swap(int *num1, int *num2) +{ + //swaps between two numbers + int temp = *num1; + *num1 = *num2; + *num2 = temp; +} + +void SortMat(int *mat,int max_size) +{ + //sorts them by ascending order + for (int count = ZERO; count < max_size; count++) + { + for (int counter = count + ONE; counter < max_size; counter++) + { + (*(mat + count) > *(mat + counter)) ? + Swap((mat + count) ,(mat + counter)): ZERO; + } + } +} + + +void Switcharoo(int *begin,int *stop) +{ + //switches between numbers in a certain + while (stop > begin) + { + int temp = *begin; + *begin = *stop; + *stop = temp; + stop--; + begin++; + } +} + +void Special_Print_for_sixth(int *mat,int size) +{ + //special print for ex 6 + int amnt = size*size; + for (int count = ZERO; count < size; count++) + { + for (int counter = count; counter < size*size; counter += size) + { + printf("%d ", *(mat + counter)); + } + printf("\n"); + } +} + +void PutIn(int *mat,int num,int N) +{ + *mat = num; + int maxsize = N * N; + SortMat(mat,maxsize); + for (int count = ZERO; count < maxsize; count++) + { + //switches the even rows values places + //so that when you print it shows ok + ((count / N) % TWO == ONE) ? Switcharoo((mat + count), (mat + count + N - ONE)) : ZERO; + ((count / N) % TWO == ONE) ? count += N - ONE : ZERO; + } +} + + +//--------------------------------------------------------------------------------------- +// exe 6 +// ----- +// +// General : the program sorts the numbers in an ascending order +// and then adds a number that is desiered to the matrix, sorts it +// again. +// +// Input : size o the matrix, and N^2 of numbers. +// +// Process : sorts in ascending order and then sorts them according to the wanted way. +// +// Output : prints the new matrix. +// +//--------------------------------------------------------------------------------------- +// Proggramer : Cohen Idan +// Student No : 211675038 +// Date : 22.11.19 +//--------------------------------------------------------------------------------------- +void main(void) +{ + int N = ZERO; + int *mat = (int*)malloc(sizeof(int)); + printf("enter Size: "); + scanf("%d", &N); + int maxsize = N * N; + int num = ZERO; + for (int sofer = ZERO; sofer < maxsize; sofer++) + { + mat = realloc(mat, sizeof(int)*(sofer+ONE)); + printf("enter no.%d: ",sofer+ONE); + scanf("%d", &(*(mat+sofer))); + } + SortMat(mat,maxsize); + for (int count = ZERO; count < maxsize; count++) + { + //switches the even rows values places + //so that when you print it shows ok + ((count / N) % TWO == ONE) ? Switcharoo((mat + count), (mat + count + N - ONE)) : ZERO; + ((count / N) % TWO == ONE) ? count += N - ONE : ZERO; + } + Special_Print_for_sixth(mat, N); + printf("enter number to enter: "); + scanf("%d", &num); + PutIn(mat, num, N); + Special_Print_for_sixth(mat, N); + free(mat); +} \ No newline at end of file diff --git a/13 - Bits/PointersLibs.h b/13 - Bits/PointersLibs.h new file mode 100644 index 0000000..1a3f878 --- /dev/null +++ b/13 - Bits/PointersLibs.h @@ -0,0 +1,1703 @@ +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} \ No newline at end of file diff --git a/13 - Bits/ex1 b/13 - Bits/ex1 new file mode 100644 index 0000000..5a91fd9 Binary files /dev/null and b/13 - Bits/ex1 differ diff --git a/13 - Bits/ex1.c b/13 - Bits/ex1.c new file mode 100644 index 0000000..f18b384 --- /dev/null +++ b/13 - Bits/ex1.c @@ -0,0 +1,12 @@ +#include "PointersLibs.h" + +BOOLEAN EvenNumber(int num) +{ + return (num & !MASK_FIRST_BIT); +} + +void main(void) +{ + int num = 2; + printf("%d\n" ,EvenNumber(3)); +} \ No newline at end of file diff --git a/13 - Bits/ex2 b/13 - Bits/ex2 new file mode 100644 index 0000000..14148b7 Binary files /dev/null and b/13 - Bits/ex2 differ diff --git a/13 - Bits/ex2.c b/13 - Bits/ex2.c new file mode 100644 index 0000000..655b8bf --- /dev/null +++ b/13 - Bits/ex2.c @@ -0,0 +1,21 @@ +#include "PointersLibs.h" + +int RotateLeft(unsigned int num, int count) +{ + unsigned short counter; + unsigned int temp; + for (counter = ZERO; counter < count; counter++) + { + temp = (num >> ((sizeof(num) * EIGHT) - ONE)); + num <<= ONE; + num |= temp; + } + + return num; +} + +void main(void) +{ + unsigned int x = 1000000000; + printf("%u\n", RotateLeft(x,30)); +} \ No newline at end of file diff --git a/13 - Bits/ex3 b/13 - Bits/ex3 new file mode 100644 index 0000000..b89053e Binary files /dev/null and b/13 - Bits/ex3 differ diff --git a/13 - Bits/ex3.c b/13 - Bits/ex3.c new file mode 100644 index 0000000..d8e1bed --- /dev/null +++ b/13 - Bits/ex3.c @@ -0,0 +1,20 @@ +#include "PointersLibs.h" + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +void main(void) +{ + byte b = 3; + printf("%hu\n", EvenBits(b)); +} \ No newline at end of file diff --git a/13 - Bits/ex4 b/13 - Bits/ex4 new file mode 100644 index 0000000..19253af Binary files /dev/null and b/13 - Bits/ex4 differ diff --git a/13 - Bits/ex4.c b/13 - Bits/ex4.c new file mode 100644 index 0000000..718158b --- /dev/null +++ b/13 - Bits/ex4.c @@ -0,0 +1,159 @@ +#include "PointersLibs.h" + +#define ROWS 4 + +void RemoveBits(byte *row, unsigned short count) +{ + *row >>= count; +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void PrintGetRow() +{ + printf("Enter row number (1-4): "); +} + +void PrintGetRemoveCount() +{ + printf("Enter many bits: "); +} + +void PrintPlayerWon() +{ + printf("You won!\n"); +} + +void PrintBotWon() +{ + printf("The bot won :(\n"); +} + +unsigned short InputRow() +{ + unsigned short row; + scanf("%hu", &row); + + return (row); +} + +unsigned short InputRemoveCount() +{ + unsigned short remove_count; + scanf("%hu", &remove_count); + + return (remove_count); +} + +BOOLEAN EvenBits(byte b) +{ + return (!(CountBits(b) % TWO)); +} + +unsigned short SumBits(byte *vec, unsigned short length) +{ + unsigned short sum = ZERO; + while (length--) + { + sum += CountBits(*(vec++)); + } + + return (sum); +} + +void PrintBits(byte b) +{ + unsigned short length = sizeof(b) * EIGHT; + while (length--) + { + printf("%hu,", !EvenNumber(b)); + b >>= ONE; + } +} + +void PrintRows(byte *rows, unsigned short length) +{ + while (length--) + { + PrintBits(*(rows++)); + printf("\n"); + } +} + +byte * MaxBitsRow(byte *rows, unsigned short length) +{ + unsigned short max_count = ZERO, + temp_count; + byte *max_row; + while (length--) + { + temp_count = CountBits(*rows); + if (temp_count > max_count) + { + max_count = temp_count; + max_row = rows; + } + rows++; + } + + return (max_row); +} + +void Bot(byte *rows, unsigned short length) +{ + byte *max_row = MaxBitsRow(rows, length); + + RemoveBits(max_row, MAX(CountBits(*max_row) / TWO * TWO, ONE)); +} + +void main(void) +{ + byte rows[ROWS] = {0x7f, 0x1f, 0x7, 0x1}; + unsigned short row = -ONE, remove_count = ZERO; + BOOLEAN player = FALSE; + while (SumBits(rows, ROWS)) + { + PrintRows(rows, ROWS); + printf("\n\n"); + row = -ONE; + remove_count = ZERO; + player = !player; + if (player) + { + while (!(row < ROWS)) + { + PrintGetRow(); + row = InputRow(); + } + while (!(ZERO < remove_count && remove_count <= CountBits(rows[row]))) + { + PrintGetRemoveCount(); + remove_count = InputRemoveCount(); + } + RemoveBits(&rows[row], remove_count); + } + else + { + Bot(rows, ROWS); + } + } + if (player) + { + PrintPlayerWon(); + } + else + { + PrintBotWon(); + } +} \ No newline at end of file diff --git a/13 - Bits/ex5 b/13 - Bits/ex5 new file mode 100644 index 0000000..288cde6 Binary files /dev/null and b/13 - Bits/ex5 differ diff --git a/13 - Bits/ex5.c b/13 - Bits/ex5.c new file mode 100644 index 0000000..a87460b --- /dev/null +++ b/13 - Bits/ex5.c @@ -0,0 +1,183 @@ +#include "PointersLibs.h" + +#define ROWS 3 + +void RemoveBits(byte *row, unsigned short count) +{ + *row >>= count; +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_lenght = sizeof(b) * EIGHT; + while (loop_lenght--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void PrintGetRow() +{ + printf("Enter row number (1-3): "); +} + +void PrintGetRemoveCount() +{ + printf("Enter many bits: "); +} + +void PrintPlayerWon() +{ + printf("You won!\n"); +} + +void PrintBotWon() +{ + printf("The bot won :(\n"); +} + +unsigned short InputRow() +{ + unsigned short row; + scanf("%hu", &row); + + return (row); +} + +unsigned short InputRemoveCount() +{ + return (InputRow()); +} + +unsigned short SumBits(byte *vec, unsigned short lenght) +{ + unsigned short sum = ZERO; + while (lenght--) + { + sum += CountBits(*(vec++)); + } + + return (sum); +} + +void PrintBits(byte b) +{ + unsigned short lenght = sizeof(b) * EIGHT; + while (lenght--) + { + printf("%hu,", !EvenNumber(b)); + b >>= ONE; + } +} + +void PrintRows(byte *rows, unsigned short lenght) +{ + while (lenght--) + { + PrintBits(*(rows++)); + printf("\n"); + } + +} + +byte * MaxBitsRow(byte *rows, unsigned short lenght) +{ + unsigned short max_count = ZERO, + temp_count; + byte *max_row; + while (lenght--) + { + temp_count = CountBits(*rows); + if (temp_count > max_count) + { + max_count = temp_count; + max_row = rows; + } + rows++; + } + + return (max_row); +} + +byte * OddMaxBitsRow(byte *rows, unsigned short length) +{ + unsigned short max_count = ZERO, + temp_count; + byte *odd_max_row = MaxBitsRow(rows, length); + while (length--) + { + if (!EvenBits(*rows)) + { + temp_count = CountBits(*rows); + if (temp_count > max_count) + { + max_count = temp_count; + odd_max_row = rows; + } + } + rows++; + } + + return (odd_max_row); +} + +void Bot(byte *rows, unsigned short lenght) +{ + byte *max_row = OddMaxBitsRow(rows, lenght); + + unsigned short sum_bits = SumBits(rows, lenght); + BOOLEAN EvenArea = EvenNumber(sum_bits); + unsigned short count_bits = CountBits(*max_row); + unsigned short remove_count = EvenNumber(sum_bits - (count_bits / TWO)) ? (count_bits / TWO) : (count_bits / TWO) + ONE; + + RemoveBits(max_row, remove_count); // EvenArea ? (CountBits(*max_row) / TWO * TWO - ONE) / TWO: (CountBits(*max_row) / TWO * TWO - ONE)); +} + +void main(void) +{ + byte rows[ROWS] = {0x7f, 0x1f, 0x7}; + + unsigned short row = -ONE, remove_count = ZERO; + BOOLEAN player = FALSE; + while (SumBits(rows, ROWS) != ONE) + { + PrintRows(rows, ROWS); + printf("\n\n"); + row = -ONE; + remove_count = ZERO; + player = !player; + if (player) + { + while (!(row < ROWS)) + { + PrintGetRow(); + row = InputRow(); + } + while (!(ZERO < remove_count && remove_count <= CountBits(rows[row]))) + { + PrintGetRemoveCount(); + remove_count = InputRemoveCount(); + } + RemoveBits(&rows[row], remove_count); + } + else + { + printf("Bot:\n"); + Bot(rows, ROWS); + } + } + PrintRows(rows, ROWS); + printf("\n\n"); + if (player) + { + PrintPlayerWon(); + } + else + { + PrintBotWon(); + } +} diff --git a/14 - Struct/PointersLibs.h b/14 - Struct/PointersLibs.h new file mode 100644 index 0000000..ed92c5e --- /dev/null +++ b/14 - Struct/PointersLibs.h @@ -0,0 +1,1773 @@ +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} \ No newline at end of file diff --git a/14 - Struct/ex1.c b/14 - Struct/ex1.c new file mode 100644 index 0000000..9076330 --- /dev/null +++ b/14 - Struct/ex1.c @@ -0,0 +1,120 @@ +#include "PointersLibs.h" + +#define MAXSIZE 256 +#define MAT_SIZE 6 + +struct study_hours +{ + string teacher; + unsigned short subject; + int total_students; +}; + +unsigned int TeachesCountMaxHoursStraightInDay(struct study_hours *ptr_mat_day, unsigned short rows, unsigned short cols) +{ + unsigned short max = ZERO; + unsigned short counter = ONE; + struct study_hours *ptr_temp = ptr_mat_day + cols; + rows--; + while (rows--) + { + if (!StringCompare(&((*ptr_mat_day).teacher), &((*ptr_temp).teacher))) + { + max = (counter > max) ? counter : max; + counter = ZERO; + } + counter++; + ptr_mat_day += cols; + ptr_temp += cols; + } + + return (max); +} + +struct study_hours * TeachesMaxHoursStraightInDay(struct study_hours *ptr_mat_day, unsigned short rows, unsigned short cols) +{ + unsigned short counter = ONE, + max = ZERO; + struct study_hours *ptr_temp = ptr_mat_day + cols; + struct study_hours *ptr_max_teacher = ptr_mat_day; + rows--; + while (rows--) + { + if (!StringCompare(&((*ptr_mat_day).teacher), &((*ptr_temp).teacher))) + { + max = (counter > max) ? counter : max; + counter = ZERO; + } + counter++; + ptr_mat_day += cols; + ptr_temp += cols; + } + + return (ptr_max_teacher); +} + +// Ex1 +struct study_hours * WhoTeachesMoreThanFourHoursStraight(struct study_hours *ptr_mat, unsigned short rows, unsigned short cols) +{ + unsigned short day = cols; + while (TeachesCountMaxHoursStraightInDay(ptr_mat++, rows, cols) < FIVE && day--); + + return (TeachesMaxHoursStraightInDay(--ptr_mat, rows, cols)); +} + +unsigned short TeacherCountOfHoursInDay(struct study_hours *ptr_mat, unsigned short rows, unsigned short cols, string teacher) +{ + unsigned short counter = ZERO; + rows--; + while (rows--) + { + counter += StringCompare(&((*ptr_mat).teacher), teacher); + ptr_mat += cols; + } + + return (counter); +} + +// Ex2 +unsigned short TeacherCountOfHoursInWeek(struct study_hours *ptr_mat, unsigned short rows, unsigned short cols, string teacher) +{ + unsigned short counter = ZERO; + unsigned short day = cols; + while (day--) + { + counter += TeacherCountOfHoursInDay(ptr_mat++, rows, cols, teacher); + } + + return counter; +} + +int CountStudentsInSubjectOnDay(struct study_hours *ptr_mat, unsigned short rows, unsigned short cols, unsigned short subject) +{ + int counter = ZERO; + rows--; + while (rows--) + { + counter += ((*ptr_mat).subject == subject) ? (*ptr_mat).total_students : ZERO; + ptr_mat += cols; + } + + return (counter); +} + +// Ex3 +int CountStudentsInSubjectOnWeek(struct study_hours *ptr_mat, unsigned short rows, unsigned short cols, unsigned short subject) +{ + int total_students = ZERO; + unsigned short days = cols; + while (days--) + { + total_students += CountStudentsInSubjectOnDay(ptr_mat, rows, cols, subject); + } + + return (total_students); +} + +void main(void) +{ + string vec_subjects[MAXSIZE]; +} \ No newline at end of file diff --git a/14 - Struct/ex2.c b/14 - Struct/ex2.c new file mode 100644 index 0000000..f7dc574 --- /dev/null +++ b/14 - Struct/ex2.c @@ -0,0 +1,67 @@ +#include "PointersLibs.h" +#include + +#define TWO_THOUSAND 2000 +#define NINETEEN 1900 + +struct book +{ + string name; + string wrtier; + string company; + int year; + int price; + int id; +}; + +void AddBook(struct book *ptr_vec, unsigned short vec_length) +{ + struct book b; + // I/O book + // Check I/O book - if I/O is ok = do realloc : out from fun + ptr_vec = realloc(ptr_vec, ++(vec_length) * sizeof(struct book)); + *(ptr_vec + (vec_length) - ONE) = b; +} + +struct book * SearchByName(struct book *ptr_vec, unsigned short vec_length, string *name) +{ + while (!StringCompare((*(ptr_vec++)).name, *name) && vec_length--); + + return (--ptr_vec); +} + +struct book * SearchByWriter(struct book *ptr_vec, unsigned short vec_length, string *writer) +{ + while (!StringCompare((*(ptr_vec++)).wrtier, *writer) && vec_length--); + + return (--ptr_vec); +} + +struct book * SearchByNameAndWriter(struct book *ptr_vec, unsigned short *vec_length, string *name, string *writer) +{ + +} + +struct book * TwentyCentury(struct book *ptr_vec, unsigned short vec_length, struct book *ptr_new_vec) +{ + ptr_new_vec = malloc(sizeof(struct book)); + unsigned int length = ONE; + unsigned short counter; + for (counter = ZERO; counter < vec_length; counter++) + { + if ((*ptr_vec).year >= 1900 && (*ptr_vec).year >= 2000) + { + *(ptr_new_vec + (length++)) = *ptr_vec; + ptr_new_vec = realloc(ptr_new_vec, sizeof(struct book) * length); + } + ptr_vec++; + } + ptr_new_vec = realloc(ptr_new_vec, sizeof(struct book) * (--length)); + + return (ptr_new_vec); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/15 - Advance Matrixs/PointersLibs.h b/15 - Advance Matrixs/PointersLibs.h new file mode 100644 index 0000000..ed92c5e --- /dev/null +++ b/15 - Advance Matrixs/PointersLibs.h @@ -0,0 +1,1773 @@ +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} \ No newline at end of file diff --git a/15 - Advance Matrixs/ex1.c b/15 - Advance Matrixs/ex1.c new file mode 100644 index 0000000..69ea18b --- /dev/null +++ b/15 - Advance Matrixs/ex1.c @@ -0,0 +1,35 @@ +#include "PointersLibs.h" + + +int SlantSum(int *ptr_mat, unsigned short rows, unsigned short cols) +{ + int sum = ZERO; + cols++; + for ( ;rows; rows--) + { + sum += *ptr_mat; + ptr_mat += cols; + } + + return (sum); +} + +int SlantWithMaxSum(int *ptr_mat, unsigned short rows, unsigned short cols) +{ + int max = MainSlantSum(ptr_mat, rows, cols); + int temp; + unsigned short slats; + ptr_mat++; + for (slats = ONE; slats < cols; slats++) + { + temp = SlantSum(ptr_mat++, rows, cols); + max = (temp > max) ? temp : max; + } + + return (max); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/15 - Advance Matrixs/ex2 b/15 - Advance Matrixs/ex2 new file mode 100644 index 0000000..3a42ca2 Binary files /dev/null and b/15 - Advance Matrixs/ex2 differ diff --git a/15 - Advance Matrixs/ex2.c b/15 - Advance Matrixs/ex2.c new file mode 100644 index 0000000..c731d7f --- /dev/null +++ b/15 - Advance Matrixs/ex2.c @@ -0,0 +1,56 @@ +#include "PointersLibs.h" + +int SumInSlantUntilNegative(int *ptr_mat, unsigned short rows, unsigned short cols) +{ + int max = *ptr_mat; + int steps = cols + ONE; + + while (rows-- && (*ptr_mat < ZERO)) + { + max += *ptr_mat; + ptr_mat += steps; + } + + return (max - *ptr_mat); +} + +int MaxSumSlant(int *ptr_mat, unsigned short rows, unsigned short cols) +{ + int *ptr_max_mat = ptr_mat; // Save the pointer of start max + int max = *ptr_max_mat; + + unsigned short steps = cols + ONE; + + int *ptr_temp_mat = ptr_mat + steps; // For checking + int temp_max = max, + temp; + + rows--; + for (; rows; rows--) + { + temp = temp_max + *ptr_temp_mat; + if (temp < temp_max || temp_max > temp) + { + if (temp_max > max) + { + max = temp_max; + ptr_max_mat = ptr_temp_mat; + } + temp_max = ZERO; + } + temp_max += *ptr_temp_mat; + ptr_temp_mat += steps; + } +} + +void main(void) +{ + int mat[4][5] = { + {1,2,3,4,5}, + {2,3,4,5,6}, + {3,4,-1,6,7}, + {4,5,6,7,8} + }; + + printf("%d\n", MaxSumInSlant(mat, 4, 5)); +} \ No newline at end of file diff --git a/16 - Stack/Lib.h b/16 - Stack/Lib.h new file mode 100644 index 0000000..5ccc2ee --- /dev/null +++ b/16 - Stack/Lib.h @@ -0,0 +1,1925 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + string string_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitializeStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item = {NULL, NULL, NULL, NULL}; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitializeStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitializeStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitializeStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitializeStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitializeStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitializeStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} \ No newline at end of file diff --git a/16 - Stack/ex1 b/16 - Stack/ex1 new file mode 100644 index 0000000..aae7c0d Binary files /dev/null and b/16 - Stack/ex1 differ diff --git a/16 - Stack/ex1.c b/16 - Stack/ex1.c new file mode 100644 index 0000000..705d81c --- /dev/null +++ b/16 - Stack/ex1.c @@ -0,0 +1,72 @@ +#include "Lib.h" + +//--------------------------------------------------------------------------------------- +// Exc1a +// ----- +// +// General : The function checks when the order in the stack is turn over. +// +// Parameters : s - A stack with numbers inside.(in) +// +// Return Value : The value in the stack when the order is turned over. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 05.12.2019 +//--------------------------------------------------------------------------------------- +int SectionOne(stack * sk) +{ + stack temp_sk; + InitializeStack(&temp_sk); + CopyStack(&temp_sk, sk); + int last_number = PopStack(&temp_sk).int_; + int this_number = PopStack(&temp_sk).int_; + while (this_number >= last_number) + { + last_number = this_number; + this_number = PopStack(&temp_sk).int_; + } + + return (this_number); +} + +//--------------------------------------------------------------------------------------- +// Exc1b +// ----- +// +// General : The function checks when the order in the stack is turn over. +// +// Parameters : s - A stack with numbers inside.(in) +// +// Return Value : The position in the stack when the order is turned over. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 05.12.2019 +//--------------------------------------------------------------------------------------- +int SectionOne(stack * sk) +{ + stack temp_sk; + InitializeStack(&temp_sk); + CopyStack(&temp_sk, sk); + unsigned int counter = ZERO; + int number = SectionOne(&temp_sk); + while (PopStack(&temp_sk).int_ != number) + { + counter++; + } + + return (counter); +} + +void main(void) +{ + stack s; + InitializeStack(&s); + Data_Type num1 = {.int_ = 4}, num2 = {.int_ = 5}, num3 = {.int_ = 6}; + PushStack(&s, num1); + PushStack(&s, num2); + PushStack(&s, num3); +} \ No newline at end of file diff --git a/16 - Stack/ex2.c b/16 - Stack/ex2.c new file mode 100644 index 0000000..e69de29 diff --git a/16 - Stack/ex3.c b/16 - Stack/ex3.c new file mode 100644 index 0000000..c3e50ef --- /dev/null +++ b/16 - Stack/ex3.c @@ -0,0 +1,62 @@ +#include "Lib.h" + +void DeleteItem(stack * sk, Data_Type item) +{ + Data_Type temp_item; + stack temp_sk; + InitializeStack(&temp_sk); + while (!IsEmptyStack(sk)) + { + temp_item = PopStack(sk); + if (temp_item.int_ != item.int_) + { + PushStack(&temp_sk, temp_item); + } + } + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +void DeleteDuplicates(stack * sk) +{ + Data_Type item; + stack temp_sk; + InitializeStack(&temp_sk); + while (!IsEmptyStack(sk)) + { + item = PopStack(sk); + DeleteItem(sk, item); + PushStack(&temp_sk, item); + } + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +//--------------------------------------------------------------------------------------- +// Exc3 +// ---- +// +// General : The function delete the duplicate numbers from the stack. +// +// Parameters : s - A stack with numbers inside.(in) +// +// Return Value : The stack without the duplicated numbers. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 05.12.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + stack s; + InitializeStack(&s); + Data_Type num1 = {.int_ = 4}, num2 = {.int_ = 5}, num3 = {.int_ = 6}; + PushStack(&s, num1); + PushStack(&s, num2); + PushStack(&s, num3); +} \ No newline at end of file diff --git a/16 - Stack/ex4.c b/16 - Stack/ex4.c new file mode 100644 index 0000000..cecae4b --- /dev/null +++ b/16 - Stack/ex4.c @@ -0,0 +1,56 @@ +#include "Lib.h" + +#define MAX 21 + +typedef struct +{ + string name; + unsigned int amount; +} VegBox; + +//--------------------------------------------------------------------------------------- +// AddBox +// ------- +// +// General : The function added new box to the tower of boxes in some Circumstances. +// +// Parameters : Tower - A stack with boxes inside.(in) +// box - A item from the type VegBox that needed to be add to the tower. +// +// Return Value : None. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 05.12.2019 +//--------------------------------------------------------------------------------------- +void AddBox(stack * sk, VegBox vb) +{ + Data_Type item = PopStack(sk); + Data_Type new_item; + stack temp_sk; + InitializeStack(&temp_sk); + while (!IsEmptyStack(sk) && !StringCompare((*(VegBox *)(item.pointer)).name, vb.name)) + { + item = PopStack(sk); + PushStack(&temp_sk, item); + } + if (!StringCompare((*(VegBox *)(item.pointer)).name, vb.name)) + { + while ((*(VegBox *)(item.pointer)).amount++ < MAX && vb.amount-- > ZERO); + } + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } + if (vb.amount > ZERO) + { + *(VegBox * )new_item.pointer = vb; + PushStack(sk, new_item); + } +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/17 - Queue/Lib.h b/17 - Queue/Lib.h new file mode 100644 index 0000000..7f901dd --- /dev/null +++ b/17 - Queue/Lib.h @@ -0,0 +1,1961 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} diff --git a/17 - Queue/ex1.c b/17 - Queue/ex1.c new file mode 100644 index 0000000..142a74d --- /dev/null +++ b/17 - Queue/ex1.c @@ -0,0 +1,32 @@ +#include "Lib.h" + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} \ No newline at end of file diff --git a/18 - Lists/Lib.h b/18 - Lists/Lib.h new file mode 100644 index 0000000..c0f1b41 --- /dev/null +++ b/18 - Lists/Lib.h @@ -0,0 +1,2089 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +typedef struct LLL LLL; + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} \ No newline at end of file diff --git a/18 - Lists/ex1 b/18 - Lists/ex1 new file mode 100644 index 0000000..90ae746 Binary files /dev/null and b/18 - Lists/ex1 differ diff --git a/18 - Lists/ex1.c b/18 - Lists/ex1.c new file mode 100644 index 0000000..cfcf66d --- /dev/null +++ b/18 - Lists/ex1.c @@ -0,0 +1,51 @@ +#include "Lib.h" + +#define ASTERISK '*' + +//----------------------------------------------------------- +// MostInRow +// --------- +// +// General : The function check who the longest word in +// list +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : The function returns the pointer of the +// beginning of the big word. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +LLL * MostInRow(LLL ** manager) +{ + LLL * pos = *manager; + LLL * max_word = pos; + LLL * temp_word = pos; + unsigned int max_count = ZERO; + unsigned int temp_count = ZERO; + while ((*pos).next != NULL) + { + if ((*pos).value.char_ == ASTERISK) + { + if (temp_count > max_count) + { + max_word = temp_word; + max_count = temp_count; + } + temp_count = ZERO; + temp_word = (*pos).next; + } + temp_count++; + pos = (*pos).next; + } + + return (max_word); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/18 - Lists/ex2 b/18 - Lists/ex2 new file mode 100644 index 0000000..73acc61 Binary files /dev/null and b/18 - Lists/ex2 differ diff --git a/18 - Lists/ex2.c b/18 - Lists/ex2.c new file mode 100644 index 0000000..4863264 --- /dev/null +++ b/18 - Lists/ex2.c @@ -0,0 +1,34 @@ +#include "Lib.h" + +//----------------------------------------------------------- +// RemoveDuplicate +// --------------- +// +// General : The function deletes the number of +// repetitive characters and returns a list +// that comes one instance of each character +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +LLL * RemoveDuplicate(LLL ** manager) +{ + unsigned short arr[TEN] = { ZERO }; + LLL * pos = *manager; + while ((*pos).next != NULL) + { + (arr[(*(*pos).next).value.int_] == ONE) ? DeleteList(pos) : arr[(*(*pos).next).value.int_]++; + pos = (*pos).next; + } +} + +void main(void) +{ + +} diff --git a/18 - Lists/ex3 b/18 - Lists/ex3 new file mode 100644 index 0000000..bec3cc5 Binary files /dev/null and b/18 - Lists/ex3 differ diff --git a/18 - Lists/ex3.c b/18 - Lists/ex3.c new file mode 100644 index 0000000..4331d04 --- /dev/null +++ b/18 - Lists/ex3.c @@ -0,0 +1,65 @@ +#include "Lib.h" + +//----------------------------------------------------------------- +// SumOfNextLLL +// ------------ +// +// General : The function summarizes it from the current +// position to the end of the list and puts it in +// the position of the array so that the first organ +// in the array contains the largest amount +// +// Parameters : **manager - pointer linear Linked List(IN) +// *ptr_vec - vector of int(IN) +// +// Return Value : None +// +//------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------------- +void SumOfNextLLL(LLL ** manager, int * ptr_vec) +{ + LLL * temp = *manager; + unsigned short length_list = ZERO; + unsigned short length_vec = ZERO; + while (temp != NULL) + { + while (length_vec--) + { + *(ptr_vec + length_vec) += (*temp).value.int_;; + } + length_vec = ++length_list; + temp = (*temp).next; + } + +} + +void main(void) +{ + LLL * manager = NULL; + PushList(&manager); + PushList(&manager); + PushList(&manager); + PushList(&manager); + PopList(&manager); + printf("h\n"); + LLL * pos = manager; + printf("h\n"); + (*pos).value.int_ = 10; + printf("h\n"); + (*(*pos).next).value.int_ = 20; + printf("h\n"); + (*(*(*pos).next).next).value.int_ = 30; + printf("h\n"); + //(*(*(*(*pos).next).next).next).value.int_ = 40; + + pos = manager; + while (pos != NULL) + { + printf("%d\n" ,(*pos).value.int_); + pos = (*pos).next; + } + +} \ No newline at end of file diff --git a/18 - Lists/ex4.c b/18 - Lists/ex4.c new file mode 100644 index 0000000..24ceb5d --- /dev/null +++ b/18 - Lists/ex4.c @@ -0,0 +1,41 @@ +#include "Lib.h" + +//----------------------------------------------------------------- +// LongestString +// ------------- +// +// General : The function check who the longest string in list +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : The index of longest string +// +//------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------------- +LLL * LongestString(LLL ** manager) +{ + LLL * runner = *manager; + LLL * result = runner; + unsigned int max = ZERO; + unsigned int str_len = ZERO; + while (runner != NULL) + { + str_len = StringLenght((*runner).value.pointer); + if (str_len > max) + { + max = str_len; + result = runner; + } + runner = (*runner).next; + } + + return (result); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/19 - List Types/Lib.h b/19 - List Types/Lib.h new file mode 100644 index 0000000..2f2e862 --- /dev/null +++ b/19 - List Types/Lib.h @@ -0,0 +1,2237 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} \ No newline at end of file diff --git a/2/PDF/debug.log b/2/PDF/debug.log new file mode 100644 index 0000000..3f9f598 --- /dev/null +++ b/2/PDF/debug.log @@ -0,0 +1,6 @@ +[0912/185130.873:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0912/185130.876:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0912/185130.906:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0912/185130.930:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0912/185131.063:ERROR:crash_report_database_win.cc(469)] failed to stat report +[0912/185131.106:ERROR:crash_report_database_win.cc(469)] failed to stat report diff --git a/2/PDF/ex1.c.pdf b/2/PDF/ex1.c.pdf new file mode 100644 index 0000000..19a0c31 Binary files /dev/null and b/2/PDF/ex1.c.pdf differ diff --git a/2/PDF/ex2.c.pdf b/2/PDF/ex2.c.pdf new file mode 100644 index 0000000..dd4171f Binary files /dev/null and b/2/PDF/ex2.c.pdf differ diff --git a/2/PDF/ex3.c.pdf b/2/PDF/ex3.c.pdf new file mode 100644 index 0000000..807c7bb Binary files /dev/null and b/2/PDF/ex3.c.pdf differ diff --git a/2/PDF/ex4.c.pdf b/2/PDF/ex4.c.pdf new file mode 100644 index 0000000..e2eadca Binary files /dev/null and b/2/PDF/ex4.c.pdf differ diff --git a/2/PDF/ex5.c.pdf b/2/PDF/ex5.c.pdf new file mode 100644 index 0000000..42fbd01 Binary files /dev/null and b/2/PDF/ex5.c.pdf differ diff --git a/2/PDF/libs.h.pdf b/2/PDF/libs.h.pdf new file mode 100644 index 0000000..6fb4c4b Binary files /dev/null and b/2/PDF/libs.h.pdf differ diff --git a/2/ex1 b/2/ex1 new file mode 100644 index 0000000..1ba4200 Binary files /dev/null and b/2/ex1 differ diff --git a/2/ex1.c b/2/ex1.c new file mode 100644 index 0000000..ef22948 --- /dev/null +++ b/2/ex1.c @@ -0,0 +1,72 @@ +#include +#include "libs.h" +//--------------------------------------------------------------------------------------- +// Exercise 1 +// ---------- +// +// General : The program sort 3 numbers by char. +// +// Input : 3 numbers and char 'U' or 'D'. +// +// Process : Bubble sort. +// +// Output : 3 numbers sorted by char. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 12.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + char code; + short num1, + num2, + num3, + first_num, + second_num, + third_num, + temp_max, + temp_min; + + printf("Enter code 'U' or 'D': "); + scanf("%c", &code); + printf("Enter 3 numbers: "); + scanf("%hd%hd%hd", &num1, &num2, &num3); + + first_num = num1; + second_num = num2; + third_num = num3; + + temp_max = MAX(first_num, second_num); + temp_min = MIN(first_num, second_num); + second_num = temp_max; + first_num = temp_min; + if (code == 'D') + { + second_num = temp_min; + first_num = temp_max; + } + + temp_max = MAX(second_num, third_num); + temp_min = MIN(second_num, third_num); + third_num = temp_max; + second_num = temp_min; + if (code == 'D') + { + third_num = temp_min; + second_num = temp_max; + } + + temp_max = MAX(first_num, second_num); + temp_min = MIN(first_num, second_num); + second_num = temp_max; + first_num = temp_min; + if (code == 'D') + { + second_num = temp_min; + first_num = temp_max; + } + + printf("%hd %hd %hd\n", first_num, second_num, third_num); +} \ No newline at end of file diff --git a/2/ex2 b/2/ex2 new file mode 100644 index 0000000..ab4bf63 Binary files /dev/null and b/2/ex2 differ diff --git a/2/ex2.c b/2/ex2.c new file mode 100644 index 0000000..bc674a9 --- /dev/null +++ b/2/ex2.c @@ -0,0 +1,55 @@ +#include +#include "libs.h" +//--------------------------------------------------------------------------------------- +// Exercise 2 +// ---------- +// +// General : The program recognize if is it triangles and the type of triangle. +// +// Input : 3 numbers. +// +// Process : The program recognize by angles if is it triangles and the type of triangle. +// +// Output : '0' - is not a triangle. +// '1' - is sharp angled triangle. +// '2' - is right angled triangle. +// '3' - is blunt angled triangle. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 12.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short angle1, + angle2, + angle3, + max_angle, + sum_angles, + type_triangle = ZERO; + printf("Enter 3 angels: "); + scanf("%hu%hu%hu", &angle1, &angle2, &angle3); + + sum_angles = angle1 + angle2 + angle3; + if (sum_angles == SUM_OF_ANGLES_IN_A_TRIANGLE) + { + max_angle = angle1; + max_angle = MAX(MAX(max_angle, angle2), angle3); + type_triangle = SHARP_ANGLED_TRIAMGLE; + if (max_angle == RIGHT_ANGLE) + { + type_triangle = RIGHT_ANGLED_TRIAMGLE; + if (max_angle > RIGHT_ANGLE) + { + type_triangle = BLUNT_ANGLED_TRIAMGLE; + } + } + } + + printf("If you got '0' - is not a triangle.\n\ +If you got '1' - is sharp angled triangle.\n\ +If you got '2' - is right angled triangle.\n\ +If you got '3' - is blunt angled triangle.\n\ +Triangle: %hu\n", type_triangle); +} \ No newline at end of file diff --git a/2/ex3 b/2/ex3 new file mode 100644 index 0000000..2760f82 Binary files /dev/null and b/2/ex3 differ diff --git a/2/ex3.c b/2/ex3.c new file mode 100644 index 0000000..5022851 --- /dev/null +++ b/2/ex3.c @@ -0,0 +1,49 @@ +#include +#include "libs.h" +//--------------------------------------------------------------------------------------- +// Exercise 3 +// ---------- +// +// General : The program performs the formula of the roots. +// +// Input : 3 numbers (a,b,c from ax^2+bx+c). +// +// Process : The program performs the formula of the roots. +// +// Output : 2 numbers (sign and result). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 12.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + short num_a, + num_b, + num_c, + delta, + sign = ONE, + result = ZERO; + + printf("Enter a,b,c from ax^2+bx+c: "); + scanf("%hd%hd%hd", &num_a, &num_b, &num_c); + + // Calculate delta + delta = (num_b * num_b) - (FOUR * num_a * num_c); + result = -num_b / TWO * num_a; + if (delta > ZERO) + { + sign = TWO; + result = ZERO; + } + if (delta < ZERO) + { + sign = ZERO; + result = ZERO; + } + + printf("If you got sign '0' - not result\n\ +If you got sign '1' - one result\n\ +If you got sign '2' - two results:\nSign: %hd\nResult: %hd\n", sign, result); +} \ No newline at end of file diff --git a/2/ex4 b/2/ex4 new file mode 100644 index 0000000..25df67d Binary files /dev/null and b/2/ex4 differ diff --git a/2/ex4.c b/2/ex4.c new file mode 100644 index 0000000..b155801 --- /dev/null +++ b/2/ex4.c @@ -0,0 +1,54 @@ +#include +#include "libs.h" +//--------------------------------------------------------------------------------------- +// Exercise 4 +// ---------- +// +// General : The program checks for the logical results of a championship game in +// the basket ball. +// +// Input : 2 numbers (results). +// +// Process : The program checks for the logical results by conditions. +// +// Output : '1' if is it True, '0' is false. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 12.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short result1, + result2, + difference; + BOOLEAN answer = FALSE; + + printf("Enter 2 numbers: "); + scanf("%hu%hu", &result1, &result2); + + difference = ABS(result1 - result2); + + if (result1 <= ONE_HUNDRED_FIFTY) + { + if (result2 <= ONE_HUNDRED_FIFTY) + { + if (result1 >= FORTY) + { + if (result2 >= FORTY) + { + if (difference < SIXTY) + { + if (difference != ZERO) + { + answer = TRUE; + } + } + } + } + } + } + + printf("The answer: %hu\n", answer); +} diff --git a/2/ex5 b/2/ex5 new file mode 100644 index 0000000..5a83452 Binary files /dev/null and b/2/ex5 differ diff --git a/2/ex5.c b/2/ex5.c new file mode 100644 index 0000000..5c68842 --- /dev/null +++ b/2/ex5.c @@ -0,0 +1,89 @@ +#include +#include "libs.h" +//--------------------------------------------------------------------------------------- +// Exercise 5 +// ---------- +// +// General : The program calculate the final salary by parameters. +// +// Input : 8 numbers +// +// Process : The program calculate the final salary by parameters. +// +// Output : The final salary +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 12.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + float salary, + vetek, + hours, + kids, + temp_kids, + temp_hours, + ty, + tb, + t160, + t175, + final_salary; + + printf("Enter salary: "); + scanf("%f", &salary); + printf("Enter vetek: "); + scanf("%f", &vetek); + printf("Enter hours: "); + scanf("%f", &hours); + printf("Enter kids: "); + scanf("%f", &kids); + printf("Enter ty: "); + scanf("%f", &ty); + printf("Enter tb: "); + scanf("%f", &tb); + printf("Enter t160: "); + scanf("%f", &t160); + printf("Enter t175: "); + scanf("%f", &t175); + + temp_kids = kids; + temp_hours = hours; + final_salary = salary; + + if (vetek > TEN) + { + final_salary += (int)((double)final_salary * ONE_HUNDRED_AND_TEN_PERCENT); + } + + temp_kids -= THREE; + if (temp_kids > ZERO) + { + if (temp_kids > THREE) + { + final_salary += ((temp_kids - THREE) * tb) + + (temp_kids - (temp_kids - THREE)) * ty; + } + else + { + final_salary += (temp_kids * ty) + } + } + + temp_hours -= ONE_HUNDRED_SIXTY; + if (temp_hours > ZERO) + { + if (temp_hours > FIFTEEN) + { + final_salary += ((temp_hours - FIFTEEN) * t175) + + (temp_hours - (temp_hours - FIFTEEN)) * t160; + } + else + { + final_salary += (temp_hours * t160); + } + } + + printf("The salary: %f\n", final_salary); +} \ No newline at end of file diff --git a/2/libs.h b/2/libs.h new file mode 100644 index 0000000..b04f400 --- /dev/null +++ b/2/libs.h @@ -0,0 +1,24 @@ +#define MAX(a,b) a > b ? a : b +#define MIN(a,b) a < b ? a : b +#define SUM_OF_ANGLES_IN_A_TRIANGLE 180 +#define RIGHT_ANGLE 90 +#define ZERO 0 +#define SHARP_ANGLED_TRIAMGLE 1 +#define RIGHT_ANGLED_TRIAMGLE 2 +#define BLUNT_ANGLED_TRIAMGLE 3 +#define FOUR 4 +#define TWO 2 +#define TRUE 1 +#define FALSE 0 +#define POSITIVE_DIFFERENCE(a,b) MAX(a,b) - MIN(a,b) +#define BOOLEAN unsigned short +#define ABS(a) (a > 0) ? a : -a +#define TEN 10 +#define THREE 3 +#define ONE_HUNDRED_AND_TEN_PERCENT 1.1 +#define ONE_HUNDRED_SIXTY 160 +#define FIFTEEN 15 +#define ONE_HUNDRED_FIFTY 150 +#define FORTY 40 +#define SIXTY 60 +#define ONE 1 \ No newline at end of file diff --git a/2/test.asm b/2/test.asm new file mode 100644 index 0000000..f21781b --- /dev/null +++ b/2/test.asm @@ -0,0 +1,20 @@ +mov bh, 0 +mov ah, cl +begin: +cmp ch, ah ; if ah > ch jump to lower +jg lower +mov al, ah +mov ah, ch +mov ch, al +lower: +cmp bh, ch ; if ch < bh jump to finish +jg finish +mov bh, ch +finish: +mov ch, dl +mov dl, dh +mov dh, 0 +cmp ch, 0 +je the_end ; if ch == 0 jump to the_end +jmp begin +the_end: \ No newline at end of file diff --git a/20 - DMatrix/General.c b/20 - DMatrix/General.c new file mode 100644 index 0000000..68b9fc8 --- /dev/null +++ b/20 - DMatrix/General.c @@ -0,0 +1,2378 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +// ---------------------------- Sparce Matrix ------------------------------ +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next->row_next != ptr_sm) + temp = temp->row_next; + + return ((temp->row_next->row == -ONE) ? temp : temp->row_next); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next->col_next != ptr_sm) + temp = temp->col_next; + + return ((temp->col_next->col == -ONE) ? temp : temp->col_next); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} \ No newline at end of file diff --git a/20 - DMatrix/General.h b/20 - DMatrix/General.h new file mode 100644 index 0000000..48222e9 --- /dev/null +++ b/20 - DMatrix/General.h @@ -0,0 +1,219 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned short StringLenght(char *start_string); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); // Fix it +void InsertAfterList(LLL * manager); +void PushList(LLL ** manager); +void PopList(LLL ** manager); +void DeleteList(LLL * manager); +LLL * GetLoactionList(LLL ** manager, unsigned short location); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +// ---------------------------- Sparce Matrix ------------------------------ +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); \ No newline at end of file diff --git a/20 - DMatrix/a.out b/20 - DMatrix/a.out new file mode 100644 index 0000000..838ad12 Binary files /dev/null and b/20 - DMatrix/a.out differ diff --git a/20 - DMatrix/dmatrix.c b/20 - DMatrix/dmatrix.c new file mode 100644 index 0000000..cce370c --- /dev/null +++ b/20 - DMatrix/dmatrix.c @@ -0,0 +1,46 @@ +#include "General.h" + + + + +void main(void) +{ + SM * manager; + InitSM(&manager); + + AddRowSM(manager); + AddRowSM(manager); + AddRowSM(manager); + AddRowSM(manager); + AddRowSM(manager); + + AddColSM(manager); + AddColSM(manager); + AddColSM(manager); + AddItemSM(manager, 0, 0); + AddItemSM(manager, 1, 1); + AddItemSM(manager, 1, 1); + GetItemSM(manager, 0, 0)->info.int_ = 1234; + GetItemSM(manager, 1, 1)->info.int_ = 11; + PrintSM(manager, PrintIntDataType); + //RemoveItemSM(manager, 1, 1); + printf("\n"); + RemoveRowSM(manager); + printf("1\n"); + RemoveRowSM(manager); + printf("2\n"); + RemoveRowSM(manager); + printf("3\n"); + RemoveRowSM(manager); + printf("4\n"); + RemoveRowSM(manager); + printf("5\n"); + RemoveRowSM(manager); + printf("6\n"); + RemoveRowSM(manager); + printf("7\n"); + AddRowSM(manager); + AddRowSM(manager); + PrintSM(manager, PrintIntDataType); + +} \ No newline at end of file diff --git a/21 - recorstion/General.c b/21 - recorstion/General.c new file mode 100644 index 0000000..cecf53f --- /dev/null +++ b/21 - recorstion/General.c @@ -0,0 +1,2380 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next->row_next != ptr_sm) + temp = temp->row_next; + + return ((temp->row_next->row == -ONE) ? temp : temp->row_next); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next->col_next != ptr_sm) + temp = temp->col_next; + + return ((temp->col_next->col == -ONE) ? temp : temp->col_next); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} diff --git a/21 - recorstion/General.h b/21 - recorstion/General.h new file mode 100644 index 0000000..48222e9 --- /dev/null +++ b/21 - recorstion/General.h @@ -0,0 +1,219 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned short StringLenght(char *start_string); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); // Fix it +void InsertAfterList(LLL * manager); +void PushList(LLL ** manager); +void PopList(LLL ** manager); +void DeleteList(LLL * manager); +LLL * GetLoactionList(LLL ** manager, unsigned short location); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +// ---------------------------- Sparce Matrix ------------------------------ +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); \ No newline at end of file diff --git a/21 - recorstion/ex1.c b/21 - recorstion/ex1.c new file mode 100644 index 0000000..572727f --- /dev/null +++ b/21 - recorstion/ex1.c @@ -0,0 +1,30 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// MaxDigit +// -------- +// +// General : Check the max digit in the number. +// +// Parameters : +// num - number (int) +// +// Return value : The max digit in the number (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +unsigned short MaxDigit(int num) +{ + if (num < TEN) + return (num); + else + return (MAX(MaxDigit(num / TEN), num % TEN)); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/21 - recorstion/ex2 b/21 - recorstion/ex2 new file mode 100644 index 0000000..55ec26c Binary files /dev/null and b/21 - recorstion/ex2 differ diff --git a/21 - recorstion/ex2.c b/21 - recorstion/ex2.c new file mode 100644 index 0000000..405da82 --- /dev/null +++ b/21 - recorstion/ex2.c @@ -0,0 +1,31 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// DiffCountDigits +// --------------- +// +// General : Check the count of digit difference between two numbers. +// +// Parameters : +// num1 - first number (int) +// num2 - second number (int) +// +// Return value : The count of digit difference between two numbers (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +unsigned short DiffCountDigits(int num1, int num2) +{ + if (num1 == ZERO && num2 == ZERO) + return (ZERO); + else + return ((DiffCountDigits(num1 / TEN, num2 / TEN)) + (num1 == ZERO || num2 == ZERO)); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/21 - recorstion/ex3 b/21 - recorstion/ex3 new file mode 100644 index 0000000..64570a2 Binary files /dev/null and b/21 - recorstion/ex3 differ diff --git a/21 - recorstion/ex3.c b/21 - recorstion/ex3.c new file mode 100644 index 0000000..f7264f4 --- /dev/null +++ b/21 - recorstion/ex3.c @@ -0,0 +1,30 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// SumDigits +// --------- +// +// General : Count the amount of digits in a number. +// +// Parameters : +// num - a number (int) +// +// Return value : The count of digit in the number (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +unsigned short SumDigits(int num) +{ + if (num < TEN) + return (num); + else + return (SumDigits(num / TEN) + (num % TEN)); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/21 - recorstion/ex4 b/21 - recorstion/ex4 new file mode 100644 index 0000000..5374987 Binary files /dev/null and b/21 - recorstion/ex4 differ diff --git a/21 - recorstion/ex4.c b/21 - recorstion/ex4.c new file mode 100644 index 0000000..96552a6 --- /dev/null +++ b/21 - recorstion/ex4.c @@ -0,0 +1,36 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// DiffEvenSumToOddSum +// ------------------- +// +// General : Checks the difference between the number of odd digits and the +// odd number. +// +// Parameters : +// num - a number (int) +// +// Return value : The difference between the number of odd digits and the +// odd number. (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +short DiffEvenSumToOddSum(int num) +{ + int digit; + if (num < TEN) + return ((num % TWO) ? num : -num); + else + { + digit = num % TEN; + return (DiffEvenSumToOddSum(num / TEN) + ((digit % TWO) ? digit : -digit)); + } +} + +void main(void) +{ + printf("%hd\n", DiffEvenSumToOddSum(12345)); +} \ No newline at end of file diff --git a/21 - recorstion/ex5 b/21 - recorstion/ex5 new file mode 100644 index 0000000..8a56365 Binary files /dev/null and b/21 - recorstion/ex5 differ diff --git a/21 - recorstion/ex6 b/21 - recorstion/ex6 new file mode 100644 index 0000000..f2951a9 Binary files /dev/null and b/21 - recorstion/ex6 differ diff --git a/21 - recorstion/ex6.c b/21 - recorstion/ex6.c new file mode 100644 index 0000000..66cb290 --- /dev/null +++ b/21 - recorstion/ex6.c @@ -0,0 +1,31 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// SumDiffDigits +// ------------------- +// +// General : Checks the sum of digits in the absolute value. +// +// Parameters : +// num1 - first number (int) +// num2 - second number (int) +// +// Return value : The Checks the sum of digits in the absolute value. (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +unsigned short SumDiffDigits(int num1, int num2) +{ + if (num1 < TEN && num2 < TEN) + return (ABS(num1 - num2)); + else + return (SumDiffDigits(num1 / TEN, num2 / TEN) + ABS((num1 % TEN) - (num2 % TEN))); +} + +void main(void) +{ + printf("%hu\n", SumDiffDigits(7890, 453)); +} \ No newline at end of file diff --git a/21 - recorstion/ex8.c b/21 - recorstion/ex8.c new file mode 100644 index 0000000..1318c0a --- /dev/null +++ b/21 - recorstion/ex8.c @@ -0,0 +1,34 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// InitialDivisions +// ---------------- +// +// General : Checks the difference between the number of odd digits and the +// odd number. +// +// Parameters : +// num - a number (int) +// +// Return value : The difference between the number of odd digits and the +// odd number. (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void InitialDivisions(int num) +{ + if (num == ONE) + printf("%hu\n", ONE); + else + { + + } +} + +void main(void) +{ + InitialDivisions(12345); +} \ No newline at end of file diff --git a/22- recorstion2/General.c b/22- recorstion2/General.c new file mode 100644 index 0000000..cecf53f --- /dev/null +++ b/22- recorstion2/General.c @@ -0,0 +1,2380 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next->row_next != ptr_sm) + temp = temp->row_next; + + return ((temp->row_next->row == -ONE) ? temp : temp->row_next); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next->col_next != ptr_sm) + temp = temp->col_next; + + return ((temp->col_next->col == -ONE) ? temp : temp->col_next); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} diff --git a/22- recorstion2/General.h b/22- recorstion2/General.h new file mode 100644 index 0000000..08e742e --- /dev/null +++ b/22- recorstion2/General.h @@ -0,0 +1,219 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); // Fix it +void InsertAfterList(LLL * manager); +void PushList(LLL ** manager); +void PopList(LLL ** manager); +void DeleteList(LLL * manager); +LLL * GetLoactionList(LLL ** manager, unsigned short location); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +// ---------------------------- Sparce Matrix ------------------------------ +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); \ No newline at end of file diff --git a/22- recorstion2/a.out b/22- recorstion2/a.out new file mode 100644 index 0000000..928ae1a Binary files /dev/null and b/22- recorstion2/a.out differ diff --git a/22- recorstion2/ex1.c b/22- recorstion2/ex1.c new file mode 100644 index 0000000..e1b03e4 --- /dev/null +++ b/22- recorstion2/ex1.c @@ -0,0 +1,27 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the length of string. +// +// Parameters : +// str - a pointer of string (char *) +// +// Return value : The length of string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +void main(void) +{ + +} diff --git a/22- recorstion2/ex2.c b/22- recorstion2/ex2.c new file mode 100644 index 0000000..0f430e8 --- /dev/null +++ b/22- recorstion2/ex2.c @@ -0,0 +1,39 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// Akeltoni +// -------- +// +// General : Gets a string and arranges it "Akeltoni". +// +// Parameters : +// str_start - a pointer of string (char *) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void Akeltoni(char * str_start) +{ + unsigned int str_len; + string new_string; + if (*str_start) + { + CopyString(new_string, ++str_start); + str_len = StringLength(new_string); + *str_start = *(new_string + str_len - ONE); + *(new_string + str_len - ONE) = BACKSLASH_ZERO; + CopyString(++str_start, new_string); + Akeltoni(str_start); + } +} + +void main(void) +{ + string test = "ABCDEFGH"; + Akeltoni(test); + printf("%s\n", test); +} \ No newline at end of file diff --git a/22- recorstion2/ex3.c b/22- recorstion2/ex3.c new file mode 100644 index 0000000..d36f7f5 --- /dev/null +++ b/22- recorstion2/ex3.c @@ -0,0 +1,34 @@ +#include "General.h" + +#define ASCII_ZERO '0' +#define ASCII_NINE '9' + + +//--------------------------------------------------------------------------------------- +// EvenPlaceIsDigit +// ---------------- +// +// General : Checks whether all characters in the pairing are digits. +// +// Parameters : +// str - a pointer of string (char *) +// +// Return value : If all characters in the pairing are digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenPlaceIsDigit(char * str) +{ + if (!(*str) || !(*(str - ONE))) + return (TRUE); + else + return (EvenPlaceIsDigit(str + TWO) * (ASCII_ZERO <= (*str) && ASCII_NINE >= (*str))); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/22- recorstion2/ex5.c b/22- recorstion2/ex5.c new file mode 100644 index 0000000..f5e1ca5 --- /dev/null +++ b/22- recorstion2/ex5.c @@ -0,0 +1,32 @@ +#include "General.h" + +#define ASCII_A 'A' + +//--------------------------------------------------------------------------------------- +// CountAChar +// ---------- +// +// General : Count the amount of characters that are A in string. +// +// Parameters : +// str - a pointer of string (char *) +// +// Return value : Count the amount of characters that are A in string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountAChar(char * str) +{ + if (!(*str)) + return (ZERO); + else + return (CountAChar(++str) * ((*str) == ASCII_A)); +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/22- recorstion2/ex6.c b/22- recorstion2/ex6.c new file mode 100644 index 0000000..5f1e01f --- /dev/null +++ b/22- recorstion2/ex6.c @@ -0,0 +1,35 @@ +#include "General.h" + + +//--------------------------------------------------------------------------------------- +// SubString +// --------- +// +// General : Checks whether the second string is a sub string in the first string. +// +// Parameters : +// first_str - first a pointer of string (char *) +// second_str - second a pointer of string (char *) +// +// Return value : if the second string is a sub string in the first string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SubString(char * first_str, char * second_str) +{ + printf("s\n"); + if (StringLength(first_str) < StringLength(second_str)) + return (FALSE); + else + return (!StringCompare(second_str, first_str) ? (SubString(++first_str, second_str)) : TRUE); +} + +void main(void) +{ + string s1 = "ABCDEFG"; + string s2 = "CD"; + printf("%hu\n", SubString(s1, s2)); +} \ No newline at end of file diff --git a/22- recorstion2/ex7.c b/22- recorstion2/ex7.c new file mode 100644 index 0000000..b3735b5 --- /dev/null +++ b/22- recorstion2/ex7.c @@ -0,0 +1,43 @@ +#include "General.h" +#include + + +//--------------------------------------------------------------------------------------- +// StringMirror +// ------------ +// +// General : Recursive function that receives a string and returns a mirror string +// of its inverted string. ("ABCD" = "DCBAABCD") +// +// Parameters : +// str - a pointer of string (char *) +// +// Return value : mirror string of its inverted string. (char *). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 05.01.2019 +//--------------------------------------------------------------------------------------- +char * StringMirror(char * str) +{ + string temp; + unsigned int len; + if (!(*(str + ONE))) + { + return (strcat(str, str)); + } + else + { + temp[ZERO] = *str; + strcpy(temp + ONE, str); + len = StringLength(str) - ONE; + return (strcpy(StringMirror(str + ONE) + len, temp) - len); + } +} + +void main(void) +{ + string s1 = " nehoC nadI"; + printf("%s\n", StringMirror(s1)); +} \ No newline at end of file diff --git a/23 - Sort/General.c b/23 - Sort/General.c new file mode 100644 index 0000000..37a051e --- /dev/null +++ b/23 - Sort/General.c @@ -0,0 +1,2433 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next->row_next != ptr_sm) + temp = temp->row_next; + + return ((temp->row_next->row == -ONE) ? temp : temp->row_next); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next->col_next != ptr_sm) + temp = temp->col_next; + + return ((temp->col_next->col == -ONE) ? temp : temp->col_next); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} diff --git a/23 - Sort/General.h b/23 - Sort/General.h new file mode 100644 index 0000000..d98d423 --- /dev/null +++ b/23 - Sort/General.h @@ -0,0 +1,226 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); // Fix it +void InsertAfterList(LLL * manager); +void PushList(LLL ** manager); +void PopList(LLL ** manager); +void DeleteList(LLL * manager); +LLL * GetLoactionList(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ----------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------ +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); \ No newline at end of file diff --git a/23 - Sort/a.out b/23 - Sort/a.out new file mode 100644 index 0000000..9d022e4 Binary files /dev/null and b/23 - Sort/a.out differ diff --git a/23 - Sort/ex1.c b/23 - Sort/ex1.c new file mode 100644 index 0000000..565e0b2 --- /dev/null +++ b/23 - Sort/ex1.c @@ -0,0 +1,77 @@ +#include "General.h" + + +BOOLEAN IntDataTypeIsBigger(Data_Type dt1, Data_Type dt2) +{ + return (dt1.int_ > dt2.int_); +} + +void SwapDataType(Data_Type * dt1, Data_Type * dt2) +{ + Data_Type temp = *dt1; + *dt1 = *dt2; + *dt2 = temp; +} + + +DLLL * Partition(DLLL * low, DLLL * high, BOOLEAN IsBigger(Data_Type dt1, Data_Type dt2), void Swap(Data_Type * dt1, Data_Type * dt2)) +{ + DLLL * temp_min = low->prev; + DLLL * temp_loop; + + for (temp_loop = low; temp_loop != high; temp_loop = temp_loop->next) + { + if (IsBigger(high->info, temp_loop->info)) + { + temp_min = (temp_min == NULL) ? low : temp_min->next; + + Swap(&(temp_min->info), &(temp_loop->info)); + } + } + temp_min = (temp_min == NULL) ? low : temp_min->next; + Swap(&(temp_min->info), &(high->info)); + return (temp_min); +} +void QuickSortDLLL(DLLL * low, DLLL * high) +{ + if (high != NULL && low != high && low != high->next) + { + DLLL * p = Partition(low, high, IntDataTypeIsBigger, SwapDataType); + QuickSortDLLL(low, p->prev); + QuickSortDLLL(p->next, high); + } +} + +DLLL * LastDLLL(DLLL * manager) +{ + while (manager->next != NULL) + manager = manager->next; + return (manager); +} + + +void main(void) +{ + int * seed; + DLLL * manager; + DLLL * last; + InitDLLL(&manager); + PushDLLL(&manager); + PushDLLL(&manager); + PushDLLL(&manager); + PushDLLL(&manager); + PushDLLL(&manager); + PushDLLL(&manager); + DLLL * temp = manager; + while (temp != NULL) + { + temp->info.int_ = Random(&seed,0, 10); + temp = temp->next; + } + last = LastDLLL(manager); + PrintDLLL(manager, PrintIntDataType); + QuickSortDLLL(manager, last); + + PrintDLLL(manager, PrintIntDataType); + +} \ No newline at end of file diff --git a/23 - Sort/ex2.c b/23 - Sort/ex2.c new file mode 100644 index 0000000..0bc5499 --- /dev/null +++ b/23 - Sort/ex2.c @@ -0,0 +1,106 @@ +#include "General.h" + +BOOLEAN IntDataTypeIsBigger(Data_Type dt1, Data_Type dt2) +{ + return (dt1.int_ >= dt2.int_); +} + +void RemoveCDLLL(CDLLL * manager) +{ + while (manager->next != manager) + { + DeleteCDLLL(manager); + } + DeleteLastCDLLL(&manager); +} + +void MergeCDLLL(CDLLL * manager1, CDLLL * manager2, BOOLEAN IsBigger(Data_Type dt1, Data_Type dt2)) +{ + manager2->next->prev = manager1; + manager1->next->prev = manager2; + manager2->next = manager1; + manager1->next = manager2; + + while (IsBigger(manager1->info,manager1->prev->info)) + { + if (IsBigger(manager1->info, manager2->info)) + { + InsertBeforeCDLLL(manager1); + manager1->prev->info = manager2->info; + manager2 = manager2->next; + } + else + { + manager1 = manager1->next; + } + } + RemoveCDLLL(manager2); +} + +unsigned int AmountNodesCDLLL(CDLLL * manager) +{ + unsigned int count = ONE; + CDLLL * temp = manager->next; + while (temp != manager) + { + count++; + temp = temp->next; + } + + return (count); +} + +void CutCDLLLTwoParts(CDLLL * manager, CDLLL ** second_part) +{ + *second_part = manager; + CDLLL * temp = manager; + unsigned int counter; + unsigned int amount_of_nodes = AmountNodesCDLLL(manager) / TWO; + for (counter = ZERO; counter < amount_of_nodes; counter++) + { + *second_part = (*second_part)->next; + } + + +} + +void MergeSortCDLLL(CDLLL * manager) +{ + CDLLL * half_of_cdlll; + if (manager->next != manager) + { + // cut the CDLLL for two parts + MergeSortCDLLL(manager); + MergeSortCDLLL(half_of_cdlll); + MergeCDLLL(manager, half_of_cdlll, IntDataTypeIsBigger); + } +} + +void main(void) +{ + CDLLL * manager1; + InsertLastCDLLL(&manager1); + InsertEndCDLLL(&manager1); + InsertEndCDLLL(&manager1); + InsertEndCDLLL(&manager1); + InsertEndCDLLL(&manager1); + InsertEndCDLLL(&manager1); + InsertEndCDLLL(&manager1); + InsertEndCDLLL(&manager1); + + CDLLL * manager2; + InsertLastCDLLL(&manager2); + InsertEndCDLLL(&manager2); + InsertEndCDLLL(&manager2); + InsertEndCDLLL(&manager2); + InsertEndCDLLL(&manager2); + InsertEndCDLLL(&manager2); + InsertEndCDLLL(&manager2); + InsertEndCDLLL(&manager2); + + + int * seed; + CDLLL * temp = manager1->next; + + PrintCDLLL(manager1, PrintIntDataType); +} \ No newline at end of file diff --git a/23 - Sort/shell.c b/23 - Sort/shell.c new file mode 100644 index 0000000..df7f278 --- /dev/null +++ b/23 - Sort/shell.c @@ -0,0 +1,27 @@ +#include "General.h" + +void ShellSort(int * arr, int size, void Swap(int * num1, int * num2)) +{ + int gap; + int temp; + unsigned int counter; + if (size != ONE) // fix + { + gap = size / TWO; + temp = arr[gap]; + for (counter = ZERO; counter < gap; counter += TWO) + { + if (temp < arr[counter]) + { + Swap(&(arr[gap]), &(arr[counter])); + } + } + + ShellSort(arr, size, Swap); + } +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/24 - SelectSearch/General.c b/24 - SelectSearch/General.c new file mode 100644 index 0000000..9a705c8 --- /dev/null +++ b/24 - SelectSearch/General.c @@ -0,0 +1,2434 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(Data_Type * start_dest_index, Data_Type * start_src_index, unsigned int length, void copy(Data_Type *, Data_Type *)) +{ + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + copy(start_dest_index++, start_src_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next->row_next != ptr_sm) + temp = temp->row_next; + + return ((temp->row_next->row == -ONE) ? temp : temp->row_next); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next->col_next != ptr_sm) + temp = temp->col_next; + + return ((temp->col_next->col == -ONE) ? temp : temp->col_next); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} diff --git a/24 - SelectSearch/General.h b/24 - SelectSearch/General.h new file mode 100644 index 0000000..d98d423 --- /dev/null +++ b/24 - SelectSearch/General.h @@ -0,0 +1,226 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); // Fix it +void InsertAfterList(LLL * manager); +void PushList(LLL ** manager); +void PopList(LLL ** manager); +void DeleteList(LLL * manager); +LLL * GetLoactionList(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ----------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------ +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); \ No newline at end of file diff --git a/24 - SelectSearch/quickselect.c b/24 - SelectSearch/quickselect.c new file mode 100644 index 0000000..8fb9063 --- /dev/null +++ b/24 - SelectSearch/quickselect.c @@ -0,0 +1,59 @@ +#include "General.h" + + +void CopyPointers(int * start_dest_index, int * start_src_index, unsigned int length) +{ + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + *(start_dest_index++) = *(start_src_index++); + } +} + +int GetHaziyon(int * ptr_arr, unsigned int length) +{ + int haziyon; + if (length % TWO) + { + haziyon = *(ptr_arr + (length / TWO) + ONE); + } + else + { + haziyon = (*(ptr_arr + (length / TWO)) + *(ptr_arr + (length / TWO) + ONE)) / TWO; + } + + return (haziyon); +} + +unsigned int SortFiveValuesAndGetHaziyon(int * ptr_arr, unsigned int length, int ** ptr_haziyons, void sort(int *, unsigned int)) +{ + int haziyon; + unsigned int length_arr_haziyons = ONE; + if (length > FIVE) + { + sort(ptr_arr + length - FIVE, FIVE); + haziyon = GetHaziyon(ptr_arr + length - FIVE, FIVE); + length_arr_haziyons = SortFiveValuesAndGetHaziyon(ptr_arr, length - FIVE, ptr_haziyons, sort) + ONE; + *ptr_haziyons = (int *)realloc(*ptr_haziyons, sizeof(int) * length_arr_haziyons); + } + else + { + sort(ptr_arr, length); + haziyon = GetHaziyon(ptr_arr, length); + *ptr_haziyons = (int *)malloc(sizeof(int)); + } + *(ptr_haziyons + length_arr_haziyons - ONE) = haziyon; + + return (length_arr_haziyons); +} + +int * Select(int * ptr_arr, unsigned int length, int k) +{ + unsigned int new_length; + int * temp_arr; +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/25 - Trees/General.c b/25 - Trees/General.c new file mode 100644 index 0000000..19ebe60 --- /dev/null +++ b/25 - Trees/General.c @@ -0,0 +1,2587 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + unsigned int counter; + Data_Type item; + if (((*q).items) == ONE) + { + item = (*q).values[ZERO]; + free((*q).values); + (*q).items--; + } + else if (((*q).items) > ONE) + { + item = (*q).values[ZERO]; + (*q).items--; + for (counter = ZERO; counter < (*q).items; counter++) + { + (*q).values[counter] = (*q).values[counter + ONE]; + } + (*q).values = (Data_Type *)realloc((*q).values, (*q).items * sizeof(Data_Type)); + } + + return (item); +} + +BOOLEAN IsEmptyQueue(queue * q) +{ + return (!q->items); +} +// ------------------------------------------ LLL --------------------------------------- +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterLLL(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushLLL(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopLLL(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteLLL(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionLLL(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next->row_next != ptr_sm) + temp = temp->row_next; + + return ((temp->row_next->row == -ONE) ? temp : temp->row_next); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next->col_next != ptr_sm) + temp = temp->col_next; + + return ((temp->col_next->col == -ONE) ? temp : temp->col_next); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} + +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** root) +{ + *root = (BinaryTree *)malloc(sizeof(BinaryTree)); + (*root)->left = NULL; + (*root)->right = NULL; +} + +void AddLeftAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +BOOLEAN IsLeafBinaryTree(BinaryTree * tree) +{ + return (!(tree->left && tree->right)); +} + +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** root) +{ + *root = (ThirdTree *)malloc(sizeof(ThirdTree)); + (*root)->left = NULL; + (*root)->right = NULL; + (*root)->middle = NULL; +} + +void AddLeftAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +void AddMiddleAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->middle = tree->middle; + tree->middle = new_node; +} + +BOOLEAN IsLeafThirdTree(ThirdTree * tree) +{ + return (!(tree->left && tree->right && tree->middle)); +} + +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** root) +{ + *root = (GeneralTree *)malloc(sizeof(GeneralTree)); + (*root)->manager_general_trees = NULL; +} + +void AddAfterGeneralTree(GeneralTree * tree) +{ + GeneralTree * new_node = (GeneralTree *)malloc(sizeof(GeneralTree)); + LLL * temp = tree->manager_general_trees; + while (temp->next != NULL) + { + temp = temp->next; + } + InsertAfterLLL(temp); +} + +BOOLEAN IsLeafGeneralTree(GeneralTree * tree) +{ + return (tree->manager_general_trees != NULL); +} + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)temp->right)); + } + } + +} \ No newline at end of file diff --git a/25 - Trees/General.h b/25 - Trees/General.h new file mode 100644 index 0000000..9ccc027 --- /dev/null +++ b/25 - Trees/General.h @@ -0,0 +1,274 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +struct BinaryTree +{ + Data_Type info; + struct BinaryTree * right; + struct BinaryTree * left; +}; + +struct ThirdTree +{ + Data_Type info; + struct ThirdTree * right; + struct ThirdTree * left; + struct ThirdTree * middle; +}; + +struct GeneralTree +{ + Data_Type info; + LLL * manager_general_trees; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; +typedef struct BinaryTree BinaryTree; +typedef struct ThirdTree ThirdTree; +typedef struct GeneralTree GeneralTree; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); +BOOLEAN IsEmptyQueue(queue * q); +// -------------------------------------- LLL ------------------------------------------- +void InsertAfterLLL(LLL * manager); +void PushLLL(LLL ** manager); +void PopLLL(LLL ** manager); +void DeleteLLL(LLL * manager); +LLL * GetLoactionLLL(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ---------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------------------- +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** tree); +void AddLeftAfterBinaryTree(BinaryTree * tree); +void AddRightAfterBinaryTree(BinaryTree * tree); +BOOLEAN IsLeafBinaryTree(BinaryTree * tree); +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** tree); +void AddLeftAfterThirdTree(ThirdTree * tree); +void AddRightAfterThirdTree(ThirdTree * tree); +void AddMiddleAfterThirdTree(ThirdTree * tree); +BOOLEAN IsLeafThirdTree(ThirdTree * tree); +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** tree); +void AddAfterGeneralTree(GeneralTree * tree); +BOOLEAN IsLeafGeneralTree(GeneralTree * tree); +// -------------------------------------- Funcations Tree ----------------------------------- +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)); \ No newline at end of file diff --git a/25 - Trees/ex1.c b/25 - Trees/ex1.c new file mode 100644 index 0000000..0b874d6 --- /dev/null +++ b/25 - Trees/ex1.c @@ -0,0 +1,44 @@ +#include "General.h" + +void InsertToBinaryTree(BinaryTree ** root, int k) +{ + if (root == NULL) + { + MakeBinaryTree(root); + (*root)->info.int_ = k; + } + else if ((*root)->info.int_ > k) + { + if ((*root)->left == NULL) + { + AddLeftAfterBinaryTree(*root); + (*root)->left->info.int_ = k; + } + else + { + InsertToBinaryTree(&((*root)->left), k); + } + } + else if ((*root)->info.int_ < k) + { + if ((*root)->right == NULL) + { + AddRightAfterBinaryTree(*root); + (*root)->right->info.int_ = k; + } + else + { + InsertToBinaryTree(&((*root)->right), k); + } + } + else + { + printf("Duplicate!\n"); + } +} + +void main(void) +{ + BinaryTree * bt; + +} \ No newline at end of file diff --git a/25 - Trees/ex2.c b/25 - Trees/ex2.c new file mode 100644 index 0000000..94791c7 --- /dev/null +++ b/25 - Trees/ex2.c @@ -0,0 +1,58 @@ +#include "General.h" + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)temp->right)); + } + } + +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/26 - Trees(continue)/General.c b/26 - Trees(continue)/General.c new file mode 100644 index 0000000..19ebe60 --- /dev/null +++ b/26 - Trees(continue)/General.c @@ -0,0 +1,2587 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + unsigned int counter; + Data_Type item; + if (((*q).items) == ONE) + { + item = (*q).values[ZERO]; + free((*q).values); + (*q).items--; + } + else if (((*q).items) > ONE) + { + item = (*q).values[ZERO]; + (*q).items--; + for (counter = ZERO; counter < (*q).items; counter++) + { + (*q).values[counter] = (*q).values[counter + ONE]; + } + (*q).values = (Data_Type *)realloc((*q).values, (*q).items * sizeof(Data_Type)); + } + + return (item); +} + +BOOLEAN IsEmptyQueue(queue * q) +{ + return (!q->items); +} +// ------------------------------------------ LLL --------------------------------------- +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterLLL(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushLLL(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopLLL(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteLLL(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionLLL(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next->row_next != ptr_sm) + temp = temp->row_next; + + return ((temp->row_next->row == -ONE) ? temp : temp->row_next); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next->col_next != ptr_sm) + temp = temp->col_next; + + return ((temp->col_next->col == -ONE) ? temp : temp->col_next); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} + +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** root) +{ + *root = (BinaryTree *)malloc(sizeof(BinaryTree)); + (*root)->left = NULL; + (*root)->right = NULL; +} + +void AddLeftAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +BOOLEAN IsLeafBinaryTree(BinaryTree * tree) +{ + return (!(tree->left && tree->right)); +} + +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** root) +{ + *root = (ThirdTree *)malloc(sizeof(ThirdTree)); + (*root)->left = NULL; + (*root)->right = NULL; + (*root)->middle = NULL; +} + +void AddLeftAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +void AddMiddleAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->middle = tree->middle; + tree->middle = new_node; +} + +BOOLEAN IsLeafThirdTree(ThirdTree * tree) +{ + return (!(tree->left && tree->right && tree->middle)); +} + +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** root) +{ + *root = (GeneralTree *)malloc(sizeof(GeneralTree)); + (*root)->manager_general_trees = NULL; +} + +void AddAfterGeneralTree(GeneralTree * tree) +{ + GeneralTree * new_node = (GeneralTree *)malloc(sizeof(GeneralTree)); + LLL * temp = tree->manager_general_trees; + while (temp->next != NULL) + { + temp = temp->next; + } + InsertAfterLLL(temp); +} + +BOOLEAN IsLeafGeneralTree(GeneralTree * tree) +{ + return (tree->manager_general_trees != NULL); +} + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)temp->right)); + } + } + +} \ No newline at end of file diff --git a/26 - Trees(continue)/General.h b/26 - Trees(continue)/General.h new file mode 100644 index 0000000..9ccc027 --- /dev/null +++ b/26 - Trees(continue)/General.h @@ -0,0 +1,274 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +struct BinaryTree +{ + Data_Type info; + struct BinaryTree * right; + struct BinaryTree * left; +}; + +struct ThirdTree +{ + Data_Type info; + struct ThirdTree * right; + struct ThirdTree * left; + struct ThirdTree * middle; +}; + +struct GeneralTree +{ + Data_Type info; + LLL * manager_general_trees; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; +typedef struct BinaryTree BinaryTree; +typedef struct ThirdTree ThirdTree; +typedef struct GeneralTree GeneralTree; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); +BOOLEAN IsEmptyQueue(queue * q); +// -------------------------------------- LLL ------------------------------------------- +void InsertAfterLLL(LLL * manager); +void PushLLL(LLL ** manager); +void PopLLL(LLL ** manager); +void DeleteLLL(LLL * manager); +LLL * GetLoactionLLL(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ---------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------------------- +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** tree); +void AddLeftAfterBinaryTree(BinaryTree * tree); +void AddRightAfterBinaryTree(BinaryTree * tree); +BOOLEAN IsLeafBinaryTree(BinaryTree * tree); +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** tree); +void AddLeftAfterThirdTree(ThirdTree * tree); +void AddRightAfterThirdTree(ThirdTree * tree); +void AddMiddleAfterThirdTree(ThirdTree * tree); +BOOLEAN IsLeafThirdTree(ThirdTree * tree); +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** tree); +void AddAfterGeneralTree(GeneralTree * tree); +BOOLEAN IsLeafGeneralTree(GeneralTree * tree); +// -------------------------------------- Funcations Tree ----------------------------------- +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)); \ No newline at end of file diff --git a/26 - Trees(continue)/ex1.c b/26 - Trees(continue)/ex1.c new file mode 100644 index 0000000..f73be2e --- /dev/null +++ b/26 - Trees(continue)/ex1.c @@ -0,0 +1,30 @@ +#include "General.h" + +BinaryTree * GetBrotherBinaryTree(BinaryTree * root, BinaryTree * p) +{ + if (root) + { + return (NULL); + } + else + { + if (root->left == p) + { + return (root->right); + } + else if (root->right == p) + { + return (root->left); + } + else + { + return (GetBrotherBinaryTree(root->left, p) || + GetBrotherBinaryTree(root->right, p)); + } + } +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/26 - Trees(continue)/ex2.c b/26 - Trees(continue)/ex2.c new file mode 100644 index 0000000..16c3535 --- /dev/null +++ b/26 - Trees(continue)/ex2.c @@ -0,0 +1,21 @@ +#include "General.h" + +BOOLEAN Ex2BinaryTree(BinaryTree * root) +{ + if (!root) + { + return (TRUE); + } + else + { + return (Ex2BinaryTree(root->left) && + Ex2BinaryTree(root->right) && + (root->right != NULL) ? root->info.int_ >= root->right->info.int_ : TRUE && + (root->left != NULL) ? root->info.int_ >= root->left->info.int_ : TRUE); + } +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/26 - Trees(continue)/ex3.c b/26 - Trees(continue)/ex3.c new file mode 100644 index 0000000..84da70c --- /dev/null +++ b/26 - Trees(continue)/ex3.c @@ -0,0 +1,14 @@ +#include "General.h" + +void Ex3BinaryTree(BinaryTree * root) +{ + if (root != NULL) + { + + } +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/27 - Expression tree/General.c b/27 - Expression tree/General.c new file mode 100644 index 0000000..cfe9be6 --- /dev/null +++ b/27 - Expression tree/General.c @@ -0,0 +1,2595 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + unsigned int counter; + Data_Type item; + if (((*q).items) == ONE) + { + item = (*q).values[ZERO]; + free((*q).values); + (*q).items--; + } + else if (((*q).items) > ONE) + { + item = (*q).values[ZERO]; + (*q).items--; + for (counter = ZERO; counter < (*q).items; counter++) + { + (*q).values[counter] = (*q).values[counter + ONE]; + } + (*q).values = (Data_Type *)realloc((*q).values, (*q).items * sizeof(Data_Type)); + } + + return (item); +} + +BOOLEAN IsEmptyQueue(queue * q) +{ + return (!q->items); +} +// ------------------------------------------ LLL --------------------------------------- +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterLLL(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushLLL(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopLLL(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteLLL(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionLLL(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next != ptr_sm) + temp = temp->row_next; + + return (temp); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next != ptr_sm) + temp = temp->col_next; + + return (temp); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} + +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** root) +{ + *root = (BinaryTree *)malloc(sizeof(BinaryTree)); + (*root)->left = NULL; + (*root)->right = NULL; +} + +void AddLeftAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +BOOLEAN IsLeafBinaryTree(BinaryTree * tree) +{ + return (!(tree->left && tree->right)); +} + +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** root) +{ + *root = (ThirdTree *)malloc(sizeof(ThirdTree)); + (*root)->left = NULL; + (*root)->right = NULL; + (*root)->middle = NULL; +} + +void AddLeftAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +void AddMiddleAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->middle = tree->middle; + tree->middle = new_node; +} + +BOOLEAN IsLeafThirdTree(ThirdTree * tree) +{ + return (!(tree->left && tree->right && tree->middle)); +} + +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** root) +{ + *root = (GeneralTree *)malloc(sizeof(GeneralTree)); + (*root)->manager_general_trees = NULL; +} + +void AddAfterGeneralTree(GeneralTree * tree) +{ + GeneralTree * new_node = (GeneralTree *)malloc(sizeof(GeneralTree)); + LLL * temp = tree->manager_general_trees; + if (temp != NULL) + { + while (temp->next != NULL) + { + temp = temp->next; + } + InsertAfterLLL(temp); + } + else + { + PushLLL(temp); + } + +} + +BOOLEAN IsLeafGeneralTree(GeneralTree * tree) +{ + return (tree->manager_general_trees != NULL); +} + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)(void *)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)(void *)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)(void *)temp->right)); + } + } + +} \ No newline at end of file diff --git a/27 - Expression tree/General.h b/27 - Expression tree/General.h new file mode 100644 index 0000000..6270809 --- /dev/null +++ b/27 - Expression tree/General.h @@ -0,0 +1,274 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +struct BinaryTree +{ + Data_Type info; + struct BinaryTree * right; + struct BinaryTree * left; +}; + +struct ThirdTree +{ + Data_Type info; + struct ThirdTree * right; + struct ThirdTree * left; + struct ThirdTree * middle; +}; + +struct GeneralTree +{ + Data_Type info; + struct LLL * manager_general_trees; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; +typedef struct BinaryTree BinaryTree; +typedef struct ThirdTree ThirdTree; +typedef struct GeneralTree GeneralTree; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); +BOOLEAN IsEmptyQueue(queue * q); +// -------------------------------------- LLL ------------------------------------------- +void InsertAfterLLL(LLL * manager); +void PushLLL(LLL ** manager); +void PopLLL(LLL ** manager); +void DeleteLLL(LLL * manager); +LLL * GetLoactionLLL(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ---------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------------------- +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** tree); +void AddLeftAfterBinaryTree(BinaryTree * tree); +void AddRightAfterBinaryTree(BinaryTree * tree); +BOOLEAN IsLeafBinaryTree(BinaryTree * tree); +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** tree); +void AddLeftAfterThirdTree(ThirdTree * tree); +void AddRightAfterThirdTree(ThirdTree * tree); +void AddMiddleAfterThirdTree(ThirdTree * tree); +BOOLEAN IsLeafThirdTree(ThirdTree * tree); +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** tree); +void AddAfterGeneralTree(GeneralTree * tree); +BOOLEAN IsLeafGeneralTree(GeneralTree * tree); +// -------------------------------------- Funcations Tree ----------------------------------- +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)); \ No newline at end of file diff --git a/28 - Heap/General.c b/28 - Heap/General.c new file mode 100644 index 0000000..cfe9be6 --- /dev/null +++ b/28 - Heap/General.c @@ -0,0 +1,2595 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + unsigned int counter; + Data_Type item; + if (((*q).items) == ONE) + { + item = (*q).values[ZERO]; + free((*q).values); + (*q).items--; + } + else if (((*q).items) > ONE) + { + item = (*q).values[ZERO]; + (*q).items--; + for (counter = ZERO; counter < (*q).items; counter++) + { + (*q).values[counter] = (*q).values[counter + ONE]; + } + (*q).values = (Data_Type *)realloc((*q).values, (*q).items * sizeof(Data_Type)); + } + + return (item); +} + +BOOLEAN IsEmptyQueue(queue * q) +{ + return (!q->items); +} +// ------------------------------------------ LLL --------------------------------------- +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterLLL(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushLLL(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopLLL(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteLLL(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionLLL(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next != ptr_sm) + temp = temp->row_next; + + return (temp); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next != ptr_sm) + temp = temp->col_next; + + return (temp); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} + +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** root) +{ + *root = (BinaryTree *)malloc(sizeof(BinaryTree)); + (*root)->left = NULL; + (*root)->right = NULL; +} + +void AddLeftAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +BOOLEAN IsLeafBinaryTree(BinaryTree * tree) +{ + return (!(tree->left && tree->right)); +} + +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** root) +{ + *root = (ThirdTree *)malloc(sizeof(ThirdTree)); + (*root)->left = NULL; + (*root)->right = NULL; + (*root)->middle = NULL; +} + +void AddLeftAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +void AddMiddleAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->middle = tree->middle; + tree->middle = new_node; +} + +BOOLEAN IsLeafThirdTree(ThirdTree * tree) +{ + return (!(tree->left && tree->right && tree->middle)); +} + +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** root) +{ + *root = (GeneralTree *)malloc(sizeof(GeneralTree)); + (*root)->manager_general_trees = NULL; +} + +void AddAfterGeneralTree(GeneralTree * tree) +{ + GeneralTree * new_node = (GeneralTree *)malloc(sizeof(GeneralTree)); + LLL * temp = tree->manager_general_trees; + if (temp != NULL) + { + while (temp->next != NULL) + { + temp = temp->next; + } + InsertAfterLLL(temp); + } + else + { + PushLLL(temp); + } + +} + +BOOLEAN IsLeafGeneralTree(GeneralTree * tree) +{ + return (tree->manager_general_trees != NULL); +} + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)(void *)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)(void *)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)(void *)temp->right)); + } + } + +} \ No newline at end of file diff --git a/28 - Heap/General.h b/28 - Heap/General.h new file mode 100644 index 0000000..6270809 --- /dev/null +++ b/28 - Heap/General.h @@ -0,0 +1,274 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +struct BinaryTree +{ + Data_Type info; + struct BinaryTree * right; + struct BinaryTree * left; +}; + +struct ThirdTree +{ + Data_Type info; + struct ThirdTree * right; + struct ThirdTree * left; + struct ThirdTree * middle; +}; + +struct GeneralTree +{ + Data_Type info; + struct LLL * manager_general_trees; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; +typedef struct BinaryTree BinaryTree; +typedef struct ThirdTree ThirdTree; +typedef struct GeneralTree GeneralTree; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); +BOOLEAN IsEmptyQueue(queue * q); +// -------------------------------------- LLL ------------------------------------------- +void InsertAfterLLL(LLL * manager); +void PushLLL(LLL ** manager); +void PopLLL(LLL ** manager); +void DeleteLLL(LLL * manager); +LLL * GetLoactionLLL(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ---------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------------------- +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** tree); +void AddLeftAfterBinaryTree(BinaryTree * tree); +void AddRightAfterBinaryTree(BinaryTree * tree); +BOOLEAN IsLeafBinaryTree(BinaryTree * tree); +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** tree); +void AddLeftAfterThirdTree(ThirdTree * tree); +void AddRightAfterThirdTree(ThirdTree * tree); +void AddMiddleAfterThirdTree(ThirdTree * tree); +BOOLEAN IsLeafThirdTree(ThirdTree * tree); +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** tree); +void AddAfterGeneralTree(GeneralTree * tree); +BOOLEAN IsLeafGeneralTree(GeneralTree * tree); +// -------------------------------------- Funcations Tree ----------------------------------- +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)); \ No newline at end of file diff --git a/29 - Graphs/General.c b/29 - Graphs/General.c new file mode 100644 index 0000000..af9109b --- /dev/null +++ b/29 - Graphs/General.c @@ -0,0 +1,2830 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + unsigned int counter; + Data_Type item; + if (((*q).items) == ONE) + { + item = (*q).values[ZERO]; + free((*q).values); + (*q).items--; + } + else if (((*q).items) > ONE) + { + item = (*q).values[ZERO]; + (*q).items--; + for (counter = ZERO; counter < (*q).items; counter++) + { + (*q).values[counter] = (*q).values[counter + ONE]; + } + (*q).values = (Data_Type *)realloc((*q).values, (*q).items * sizeof(Data_Type)); + } + + return (item); +} + +BOOLEAN IsEmptyQueue(queue * q) +{ + return (!q->items); +} +// ------------------------------------------ LLL --------------------------------------- +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterLLL(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushLLL(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopLLL(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteAfterList +// --------------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteAfterLLL(LLL * manager) +{ + LLL * con_ls = manager->next->next; + free(manager->next); + manager->next = con_ls; +} + +LLL * GetLoactionLLL(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next != ptr_sm) + temp = temp->row_next; + + return (temp); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next != ptr_sm) + temp = temp->col_next; + + return (temp); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} + +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** root) +{ + *root = (BinaryTree *)malloc(sizeof(BinaryTree)); + (*root)->left = NULL; + (*root)->right = NULL; +} + +void AddLeftAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +BOOLEAN IsLeafBinaryTree(BinaryTree * tree) +{ + return (!(tree->left && tree->right)); +} + +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** root) +{ + *root = (ThirdTree *)malloc(sizeof(ThirdTree)); + (*root)->left = NULL; + (*root)->right = NULL; + (*root)->middle = NULL; +} + +void AddLeftAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +void AddMiddleAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->middle = tree->middle; + tree->middle = new_node; +} + +BOOLEAN IsLeafThirdTree(ThirdTree * tree) +{ + return (!(tree->left && tree->right && tree->middle)); +} + +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** root) +{ + *root = (GeneralTree *)malloc(sizeof(GeneralTree)); + (*root)->manager_general_trees = NULL; +} + +void AddAfterGeneralTree(GeneralTree * tree) +{ + GeneralTree * new_node = (GeneralTree *)malloc(sizeof(GeneralTree)); + LLL * temp = tree->manager_general_trees; + if (temp != NULL) + { + while (temp->next != NULL) + { + temp = temp->next; + } + InsertAfterLLL(temp); + } + else + { + PushLLL(temp); + } + +} + +BOOLEAN IsLeafGeneralTree(GeneralTree * tree) +{ + return (tree->manager_general_trees != NULL); +} + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)(void *)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)(void *)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)(void *)temp->right)); + } + } + +} + +// -------------------------------------- Graph ----------------------------------------- +//--------------------------------------------------------------------------------------- +// JoinGraphDirectedWt +// ------------------- +// +// General : the function adds an arc between two items with direction +// and weight to the arc +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be added +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphDirectedWt(Graph * a, Graph * b, int weight) +{ + Arc * arc = (Arc *)malloc(sizeof(Arc)); + arc->point = b; + arc->weight = weight; + PushLLL(&a->list); + a->list->value = (Data_Type)(void *)arc; +} + +//--------------------------------------------------------------------------------------- +// JoinGraphNonDirectedWt +// ---------------------- +// +// General : adds an arc between two items for both direction with +// weight to it +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be added +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphNonDirectedWt(Graph * a, Graph * b, int weight) +{ + JoinGraphDirectedWt(a, b, weight); + JoinGraphDirectedWt(b, a, weight); +} + +//--------------------------------------------------------------------------------------- +// JoinGraphDirected +// ----------------- +// +// General : adds an arc between two items without weight(single +// direction) +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphDirected(Graph * a, Graph * b) +{ + JoinGraphDirectedWt(a, b, ZERO); +} + +//--------------------------------------------------------------------------------------- +// JoinGraphNonDirected +// -------------------- +// +// General : adds an arc between two items without weight. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphNonDirected(Graph * a, Graph * b) +{ + JoinGraphDirected(a, b); + JoinGraphDirected(b, a); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphDirectedWt +// --------------------- +// +// General : removes an arc between two items in a graph with the +// weight of it(searches for a certain direction). +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// int weight - the weight of the arc to be removed. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphDirectedWt(Graph * a, Graph * b, int weight) +{ + LLL * temp = a->list; + if (temp == NULL) + { + + } + else if (((Arc *)temp->value.pointer)->point == b && + ((Arc *)temp->value.pointer)->weight == weight) + { + PopLLL(&a->list); + } + else + { + while (temp->next && ((Arc *)temp->next->value.pointer)->point != b || + ((Arc *)temp->next->value.pointer)->weight != weight) + { + temp = temp->next; + } + if (temp->next) + { + DeleteAfterLLL(temp); + } + } +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphDirected +// ------------------- +// +// General : function removes arc between two items in a graph with a +// direction between them. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphDirected(Graph * a, Graph * b) +{ + RemoveGraphDirectedWt(a, b, ZERO); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphNonDirected +// ---------------------- +// +// General : function removes arc between two items in a graph, +// when the arc doesnt have weight to it. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphNonDirected(Graph * a, Graph * b) +{ + RemoveGraphDirected(a ,b); + RemoveGraphDirected(b, a); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphNonDirectedWt +// ------------------------ +// +// General : the function removes a specific arc with a specific weight +// to it +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be removed +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphNonDirectedWt(Graph * a, Graph * b, int weight) +{ + RemoveGraphDirectedWt(a ,b, weight); + RemoveGraphDirectedWt(b, a, weight); +} + +//--------------------------------------------------------------------------------------- +// AdjacentGraph +// ------------- +// +// General : Checks if a has direct access to b. +// +// Parameters : Graph * a - item to check if it is next to b +// Graph * b - item to check if it is next to a. +// +// Return Value : if Adjacent graph or not (true/false). +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +BOOLEAN AdjacentGraph(Graph * a, Graph * b) +{ + LLL * temp = a->list; + while (temp && ((Arc *)temp->next->value.pointer)->point != b) + { + temp = temp->next; + } + return (((Arc *)temp->next->value.pointer)->point == b); +} \ No newline at end of file diff --git a/29 - Graphs/General.h b/29 - Graphs/General.h new file mode 100644 index 0000000..52e3f53 --- /dev/null +++ b/29 - Graphs/General.h @@ -0,0 +1,298 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +struct BinaryTree +{ + Data_Type info; + struct BinaryTree * right; + struct BinaryTree * left; +}; + +struct ThirdTree +{ + Data_Type info; + struct ThirdTree * right; + struct ThirdTree * left; + struct ThirdTree * middle; +}; + +struct GeneralTree +{ + Data_Type info; + struct LLL * manager_general_trees; +}; + +struct Graph +{ + Data_Type info; + struct LLL * list; +}; + +struct Arc +{ + int weight; + struct Graph * point; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; +typedef struct BinaryTree BinaryTree; +typedef struct ThirdTree ThirdTree; +typedef struct GeneralTree GeneralTree; +typedef struct Graph Graph; +typedef struct Arc Arc; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); +BOOLEAN IsEmptyQueue(queue * q); +// -------------------------------------- LLL ------------------------------------------- +void InsertAfterLLL(LLL * manager); +void PushLLL(LLL ** manager); +void PopLLL(LLL ** manager); +void DeleteLLL(LLL * manager); +LLL * GetLoactionLLL(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ---------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------------------- +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** tree); +void AddLeftAfterBinaryTree(BinaryTree * tree); +void AddRightAfterBinaryTree(BinaryTree * tree); +BOOLEAN IsLeafBinaryTree(BinaryTree * tree); +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** tree); +void AddLeftAfterThirdTree(ThirdTree * tree); +void AddRightAfterThirdTree(ThirdTree * tree); +void AddMiddleAfterThirdTree(ThirdTree * tree); +BOOLEAN IsLeafThirdTree(ThirdTree * tree); +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** tree); +void AddAfterGeneralTree(GeneralTree * tree); +BOOLEAN IsLeafGeneralTree(GeneralTree * tree); +// -------------------------------------- Funcations Tree ----------------------------------- +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +// -------------------------------------- Graph ----------------------------------------- +void JoinGraphDirectedWt(Graph * a, Graph * b, int weight); +void JoinGraphNonDirectedWt(Graph * a, Graph * b, int weight); +void JoinGraphDirected(Graph * a, Graph * b); +void JoinGraphNonDirected(Graph * a, Graph * b); +void RemoveGraphDirectedWt(Graph * a, Graph * b, int weight); +void RemoveGraphDirected(Graph * a, Graph * b); +void RemoveGraphNonDirected(Graph * a, Graph * b); +void RemoveGraphNonDirectedWt(Graph * a, Graph * b, int weight); +BOOLEAN AdjacentGraph(Graph * a, Graph * b); \ No newline at end of file diff --git a/29 - Graphs/a.out b/29 - Graphs/a.out new file mode 100644 index 0000000..8588243 Binary files /dev/null and b/29 - Graphs/a.out differ diff --git a/29 - Graphs/ex1.c b/29 - Graphs/ex1.c new file mode 100644 index 0000000..f950549 --- /dev/null +++ b/29 - Graphs/ex1.c @@ -0,0 +1,255 @@ +#include "General.h" + +struct Graph +{ + Data_Type info; + struct LLL * list; +}; + +struct Arc +{ + int weight; + struct Graph * point; +}; + +typedef struct Graph Graph; +typedef struct Arc Arc; + +//--------------------------------------------------------------------------------------- +// JoinGraphDirectedWt +// ------------------- +// +// General : the function adds an arc between two items with direction +// and weight to the arc +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be added +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphDirectedWt(Graph * a, Graph * b, int weight) +{ + Arc * arc = (Arc *)malloc(sizeof(Arc)); + arc->point = b; + arc->weight = weight; + PushLLL(&a->list); + a->list->value = (Data_Type)(void *)arc; +} + +//--------------------------------------------------------------------------------------- +// JoinGraphNonDirectedWt +// ---------------------- +// +// General : adds an arc between two items for both direction with +// weight to it +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be added +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphNonDirectedWt(Graph * a, Graph * b, int weight) +{ + JoinGraphDirectedWt(a, b, weight); + JoinGraphDirectedWt(b, a, weight); +} + +//--------------------------------------------------------------------------------------- +// JoinGraphDirected +// ----------------- +// +// General : adds an arc between two items without weight(single +// direction) +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphDirected(Graph * a, Graph * b) +{ + JoinGraphDirectedWt(a, b, ZERO); +} + +//--------------------------------------------------------------------------------------- +// JoinGraphNonDirected +// -------------------- +// +// General : adds an arc between two items without weight. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphNonDirected(Graph * a, Graph * b) +{ + JoinGraphDirected(a, b); + JoinGraphDirected(b, a); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphDirectedWt +// --------------------- +// +// General : removes an arc between two items in a graph with the +// weight of it(searches for a certain direction). +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// int weight - the weight of the arc to be removed. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphDirectedWt(Graph * a, Graph * b, int weight) +{ + LLL * temp = a->list; + if (temp == NULL) + { + + } + else if (((Arc *)temp->value.pointer)->point == b && + ((Arc *)temp->value.pointer)->weight == weight) + { + PopLLL(&a->list); + } + else + { + while (temp->next && ((Arc *)temp->next->value.pointer)->point != b || + ((Arc *)temp->next->value.pointer)->weight != weight) + { + temp = temp->next; + } + if (temp->next) + { + DeleteAfterLLL(temp); + } + } +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphDirected +// ------------------- +// +// General : function removes arc between two items in a graph with a +// direction between them. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphDirected(Graph * a, Graph * b) +{ + RemoveGraphDirectedWt(a, b, ZERO); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphNonDirected +// ---------------------- +// +// General : function removes arc between two items in a graph, +// when the arc doesnt have weight to it. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphNonDirected(Graph * a, Graph * b) +{ + RemoveGraphDirected(a ,b); + RemoveGraphDirected(b, a); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphNonDirectedWt +// ------------------------ +// +// General : the function removes a specific arc with a specific weight +// to it +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be removed +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphNonDirectedWt(Graph * a, Graph * b, int weight) +{ + RemoveGraphDirectedWt(a ,b, weight); + RemoveGraphDirectedWt(b, a, weight); +} + +//--------------------------------------------------------------------------------------- +// AdjacentGraph +// ------------- +// +// General : Checks if a has direct access to b. +// +// Parameters : Graph * a - item to check if it is next to b +// Graph * b - item to check if it is next to a. +// +// Return Value : if Adjacent graph or not (true/false). +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +BOOLEAN AdjacentGraph(Graph * a, Graph * b) +{ + LLL * temp = a->list; + while (temp && ((Arc *)temp->next->value.pointer)->point != b) + { + temp = temp->next; + } + return (((Arc *)temp->next->value.pointer)->point == b); +} + +void main(void) +{ + +} diff --git a/29 - Graphs/ex2.c b/29 - Graphs/ex2.c new file mode 100644 index 0000000..4e55699 --- /dev/null +++ b/29 - Graphs/ex2.c @@ -0,0 +1,41 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// DoesExistPath +// ------------- +// +// General : Check if have path from point a to point b in graph with number of arc +// +// Parameters : Graph * a - the first item. +// Graph * b - the second item. +// unsigned int number_road - the number of arc. +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +unsigned int DoesExistPath(Graph * start_point, Graph * end_point, unsigned int number_road) +{ + LLL * temp; + if (!number_road) + { + return (start_point == end_point); + } + else + { + temp = start_point->list; + while (temp && !DoesExistPath(((Arc *)temp->value.pointer)->point, end_point, number_road - ONE)) + { + temp = temp->next; + } + return (!temp); + } +} + +void main(void) +{ + +} \ No newline at end of file diff --git a/3/ex1 b/3/ex1 new file mode 100644 index 0000000..06401bf Binary files /dev/null and b/3/ex1 differ diff --git a/3/ex1.c b/3/ex1.c new file mode 100644 index 0000000..85107b7 --- /dev/null +++ b/3/ex1.c @@ -0,0 +1,49 @@ +#include + +#define SUM(a,b) a + b +#define DIFFERENCE(a,b) a - b +#define MULTIPLICATION(a,b) a * b +#define DIVIDE(a,b) a / b +//--------------------------------------------------------------------------------------- +// Exercise 1 +// ---------- +// +// General : The program do math with two numbers and one operator. +// +// Input : 2 numbers (results), 1 char. +// +// Process : The program checks the operator and process math on 2 numbers. +// +// Output : 1 number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 19.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + float num1, + num2, + result; + char opr; + printf("Enter mathematical expression (a + b): "); + scanf("%f %c %f", &num1, &opr, &num2); + switch (opr) + { + case '-': + result = DIFFERENCE(num1, num2); + break; + case '/': + result = DIVIDE(num1, num2); + break; + case '*': + result = MULTIPLICATION(num1, num2); + break; + default: + result = SUM(num1, num2); + break; + } + + printf("The result: %f\n", result); +} \ No newline at end of file diff --git a/3/ex2.c b/3/ex2.c new file mode 100644 index 0000000..7a10ba7 --- /dev/null +++ b/3/ex2.c @@ -0,0 +1,56 @@ +#include + +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define ONE_HUNDRED_SIXTY 160 +#define ONE_HUNDRED_FIFTY 150 +#define FORTY 40 +#define SIXTY 60 +#define ZERO 0 +#define MAX(a,b) a > b ? a : b +#define MIN(a,b) a < b ? a : b +//--------------------------------------------------------------------------------------- +// Exercise 2 +// ---------- +// +// General : The program checks for the logical results of a championship game in +// the basket ball. +// +// Input : 2 numbers (results). +// +// Process : The program checks for the logical results by conditions. +// +// Output : '1' if is it True, '0' is false. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 19.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short result1, + result2, + max_result, + min_result, + difference; + BOOLEAN answer = FALSE; + + printf("Enter 2 numbers: "); + scanf("%hu%hu", &result1, &result2); + + max_result = MAX(result1, result2); + min_result = MIN(result1, result2); + difference = max_result - min_result; + + if ((max_result <= ONE_HUNDRED_FIFTY) && + (min_result >= FORTY) && + (difference <= SIXTY) && + (difference > ZERO)) + { + answer = TRUE; + } + + printf("The answer: %hu\n", answer); +} \ No newline at end of file diff --git a/3/ex2_6.c b/3/ex2_6.c new file mode 100644 index 0000000..4e6a0db --- /dev/null +++ b/3/ex2_6.c @@ -0,0 +1,52 @@ +#include +#define ONE 1 +#define FOUR 4 +#define ZERO 0 +#define TWO 2 +//--------------------------------------------------------------------------------------- +// Exercise 2_6 +// ------------ +// +// General : The program performs the formula of the roots. +// +// Input : 3 numbers (a,b,c from ax^2+bx+c). +// +// Process : The program performs the formula of the roots. +// +// Output : 2 numbers (sign and result). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 19.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + short num_a, + num_b, + num_c, + delta, + sign = ONE, + result = ZERO; + + printf("Enter a,b,c from ax^2+bx+c: "); + scanf("%hd%hd%hd", &num_a, &num_b, &num_c); + + // Calculate delta + delta = (num_b * num_b) - (FOUR * num_a * num_c); + result = -num_b / TWO * num_a; + if (delta > ZERO) + { + sign = TWO; + result = ZERO; + } + if (delta < ZERO) + { + sign = ZERO; + result = ZERO; + } + + printf("If you got sign '0' - not result\n\ +If you got sign '1' - one result\n\ +If you got sign '2' - two results:\nSign: %hd\nResult: %hd\n", sign, result); +} \ No newline at end of file diff --git a/3/ex2_7 b/3/ex2_7 new file mode 100644 index 0000000..b344e94 Binary files /dev/null and b/3/ex2_7 differ diff --git a/3/ex2_7.c b/3/ex2_7.c new file mode 100644 index 0000000..826e553 --- /dev/null +++ b/3/ex2_7.c @@ -0,0 +1,44 @@ +#include +#define ONE 1 +#define TWO 2 +//--------------------------------------------------------------------------------------- +// Exercise 2_7 +// ------------ +// +// General : The program change letters by one depends on situation. +// +// Input : 2 letters. +// +// Process : The program checks if the first letter is before the second in +// the ABC and acts accordingly. +// +// Output : '1' if is it True, '0' is false. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 19.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + char a, + b, + final_a, + final_b, + opr = '+'; + + printf("Enter 2 chars: "); + scanf("%c%c", &a, &b); + + final_a = a + ONE; + final_b = b - ONE; + + if (a > b) + { + final_a -= TWO; + final_b += TWO; + opr = '-'; + } + + printf("%c %c %c\n", final_a, opr, final_b); +} diff --git a/3/ex3 b/3/ex3 new file mode 100644 index 0000000..cd37ec2 Binary files /dev/null and b/3/ex3 differ diff --git a/3/ex3.c b/3/ex3.c new file mode 100644 index 0000000..cd7dc75 --- /dev/null +++ b/3/ex3.c @@ -0,0 +1,46 @@ +#include + +#define TEN_THOUSAND 10000 +#define ONE_HUNDRED 100 +//--------------------------------------------------------------------------------------- +// Exercise 3 +// ---------- +// +// General : The program print the date as a sentence. +// +// Input : 1 number. +// +// Process : The program take the year, month and day from the input and put in +// a sentence. +// +// Output : A sentence. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 19.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + int date, + temp_date; + short day, + month, + year; + + printf("Enter date: "); + scanf("%d", &date); + + temp_date = date; + + year = temp_date - (temp_date / TEN_THOUSAND) * TEN_THOUSAND; + temp_date /= TEN_THOUSAND; + + month = temp_date - (temp_date / ONE_HUNDRED) * ONE_HUNDRED; + temp_date /= ONE_HUNDRED; + + day = temp_date; + + printf("The year is %hd, the month is %hd, and the day is %hd\n", year, month, day); + +} \ No newline at end of file diff --git a/3/ex4 b/3/ex4 new file mode 100644 index 0000000..fb2cd2e Binary files /dev/null and b/3/ex4 differ diff --git a/3/ex4.c b/3/ex4.c new file mode 100644 index 0000000..c4dfa07 --- /dev/null +++ b/3/ex4.c @@ -0,0 +1,44 @@ +#include + +#define TEN_THOUSAND 10000 +#define ONE_HUNDRED 100 +#define MONTHS 12 +#define THREE 3 +//--------------------------------------------------------------------------------------- +// Exercise 4 +// ---------- +// +// General : The program print the period by month in date. +// +// Input : 1 number. +// +// Process : The program take the month, and check which belongs to period. +// +// Output : A sentence. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 19.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + int date, + temp_date; + short month; + + printf("Enter date: "); + scanf("%d", &date); + + temp_date = date / TEN_THOUSAND; + month = temp_date - (temp_date / ONE_HUNDRED) * ONE_HUNDRED; + + month %= MONTHS; + month /= THREE; + + printf("If you got '0' this WINTER \n\ +If you got '1' this SPRING \n\ +If you got '2' this SUMMER \n\ +If you got '3' this AUTUMN \n\ +You got: %hd\n", month); +} diff --git a/3/part2.c b/3/part2.c new file mode 100644 index 0000000..a016f90 --- /dev/null +++ b/3/part2.c @@ -0,0 +1,55 @@ +#define ABS(x) x * (((2 * x) + 1) % 2) +#define MAX(x, y) ((x+y) + ABS(x-y))/2 +#define TWO 2 +#define THREE 3 +#define ZERO 0 + + +// Part 2 exercise 2 +void main(void) +{ + short x_king, + y_king, + x_zariah, + y_zariah, + answer; + + // If answer == '0' is TRUE, else is FALSE + if ((x_king - x_zariah) * (y_king - y_zariah) == ZERO){} +} + +// Part 2 exercise 3 +void main(void) +{ + short x_king, + y_king, + x_runner, + y_runner, + answer; + + // If answer == '0' is TRUE, else is FALSE + if (ABS(x_king - x_runner) - ABS(y_king - y_runner) == ZERO){} +} + +// Part 2 exercise 4 +void main(void) +{ + short x_king, + y_king, + x_horseman, + y_horseman, + answer; + + // If answer == '0' is TRUE, else is FALSE + if (ABS(x_king - x_horseman) + ABS(y_king - y_horseman) - THREE == ZERO){} +} + +// Part 2 exercise 5 +void main(void) +{ + short a, + b, + answer; + + answer = ((a+b) + ABS(a-b))/TWO; +} diff --git a/30 - Warshall/General.c b/30 - Warshall/General.c new file mode 100644 index 0000000..af9109b --- /dev/null +++ b/30 - Warshall/General.c @@ -0,0 +1,2830 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + unsigned int counter; + Data_Type item; + if (((*q).items) == ONE) + { + item = (*q).values[ZERO]; + free((*q).values); + (*q).items--; + } + else if (((*q).items) > ONE) + { + item = (*q).values[ZERO]; + (*q).items--; + for (counter = ZERO; counter < (*q).items; counter++) + { + (*q).values[counter] = (*q).values[counter + ONE]; + } + (*q).values = (Data_Type *)realloc((*q).values, (*q).items * sizeof(Data_Type)); + } + + return (item); +} + +BOOLEAN IsEmptyQueue(queue * q) +{ + return (!q->items); +} +// ------------------------------------------ LLL --------------------------------------- +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterLLL(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushLLL(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopLLL(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteAfterList +// --------------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteAfterLLL(LLL * manager) +{ + LLL * con_ls = manager->next->next; + free(manager->next); + manager->next = con_ls; +} + +LLL * GetLoactionLLL(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next != ptr_sm) + temp = temp->row_next; + + return (temp); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next != ptr_sm) + temp = temp->col_next; + + return (temp); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} + +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** root) +{ + *root = (BinaryTree *)malloc(sizeof(BinaryTree)); + (*root)->left = NULL; + (*root)->right = NULL; +} + +void AddLeftAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +BOOLEAN IsLeafBinaryTree(BinaryTree * tree) +{ + return (!(tree->left && tree->right)); +} + +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** root) +{ + *root = (ThirdTree *)malloc(sizeof(ThirdTree)); + (*root)->left = NULL; + (*root)->right = NULL; + (*root)->middle = NULL; +} + +void AddLeftAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +void AddMiddleAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->middle = tree->middle; + tree->middle = new_node; +} + +BOOLEAN IsLeafThirdTree(ThirdTree * tree) +{ + return (!(tree->left && tree->right && tree->middle)); +} + +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** root) +{ + *root = (GeneralTree *)malloc(sizeof(GeneralTree)); + (*root)->manager_general_trees = NULL; +} + +void AddAfterGeneralTree(GeneralTree * tree) +{ + GeneralTree * new_node = (GeneralTree *)malloc(sizeof(GeneralTree)); + LLL * temp = tree->manager_general_trees; + if (temp != NULL) + { + while (temp->next != NULL) + { + temp = temp->next; + } + InsertAfterLLL(temp); + } + else + { + PushLLL(temp); + } + +} + +BOOLEAN IsLeafGeneralTree(GeneralTree * tree) +{ + return (tree->manager_general_trees != NULL); +} + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)(void *)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)(void *)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)(void *)temp->right)); + } + } + +} + +// -------------------------------------- Graph ----------------------------------------- +//--------------------------------------------------------------------------------------- +// JoinGraphDirectedWt +// ------------------- +// +// General : the function adds an arc between two items with direction +// and weight to the arc +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be added +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphDirectedWt(Graph * a, Graph * b, int weight) +{ + Arc * arc = (Arc *)malloc(sizeof(Arc)); + arc->point = b; + arc->weight = weight; + PushLLL(&a->list); + a->list->value = (Data_Type)(void *)arc; +} + +//--------------------------------------------------------------------------------------- +// JoinGraphNonDirectedWt +// ---------------------- +// +// General : adds an arc between two items for both direction with +// weight to it +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be added +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphNonDirectedWt(Graph * a, Graph * b, int weight) +{ + JoinGraphDirectedWt(a, b, weight); + JoinGraphDirectedWt(b, a, weight); +} + +//--------------------------------------------------------------------------------------- +// JoinGraphDirected +// ----------------- +// +// General : adds an arc between two items without weight(single +// direction) +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphDirected(Graph * a, Graph * b) +{ + JoinGraphDirectedWt(a, b, ZERO); +} + +//--------------------------------------------------------------------------------------- +// JoinGraphNonDirected +// -------------------- +// +// General : adds an arc between two items without weight. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphNonDirected(Graph * a, Graph * b) +{ + JoinGraphDirected(a, b); + JoinGraphDirected(b, a); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphDirectedWt +// --------------------- +// +// General : removes an arc between two items in a graph with the +// weight of it(searches for a certain direction). +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// int weight - the weight of the arc to be removed. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphDirectedWt(Graph * a, Graph * b, int weight) +{ + LLL * temp = a->list; + if (temp == NULL) + { + + } + else if (((Arc *)temp->value.pointer)->point == b && + ((Arc *)temp->value.pointer)->weight == weight) + { + PopLLL(&a->list); + } + else + { + while (temp->next && ((Arc *)temp->next->value.pointer)->point != b || + ((Arc *)temp->next->value.pointer)->weight != weight) + { + temp = temp->next; + } + if (temp->next) + { + DeleteAfterLLL(temp); + } + } +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphDirected +// ------------------- +// +// General : function removes arc between two items in a graph with a +// direction between them. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphDirected(Graph * a, Graph * b) +{ + RemoveGraphDirectedWt(a, b, ZERO); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphNonDirected +// ---------------------- +// +// General : function removes arc between two items in a graph, +// when the arc doesnt have weight to it. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphNonDirected(Graph * a, Graph * b) +{ + RemoveGraphDirected(a ,b); + RemoveGraphDirected(b, a); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphNonDirectedWt +// ------------------------ +// +// General : the function removes a specific arc with a specific weight +// to it +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be removed +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphNonDirectedWt(Graph * a, Graph * b, int weight) +{ + RemoveGraphDirectedWt(a ,b, weight); + RemoveGraphDirectedWt(b, a, weight); +} + +//--------------------------------------------------------------------------------------- +// AdjacentGraph +// ------------- +// +// General : Checks if a has direct access to b. +// +// Parameters : Graph * a - item to check if it is next to b +// Graph * b - item to check if it is next to a. +// +// Return Value : if Adjacent graph or not (true/false). +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +BOOLEAN AdjacentGraph(Graph * a, Graph * b) +{ + LLL * temp = a->list; + while (temp && ((Arc *)temp->next->value.pointer)->point != b) + { + temp = temp->next; + } + return (((Arc *)temp->next->value.pointer)->point == b); +} \ No newline at end of file diff --git a/30 - Warshall/General.h b/30 - Warshall/General.h new file mode 100644 index 0000000..52e3f53 --- /dev/null +++ b/30 - Warshall/General.h @@ -0,0 +1,298 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +struct BinaryTree +{ + Data_Type info; + struct BinaryTree * right; + struct BinaryTree * left; +}; + +struct ThirdTree +{ + Data_Type info; + struct ThirdTree * right; + struct ThirdTree * left; + struct ThirdTree * middle; +}; + +struct GeneralTree +{ + Data_Type info; + struct LLL * manager_general_trees; +}; + +struct Graph +{ + Data_Type info; + struct LLL * list; +}; + +struct Arc +{ + int weight; + struct Graph * point; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; +typedef struct BinaryTree BinaryTree; +typedef struct ThirdTree ThirdTree; +typedef struct GeneralTree GeneralTree; +typedef struct Graph Graph; +typedef struct Arc Arc; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); +BOOLEAN IsEmptyQueue(queue * q); +// -------------------------------------- LLL ------------------------------------------- +void InsertAfterLLL(LLL * manager); +void PushLLL(LLL ** manager); +void PopLLL(LLL ** manager); +void DeleteLLL(LLL * manager); +LLL * GetLoactionLLL(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ---------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------------------- +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** tree); +void AddLeftAfterBinaryTree(BinaryTree * tree); +void AddRightAfterBinaryTree(BinaryTree * tree); +BOOLEAN IsLeafBinaryTree(BinaryTree * tree); +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** tree); +void AddLeftAfterThirdTree(ThirdTree * tree); +void AddRightAfterThirdTree(ThirdTree * tree); +void AddMiddleAfterThirdTree(ThirdTree * tree); +BOOLEAN IsLeafThirdTree(ThirdTree * tree); +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** tree); +void AddAfterGeneralTree(GeneralTree * tree); +BOOLEAN IsLeafGeneralTree(GeneralTree * tree); +// -------------------------------------- Funcations Tree ----------------------------------- +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +// -------------------------------------- Graph ----------------------------------------- +void JoinGraphDirectedWt(Graph * a, Graph * b, int weight); +void JoinGraphNonDirectedWt(Graph * a, Graph * b, int weight); +void JoinGraphDirected(Graph * a, Graph * b); +void JoinGraphNonDirected(Graph * a, Graph * b); +void RemoveGraphDirectedWt(Graph * a, Graph * b, int weight); +void RemoveGraphDirected(Graph * a, Graph * b); +void RemoveGraphNonDirected(Graph * a, Graph * b); +void RemoveGraphNonDirectedWt(Graph * a, Graph * b, int weight); +BOOLEAN AdjacentGraph(Graph * a, Graph * b); \ No newline at end of file diff --git a/30 - Warshall/a.out b/30 - Warshall/a.out new file mode 100644 index 0000000..0bb54c4 Binary files /dev/null and b/30 - Warshall/a.out differ diff --git a/30 - Warshall/ex1.c b/30 - Warshall/ex1.c new file mode 100644 index 0000000..a0828a1 --- /dev/null +++ b/30 - Warshall/ex1.c @@ -0,0 +1,26 @@ +#include "General.h" + +void MatrixMultiplication(Data_Type * mat1, Data_Type * mat2, unsigned int mat1_row_size, unsigned int mat1_col_size, + unsigned int mat2_row_size, unsigned int mat2_col_size, + Data_Type ** new_mat, unsigned int * new_mat_row_size, unsigned int * new_mat_col_size) +{ + *new_mat_row_size = MAX(mat1_row_size, mat2_row_size); + *new_mat_col_size = MAX(mat1_col_size, mat2_col_size); + *new_mat = (Data_Type *)malloc((*new_mat_row_size) * (*new_mat_col_size)); + unsigned int counter_row_new_mat, counter_col_new_mat; + for (counter_row_new_mat = ZERO; counter_row_new_mat < *new_mat_row_size; counter_row_new_mat++) + { + for (counter_col_new_mat = ZERO; counter_col_new_mat < *new_mat_col_size; counter_col_new_mat++) + { + + } + + } + +} + +void main(void) +{ + //Data_Type mat[100][100] +} + diff --git a/4/ex1 b/4/ex1 new file mode 100644 index 0000000..69afbc8 Binary files /dev/null and b/4/ex1 differ diff --git a/4/ex1.c b/4/ex1.c new file mode 100644 index 0000000..edb5d42 --- /dev/null +++ b/4/ex1.c @@ -0,0 +1,45 @@ +#include + +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +//--------------------------------------------------------------------------------------- +// Exercise 1 +// ---------- +// +// General : The program checks if there is at least one common digit between 2 numbers. +// +// Input : 2 numbers. +// +// Process : The program checks check every digit of 2 numbers. +// +// Output : 0(FALSE), 1(TRUE). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 23.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + short num1, + num2, + temp_num1, + temp_num2, + digit_num1, + digit_num2; + BOOLEAN answer = FALSE; + + printf("Enter 2 numbers: "); + scanf("%hd%hd", &num1, &num2); + + for (temp_num1 = num1, temp_num2 = num2; temp_num1 && !answer; + (!temp_num2) ? + temp_num2 = num2, temp_num1 /= TEN: + (temp_num1 % TEN == temp_num2 % TEN) ? + answer = TRUE : + (temp_num2 /= TEN)); + + printf("The answer is: %hu\n", answer); +} \ No newline at end of file diff --git a/4/ex1.c.save b/4/ex1.c.save new file mode 100644 index 0000000..c649b7b --- /dev/null +++ b/4/ex1.c.save @@ -0,0 +1,45 @@ +#include + +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +//--------------------------------------------------------------------------------------- +// Exercise 1 +// ---------- +mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm// +// General : The program checks if there is at least one common digit between 2 numbers. +// +// Input : 2 numbers. +// +// Process : The program checks check every digit of 2 numbers. +// +// Output : 0(FALSE), 1(TRUE). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 23.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + short num1, + num2, + temp_num1, + temp_num2, + digit_num1, + digit_num2; + BOOLEAN answer = FALSE; + + printf("Enter 2 numbers: "); + scanf("%hd%hd", &num1, &num2); + + for (temp_num1 = num1, temp_num2 = num2; temp_num1 && !answer; + (!temp_num2) ? + temp_num2 = num2, temp_num1 /= TEN: + (temp_num1 % TEN == temp_num2 % TEN) ? + answer = TRUE : + (temp_num2 /= TEN)); + + printf("The answer is: %hu\n", answer); +} diff --git a/4/ex2.c b/4/ex2.c new file mode 100644 index 0000000..ae139cf --- /dev/null +++ b/4/ex2.c @@ -0,0 +1,17 @@ +#include + +#define EOD -1 + +void main(void) +{ + short num = 0, + count = 0, + sum = 0; + + for (count = 0; num != EOD; count++) + { + printf("Enter number (-1 to stop): "); + scanf("%hd", &num); + sum += num; + } +} \ No newline at end of file diff --git a/4/ex3 b/4/ex3 new file mode 100644 index 0000000..16c5db3 Binary files /dev/null and b/4/ex3 differ diff --git a/4/ex3.c b/4/ex3.c new file mode 100644 index 0000000..dfa0031 --- /dev/null +++ b/4/ex3.c @@ -0,0 +1,32 @@ +#include + +#define THREE 3 +//--------------------------------------------------------------------------------------- +// Exercise 3 +// ---------- +// +// General : The program prints the smallest power of 3 larger than the input. +// +// Input : Number. +// +// Process : The program check all power of 3 until that is smaller than input. +// +// Output : Number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 23.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short num; + unsigned int result; + + printf("Enter number: "); + scanf("%hd", &num); + for (result = THREE; num > result; result *= THREE); + + printf("%d\n", result); + +} \ No newline at end of file diff --git a/4/ex4 b/4/ex4 new file mode 100644 index 0000000..9e85b8f Binary files /dev/null and b/4/ex4 differ diff --git a/4/ex4.c b/4/ex4.c new file mode 100644 index 0000000..0e3c6ee --- /dev/null +++ b/4/ex4.c @@ -0,0 +1,44 @@ +#include + +#define MAX(a,b) (a > b) ? a : b +#define MIN(a,b) (a < b) ? a : b +#define ONE 1 +#define ZERO 0 +#define TEN 10 +//--------------------------------------------------------------------------------------- +// Exercise 4 +// ---------- +// +// General : The program receives 10 numbers and prints the largest +// number and the second largest number. +// +// Input : 10 numbers. +// +// Process : The program loop for input and check max and second max . +// +// Output : 2 number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 23.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned int num, + counter, + temp, + max_max = ZERO, + min_max = ZERO; + + + for (counter = ZERO; counter < TEN; counter++) + { + printf("Enter number: "); + scanf("%d", &num); + (num > max_max) ? (min_max = max_max, max_max = num) : (min_max = MAX(min_max, num)); + } + + printf("Max_Max: %d\nMin_Max: %d\n", max_max, min_max); + +} \ No newline at end of file diff --git a/4/ex5 b/4/ex5 new file mode 100644 index 0000000..c0465d9 Binary files /dev/null and b/4/ex5 differ diff --git a/4/ex5.c b/4/ex5.c new file mode 100644 index 0000000..6da282c --- /dev/null +++ b/4/ex5.c @@ -0,0 +1,46 @@ +#include + +#define MAX(a, b) (a > b) ? a : b +#define MIN(a, b) (a < b) ? a : b +#define ZERO 0 +#define TEN 10 +#define MAXIMUM_SHORT 32767 +//--------------------------------------------------------------------------------------- +// Exercise 5 +// ---------- +// +// General : The program prints the largest, smallest organ, and the sum of the series. +// On all series.. +// +// Input : None +// +// Process : The program do sum of series and take the max mnuber and min number. +// +// Output : Max, Min, Sum, for evert series. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 23.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + long long series = 386946543216; // example for series (start from right) + short value, + sum = ZERO, + amount_values, + amount_series; + + unsigned short max = ZERO; + short min = MAXIMUM_SHORT; + + for (amount_values = series % TEN, series /= TEN; amount_values; + series /= TEN, amount_values--, (!amount_values) ? + (printf("MAX: %hd\nMIN: %hd\nSUM: %hd\n", max, min, sum), amount_values = series % TEN, sum = ZERO, max = ZERO, min = MAXIMUM_SHORT, series /= TEN) : ZERO) + { + value = series % TEN; + max = MAX(value, (signed short)max); + min = MIN(value, (signed short)min); + sum += value; + } +} \ No newline at end of file diff --git a/4/ex6 b/4/ex6 new file mode 100644 index 0000000..0cb7c21 Binary files /dev/null and b/4/ex6 differ diff --git a/4/ex6.c b/4/ex6.c new file mode 100644 index 0000000..a49e376 --- /dev/null +++ b/4/ex6.c @@ -0,0 +1,39 @@ +#include + +#define MIN(a,b) (a < b) ? a : b +#define THOUSAND 1000 +#define TWO 2 +//--------------------------------------------------------------------------------------- +// Exercise 6 +// ---------- +// +// General : The program prints positive integers that divide the two input +// numbers in the field up to 1000. +// +// Input : Two numbers that don't divide each other. +// +// Process : The program do a loop. +// +// Output : Positive integers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 23.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short num1, + num2, + counter; + + printf("Enter 2 numbers: "); + scanf("%hu%hu", &num1, &num2); + + for (counter = ((MIN(num2, MIN(num1, THOUSAND))) / TWO); counter; counter--) + { + if (!((num1 % counter) + (num2 % counter))) + printf("%hu\n", counter); + } + +} \ No newline at end of file diff --git a/4/ex7 b/4/ex7 new file mode 100644 index 0000000..bf0cb16 Binary files /dev/null and b/4/ex7 differ diff --git a/4/ex7.c b/4/ex7.c new file mode 100644 index 0000000..db74c7e --- /dev/null +++ b/4/ex7.c @@ -0,0 +1,41 @@ +#include + +#define ZERO 0 +//--------------------------------------------------------------------------------------- +// Exercise 7 +// ---------- +// +// General : The program prints the minimum number of tiles required to +// line the length of the line. +// +// Input : A(number), B(number), N(number). +// +// Process : The program דubtracts A by N until the remainder of B by N is 0. +// +// Output : Count of A and count of B. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 23.09.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short a, + b, + n, + counter, + count_a = ZERO, + count_b = ZERO; + + printf("Enter A: "); + scanf("%hu", &a); + printf("Enter B: "); + scanf("%hu", &b); + printf("Enter N: "); + scanf("%hu", &n); + + for (counter = n; counter; (!(counter % b)) ? (count_b = counter / b, counter %= b) : (count_a++, counter -= a)); + + printf("Count A: %hu\nCount B: %hu\n", count_a, count_b); +} \ No newline at end of file diff --git a/5/ex1 b/5/ex1 new file mode 100644 index 0000000..cacd4cd Binary files /dev/null and b/5/ex1 differ diff --git a/5/ex1.c b/5/ex1.c new file mode 100644 index 0000000..9d1b24a --- /dev/null +++ b/5/ex1.c @@ -0,0 +1,58 @@ +#include +#include "IdanLib.c" + + +int DifferentDates2(int date1, int date2) +{ + int temp_date1 = date1, + temp_date2 = date2, + new_date = 0; + short days_date1, + days_date2, + months_date1, + months_date2; + BOOLEAN negative; + + days_date1 = temp_date1 % 100; + days_date2 = temp_date2 % 100; + temp_date1 /= 100; + temp_date2 /= 100; + months_date1 = temp_date1 % 100; + months_date2 = temp_date2 % 100; + temp_date1 /= 100; + temp_date2 /= 100; + + days_date1 -= days_date2; + months_date1 -= months_date2; + temp_date1 -= temp_date2; + + negative = (months_date1 < 0); + months_date1 += (negative * 12); + temp_date1 += (negative * -1); + + negative = (days_date1 < 0); + days_date1 += (negative * 30); + months_date1 += (negative * -1); + + negative = TAKE_SIGNED(temp_date1); + + new_date = temp_date1; + new_date *= 100; + new_date += (months_date1 * (signed short)negative); + new_date *= 100; + new_date += (days_date1 * (signed short)negative); + + return (new_date); + +} + + +void main(void) +{ + int date1, date2, new_date; + printf("Enter 2 dates (yymmdd): "); + scanf("%d%d", &date1, &date2); + new_date = DifferentDates2(date1, date2); + printf("%d\n", new_date); + +} \ No newline at end of file diff --git a/5/ex3 b/5/ex3 new file mode 100644 index 0000000..2ee29a2 Binary files /dev/null and b/5/ex3 differ diff --git a/5/ex3.c b/5/ex3.c new file mode 100644 index 0000000..02c1d3f --- /dev/null +++ b/5/ex3.c @@ -0,0 +1,12 @@ +#include +#include "IdanLib.c" + + +void main(void) +{ + float num, base; + printf("Enter number and base: "); + scanf("%f%f", &num, &base); + num = ConvertBaseToDeciaml(num, base, 6); + printf("%f\n", num); +} \ No newline at end of file diff --git a/6/IdanLib b/6/IdanLib new file mode 100644 index 0000000..996354c Binary files /dev/null and b/6/IdanLib differ diff --git a/6/IdanLib.h b/6/IdanLib.h new file mode 100644 index 0000000..a9ec6c9 --- /dev/null +++ b/6/IdanLib.h @@ -0,0 +1,1190 @@ +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define TAKE_SIGNED(x) (((2 * (x)) + 1) % 2) +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeYearsToMonths(short years) +{ + int days = years * MONTHS_IN_YEAR; + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeMonthsToDays(short months) +{ + int days = months * DAYS_IN_MONTH; + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDateToDays(int date) +{ + short years, + month; + int days; + + years = date % ONE_THOSEND; + date /= ONE_THOSEND; + month = date % ONE_HUNDRED; + date /= ONE_HUNDRED; + days = date; + month += ChangeYearsToMonths(years); + days += ChangeMonthsToDays(month); + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDaysToMonths(int days) +{ + int months = days / DAYS_IN_MONTH; + return months; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeMonthsToYears(int months) +{ + int years = months / MONTHS_IN_YEAR; + return years; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDaysToDate(int days) +{ + int date, + month = ChangeDaysToMonths(days), + years = ChangeMonthsToYears(month); + date = (days - (month * DAYS_IN_MONTH)); + date *= ONE_HUNDRED; + date += (month - (years * MONTHS_IN_YEAR)); + date *= ONE_THOSEND; + date += years; + return date; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int date1, int date2) +{ + int new_date = ChangeDateToDays(date1) - ChangeDateToDays(date2); + new_date = ChangeDaysToDate(new_date); + return new_date; +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + BOOLEAN answer = !(num % TWO); + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO) ? TRUE : FALSE; + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +double MultiplicationFractions(float number1, float number2) // TODO : FIX IT +{ + short number1_counter = GetCounter(number1), + number2_counter = GetCounter(number2), + number1_denominator = GetDenominator(number1), + number2_denominator = GetDenominator(number2), + final_counter, + final_denominator; + double result; + printf("%hd\n%hd\n%hd\n%hd\n", number1_counter, number1_denominator, number2_counter, number2_denominator); + final_counter = Multiplication(number1_counter, number2_counter); + final_denominator = Multiplication(number1_denominator, number2_denominator); + + result = Divide(final_counter, final_denominator); + + return (result); +} + +double MultiplicationFloat(float number1, float multiply) // TODO : FIX IT +{ + double new_number = ZERO, + temp_number1; + + for (; multiply -ONE > ZERO; multiply--) + { + new_number += number1; + } + temp_number1 = number1 - new_number; + new_number += MultiplicationFractions(temp_number1, multiply); + + //new_number += Divide(number1, Divide(ONE, multiply)); + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} \ No newline at end of file diff --git a/6/PDFs/ex1.c.pdf b/6/PDFs/ex1.c.pdf new file mode 100644 index 0000000..a470c63 Binary files /dev/null and b/6/PDFs/ex1.c.pdf differ diff --git a/6/PDFs/ex2.c.pdf b/6/PDFs/ex2.c.pdf new file mode 100644 index 0000000..7fc8462 Binary files /dev/null and b/6/PDFs/ex2.c.pdf differ diff --git a/6/PDFs/ex3.c.pdf b/6/PDFs/ex3.c.pdf new file mode 100644 index 0000000..9d93c4b Binary files /dev/null and b/6/PDFs/ex3.c.pdf differ diff --git a/6/PDFs/ex4.c.pdf b/6/PDFs/ex4.c.pdf new file mode 100644 index 0000000..de2999d Binary files /dev/null and b/6/PDFs/ex4.c.pdf differ diff --git a/6/PDFs/ex5.c.pdf b/6/PDFs/ex5.c.pdf new file mode 100644 index 0000000..8ef51cd Binary files /dev/null and b/6/PDFs/ex5.c.pdf differ diff --git a/6/PDFs/ex6.c.pdf b/6/PDFs/ex6.c.pdf new file mode 100644 index 0000000..f20a41e Binary files /dev/null and b/6/PDFs/ex6.c.pdf differ diff --git a/6/ex1 b/6/ex1 new file mode 100644 index 0000000..e0665b0 Binary files /dev/null and b/6/ex1 differ diff --git a/6/ex1.c b/6/ex1.c new file mode 100644 index 0000000..84ae7b9 --- /dev/null +++ b/6/ex1.c @@ -0,0 +1,74 @@ +#include + +#define N 5 +#define S 5 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define ZERO 0 +#define ONE 1 + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, double sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + + +//--------------------------------------------------------------------------------------- +// Exercise 1 +// ---------- +// +// General : The program checks whether the required sum of two numbers +// is in an ordered array. +// +// Input : None. +// +// Process : Uses a function called "SumInArray". +// +// Output : If the required sum of two numbers is found in an ordered array (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 23.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + int sort_numbers[N] = {1,2,3,4,5}; + BOOLEAN answer = FALSE; + answer = SumInArray(sort_numbers, N, S); + + printf("Answer: %hu\n", answer); +} \ No newline at end of file diff --git a/6/ex2 b/6/ex2 new file mode 100644 index 0000000..73f595f Binary files /dev/null and b/6/ex2 differ diff --git a/6/ex2.c b/6/ex2.c new file mode 100644 index 0000000..aa8d81a --- /dev/null +++ b/6/ex2.c @@ -0,0 +1,93 @@ +#include + +#define N 30 +#define CUBE 6 +#define INDEX_PlAYER 24 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define BOOLEAN unsigned short + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Exercise 2 +// ---------- +// +// General : The program checks the amount of cube flips for which the player +// can advance his tool forward. +// +// Input : None. +// +// Process : The program counts the number of zeros on the board to position 6 +// after the player's position on the board. +// +// Output : The amount of cube throws for which the player can advance +// his tool (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 23.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short board[N] = + {0,1,0,1,0,1,0,0,1,1,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1,1,1,0}; + + unsigned short sum = ZERO, + counter = INDEX_PlAYER, + last_step = counter + CUBE; + + for (++counter; NumBBiggerThenNumA(counter, last_step); counter++) + { + sum += ChangeBool(board[counter]); + } + + printf("Sum: %hu\n", sum); +} \ No newline at end of file diff --git a/6/ex3 b/6/ex3 new file mode 100644 index 0000000..85be1fe Binary files /dev/null and b/6/ex3 differ diff --git a/6/ex3.c b/6/ex3.c new file mode 100644 index 0000000..a2966a4 --- /dev/null +++ b/6/ex3.c @@ -0,0 +1,65 @@ +#include + +#define N 20 +#define ZERO 0 +#define ONE 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define BOOLEAN unsigned short + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// Exercise 3 +// ---------- +// +// General : The program checks the number of neighboring organs whose values are equal. +// +// Input : None. +// +// Process : The program checks the number of neighboring organs whose values are equal. +// +// Output : The number of neighboring organ pairs whose values +// are equal (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 23.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short board[N] = + {1,1,3,3,4,5,5,6,7,7,4,3,2,3,1,1,0,1,0,1}; + + unsigned short sum = ZERO; + unsigned short counter; + + for (counter = ONE; counter < N; counter++) + { + sum += Equality(board[counter - ONE], board[counter]); + } + + printf("Sum: %hu\n", sum); +} \ No newline at end of file diff --git a/6/ex4 b/6/ex4 new file mode 100644 index 0000000..198dc28 Binary files /dev/null and b/6/ex4 differ diff --git a/6/ex4.c b/6/ex4.c new file mode 100644 index 0000000..d894136 --- /dev/null +++ b/6/ex4.c @@ -0,0 +1,75 @@ +#include + +#define N 20 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define BOOLEAN unsigned short + + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// Exercise 4 +// ---------- +// +// General : The program checks several pairs of consecutive characters that are +// equal to the last pair of characters in the array. +// +// Input : 20 chars. +// +// Process : The program checks several pairs of consecutive characters that are +// equal to the last pair of characters in the array. +// +// Output : The number of consecutive character pairs that equals the last +// pair of characters in the array (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 23.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + char array[N]; + unsigned short loop_counter, + count = ZERO, + new_size_array = N - TWO; + printf("Enter char 20 chars: \n"); + for (loop_counter = ZERO; loop_counter < N; loop_counter++) + { + scanf("%c", &array[loop_counter]); + } + + for (loop_counter = ONE; loop_counter < new_size_array; loop_counter++) + { + count += Equality((int)array[loop_counter - ONE], (int)array[N - TWO]) * + Equality((int)array[loop_counter], (int)array[N - ONE]); + } + + printf("Count: %hd\n", count); + +} \ No newline at end of file diff --git a/6/ex5 b/6/ex5 new file mode 100644 index 0000000..315b6dc Binary files /dev/null and b/6/ex5 differ diff --git a/6/ex5.c b/6/ex5.c new file mode 100644 index 0000000..f28a250 --- /dev/null +++ b/6/ex5.c @@ -0,0 +1,80 @@ +#include + +#define N 25 +#define ONE 1 +#define BOOLEAN unsigned short +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define ZERO 0 + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// Exercise 5 +// ---------- +// +// General : The program checks if the tool can move in other rule. +// +// Input : 25 numbers, index of player(number), cube result(number). +// +// Process : The program checks the place and the dice roll +// and then it checks if it has to go back or can go forward. +// +// Output : The new place of the tool on the board according to the +// cube roll (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 23.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short board[N] = { ZERO }, + start_index_player, + cube_result, + end_player_index, + counter, + input; + + for (counter = ZERO; counter < N; counter++) + { + printf("Enter number for index %ud on borad : ", counter); + scanf("%ud", &input); + } + + printf("Enter index of player: "); + scanf("%ud", &start_index_player); + + printf("Enter cube result: "); + scanf("%ud", &cube_result); + + end_player_index = start_index_player + ONE; + + end_player_index -= NumBBiggerThenNumA(board[end_player_index], + cube_result) * (cube_result + ONE); + + printf("%hd\n", end_player_index); + +} diff --git a/6/ex6 b/6/ex6 new file mode 100644 index 0000000..a1d8fdb Binary files /dev/null and b/6/ex6 differ diff --git a/6/ex6.c b/6/ex6.c new file mode 100644 index 0000000..9b95472 --- /dev/null +++ b/6/ex6.c @@ -0,0 +1,49 @@ +#include + +#define COUNT_CHANNELS 10 +#define ZERO 0 +#define ONE 1 +#define TWO 2 + +//--------------------------------------------------------------------------------------- +// Exercise 6 +// ---------- +// +// General : The program counts several channels above the average viewing percentage. +// +// Input : 40 numbers (0 - 100) (unsigned short). +// +// Process : The program calculates the average viewing percentage, and counts how +// many channels are in the field above average. +// +// Output : Number of channels above average viewership percentage. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 23.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short channels[COUNT_CHANNELS] = { ZERO }, + counter, + percent, + sum = ZERO, + avg, + counter = ZERO; + for (counter = ZERO; counter < COUNT_CHANNELS; counter++) + { + printf("Enter percet of viewers: "); + scanf("%hd", &percent); + channels[counter] = percent; + } + + for (counter = ZERO; counter < COUNT_CHANNELS; counter++) + sum += channels[counter]; + + // According to the second section "avg" should be changed to 20 + avg = sum / COUNT_CHANNELS; + for (counter = ZERO; channels[counter] > avg; counter++); + + printf("Above avg: %hd\n", counter); +} \ No newline at end of file diff --git a/7/Screenshot 2019-10-31 20%3a52%3a22.png b/7/Screenshot 2019-10-31 20%3a52%3a22.png new file mode 100644 index 0000000..6ed11c8 Binary files /dev/null and b/7/Screenshot 2019-10-31 20%3a52%3a22.png differ diff --git a/7/ex1_1 b/7/ex1_1 new file mode 100644 index 0000000..55ce7ff Binary files /dev/null and b/7/ex1_1 differ diff --git a/7/ex1_1.c b/7/ex1_1.c new file mode 100644 index 0000000..c1b0728 --- /dev/null +++ b/7/ex1_1.c @@ -0,0 +1,35 @@ +#define N 7 +#define ZERO 0 +#define ONE 1 + +//--------------------------------------------------------------------------------------- +// Exercise 1_1 +// ------------ +// +// General : None. +// +// Input : None. +// +// Process : None. +// +// Output : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 27.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + int array[N][N] = { ZERO }; + unsigned int counter, + area = N * N, + row, + col; + for (counter = ZERO; counter < area; counter++) + { + row = counter / N; + col = counter % N; + array[row][col] = (col >= row) * (row + ONE); + } +} \ No newline at end of file diff --git a/7/ex1_2.c b/7/ex1_2.c new file mode 100644 index 0000000..fa45532 --- /dev/null +++ b/7/ex1_2.c @@ -0,0 +1,35 @@ +#define N 7 +#define ZERO 0 +#define ONE 1 + +//--------------------------------------------------------------------------------------- +// Exercise 1_2 +// ------------ +// +// General : None. +// +// Input : None. +// +// Process : None. +// +// Output : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 27.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + int array[N][N] = { ZERO }; + unsigned int counter, + area = N * N, + row, + col; + for (counter = ZERO; counter < area; counter++) + { + row = counter / N; + col = counter % N; + array[row][col] = (col >= row) * (col-row + ONE); + } +} \ No newline at end of file diff --git a/7/ex2_1 b/7/ex2_1 new file mode 100644 index 0000000..620cf9d Binary files /dev/null and b/7/ex2_1 differ diff --git a/7/ex2_1.c b/7/ex2_1.c new file mode 100644 index 0000000..873fa3b --- /dev/null +++ b/7/ex2_1.c @@ -0,0 +1,36 @@ +#define N 7 +#define ZERO 0 +#define ONE 1 +#define TWO 2 + +//--------------------------------------------------------------------------------------- +// Exercise 2_1 +// ------------ +// +// General : None. +// +// Input : None. +// +// Process : None. +// +// Output : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 27.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + int array[N][N] = { ZERO }; + unsigned int counter, + area = N * N, + row, + col; + for (counter = ZERO; counter < area; counter++) + { + row = counter / N; + col = counter % N; + array[row][col] = (counter + ONE) + ((N - ONE - (TWO * col)) * (row % TWO)); + } +} \ No newline at end of file diff --git a/7/ex2_2 b/7/ex2_2 new file mode 100644 index 0000000..3f54866 Binary files /dev/null and b/7/ex2_2 differ diff --git a/7/ex2_2.c b/7/ex2_2.c new file mode 100644 index 0000000..10c3f5c --- /dev/null +++ b/7/ex2_2.c @@ -0,0 +1,50 @@ +#include + +#define N 7 +#define ZERO 0 +#define ONE 1 +#define TWO 2 + + +//--------------------------------------------------------------------------------------- +// Exercise 2_2 +// ------------ +// +// General : None. +// +// Input : None. +// +// Process : None. +// +// Output : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 27.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + int array[N][N] = { ZERO }; + unsigned int counter, + area = N * N, + row = ZERO, + col = ZERO; + for (counter = ZERO; counter < 49; counter++) + { + col = counter % 7; + row = counter / 7; + array[row][col] = counter + ONE; + array[col + 1][row] = 4 * (N - 1) - col; + } + + for (int num = ZERO; num < N; num++) + { + for (int num2 = ZERO; num2 < N; num2++) + { + printf("%d, ", array[num][num2]); + } + printf("\n"); + } + +} \ No newline at end of file diff --git a/8/IdanLib.h b/8/IdanLib.h new file mode 100644 index 0000000..a9ec6c9 --- /dev/null +++ b/8/IdanLib.h @@ -0,0 +1,1190 @@ +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define TAKE_SIGNED(x) (((2 * (x)) + 1) % 2) +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeYearsToMonths(short years) +{ + int days = years * MONTHS_IN_YEAR; + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeMonthsToDays(short months) +{ + int days = months * DAYS_IN_MONTH; + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDateToDays(int date) +{ + short years, + month; + int days; + + years = date % ONE_THOSEND; + date /= ONE_THOSEND; + month = date % ONE_HUNDRED; + date /= ONE_HUNDRED; + days = date; + month += ChangeYearsToMonths(years); + days += ChangeMonthsToDays(month); + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDaysToMonths(int days) +{ + int months = days / DAYS_IN_MONTH; + return months; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeMonthsToYears(int months) +{ + int years = months / MONTHS_IN_YEAR; + return years; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDaysToDate(int days) +{ + int date, + month = ChangeDaysToMonths(days), + years = ChangeMonthsToYears(month); + date = (days - (month * DAYS_IN_MONTH)); + date *= ONE_HUNDRED; + date += (month - (years * MONTHS_IN_YEAR)); + date *= ONE_THOSEND; + date += years; + return date; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int date1, int date2) +{ + int new_date = ChangeDateToDays(date1) - ChangeDateToDays(date2); + new_date = ChangeDaysToDate(new_date); + return new_date; +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + BOOLEAN answer = !(num % TWO); + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO) ? TRUE : FALSE; + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +double MultiplicationFractions(float number1, float number2) // TODO : FIX IT +{ + short number1_counter = GetCounter(number1), + number2_counter = GetCounter(number2), + number1_denominator = GetDenominator(number1), + number2_denominator = GetDenominator(number2), + final_counter, + final_denominator; + double result; + printf("%hd\n%hd\n%hd\n%hd\n", number1_counter, number1_denominator, number2_counter, number2_denominator); + final_counter = Multiplication(number1_counter, number2_counter); + final_denominator = Multiplication(number1_denominator, number2_denominator); + + result = Divide(final_counter, final_denominator); + + return (result); +} + +double MultiplicationFloat(float number1, float multiply) // TODO : FIX IT +{ + double new_number = ZERO, + temp_number1; + + for (; multiply -ONE > ZERO; multiply--) + { + new_number += number1; + } + temp_number1 = number1 - new_number; + new_number += MultiplicationFractions(temp_number1, multiply); + + //new_number += Divide(number1, Divide(ONE, multiply)); + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} \ No newline at end of file diff --git a/8/IdanLibPointers.h b/8/IdanLibPointers.h new file mode 100644 index 0000000..d336b8c --- /dev/null +++ b/8/IdanLibPointers.h @@ -0,0 +1,181 @@ +#include "IdanLib.h" + +#define N 3 + +unsigned short CountCharInColumn(char mat[][N], unsigned short row_size ,unsigned short column, char c) +{ + unsigned short count = ZERO, + counter; + for (counter = ZERO; counter < row_size; counter++) + { + count += (mat[counter][column] == c); + } + + return (count); +} + +unsigned short CountCharInRow(char mat[][N], unsigned short col_size ,unsigned short row, char c) +{ + unsigned short count = ZERO, + counter; + for (counter = ZERO; counter < col_size; counter++) + { + count += (mat[row][counter] == c); + } + + return (count); +} + +unsigned short CountCharInMainDiagonal(char mat[][N], unsigned short size, char c) +{ + unsigned short count = ZERO, + counter; + for (counter = ZERO; counter < size; counter++) + { + count += (mat[size][size] == c); + } + + return (count); +} + +unsigned short CountCharInSecondaryDiagonal(char mat[][N], unsigned short size, char c) +{ + unsigned short count = ZERO, + counter; + for (counter = ZERO; counter < size; counter++) + { + count += (mat[size][N - size] == c); + } + + return (count); +} + +void OutputPrintMatrix(char mat[][N], unsigned int row_size, unsigned int column_size) +{ + unsigned int counter_row, + counter_col; + for (counter_row = ZERO; counter_row < row_size; counter_row++) + { + for (counter_col = ZERO; counter_col < column_size; counter_col++) + { + printf("%c, ", mat[counter_row][counter_col]); + } + printf("\n"); + } +} + +unsigned short MaxNumberInArray(unsigned short array[], int size) +{ + int max = array[ZERO], + counter = ONE; + for (counter = ONE; counter < size; counter++) + { + max = (array[counter] > max) ? array[counter] : max; + } + + return (max); +} + +unsigned short MaxCountNumberInColumn(int mat[][N], unsigned short row_size ,unsigned short column) +{ + unsigned short counter_array[TEN] = { ZERO }, + counter, + max; + for (counter = ZERO; counter < row_size; counter++) + { + counter_array[mat[counter][column]]++; + } + + max = MaxNumberInArray(counter_array, TEN); + return (max); + +} + +unsigned short MaxCountNumberInRow(int mat[][N], unsigned short col_size ,unsigned short row) +{ + unsigned short counter_array[TEN] = { ZERO }, + counter, + max; + for (counter = ZERO; counter < col_size; counter++) + { + counter_array[mat[row][counter]]++; + } + + max = MaxNumberInArray(counter_array, TEN); + return (max); + +} + +BOOLEAN IsLatinSquare(int mat[][N], unsigned short row_size) +{ + unsigned short counter = ZERO; + BOOLEAN is_latin_square = TRUE; + while ((row_size - counter) * is_latin_square) + { + is_latin_square *= (MaxCountNumberInColumn(mat, row_size, counter) == ONE) * + (MaxCountNumberInRow(mat, row_size, counter) == ONE); + counter++; + } + + return (is_latin_square); +} + +void InputMatrix(int mat[][N], unsigned short row_size) +{ + unsigned short counter, + area = row_size * row_size; + for (counter = ZERO; counter < area; counter++) + { + scanf(" %d", &mat[counter / row_size][counter % row_size]); + } + +} + +int ColumnSum(int mat[][N], unsigned short row_size ,unsigned short column) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < row_size; counter++) + { + sum += mat[counter][column]; + } + + return (sum); + +} + +int RowSum(int mat[][N], unsigned short col_size ,unsigned short row) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < col_size; counter++) + { + sum += mat[row][counter]; + } + + return (sum); +} + +int MainDiagonalSum(char mat[][N], unsigned short col_size) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < col_size; counter++) + { + sum += mat[counter][counter]; + } + + return (sum); +} + +int SecondaryDiagonalSum(int mat[][N], unsigned short col_size) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < col_size; counter++) + { + sum += mat[counter][col_size - ONE - counter]; + } + + return (sum); +} \ No newline at end of file diff --git a/8/ex1 b/8/ex1 new file mode 100644 index 0000000..50676d4 Binary files /dev/null and b/8/ex1 differ diff --git a/8/ex1.c b/8/ex1.c new file mode 100644 index 0000000..71d8001 --- /dev/null +++ b/8/ex1.c @@ -0,0 +1,134 @@ +#include "IdanLib.h" +#include + +#define N 3 + +unsigned short CountCharInColumn(char mat[][N], unsigned short row_size ,unsigned short column, char c) +{ + unsigned short count = ZERO, + counter; + for (counter = ZERO; counter < row_size; counter++) + { + count += (mat[counter][column] == c); + } + + return (count); +} + +unsigned short CountCharInRow(char mat[][N], unsigned short col_size ,unsigned short row, char c) +{ + unsigned short count = ZERO, + counter; + for (counter = ZERO; counter < col_size; counter++) + { + count += (mat[row][counter] == c); + } + + return (count); +} + +unsigned short CountCharInMainDiagonal(char mat[][N], unsigned short size, char c) +{ + unsigned short count = ZERO, + counter; + for (counter = ZERO; counter < size; counter++) + { + count += (mat[size][size] == c); + } + + return (count); +} + +unsigned short CountCharInSecondaryDiagonal(char mat[][N], unsigned short size, char c) +{ + unsigned short count = ZERO, + counter; + for (counter = ZERO; counter < size; counter++) + { + count += (mat[size][N - size] == c); + } + + return (count); +} + +BOOLEAN CheckWin(char mat[][N], unsigned short size, char c) +{ + BOOLEAN win = (CountCharInMainDiagonal(mat, size, c) == THREE) + + (CountCharInSecondaryDiagonal(mat, size, c) == THREE); + unsigned short counter = ZERO; + while (!win * (size - counter)) + { + win = (CountCharInColumn(mat, size, counter, c) == THREE) + + (CountCharInRow(mat, size, counter, c) == THREE); + counter++; + } + win = (win > ZERO); + + return (win); +} + +char InputChar() +{ + char c; + scanf(" %c", &c); + + return (c); +} + +unsigned short InputUnsignedShort() +{ + unsigned short number; + scanf("%hu", &number); + + return (number); +} + +void OutputPrintRequestForChar() +{ + printf("Enter 'X' or 'O': "); +} + +void OutputPrintRequestForColAndRow() +{ + printf("Enter column and row: "); +} + +void OutputPrintWhoWin(char c) +{ + printf("The winner is: %c\n", c); +} + +void OutputPrintMatrix(char mat[][N], unsigned int row_size, unsigned int column_size) +{ + unsigned int counter_row, + counter_col; + for (counter_row = ZERO; counter_row < row_size; counter_row++) + { + for (counter_col = ZERO; counter_col < column_size; counter_col++) + { + printf("%c, ", mat[counter_row][counter_col]); + } + printf("\n"); + } +} + +void main(void) +{ + char mat[N][N] = { ZERO }; + BOOLEAN win = FALSE; + char input; + unsigned short col, + row; + while (!win) + { + OutputPrintRequestForChar(); + input = InputChar(); + OutputPrintRequestForColAndRow(); + col = InputUnsignedShort(); + row = InputUnsignedShort(); + mat[row][col] = input; + win = CheckWin(mat, N, input); + OutputPrintMatrix(mat, N, N); + } + OutputPrintWhoWin(input); +} \ No newline at end of file diff --git a/8/ex2 b/8/ex2 new file mode 100644 index 0000000..f337de1 Binary files /dev/null and b/8/ex2 differ diff --git a/8/ex2.c b/8/ex2.c new file mode 100644 index 0000000..d138630 --- /dev/null +++ b/8/ex2.c @@ -0,0 +1,112 @@ +#include "IdanLib.h" +#include + +#define N 3 + +unsigned short MaxNumberInArray(unsigned short array[], int size) +{ + int max = array[ZERO], + counter = ONE; + for (counter = ONE; counter < size; counter++) + { + max = (array[counter] > max) ? array[counter] : max; + } + + return (max); +} + +unsigned short MaxCountNumberInColumn(int mat[][N], unsigned short row_size ,unsigned short column) +{ + unsigned short counter_array[TEN] = { ZERO }, + counter, + max; + for (counter = ZERO; counter < row_size; counter++) + { + counter_array[mat[counter][column]]++; + } + + max = MaxNumberInArray(counter_array, TEN); + return (max); + +} + +unsigned short MaxCountNumberInRow(int mat[][N], unsigned short col_size ,unsigned short row) +{ + unsigned short counter_array[TEN] = { ZERO }, + counter, + max; + for (counter = ZERO; counter < col_size; counter++) + { + counter_array[mat[row][counter]]++; + } + + max = MaxNumberInArray(counter_array, TEN); + return (max); + +} + +BOOLEAN IsLatinSquare(int mat[][N], unsigned short row_size) +{ + unsigned short counter = ZERO; + BOOLEAN is_latin_square = TRUE; + while ((row_size - counter) * is_latin_square) + { + is_latin_square *= (MaxCountNumberInColumn(mat, row_size, counter) == ONE) * + (MaxCountNumberInRow(mat, row_size, counter) == ONE); + counter++; + } + + return (is_latin_square); +} + +unsigned short InputUnsignedShort() +{ + unsigned short number; + scanf("%hu", &number); + + return (number); +} + +void InputMatrix(int mat[][N], unsigned short row_size) +{ + unsigned short counter, + area = row_size * row_size; + for (counter = ZERO; counter < area; counter++) + { + scanf(" %d", &mat[counter / row_size][counter % row_size]); + } + +} + +void OutputPrintRequestForMatrix() +{ + printf("Enter 9 numbers for matrix: "); +} + +void OutputPrintLatinSquare(BOOLEAN is_latin_square) +{ + printf("This is latin square: %hu\n", is_latin_square); +} + +void OutputPrintMatrix(int mat[][N], unsigned int row_size, unsigned int column_size) +{ + unsigned int counter_row, + counter_col; + for (counter_row = ZERO; counter_row < row_size; counter_row++) + { + for (counter_col = ZERO; counter_col < column_size; counter_col++) + { + printf("%d, ", mat[counter_row][counter_col]); + } + printf("\n"); + } +} + +void main(void) +{ + int mat[N][N] = { ZERO }; + OutputPrintRequestForMatrix(); + InputMatrix(mat, N); + OutputPrintMatrix(mat, N, N); + OutputPrintLatinSquare(IsLatinSquare(mat, N)); +} \ No newline at end of file diff --git a/8/ex3 b/8/ex3 new file mode 100644 index 0000000..8464a88 Binary files /dev/null and b/8/ex3 differ diff --git a/8/ex3.c b/8/ex3.c new file mode 100644 index 0000000..3c4ef9a --- /dev/null +++ b/8/ex3.c @@ -0,0 +1,120 @@ +#include "IdanLib.h" +#include + +#define N 3 + +int ColumnSum(int mat[][N], unsigned short row_size ,unsigned short column) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < row_size; counter++) + { + sum += mat[counter][column]; + } + + return (sum); + +} + +int RowSum(int mat[][N], unsigned short col_size ,unsigned short row) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < col_size; counter++) + { + sum += mat[row][counter]; + } + + return (sum); +} + +int MainDiagonalSum(char mat[][N], unsigned short col_size) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < col_size; counter++) + { + sum += mat[counter][counter]; + } + + return (sum); +} + +int SecondaryDiagonalSum(int mat[][N], unsigned short col_size) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < col_size; counter++) + { + sum += mat[counter][col_size - ONE - counter]; + } + + return (sum); +} + +int InputInt() +{ + int num; + scanf(" %d", &num); + + return (num); +} + +BOOLEAN IsMagicSqaure(int mat[][N], unsigned short row_size) +{ + int sum = MainDiagonalSum(mat, row_size); + BOOLEAN is_magic_sqaure = (sum == SecondaryDiagonalSum(mat, row_size)); + unsigned short counter = ZERO; + + while ((row_size - counter) * is_magic_sqaure) + { + is_magic_sqaure *= (ColumnSum(mat, row_size, counter) == sum) * + (RowSum(mat, row_size, counter) == sum); + counter++; + } + + return (is_magic_sqaure); +} + +void InputMatrix(int mat[][N], unsigned short row_size) +{ + unsigned short counter, + area = row_size * row_size; + for (counter = ZERO; counter < area; counter++) + { + mat[counter / row_size][counter % row_size] = InputInt(); + } +} + +void OutputPrintRequestForMatrix() +{ + printf("Enter 9 numbers for matrix: "); +} + +void OutputPrintMagicSquare(BOOLEAN is_magic_square) +{ + printf("This is magic square: %hu\n", is_magic_square); +} + +void OutputPrintMatrix(int mat[][N], unsigned int row_size, unsigned int column_size) +{ + unsigned int counter_row, + counter_col; + for (counter_row = ZERO; counter_row < row_size; counter_row++) + { + for (counter_col = ZERO; counter_col < column_size; counter_col++) + { + printf("%d, ", mat[counter_row][counter_col]); + } + printf("\n"); + } +} + +void main(void) +{ + int mat[N][N] = { ZERO }; + OutputPrintRequestForMatrix(); + InputMatrix(mat, N); + OutputPrintMatrix(mat, N, N); + OutputPrintMagicSquare(IsMagicSqaure(mat, N)); +} \ No newline at end of file diff --git a/8/ex4.c b/8/ex4.c new file mode 100644 index 0000000..bd93c9b --- /dev/null +++ b/8/ex4.c @@ -0,0 +1,93 @@ +#include "IdanLib.h" +#include + +#define M 8 +#define N 10 + +int ColumnSum(int mat[][N], unsigned short row_size ,unsigned short column) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < row_size; counter++) + { + sum += mat[counter][column]; + } + + return (sum); + +} + +int RowSum(int mat[][N], unsigned short col_size ,unsigned short row) +{ + unsigned short counter; + int sum = ZERO; + for (counter = ZERO; counter < col_size; counter++) + { + sum += mat[row][counter]; + } + + return (sum); +} + +unsigned short SumArray(unsigned short array[], unsigned short start, unsigned short end) +{ + int sum = ZERO, + counter; + for (counter = start; counter < end; counter++) + { + sum += array[counter]; + } + + return (sum); +} + +unsigned short IndexOfRangeMaxSum(int vector, unsigned short vector_size, unsigned short count_index) +{ + int index_max_sum, + max_sum = ZERO, + sum; + unsigned short new_size = vector - count_index; + unsigned short counter; + for (counter = ZERO; counter < new_size; counter++) + { + sum = SumArray(vector, counter, counter + count_index); + if (sum > max_sum) + { + sum = max_sum; + index_max_sum = counter; + } + } + + return (index_max_sum); +} + +void SumOfNumberInRows(int mat[M][N], int sum_row[M], int number) +{ + unsigned short counter; + unsigned int area = N * M; + for ( counter = ZERO; counter < area; counter++) + { + sum_row[counter / N] += (mat[counter / N][counter % N] == number); + } +} + +void SumOfNumberInColumns(int mat[M][N], int sum_col[N], int number) +{ + unsigned short counter; + unsigned int area = N * M; + for ( counter = ZERO; counter < area; counter++) + { + sum_col[counter % N] += (mat[counter / N][counter % N] == number); + } +} + + +void main(void) +{ + unsigned int L; + int mat[M][N] = { ZERO }; + int sum_row[M] = { ZERO }; + int sum_col[N] = { ZERO }; + + +} \ No newline at end of file diff --git a/8/test b/8/test new file mode 100644 index 0000000..ffeb784 Binary files /dev/null and b/8/test differ diff --git a/8/test.c b/8/test.c new file mode 100644 index 0000000..396eba3 --- /dev/null +++ b/8/test.c @@ -0,0 +1,50 @@ +#include "IdanLib.h" +#include + +#define N 7 +#define N2 6 +#define REMOVE_COL 3 +#define REMOVE_ROW 5 + +void OutputPrintMatrix(int mat[][N2], unsigned int row_size, unsigned int column_size) +{ + unsigned int counter_row, + counter_col; + for (counter_row = ZERO; counter_row < row_size; counter_row++) + { + for (counter_col = ZERO; counter_col < column_size; counter_col++) + { + printf("%d ", mat[counter_row][counter_col]); + } + printf("\n"); + } +} + + +void main(void) +{ + int mat1[N][N] = { ZERO }; + int mat2[N2][N2] = { ZERO }; + int row1, col1, row2, col2; + + for (unsigned short i = 0; i < N * N; i++) + { + mat1[i / N][i % N] = i+1; + } + + + for (unsigned counter = (REMOVE_ROW * (N2) + REMOVE_COL); counter < (N2 * N2) + (REMOVE_ROW * (N2) + REMOVE_COL) ; counter++) + { + row2 = ((counter - REMOVE_COL)/ N2) % N2; + col2 = (counter % N2); + row1 = (((counter - REMOVE_COL) / N2) + ((N - N2) * ((counter / N2) >= REMOVE_ROW))) % N; + col1 = ((counter % N2) + ((N - N2) * ((counter % N2) >= REMOVE_COL))) % N; + mat2[row2][col2] = mat1[row1][col1]; + } + + + printf("\n\n"); + OutputPrintMatrix(mat2, N2, N2); + + +} \ No newline at end of file diff --git a/9/IdanLib.h b/9/IdanLib.h new file mode 100644 index 0000000..14731b0 --- /dev/null +++ b/9/IdanLib.h @@ -0,0 +1,1188 @@ +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define TAKE_SIGNED(x) (((2 * (x)) + 1) % 2) +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y + + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeYearsToMonths(short years) +{ + int days = years * MONTHS_IN_YEAR; + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeMonthsToDays(short months) +{ + int days = months * DAYS_IN_MONTH; + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDateToDays(int date) +{ + short years, + month; + int days; + + years = date % ONE_THOSEND; + date /= ONE_THOSEND; + month = date % ONE_HUNDRED; + date /= ONE_HUNDRED; + days = date; + month += ChangeYearsToMonths(years); + days += ChangeMonthsToDays(month); + return days; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDaysToMonths(int days) +{ + int months = days / DAYS_IN_MONTH; + return months; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeMonthsToYears(int months) +{ + int years = months / MONTHS_IN_YEAR; + return years; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int ChangeDaysToDate(int days) +{ + int date, + month = ChangeDaysToMonths(days), + years = ChangeMonthsToYears(month); + date = (days - (month * DAYS_IN_MONTH)); + date *= ONE_HUNDRED; + date += (month - (years * MONTHS_IN_YEAR)); + date *= ONE_THOSEND; + date += years; + return date; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int date1, int date2) +{ + int new_date = ChangeDateToDays(date1) - ChangeDateToDays(date2); + new_date = ChangeDaysToDate(new_date); + return new_date; +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + BOOLEAN answer = !(num % TWO); + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO) ? TRUE : FALSE; + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +double MultiplicationFractions(float number1, float number2) // TODO : FIX IT +{ + short number1_counter = GetCounter(number1), + number2_counter = GetCounter(number2), + number1_denominator = GetDenominator(number1), + number2_denominator = GetDenominator(number2), + final_counter, + final_denominator; + double result; + printf("%hd\n%hd\n%hd\n%hd\n", number1_counter, number1_denominator, number2_counter, number2_denominator); + final_counter = Multiplication(number1_counter, number2_counter); + final_denominator = Multiplication(number1_denominator, number2_denominator); + + result = Divide(final_counter, final_denominator); + + return (result); +} + +double MultiplicationFloat(float number1, float multiply) // TODO : FIX IT +{ + double new_number = ZERO, + temp_number1; + + for (; multiply -ONE > ZERO; multiply--) + { + new_number += number1; + } + temp_number1 = number1 - new_number; + new_number += MultiplicationFractions(temp_number1, multiply); + + //new_number += Divide(number1, Divide(ONE, multiply)); + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} \ No newline at end of file diff --git a/9/IdanStringLib b/9/IdanStringLib new file mode 100644 index 0000000..a057e4d Binary files /dev/null and b/9/IdanStringLib differ diff --git a/9/IdanStringLib.h b/9/IdanStringLib.h new file mode 100644 index 0000000..cca3136 --- /dev/null +++ b/9/IdanStringLib.h @@ -0,0 +1,452 @@ +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define TAKE_SIGNED(x) (((2 * (x)) + 1) % 2) +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char text[]) +{ + unsigned short counter = ZERO; + while (text[counter++]); + + return (--counter); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char text1[], char text2[]) +{ + BOOLEAN equals = FALSE; + unsigned short counter = ZERO; + while ((text1[counter] == text2[counter]) * (text1[counter++])); + equals = (text1[--counter] == text2[counter]); + + return equals; +} + +//--------------------------------------------------------------------------------------- +// IndexCharInString +// ----------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short IndexCharInString(char text[], char c) +{ + unsigned short counter = ZERO; + while (text[counter++] != c); + + return (--counter); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char text[], char c) +{ + unsigned short count = ZERO, + loop_counter = ZERO; + while (text[loop_counter]) + { + count += (text[loop_counter++] == c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// size - the size of cut (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char text[], unsigned short start, unsigned short size) +{ + unsigned short counter; + for (counter = ZERO; (counter < size) * text[counter + start]; counter++) + { + text[counter] = text[counter + start]; + } + text[counter] = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char text[], char copy[], unsigned short start) +{ + unsigned short counter, + length = StringLenght(copy) + start; + for (counter = start; counter < length; counter++) + { + text[counter] = copy[counter - start]; + } + text[counter] = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char textA[], char textB[]) +{ + CopyString(textA, textB, StringLenght(textA)); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char textA[], char textB[]) +{ + BOOLEAN exist = FALSE; + unsigned short textA_lenght = StringLenght(textA); + unsigned short textB_lenght = StringLenght(textB); + char temp_textA[textA_lenght]; + unsigned short counter; + unsigned short loop_length = StringLenght(textA) - textB_lenght; + for (counter = ZERO; (counter < loop_length) * !exist; counter++) + { + CopyString(temp_textA, textA, ZERO); + CutString(temp_textA, counter, textB_lenght); + exist = StringCompare(temp_textA, textB); + } + + return (exist); +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short IndexStringBInStringA(char textA[], char textB[]) +{ + BOOLEAN exist = FALSE; + unsigned short textA_lenght = StringLenght(textA); + unsigned short textB_lenght = StringLenght(textB); + char temp_textA[textA_lenght]; + unsigned short counter; + unsigned short loop_length = StringLenght(textA) - textB_lenght + ONE; + for (counter = ZERO; (counter < loop_length) * !exist; counter++) + { + CopyString(temp_textA, textA, ZERO); + CutString(temp_textA, counter, textB_lenght); + exist = StringCompare(temp_textA, textB); + } + + return (--counter); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Count string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Count of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountStringBInStringA(char textA[], char textB[]) +{ + unsigned short count = ZERO; + unsigned short textA_lenght = StringLenght(textA); + unsigned short textB_lenght = StringLenght(textB); + char temp_textA[textA_lenght]; + unsigned short counter; + unsigned short loop_length = StringLenght(textA) - textB_lenght; + for (counter = ZERO; (counter < loop_length); counter++) + { + CopyString(temp_textA, textA, ZERO); + CutString(temp_textA, counter, textB_lenght); + count += StringCompare(temp_textA, textB); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char textA[], char textB[]) +{ + unsigned short textA_lenght = StringLenght(textA); + unsigned short textB_lenght = StringLenght(textB); + unsigned short index_textB_in_textA = IndexStringBInStringA(textA, textB); + char temp_textA[textA_lenght]; + + CopyString(temp_textA, textA, ZERO); + CutString(temp_textA, index_textB_in_textA + textB_lenght, + textA_lenght - (index_textB_in_textA + textB_lenght)); + CopyString(textA, temp_textA, index_textB_in_textA); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char textA[], char textB[]) +{ + unsigned short loop_lenght = CountStringBInStringA(textA, textB); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(textA, textB); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} diff --git a/9/ex1 b/9/ex1 new file mode 100644 index 0000000..63f5a31 Binary files /dev/null and b/9/ex1 differ diff --git a/9/ex1.c b/9/ex1.c new file mode 100644 index 0000000..61c9064 --- /dev/null +++ b/9/ex1.c @@ -0,0 +1,35 @@ +#include "IdanStringLib.h" +#include "IdanLib.h" +#include + +#define STRING_MAX_SIZE 256 + +//--------------------------------------------------------------------------------------- +// Exercise 1 +// ---------- +// +// General : The program deletes a string in a string till the are no more. +// +// Input : 2 string. +// +// Process : The program checks if the is the string that needs too be deleted if there +// is delete else stop and print how many times it was deleted and the new +// string. +// +// Output : The new string and how many times it deleted. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.11.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + typedef char string[STRING_MAX_SIZE]; + string str1 = ""; + string str2 = ""; + + printf("Count: %u\n", CountStringBInStringA(str1, str2)); + RemoveAllStringBFromStringA(str1, str2); + printf("The text: %s\n", str1); +} \ No newline at end of file diff --git a/9/ex2.c b/9/ex2.c new file mode 100644 index 0000000..c2ab4bc --- /dev/null +++ b/9/ex2.c @@ -0,0 +1,33 @@ +#include "IdanStringLib.h" +#include "IdanLib.h" +#include + +#define STRING_MAX_SIZE 256 + + +//--------------------------------------------------------------------------------------- +// Exercise 2 +// ---------- +// +// General : The program checks if the string is a good equation. +// +// Input : String. +// +// Process : The program checks how many times a barcket '(' and a bracket ')' is in the +// string and if the first one is a closer. +// +// Output : If the equation is ok. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.11.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + typedef char string[STRING_MAX_SIZE]; + string str1 = ""; + + ValidParenthesesTemplate(str1); + +} \ No newline at end of file diff --git a/9/ex3 b/9/ex3 new file mode 100644 index 0000000..cdc1bed Binary files /dev/null and b/9/ex3 differ diff --git a/9/ex3.c b/9/ex3.c new file mode 100644 index 0000000..2d13257 --- /dev/null +++ b/9/ex3.c @@ -0,0 +1,73 @@ +#include "IdanStringLib.h" +#include "IdanLib.h" +#include + +#define STRING_MAX_SIZE 256 +#define A 'a' +#define B 'b' + +//--------------------------------------------------------------------------------------- +// CountStringSubStrings +// ------------------------ +// +// General : Checks how many substring can u build with the string that you +// get in the main string you got. +// +// Parameters : +// text - string (char[]) +// +// Return value : How many substring can you build (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountStringSubStrings(char text[], char a, char b) +{ + unsigned short count = ZERO; + unsigned short text_lenght = StringLenght(text); + unsigned short temp_text_lenght; + char temp_text[text_lenght]; + unsigned short index_a; + + CopyString(temp_text, text, ZERO); + while (CharInString(temp_text, a)) + { + index_a = IndexCharInString(temp_text, a) + ONE; + temp_text_lenght = StringLenght(temp_text); + CutString(temp_text, index_a, temp_text_lenght - index_a); + count += CountCharInString(temp_text, b); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// Exercise 3 +// ---------- +// +// General : The program checks how many substring can u build with the string that you +// get in the main string you got. +// +// Input : String. +// +// Process : The program checks if there is a char like the start (char start) that the +// program got, if there is it will check how many ends (char end) and just +// add it too the counter. +// +// Output : How many substring can you build. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.11.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + typedef char string[STRING_MAX_SIZE]; + string str1 = "ababbb"; + + printf("%u\n", CountStringSubStrings(str1, A, B)); + +} \ No newline at end of file diff --git a/9/ex4.c b/9/ex4.c new file mode 100644 index 0000000..f9240fe --- /dev/null +++ b/9/ex4.c @@ -0,0 +1,68 @@ +#include "IdanStringLib.h" +#include "IdanLib.h" +#include + +#define STRING_MAX_SIZE 256 + +unsigned short HighestSequence(char vec[]) +{ + unsigned short place = ZERO; + unsigned short counter = ZERO; + unsigned short counter_max = ZERO; + while(vec[place]) + { + counter = (vec[place] == vec[place + ONE]) ? ++counter : ZERO; + counter_max = (counter_max > counter) ? counter : counter_max; + } + + return counter_max + 1; +} + +//--------------------------------------------------------------------------------------- +// Exercise 4 +// ---------- +// +// General : The program checks how many substring can u build with the string that you +// get in the main string you got. +// +// Input : string. +// +// Process : The program checks if there is a char like the start (char start) that the +// program got, if there is it will check how many ends (char end) and just +// add it too the counter. +// +// Output : How many substring can you build. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.11.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + typedef char string[STRING_MAX_SIZE]; + string str_arr[TEN]; + + unsigned short counter; + unsigned short max; + unsigned short max_offset; + + for(counter = ZERO; counter < TEN; counter++) + { + scanf("%s", str_arr[counter]); + } + + max = HighestSequence(str_arr[ZERO]); + max_offset = ZERO; + for (counter = ONE; counter < TEN; counter++) + { + if(max < HighestSequence(str_arr[counter])) + { + max = HighestSequence(str_arr[counter]); + max_offset = counter; + } + } + printf("%s %hu\n",str_arr[max_offset], max_offset + ONE); + + scanf("%hu",&counter); +} \ No newline at end of file diff --git a/9/test b/9/test new file mode 100644 index 0000000..16983b6 Binary files /dev/null and b/9/test differ diff --git a/9/test.c b/9/test.c new file mode 100644 index 0000000..aee1e24 --- /dev/null +++ b/9/test.c @@ -0,0 +1,13 @@ +#include +#include "IdanStringLib.h" + +void main(void) +{ + char str1[100] = {'a', 'b', 'c', 'b', 'e', '\0'}; + char str2[100] = {'b', '\0'}; + + RemoveAllStringBFromStringA(str1, str2); + printf("%u\n", StringLenght(str1)); + printf("%s\n", str1); + printf("%d\n", !0); +} \ No newline at end of file diff --git a/Libs/General.c b/Libs/General.c new file mode 100644 index 0000000..af9109b --- /dev/null +++ b/Libs/General.c @@ -0,0 +1,2830 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + unsigned int counter; + Data_Type item; + if (((*q).items) == ONE) + { + item = (*q).values[ZERO]; + free((*q).values); + (*q).items--; + } + else if (((*q).items) > ONE) + { + item = (*q).values[ZERO]; + (*q).items--; + for (counter = ZERO; counter < (*q).items; counter++) + { + (*q).values[counter] = (*q).values[counter + ONE]; + } + (*q).values = (Data_Type *)realloc((*q).values, (*q).items * sizeof(Data_Type)); + } + + return (item); +} + +BOOLEAN IsEmptyQueue(queue * q) +{ + return (!q->items); +} +// ------------------------------------------ LLL --------------------------------------- +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterLLL(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushLLL(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopLLL(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteAfterList +// --------------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteAfterLLL(LLL * manager) +{ + LLL * con_ls = manager->next->next; + free(manager->next); + manager->next = con_ls; +} + +LLL * GetLoactionLLL(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next != ptr_sm) + temp = temp->row_next; + + return (temp); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next != ptr_sm) + temp = temp->col_next; + + return (temp); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} + +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** root) +{ + *root = (BinaryTree *)malloc(sizeof(BinaryTree)); + (*root)->left = NULL; + (*root)->right = NULL; +} + +void AddLeftAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +BOOLEAN IsLeafBinaryTree(BinaryTree * tree) +{ + return (!(tree->left && tree->right)); +} + +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** root) +{ + *root = (ThirdTree *)malloc(sizeof(ThirdTree)); + (*root)->left = NULL; + (*root)->right = NULL; + (*root)->middle = NULL; +} + +void AddLeftAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +void AddMiddleAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->middle = tree->middle; + tree->middle = new_node; +} + +BOOLEAN IsLeafThirdTree(ThirdTree * tree) +{ + return (!(tree->left && tree->right && tree->middle)); +} + +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** root) +{ + *root = (GeneralTree *)malloc(sizeof(GeneralTree)); + (*root)->manager_general_trees = NULL; +} + +void AddAfterGeneralTree(GeneralTree * tree) +{ + GeneralTree * new_node = (GeneralTree *)malloc(sizeof(GeneralTree)); + LLL * temp = tree->manager_general_trees; + if (temp != NULL) + { + while (temp->next != NULL) + { + temp = temp->next; + } + InsertAfterLLL(temp); + } + else + { + PushLLL(temp); + } + +} + +BOOLEAN IsLeafGeneralTree(GeneralTree * tree) +{ + return (tree->manager_general_trees != NULL); +} + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)(void *)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)(void *)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)(void *)temp->right)); + } + } + +} + +// -------------------------------------- Graph ----------------------------------------- +//--------------------------------------------------------------------------------------- +// JoinGraphDirectedWt +// ------------------- +// +// General : the function adds an arc between two items with direction +// and weight to the arc +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be added +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphDirectedWt(Graph * a, Graph * b, int weight) +{ + Arc * arc = (Arc *)malloc(sizeof(Arc)); + arc->point = b; + arc->weight = weight; + PushLLL(&a->list); + a->list->value = (Data_Type)(void *)arc; +} + +//--------------------------------------------------------------------------------------- +// JoinGraphNonDirectedWt +// ---------------------- +// +// General : adds an arc between two items for both direction with +// weight to it +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be added +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphNonDirectedWt(Graph * a, Graph * b, int weight) +{ + JoinGraphDirectedWt(a, b, weight); + JoinGraphDirectedWt(b, a, weight); +} + +//--------------------------------------------------------------------------------------- +// JoinGraphDirected +// ----------------- +// +// General : adds an arc between two items without weight(single +// direction) +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphDirected(Graph * a, Graph * b) +{ + JoinGraphDirectedWt(a, b, ZERO); +} + +//--------------------------------------------------------------------------------------- +// JoinGraphNonDirected +// -------------------- +// +// General : adds an arc between two items without weight. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void JoinGraphNonDirected(Graph * a, Graph * b) +{ + JoinGraphDirected(a, b); + JoinGraphDirected(b, a); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphDirectedWt +// --------------------- +// +// General : removes an arc between two items in a graph with the +// weight of it(searches for a certain direction). +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// int weight - the weight of the arc to be removed. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphDirectedWt(Graph * a, Graph * b, int weight) +{ + LLL * temp = a->list; + if (temp == NULL) + { + + } + else if (((Arc *)temp->value.pointer)->point == b && + ((Arc *)temp->value.pointer)->weight == weight) + { + PopLLL(&a->list); + } + else + { + while (temp->next && ((Arc *)temp->next->value.pointer)->point != b || + ((Arc *)temp->next->value.pointer)->weight != weight) + { + temp = temp->next; + } + if (temp->next) + { + DeleteAfterLLL(temp); + } + } +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphDirected +// ------------------- +// +// General : function removes arc between two items in a graph with a +// direction between them. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void. +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphDirected(Graph * a, Graph * b) +{ + RemoveGraphDirectedWt(a, b, ZERO); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphNonDirected +// ---------------------- +// +// General : function removes arc between two items in a graph, +// when the arc doesnt have weight to it. +// +// Parameters : Graph * a - the first item. +// Graph * b -the second item. +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphNonDirected(Graph * a, Graph * b) +{ + RemoveGraphDirected(a ,b); + RemoveGraphDirected(b, a); +} + +//--------------------------------------------------------------------------------------- +// RemoveGraphNonDirectedWt +// ------------------------ +// +// General : the function removes a specific arc with a specific weight +// to it +// +// Parameters : Graph * a - the first item +// Graph * b -the second item +// int weight - the weight of the arc to be removed +// +// Return Value : Void +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +void RemoveGraphNonDirectedWt(Graph * a, Graph * b, int weight) +{ + RemoveGraphDirectedWt(a ,b, weight); + RemoveGraphDirectedWt(b, a, weight); +} + +//--------------------------------------------------------------------------------------- +// AdjacentGraph +// ------------- +// +// General : Checks if a has direct access to b. +// +// Parameters : Graph * a - item to check if it is next to b +// Graph * b - item to check if it is next to a. +// +// Return Value : if Adjacent graph or not (true/false). +// +//--------------------------------------------------------------------------------------- +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 04.01.2020 +//--------------------------------------------------------------------------------------- +BOOLEAN AdjacentGraph(Graph * a, Graph * b) +{ + LLL * temp = a->list; + while (temp && ((Arc *)temp->next->value.pointer)->point != b) + { + temp = temp->next; + } + return (((Arc *)temp->next->value.pointer)->point == b); +} \ No newline at end of file diff --git a/Libs/General.h b/Libs/General.h new file mode 100644 index 0000000..52e3f53 --- /dev/null +++ b/Libs/General.h @@ -0,0 +1,298 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +struct BinaryTree +{ + Data_Type info; + struct BinaryTree * right; + struct BinaryTree * left; +}; + +struct ThirdTree +{ + Data_Type info; + struct ThirdTree * right; + struct ThirdTree * left; + struct ThirdTree * middle; +}; + +struct GeneralTree +{ + Data_Type info; + struct LLL * manager_general_trees; +}; + +struct Graph +{ + Data_Type info; + struct LLL * list; +}; + +struct Arc +{ + int weight; + struct Graph * point; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; +typedef struct BinaryTree BinaryTree; +typedef struct ThirdTree ThirdTree; +typedef struct GeneralTree GeneralTree; +typedef struct Graph Graph; +typedef struct Arc Arc; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); +BOOLEAN IsEmptyQueue(queue * q); +// -------------------------------------- LLL ------------------------------------------- +void InsertAfterLLL(LLL * manager); +void PushLLL(LLL ** manager); +void PopLLL(LLL ** manager); +void DeleteLLL(LLL * manager); +LLL * GetLoactionLLL(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ---------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------------------- +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** tree); +void AddLeftAfterBinaryTree(BinaryTree * tree); +void AddRightAfterBinaryTree(BinaryTree * tree); +BOOLEAN IsLeafBinaryTree(BinaryTree * tree); +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** tree); +void AddLeftAfterThirdTree(ThirdTree * tree); +void AddRightAfterThirdTree(ThirdTree * tree); +void AddMiddleAfterThirdTree(ThirdTree * tree); +BOOLEAN IsLeafThirdTree(ThirdTree * tree); +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** tree); +void AddAfterGeneralTree(GeneralTree * tree); +BOOLEAN IsLeafGeneralTree(GeneralTree * tree); +// -------------------------------------- Funcations Tree ----------------------------------- +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +// -------------------------------------- Graph ----------------------------------------- +void JoinGraphDirectedWt(Graph * a, Graph * b, int weight); +void JoinGraphNonDirectedWt(Graph * a, Graph * b, int weight); +void JoinGraphDirected(Graph * a, Graph * b); +void JoinGraphNonDirected(Graph * a, Graph * b); +void RemoveGraphDirectedWt(Graph * a, Graph * b, int weight); +void RemoveGraphDirected(Graph * a, Graph * b); +void RemoveGraphNonDirected(Graph * a, Graph * b); +void RemoveGraphNonDirectedWt(Graph * a, Graph * b, int weight); +BOOLEAN AdjacentGraph(Graph * a, Graph * b); \ No newline at end of file diff --git a/Projects/AtomBomb/General.c b/Projects/AtomBomb/General.c new file mode 100644 index 0000000..c9daa76 --- /dev/null +++ b/Projects/AtomBomb/General.c @@ -0,0 +1,2587 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLength +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringLength(char * str) +{ + return ((!*str) ? ZERO : (StringLength(++str) + ONE)); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (!(*start_stringA_index) && !(*start_stringB_index)); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLength(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLength(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLength(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) +{ + unsigned int counter; + Data_Type item; + if (((*q).items) == ONE) + { + item = (*q).values[ZERO]; + free((*q).values); + (*q).items--; + } + else if (((*q).items) > ONE) + { + item = (*q).values[ZERO]; + (*q).items--; + for (counter = ZERO; counter < (*q).items; counter++) + { + (*q).values[counter] = (*q).values[counter + ONE]; + } + (*q).values = (Data_Type *)realloc((*q).values, (*q).items * sizeof(Data_Type)); + } + + return (item); +} + +BOOLEAN IsEmptyQueue(queue * q) +{ + return (!q->items); +} +// ------------------------------------------ LLL --------------------------------------- +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterLLL(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushLLL(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopLLL(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteLLL(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionLLL(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} +// ----------------------------------- DLLL --------------------------------------------- +void InitDLLL(DLLL ** manager) +{ + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = NULL; + (*manager)->prev = NULL; +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)) +{ + while (manager != NULL) + { + Print(manager->info); + printf(" "); + manager = manager->next; + } + printf("\n"); +} +// ------------------------------------- CLLL ------------------------------------------- +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +// ---------------------------------- CDLLL --------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)) +{ + CDLLL * temp = manager->next; + while (temp != manager) + { + Print(temp->info); + printf(" "); + temp = temp->next; + } + Print(temp->info); + printf("\n"); +} + +// -------------------------------- Sparce Matrix --------------------------------------- +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next != ptr_sm) + temp = temp->row_next; + + return (temp); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next != ptr_sm) + temp = temp->col_next; + + return (temp); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} + +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** root) +{ + *root = (BinaryTree *)malloc(sizeof(BinaryTree)); + (*root)->left = NULL; + (*root)->right = NULL; +} + +void AddLeftAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterBinaryTree(BinaryTree * tree) +{ + BinaryTree * new_node = (BinaryTree *)malloc(sizeof(BinaryTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +BOOLEAN IsLeafBinaryTree(BinaryTree * tree) +{ + return (!(tree->left && tree->right)); +} + +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** root) +{ + *root = (ThirdTree *)malloc(sizeof(ThirdTree)); + (*root)->left = NULL; + (*root)->right = NULL; + (*root)->middle = NULL; +} + +void AddLeftAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->left = tree->left; + tree->left = new_node; +} + +void AddRightAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->right = tree->right; + tree->right = new_node; +} + +void AddMiddleAfterThirdTree(ThirdTree * tree) +{ + ThirdTree * new_node = (ThirdTree *)malloc(sizeof(ThirdTree)); + new_node->middle = tree->middle; + tree->middle = new_node; +} + +BOOLEAN IsLeafThirdTree(ThirdTree * tree) +{ + return (!(tree->left && tree->right && tree->middle)); +} + +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** root) +{ + *root = (GeneralTree *)malloc(sizeof(GeneralTree)); + (*root)->manager_general_trees = NULL; +} + +void AddAfterGeneralTree(GeneralTree * tree) +{ + GeneralTree * new_node = (GeneralTree *)malloc(sizeof(GeneralTree)); + LLL * temp = tree->manager_general_trees; + while (temp->next != NULL) + { + temp = temp->next; + } + InsertAfterLLL(temp); +} + +BOOLEAN IsLeafGeneralTree(GeneralTree * tree) +{ + return (tree->manager_general_trees != NULL); +} + +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + print(root->info); + PreodererPrintBinaryTree(root->left, print); + PreodererPrintBinaryTree(root->right, print); + } +} + +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + PosorderPrintBinaryTree(root->left, print); + PosorderPrintBinaryTree(root->right, print); + print(root->info); + } +} + +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + if (root != NULL) + { + InorderPrintBinaryTree(root->left, print); + print(root->info); + InorderPrintBinaryTree(root->right, print); + } +} + +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)) +{ + BinaryTree * temp; + queue * qt; + InitQueue(qt); + InsertQueue(qt, ((Data_Type)(void *)root)); + while (IsEmptyQueue(qt)) + { + temp = (BinaryTree *)RemoveQueue(qt).pointer; + if (!temp->left) + { + InsertQueue(qt, ((Data_Type)(void *)temp->left)); + } + print(temp->info); + if (!temp->right) + { + InsertQueue(qt, ((Data_Type)(void *)temp->right)); + } + } + +} \ No newline at end of file diff --git a/Projects/AtomBomb/General.h b/Projects/AtomBomb/General.h new file mode 100644 index 0000000..6270809 --- /dev/null +++ b/Projects/AtomBomb/General.h @@ -0,0 +1,274 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +struct BinaryTree +{ + Data_Type info; + struct BinaryTree * right; + struct BinaryTree * left; +}; + +struct ThirdTree +{ + Data_Type info; + struct ThirdTree * right; + struct ThirdTree * left; + struct ThirdTree * middle; +}; + +struct GeneralTree +{ + Data_Type info; + struct LLL * manager_general_trees; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; +typedef struct BinaryTree BinaryTree; +typedef struct ThirdTree ThirdTree; +typedef struct GeneralTree GeneralTree; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +int Random(int ** seed, int min, int max); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned int StringLength(char * str); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +// -------------------------------------- Stack ----------------------------------------- +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +// -------------------------------------- Queue ----------------------------------------- +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); +BOOLEAN IsEmptyQueue(queue * q); +// -------------------------------------- LLL ------------------------------------------- +void InsertAfterLLL(LLL * manager); +void PushLLL(LLL ** manager); +void PopLLL(LLL ** manager); +void DeleteLLL(LLL * manager); +LLL * GetLoactionLLL(LLL ** manager, unsigned short location); +// -------------------------------------- DLLL ------------------------------------------ +void InitDLLL(DLLL ** manager); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void PrintDLLL(DLLL * manager, void Print(Data_Type dt)); +// --------------------------------- CLLL ----------------------------------------------- +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +// --------------------------------- CDLLL ---------------------------------------------- +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +void PrintCDLLL(CDLLL * manager, void Print(Data_Type dt)); +// ---------------------------- Sparce Matrix ------------------------------------------- +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); +// -------------------------------------- Binary Tree ----------------------------------- +void MakeBinaryTree(BinaryTree ** tree); +void AddLeftAfterBinaryTree(BinaryTree * tree); +void AddRightAfterBinaryTree(BinaryTree * tree); +BOOLEAN IsLeafBinaryTree(BinaryTree * tree); +// -------------------------------------- Third Tree ----------------------------------- +void MakeThirdTree(ThirdTree ** tree); +void AddLeftAfterThirdTree(ThirdTree * tree); +void AddRightAfterThirdTree(ThirdTree * tree); +void AddMiddleAfterThirdTree(ThirdTree * tree); +BOOLEAN IsLeafThirdTree(ThirdTree * tree); +// -------------------------------------- General Tree ----------------------------------- +void MakeGeneralTree(GeneralTree ** tree); +void AddAfterGeneralTree(GeneralTree * tree); +BOOLEAN IsLeafGeneralTree(GeneralTree * tree); +// -------------------------------------- Funcations Tree ----------------------------------- +void PreodererPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void PosorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void InorderPrintBinaryTree(BinaryTree * root, void print(Data_Type)); +void LevelPrintBinaryTree(BinaryTree * root, void print(Data_Type)); \ No newline at end of file diff --git a/Projects/AtomBomb/a.out b/Projects/AtomBomb/a.out new file mode 100644 index 0000000..6d57299 Binary files /dev/null and b/Projects/AtomBomb/a.out differ diff --git a/Projects/AtomBomb/atom_bomb.c b/Projects/AtomBomb/atom_bomb.c new file mode 100644 index 0000000..25257d6 --- /dev/null +++ b/Projects/AtomBomb/atom_bomb.c @@ -0,0 +1,480 @@ +#include "General.h" + +#define ATOM 4 +#define NEUTRON_UP 3 +#define NEUTRON_DOWN 5 +#define NEUTRON_LEFT 7 +#define NEUTRON_RIGHT 9 +#define FILE_NAME "test.txt" +#define OPEN_FILE_TYPE "rt" +#define ASCII_COMMA ',' +#define ASCII_ZERO '0' +#define ASCII_HYPHEN '-' +#define SM_ROWS 500 +#define SM_COLUMNS 600 + + + +//--------------------------------------------------------------------------------------- +// ReadStringFromFile +// ------------------ +// +// General : Read from file as string and save the string to array. +// +// Parameters : +// char ** ptr_save_data - save data from file in array +// unsigned int length - length of array +// +// Return value : The number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void ReadStringFromFile(char ** ptr_save_data, unsigned int * length) +{ + *length = ZERO; + char ch; + FILE * fp = fopen(FILE_NAME, OPEN_FILE_TYPE); + if (fp) + { + *ptr_save_data = malloc(sizeof(ch)); + while ((ch = fgetc(fp)) != EOF) + { + *((*ptr_save_data) + *length) = ch; + (*length)++; + *ptr_save_data = realloc(*ptr_save_data, sizeof(ch) * (*length + ONE)); + } + *ptr_save_data = realloc(*ptr_save_data, sizeof(ch) * (*length)); + fclose(fp); + } + else + { + printf("Can't read file : \"%s\"\n", FILE_NAME); + } +} + +//--------------------------------------------------------------------------------------- +// StringToNumber +// -------------- +// +// General : Convert string to number. +// +// Parameters : +// char * ptr_str - array of char +// unsigned int length - length of array +// +// Return value : The number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +int StringToNumber(char * ptr_str, unsigned int length) +{ + int number = ZERO; + unsigned int counter; + if (*ptr_str == ASCII_HYPHEN) + { + number = -(*(++ptr_str)); + ptr_str++; + } + for (counter = ZERO; counter < length; counter++) + { + number = (number * TEN) + (*(ptr_str++) - ASCII_ZERO); + } + + return (number); +} + + +//--------------------------------------------------------------------------------------- +// FileDataToArray +// --------------- +// +// General : Change the data we get from file as string to numbers array. +// +// Parameters : +// char * ptr_file_data - pointer to char array +// unsigned int length_file_data - length of char array +// int ** ptr_array - pointer to save data from char array +// unsigned int * length_array - pointer of ptr_array length +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void FileDataToArray(char * ptr_file_data, unsigned int length_file_data, int ** ptr_array, unsigned int * length_array) +{ + char * temp_ptr_file_data = ptr_file_data; + int temp_number; + unsigned int loop_counter; + *length_array = ONE; + *ptr_array = malloc(sizeof(int)); + + for (loop_counter = ZERO; loop_counter < length_file_data; loop_counter++) + { + if (*temp_ptr_file_data == ASCII_COMMA) + { + (*ptr_array)[*length_array - ONE] = StringToNumber(ptr_file_data, temp_ptr_file_data - ptr_file_data); + (*length_array)++; + *ptr_array = realloc(*ptr_array, sizeof(int) * (*length_array)); + ptr_file_data = ++temp_ptr_file_data + ONE; + loop_counter++; + } + temp_ptr_file_data++; + } + *ptr_array = realloc(*ptr_array, sizeof(int) * (--(*length_array))); +} + +//--------------------------------------------------------------------------------------- +// InitBoard +// --------- +// +// General : Initializing simulation board. +// +// Parameters : +// SM * board - Simulation board +// unsigned int rows - Amount of rows in board +// unsigned int cols - Amount of cols in board +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void InitBoard(SM * board, unsigned int rows, unsigned int cols) +{ + unsigned int counter; + for (counter = ZERO; counter < rows; counter++) + { + AddRowSM(board); + } + for (counter = ZERO; counter < cols; counter++) + { + AddColSM(board); + } + +} + +//--------------------------------------------------------------------------------------- +// ArrayDataToSM +// ------------- +// +// General : Copies all points to a sparse matrix from the array. +// +// Parameters : +// SM * board - Simulation board +// int * ptr_arr - pointer of points array (x1, y1, x2, y2, ..) +// unsigned int length - length of points array +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void ArrayDataToSM(SM * board, int * ptr_arr, unsigned int length) +{ + unsigned int counter; + for (counter = ZERO; counter < length; counter += TWO) + { + AddItemSM(board, ptr_arr[counter], ptr_arr[counter+ONE]); + GetItemSM(board, ptr_arr[counter], ptr_arr[counter+ONE])->info.int_ = ATOM; + } +} + +//--------------------------------------------------------------------------------------- +// MoveUp +// ------ +// +// General : Creates to the up of the node, a neutron facing the up side +// of the simulation board. +// +// Parameters : +// SM * board - Simulation board +// SM * node - address of node in simulation board +// queue * qt - queue of active objects +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void MoveUp(SM * manager, SM * node, queue * qt) +{ + SM * temp = NULL; + if (node->row > ZERO) + { + temp = GetItemSM(manager, node->row - ONE, node->col); + if (!temp) + { + AddItemSM(manager, node->row - ONE, node->col); + temp->info.int_ = ONE; + } + temp->info.int_ *= node->info.int_; + } + if (temp != NULL) + { + InsertQueue(qt, (Data_Type)(void *)temp); + } +} + +//--------------------------------------------------------------------------------------- +// MoveDown +// -------- +// +// General : Creates to the down of the node, a neutron facing the down side +// of the simulation board. +// +// Parameters : +// SM * board - Simulation board +// SM * node - address of node in simulation board +// queue * qt - queue of active objects +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void MoveDown(SM * manager, SM * node, queue * qt) +{ + SM * temp = NULL; + if ((node->row + ONE) < RowsCountSM(manager)) + { + temp = GetItemSM(manager, node->row + ONE, node->col); + if (!temp) + { + AddItemSM(manager, node->row + ONE, node->col); + temp->info.int_ = ONE; + } + temp->info.int_ *= NEUTRON_DOWN; + } + if (temp != NULL) + { + InsertQueue(qt, (Data_Type)(void *)temp); + } +} + +//--------------------------------------------------------------------------------------- +// MoveLeft +// -------- +// +// General : Creates to the left of the node, a neutron facing the left side +// of the simulation board. +// +// Parameters : +// SM * board - Simulation board +// SM * node - address of node in simulation board +// queue * qt - queue of active objects +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void MoveLeft(SM * manager, SM * node, queue * qt) +{ + SM * temp = NULL; + if (node->col > ZERO) + { + temp = GetItemSM(manager, node->row, node->col - ONE); + if (!temp) + { + AddItemSM(manager, node->row, node->col - ONE); + temp->info.int_ = ONE; + } + temp->info.int_ *= NEUTRON_LEFT; + } + if (temp != NULL) + { + InsertQueue(qt, (Data_Type)(void *)temp); + } +} + +//--------------------------------------------------------------------------------------- +// MoveRight +// --------- +// +// General : Creates to the right of the node, a neutron facing the right side +// of the simulation board. +// +// Parameters : +// SM * board - Simulation board +// SM * node - address of node in simulation board +// queue * qt - queue of active objects +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void MoveRight(SM * board, SM * node, queue * qt) +{ + SM * temp = NULL; + if ((node->col + ONE) < ColsCountSM(board)) + { + temp = GetItemSM(board, node->row, node->col + ONE); + if (!temp) + { + AddItemSM(board, node->row, node->col + ONE); + temp->info.int_ = ONE; + } + temp->info.int_ *= NEUTRON_RIGHT; + } + if (temp != NULL) + { + InsertQueue(qt, (Data_Type)(void *)temp); + } +} + +//--------------------------------------------------------------------------------------- +// Explode +// ------- +// +// General : Handles atomic fission mode. +// +// Parameters : +// SM * board - Simulation board +// SM * node - address of node in simulation board +// queue * qt - queue of active objects +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void Explode(SM * board, SM * node, queue * qt) +{ + MoveUp(board, node, qt); + MoveDown(board, node, qt); + MoveLeft(board, node, qt); + MoveRight(board, node, qt); +} + +//--------------------------------------------------------------------------------------- +// Steps +// ----- +// +// General : Handles all objects within the queue.. +// +// Parameters : +// SM * manager - pointer of simulation board +// queue * qt - queue of objects +// +// Return value : Amount atoms explode. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +unsigned int Steps(SM * manager, queue * qt) +{ + unsigned int booms_count = ZERO; + SM * main_node; + while (!IsEmptyQueue(qt)) + { + main_node = (SM *)RemoveQueue(qt).pointer; + switch (main_node->info.int_) + { + case NEUTRON_UP: + MoveUp(manager, main_node, qt); + break; + case NEUTRON_DOWN: + MoveDown(manager, main_node, qt); + break; + case NEUTRON_LEFT: + MoveLeft(manager, main_node, qt); + break; + case NEUTRON_RIGHT: + MoveRight(manager, main_node, qt); + break; + + default: + if (!(main_node->info.int_ % TWO)); + { + Explode(manager, main_node, qt); + booms_count++; + } + break; + } + RemoveItemSM(manager, main_node->row, main_node->col); + } + + return (booms_count); +} + +//--------------------------------------------------------------------------------------- +// Atomic explosion +// ------------------- +// +// General : The program is essentially an atomic explosion +// simulation +// +// Input : A location where we want to blow up the atom +// +// Process : The program reads atoms the locations of the atoms +// and presents them in the matrix. Then we choose a +// place where we want to blow up the atom in the matrix +// and count how many nuclear fission happened +// +// Output : None +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.01.2020 +//--------------------------------------------------------------------------------------- +void main(void) +{ + SM * board; + SM * temp; + queue active_objects; + char * chars_from_file; + unsigned int length_chars_from_file; + int * atoms_position; + unsigned int length_atoms_position; + unsigned int chosen_row; + unsigned int chosen_col; + unsigned int booms_count; + ReadStringFromFile(&chars_from_file, &length_chars_from_file); + FileDataToArray(chars_from_file, length_chars_from_file, atoms_position, &length_atoms_position); + free(chars_from_file); + InitSM(&board); + InitBoard(board, SM_ROWS, SM_COLUMNS); + InitQueue(&active_objects); + ArrayDataToSM(board, atoms_position + ONE, length_atoms_position - ONE); + free(atoms_position); + while (!temp) + { + printf("Enter X of atom you want to explode: "); + scanf(" %u", &chosen_col); + printf("Enter Y of atom you want to explode: "); + scanf(" %u", &chosen_row); + temp = GetItemSM(board, chosen_row, chosen_col); + } + InsertQueue(&active_objects, (Data_Type)(void *)temp); + booms_count = Steps(board, &active_objects); + + printf("Energy: %d\n", booms_count); + +} \ No newline at end of file diff --git a/Projects/AtomBomb/test.txt b/Projects/AtomBomb/test.txt new file mode 100644 index 0000000..41dc1ef --- /dev/null +++ b/Projects/AtomBomb/test.txt @@ -0,0 +1 @@ +idan cohen diff --git a/Projects/AtomBomb/בעיות.odg b/Projects/AtomBomb/בעיות.odg new file mode 100644 index 0000000..10452b5 Binary files /dev/null and b/Projects/AtomBomb/בעיות.odg differ diff --git a/Projects/AtomBomb/פונקציות.txt b/Projects/AtomBomb/פונקציות.txt new file mode 100644 index 0000000..65337fc --- /dev/null +++ b/Projects/AtomBomb/פונקציות.txt @@ -0,0 +1,3 @@ +1) לעשות פונקציה שתבדוק את מקום ההתנגשות ברגע ששני אטומים מתפוצצים באותו רגע. + +2) ג diff --git a/Projects/LifeGame/General.c b/Projects/LifeGame/General.c new file mode 100644 index 0000000..68b9fc8 --- /dev/null +++ b/Projects/LifeGame/General.c @@ -0,0 +1,2378 @@ +#include "General.h" + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = ZERO; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(","); + } + printf("\n"); +} + +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} + +// ---------------------------- Sparce Matrix ------------------------------ +void InitSM(SM ** manager) +{ + *manager = (SM *)malloc(sizeof(SM)); + (*manager)->col = (*manager)->row = -ONE; + (*manager)->col_next = (*manager)->row_next = *manager; +} + +void AddRowSM(SM * manager) +{ + SM * temp = manager->row_next; + while (temp->row_next != manager) + temp = temp->row_next; + temp->row_next = (SM *)malloc(sizeof(SM)); + temp->row_next->row_next = manager; + temp->row_next->col_next = temp->row_next; + temp->row_next->row = temp->row + ONE; + temp->row_next->col = -ONE; +} + +void AddColSM(SM * manager) +{ + SM * temp = manager->col_next; + while (temp->col_next != manager) + temp = temp->col_next; + temp->col_next = (SM *)malloc(sizeof(SM)); + temp->col_next->col_next = manager; + temp->col_next->row_next = temp->col_next; + temp->col_next->col = temp->col + ONE; + temp->col_next->row = -ONE; +} + +SM * GetItemSM(SM * manager, int row, int col) +{ + SM * temp_manager = manager->row_next; + SM * ret_item = NULL; + while (temp_manager->row < row && temp_manager->row != -ONE) + { + temp_manager = temp_manager->row_next; + } + temp_manager = temp_manager->col_next; + while (temp_manager->col < col && temp_manager->col != -ONE) + { + temp_manager = temp_manager->col_next; + } + if (temp_manager->col == col && temp_manager->row == row) + { + ret_item = temp_manager; + } + return (ret_item); +} + +SM * FindAbove(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->row_next->row_next != ptr_sm) + temp = temp->row_next; + + return ((temp->row_next->row == -ONE) ? temp : temp->row_next); +} + +SM * FindBefore(SM * ptr_sm) +{ + SM * temp = ptr_sm; + while (temp->col_next->col_next != ptr_sm) + temp = temp->col_next; + + return ((temp->col_next->col == -ONE) ? temp : temp->col_next); +} + +unsigned int RowsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->row_next; + while (temp != manager) + { + count++; + temp = temp->row_next; + } + + return (count); +} + +unsigned short ColsCountSM(SM * manager) +{ + unsigned int count = ZERO; + SM * temp = manager->col_next; + while (temp != manager) + { + count++; + temp = temp->col_next; + } + + return (count); +} + +void AddItemSM(SM * manager, int row, int col) +{ + SM * col_manager = manager; + SM * row_manager = manager; + SM * new_item; + while (row_manager->row_next->row != -ONE && row_manager->row < row) + { + row_manager = row_manager->row_next; + } + while (col_manager->col_next->col != -ONE && col_manager->col < col) + { + col_manager = col_manager->col_next; + } + + while (row_manager->col_next->col != -ONE && row_manager->col_next->col < col) + { + row_manager = row_manager->col_next; + } + while (col_manager->row_next->row != -ONE && col_manager->row_next->row < row) + { + col_manager = col_manager->row_next; + } + + if (col_manager->row_next != row_manager->col_next) + { + new_item = (SM *)malloc(sizeof(SM)); + new_item ->col_next = row_manager->col_next; + new_item ->row_next = col_manager->row_next; + row_manager->col_next = new_item; + col_manager->row_next = new_item; + new_item->col = col; + new_item->row = row; + } +} + +void RemoveItemSM(SM * manager, int row, int col) +{ + SM * temp_manager; + SM * del_item = GetItemSM(manager, row, col); + if (del_item != NULL) + { + temp_manager = del_item->row_next; + while (temp_manager->row_next != del_item) + { + temp_manager = temp_manager->row_next; + } + temp_manager->row_next = del_item->row_next; + + temp_manager = del_item->col_next; + while (temp_manager->col_next != del_item) + { + temp_manager = temp_manager->col_next; + } + temp_manager->col_next = del_item->col_next; + free(del_item); + } +} + +void RemoveColSM(SM * manager) +{ + SM * temp = manager; + SM * del_col; + while (temp->col_next->col_next->col != -ONE) + { + temp = temp->col_next; + } + if (temp->col_next->row_next->col != -ONE) + { + while (temp->col_next->row_next->row != -ONE) + { + RemoveItemSM(manager, temp->col_next->row_next->row, temp->col_next->row_next->col); + } + del_col = manager->col_next; + manager->col_next = manager->col_next->col_next; + free(del_col); + } +} + +void RemoveRowSM(SM * manager) +{ + SM * temp = manager; + SM * del_row; + while (temp->row_next->row_next->row != -ONE) + { + temp = temp->row_next; + } + if (temp->row_next->col_next->row != -ONE) + { + while (temp->row_next->col_next->col != -ONE) + { + RemoveItemSM(manager, temp->row_next->col_next->row, temp->row_next->col_next->col); + } + del_row = manager->row_next; + manager->row_next = manager->row_next->row_next; + free(del_row); + } +} + +void PrintIntDataType(Data_Type dt) +{ + printf("%d", dt.int_); +} + +void PrintSM(SM * manager, void print(Data_Type)) +{ + SM * temp; + unsigned int length_row = RowsCountSM(manager); + unsigned int length_col = ColsCountSM(manager); + unsigned int count_row, count_col; + for (count_row = ZERO; count_row < length_row; count_row++) + { + for (count_col = ZERO; count_col < length_col; count_col++) + { + temp = GetItemSM(manager, count_row, count_col); + (temp == NULL) ? printf("NULL") : print(temp->info); + printf(" "); + } + printf("\n"); + } +} \ No newline at end of file diff --git a/Projects/LifeGame/General.h b/Projects/LifeGame/General.h new file mode 100644 index 0000000..48222e9 --- /dev/null +++ b/Projects/LifeGame/General.h @@ -0,0 +1,219 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +struct SM +{ + Data_Type info; + int row; + int col; + struct SM * col_next; + struct SM * row_next; +}; + +typedef struct SM SM; +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; + +void ChangeYearsToMonths(int *years, short *month); +void SwapNumbers(int *ptr_number1, int *ptr_number2); +void SwapChars(char *ptr_char1, char *ptr_char2); +void ChangeMonthsToDays(short *months, int *days); +void ChangeDateToDays(int *date, int *days); +void ChangeDaysToMonths(int *days, int *months); +void ChangeMonthsToYears(int *months, int *years); +void ChangeDaysToDate(int *days, int *date); +int DifferentDates(int *date1, int *date2, int *different); +BOOLEAN EvenNumber(int num); +int OppositeNumber(int num); +int OddDigitsInNumber(int num); +int EvenDigitsInNumber(int num); +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num); +double Power(float num, short pow); +int GetRest(double num, unsigned short count_digits); +unsigned short CountDigits(int num); +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size); +double Sum(double number1, double number2); +int SumOfDigitsNumber(double number); +int SumEvenDigits(double number); +int SumOddDigits(double number); +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2); +double Sqrt(double number, short root); +BOOLEAN PrimeNumber(int number); +double Module(double number, double div); // TODO : FIX IT +BOOLEAN DigitInNumber(double number, unsigned short digit); +int ConcatenationNumbers(short number1, short number2); +int Multiplication(short number1, short multiply); // TODO : FIX IT +int GetDenominator(double number); +short GetCounter(double number); +double Divide(double number, double div); // TODO : FIX IT +BOOLEAN SumInArray(int array[], unsigned int size, int sum); +BOOLEAN ChangeBool(BOOLEAN bool1); +BOOLEAN Equality(int number1, int number2); +BOOLEAN NumBBiggerThenNumA(int a, int b); +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size); +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask); +unsigned short CountADigitInNumber(int number, unsigned short digit); +short GetDigit(int number, unsigned short location); +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2); +unsigned short CountOfIdenticalDigits(int number1, int number2); +BOOLEAN ForeignDigits(int number); +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)); +void CopyChar(char * ch, char * copy); +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)); +BOOLEAN CharInString(char text[], char c); +char * LastCharOfString(char * start_string); +unsigned short StringLenght(char *start_string); +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index); +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c); +unsigned short CountCharInString(char *start_string_index, char *c); +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index); +void CopyString(char *start_string_index, char *start_copy_index); +void LinkingString(char *start_stringA_index, char *start_stringB_index); +void ReverseString(char textA[]); +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b); +char * IndexStringBInStringA(char *start_string_a, char *start_string_b); +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b); +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b); +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index); +BOOLEAN ValidParenthesesTemplate(char text[]); +unsigned short CharToNumber(char *c); +unsigned int MaxCountCharInString(char *start_string_index); +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index); +BOOLEAN EvenBits(byte b); +unsigned short CountBits(byte b); +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result); +void InitStack(stack * sk); +BOOLEAN IsEmptyStack(stack * sk); +void PushStack(stack * sk , Data_Type item); +Data_Type PopStack(stack * sk); +void EmptyStack(stack * sk); +void CopyStack(stack * sk, stack * copy); +void OppositeStack(stack * sk); +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2); +unsigned int ItemsStack(stack * sk); +int SumStack(stack * sk); +BOOLEAN FindNumberInStack(stack * sk, Data_Type item); +void UnionStack(stack * sk1, stack * sk2); +void InitQueue(queue * q); +void InsertQueue(queue * q, Data_Type item); +Data_Type RemoveQueue(queue * q); // Fix it +void InsertAfterList(LLL * manager); +void PushList(LLL ** manager); +void PopList(LLL ** manager); +void DeleteList(LLL * manager); +LLL * GetLoactionList(LLL ** manager, unsigned short location); +void PushDLLL(DLLL ** manager); +void InsertAfterDLLL(DLLL * ptr_before); +void InsertBeforeDLLL(DLLL * ptr_after); +void PopDLLL(DLLL ** manager); +void DeleteDLLL(DLLL * ptr_cur); +void InsertLastCLLL(CLLL ** manager); +void InsertAfterCLLL(CLLL * ptr_before); +void InsertEndCLLL(CLLL ** manager); +void DeleteLastCLLL(CLLL ** manager); +void DeleteAfterCLLL(CLLL * ptr_before); +void DeleteEndCLLL(CLLL ** manager); +void InsertLastCDLLL(CDLLL ** manager); +void InsertAfterCDLLL(CDLLL * ptr_before); +void InsertBeforeCDLLL(CDLLL * ptr_after); +void InsertEndCDLLL(CDLLL ** manager); +void DeleteCDLLL(CDLLL * ptr_cur); +void DeleteLastCDLLL(CDLLL ** manager); +// ---------------------------- Sparce Matrix ------------------------------ +void InitSM(SM ** manager); +void AddRowSM(SM * manager); +void AddColSM(SM * manager); +SM * GetItemSM(SM * manager, int row, int col); +SM * FindAbove(SM * ptr_sm); +SM * FindBefore(SM * ptr_sm); +unsigned int RowsCountSM(SM * manager); +unsigned short ColsCountSM(SM * manager); +void AddItemSM(SM * manager, int row, int col); +void RemoveItemSM(SM * manager, int row, int col); +void RemoveColSM(SM * manager); +void RemoveRowSM(SM * manager); +void PrintIntDataType(Data_Type dt); +void PrintSM(SM * manager, void print(Data_Type)); \ No newline at end of file diff --git a/Projects/LifeGame/a.out b/Projects/LifeGame/a.out new file mode 100644 index 0000000..179f241 Binary files /dev/null and b/Projects/LifeGame/a.out differ diff --git a/Projects/LifeGame/checkthis.c b/Projects/LifeGame/checkthis.c new file mode 100644 index 0000000..e64a139 --- /dev/null +++ b/Projects/LifeGame/checkthis.c @@ -0,0 +1,37 @@ +void AddOneToNeighbors(int * ptr_mat, int * ptr_loc, unsigned int row_size, unsigned int col_size) +{ + int * ptr_last = ptr_mat + (row_size * col_size); + int * ptr_temp = ptr_loc - col_size - ONE; + for (unsigned short count = ZERO; count < THREE; count++) + { + if (ptr_temp >= ptr_mat && + ((int)ptr_temp / sizeof(int)) / row_size == ((((int)ptr_loc / sizeof(int)) / row_size) - ONE)) + { + (*(ptr_temp))++; + } + ptr_temp++; + } + + ptr_temp = ptr_loc - ONE; + for (unsigned short count = ZERO; count < TWO; count++) + { + if (ptr_temp >= ptr_mat && + ptr_temp < ptr_last && + ((int)ptr_temp / sizeof(int)) / row_size == ((((int)ptr_loc / sizeof(int)) / row_size))) + { + (*(ptr_temp))++; + } + ptr_temp += TWO; + } + + ptr_temp = ptr_loc + col_size - ONE; + for (unsigned short count = ZERO; count < THREE; count++) + { + if (ptr_temp < ptr_last && + ((int)ptr_temp / sizeof(int)) / row_size == ((((int)ptr_loc / sizeof(int)) / row_size) + ONE)) + { + (*(ptr_temp))++; + } + ptr_temp++; + } +} diff --git a/Projects/LifeGame/life_game.c b/Projects/LifeGame/life_game.c new file mode 100644 index 0000000..3bda26c --- /dev/null +++ b/Projects/LifeGame/life_game.c @@ -0,0 +1,429 @@ +#include "General.h" + +#define WORLD_SIZE 25 +#define FIVETEEN 15 +#define FORTY 40 +#define FIVTY 50 +#define THIRTY 30 +#define TWENTY 20 + + +//--------------------------------------------------------------------------------------- +// Random +// ------ +// +// General : Create random number. +// +// Parameters : +// seed - seed of random (int **). +// min - minimum for result. +// max - maximum for result. +// +// Return value : random number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int Random(int ** seed, int min, int max) +{ + return ((*((*seed)++) % (++max)) + min); +} + +//--------------------------------------------------------------------------------------- +// InitWorld +// --------- +// +// General : Initialize the world. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// rows - Amount of rows in the world. +// cols - Amount of columns in the world. +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void InitWorld(SM * world, int rows, int cols) +{ + unsigned short counter; + for (counter = ZERO; counter < rows; counter++) + { + AddRowSM(world); + } + for (counter = ZERO; counter < cols; counter++) + { + AddColSM(world); + } +} + +//--------------------------------------------------------------------------------------- +// RemoveWorld +// ----------- +// +// General : Deletes the world, freeing up space in memory. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void RemoveWorld(SM * world) +{ + unsigned short counter; + unsigned short rows = RowsCountSM(world); + unsigned short cols = ColsCountSM(world); + for (counter = ZERO; counter < rows; counter++) + { + RemoveRowSM(world); + } + for (counter = ZERO; counter < cols; counter++) + { + RemoveColSM(world); + } + free(world); +} + +//--------------------------------------------------------------------------------------- +// RandomWorld +// ----------- +// +// General : Creates a random population. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// seed - seed for random (int **). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void RandomWorld(SM * world, int ** seed) +{ + unsigned short rows = RowsCountSM(world); + unsigned short cols = ColsCountSM(world); + unsigned short counter; + unsigned short length = rows * cols; + for (counter = ZERO; counter < length; counter++) + { + Random(seed, ZERO, ONE) ? AddItemSM(world, counter / rows, counter % cols) : ZERO; + } +} + +//--------------------------------------------------------------------------------------- +// Earthquake +// ---------- +// +// General : Decreases world size because of earthquake. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// row - row of point to check (unsigned int). +// col - column of point to check (unsigned int). +// +// Return value : Amount of neughbors (short (0-8)). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +short CountNeighbors(SM * world, unsigned int row, unsigned int col) +{ + short count = -ONE; + short loop_counter; + for (loop_counter = -ONE; loop_counter < TWO; loop_counter++) + { + count += GetItemSM(world, row - ONE , col + loop_counter) != NULL; + count += GetItemSM(world, row, col + loop_counter) != NULL; + count += GetItemSM(world, row + ONE, col + loop_counter) != NULL; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// Earthquake +// ---------- +// +// General : Decreases world size because of earthquake. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void Earthquake(SM * world) +{ + int del_rows_count = RowsCountSM(world) / TEN; + int del_cols_count = ColsCountSM(world) / TEN; + unsigned short counter; + for (counter = ZERO; counter < del_rows_count; counter++) + { + RemoveRowSM(world); + } + for (counter = ZERO; counter < del_cols_count; counter++) + { + RemoveColSM(world); + } +} + +//--------------------------------------------------------------------------------------- +// Epidemic +// -------- +// +// General : Expands the world in rows and columns because of ocean retreat. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void WithdrawalOceans(SM * world) +{ + int add_rows_count = RowsCountSM(world) / FIVE; + int add_cols_count = ColsCountSM(world) / FIVE; + unsigned short counter; + for (counter = ZERO; counter < add_rows_count; counter++) + { + AddRowSM(world); + } + for (counter = ZERO; counter < add_cols_count; counter++) + { + AddColSM(world); + } +} + +//--------------------------------------------------------------------------------------- +// Epidemic +// -------- +// +// General : Reduces the amount of ranks in the world because of an epidemic. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void Epidemic(SM * world) +{ + int del_rows_count = RowsCountSM(world) / FIVETEEN; + unsigned short counter; + for (counter = ZERO; counter < del_rows_count; counter++) + { + RemoveRowSM(world); + } +} + +//--------------------------------------------------------------------------------------- +// Drying +// ------ +// +// General : Expands the world space due to drying and lakes. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void Drying(SM * world) +{ + int add_cols_count = RowsCountSM(world) / FIVETEEN; + unsigned short counter; + for (counter = ZERO; counter < add_cols_count; counter++) + { + AddColSM(world); + } +} + +//--------------------------------------------------------------------------------------- +// PercentagePopulation +// -------------------- +// +// General : Checks the amount of population relative to world size. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// +// Return value : Percentage (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +int PercentagePopulation(SM * world) +{ + unsigned short alives = ZERO; + unsigned short counter; + unsigned short rows = RowsCountSM(world); + unsigned short cols = ColsCountSM(world); + unsigned short length = rows * cols; + for (counter = ZERO; counter < length; counter++) + { + alives += (GetItemSM(world, counter / rows, counter % cols) != NULL); + } + + return ((alives / length) * ONE_HUNDRED); +} + +//--------------------------------------------------------------------------------------- +// OneGenerationWorld +// ------------------ +// +// General : Performs a one-generation world-wide process. +// +// Parameters : +// world - sparce matrix pointer (SM *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void OneGenerationWorld(SM * world) +{ + int percentage = PercentagePopulation(world); + (percentage >= FIVTY) ? Earthquake(world) : ZERO; + (percentage < TWENTY) ? WithdrawalOceans(world) : ZERO; + (percentage == THIRTY) ? Epidemic(world) : ZERO; + (percentage == FORTY) ? Drying(world) : ZERO; +} + +//--------------------------------------------------------------------------------------- +// OneGenerationPopulation +// ----------------------- +// +// General : Performs one generation process in population. +// +// Parameters : +// world - pointer of sparce matrix pointer (SM **). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void OneGenerationPopulation(SM ** world) +{ + SM * new_world; + SM * temp; + unsigned short counter; + unsigned short rows = RowsCountSM(*world); + unsigned short cols = ColsCountSM(*world); + unsigned short length = rows * cols; + short count_neighbors; + InitSM(&new_world); + InitWorld(new_world, rows, cols); + for (counter = ZERO; counter < length; counter++) + { + count_neighbors = CountNeighbors(*world, counter / rows, counter % cols); + temp = GetItemSM(*world, counter / rows, counter % cols); + if ((temp == NULL && count_neighbors == TWO) || + (temp != NULL && count_neighbors <= THREE && count_neighbors >= TWO)) + { + AddItemSM(new_world, counter / rows, counter % cols); + } + } + RemoveWorld(*world); + *world = new_world; +} + +//--------------------------------------------------------------------------------------- +// OneGeneralGeneration +// -------------------- +// +// General : Performs one generation procedure and prints it. +// +// Parameters : +// world - pointer of sparce matrix pointer (SM **). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void OneGeneralGeneration(SM ** world) +{ + OneGenerationPopulation(world); + OneGenerationWorld(*world); + PrintSM(*world, PrintIntDataType); +} + +//--------------------------------------------------------------------------------------- +// Minesweeper +// ----------- +// +// General : The game is a zero-player game, meaning that its evolution is determined by +// its initial state, requiring no further input. One interacts with the Game +// of Life by creating an initial configuration and observing how it evolves. +// +// Input : Accepts like the generations the user wants to do. +// +// Process : The program accepts the number of generations and loops each time it +// processes the world and prints to the user what happens in each generation. +// +// Output : What the world looks like in each generation. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned int generations; + unsigned int counter; + int * seed; + SM * world; + InitSM(&world); + InitWorld(world, WORLD_SIZE, WORLD_SIZE); + RandomWorld(world, &seed); + PrintSM(world, PrintIntDataType); + printf("Enter count of generations: "); + scanf("%u", &generations); + for (counter = ZERO; counter < generations; counter++) + { + OneGeneralGeneration(&world); + } + RemoveWorld(world); +} \ No newline at end of file diff --git a/Projects/MainProject/OpenCV Face Detection_ Visualized ( 488 X 512 ).mp4 b/Projects/MainProject/OpenCV Face Detection_ Visualized ( 488 X 512 ).mp4 new file mode 100644 index 0000000..984c3c8 Binary files /dev/null and b/Projects/MainProject/OpenCV Face Detection_ Visualized ( 488 X 512 ).mp4 differ diff --git a/Projects/MainProject/הצעת פרויקט.odt b/Projects/MainProject/הצעת פרויקט.odt new file mode 100644 index 0000000..94d53da Binary files /dev/null and b/Projects/MainProject/הצעת פרויקט.odt differ diff --git a/Projects/Projects1/project1 b/Projects/Projects1/project1 new file mode 100644 index 0000000..f905d94 Binary files /dev/null and b/Projects/Projects1/project1 differ diff --git a/Projects/Projects1/project1.c b/Projects/Projects1/project1.c new file mode 100644 index 0000000..85ce012 --- /dev/null +++ b/Projects/Projects1/project1.c @@ -0,0 +1,345 @@ +#include + +#define SIZE_NUMBER 4 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define TEN 10 +#define TWO 2 +#define ONE 1 +#define ZERO 0 +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) + + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + BOOLEAN answer = (ONE / (ABS(number1 - number2) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number_a - first number (int) +// number_b - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int number_a, int number_b) +{ + int sub = number_a - number_b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Game Bullseye +// ------------- +// +// General : There are two contestants. Each contestant chooses an integer +// of 4 digits without declaring it +// The number consists of foreign literature to each other. +// Each participant is supposed to guess the number chosen by his or +// her member in minimum steps. +// For each guess, the contestant will receive a response according to +// the following rules: +// If you guess a book exists in a selected number and is not in its exact +// location - this is an injury +// If you guess a book exists in a number but not in its +// exact location - it's a bullet. +// +// Input : Two numbers with 4 digits and Foreign digits. +// +// Process : The program receives two numbers per number, it checks their correctness. +// If the number is foreign and has 4 digits. +// The program then enters the loop where it stops only when one of the +// players manages to reach four hits. +// The program checks the accuracy of each player's guess. +// The program then checks to see if the number has vulnerabilities and +// projectiles with its opponent's number. +// The program prints the player's results and moves to the next +// player's queue. If one of the players wins the program comes +// out of the loop and announces the winner +// +// Output : Who wins. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 23.10.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + unsigned short player1_number = ZERO, + player2_number = ZERO, + check_number, + damage, + projectiles, + guess_number, + guessing_amount = ZERO; + BOOLEAN is_player1; + + // Checking the correctness of the input (4 digits, foreign digits) for player1 + while ((CountDigits(player1_number) - SIZE_NUMBER) + !ForeignDigits(player1_number)) + { + printf("Player 1 : : Enter number with foreign digits and 4 digits: "); + scanf("%hu", &player1_number); + } + + // Checking the correctness of the input (4 digits, foreign digits) for player2 + while ((CountDigits(player2_number) - SIZE_NUMBER) + !ForeignDigits(player2_number)) + { + printf("Player 2 : : Enter number with foreign digits and 4 digits: "); + scanf("%hu", &player2_number); + } + + // First player starts his turn + is_player1 = TRUE; + + // As long as the vulnerability is not 4, the loop is running + while (!Equality(damage, SIZE_NUMBER)) + { + damage = ZERO; + projectiles = ZERO; + + // Checks that the correctness of the guess input is 4 digits + while (CountDigits(guess_number) - SIZE_NUMBER) + { + printf("Player "); + if (is_player1) + { + printf("1"); + guessing_amount++; + } + else + printf("2"); + printf(" : : Enter your guess: "); + scanf("%hu", &guess_number); + } + + // Checks the guess based on the player's turn + check_number = (!is_player1) ? player1_number : player2_number; + + // Checks the amount of vulnerability + damage = CountOfIdenticalDigitsInSomeIndex(check_number, guess_number); + + // Checking the amount of projectiles + projectiles = CountOfIdenticalDigits(check_number, guess_number) - damage; + + printf("Damage: %hu\nTarget Shooting: %hu\n\n", damage, projectiles); + guess_number = ZERO; + + // Changing the turn of the player to the next player + is_player1 = ChangeBool(is_player1); + } + printf("The winner is \"Player "); + if (!is_player1) + printf("1"); + else + printf("2"); + printf("\" with %hd guesses!\n", guessing_amount); +} \ No newline at end of file diff --git a/Projects/Shola/Lib b/Projects/Shola/Lib new file mode 100644 index 0000000..d210d20 Binary files /dev/null and b/Projects/Shola/Lib differ diff --git a/Projects/Shola/Lib.h b/Projects/Shola/Lib.h new file mode 100644 index 0000000..d00bb6c --- /dev/null +++ b/Projects/Shola/Lib.h @@ -0,0 +1,2227 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +struct DLLL +{ + Data_Type info; + struct DLLL * next; + struct DLLL * prev; +}; + +struct CLLL +{ + Data_Type info; + struct CLLL * next; +}; + +struct CDLLL +{ + Data_Type info; + struct CDLLL * next; + struct CDLLL * prev; +}; + +typedef struct LLL LLL; +typedef struct DLLL DLLL; +typedef struct CLLL CLLL; +typedef struct CDLLL CDLLL; + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * PtrCharInString(char * text, char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((*text != c) && *text); + + return ((*text) ? text : NULL); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} + +void PushDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager); + (*manager) = (DLLL *)malloc(sizeof(DLLL)); + (*manager)->next = ptr_next; + ptr_next->prev = (*manager); +} + +void InsertAfterDLLL(DLLL * ptr_before) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->next = ptr_before->next; + ptr_before->next->prev = ptr_cur; + ptr_cur->prev = ptr_before; + ptr_before->next = ptr_cur; +} + +void InsertBeforeDLLL(DLLL * ptr_after) +{ + DLLL * ptr_cur = (DLLL *)malloc(sizeof(DLLL)); + ptr_cur->prev = ptr_after->prev; + ptr_after->prev->next = ptr_cur; + ptr_cur->next = ptr_after; + ptr_after->prev = ptr_cur; +} + +void PopDLLL(DLLL ** manager) +{ + DLLL * ptr_next = (*manager)->next; + ptr_next->prev = NULL; + free(*manager); + *manager = ptr_next; +} + +void DeleteDLLL(DLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void InsertLastCLLL(CLLL ** manager) +{ + (*manager) = (CLLL *)malloc(sizeof(CLLL)); + (*manager)->next = (*manager); +} + +void InsertAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = (CLLL *)malloc(sizeof(CLLL)); + ptr_before->next->next = ptr_next; +} + +void InsertEndCLLL(CLLL ** manager) +{ + InsertAfterCLLL(*manager); + manager = &((*manager)->next); +} + +void DeleteLastCLLL(CLLL ** manager) +{ + free(*manager); + (*manager) = NULL; +} + +void DeleteAfterCLLL(CLLL * ptr_before) +{ + CLLL * ptr_next = ptr_before->next; + ptr_before->next = ptr_before->next->next; + free(ptr_next); +} + +void DeleteEndCLLL(CLLL ** manager) +{ + CLLL * ptr_before = (*manager)->next; + while (ptr_before->next != (*manager)) + { + ptr_before = ptr_before->next; + } + DeleteAfterCLLL(ptr_before); + manager = &ptr_before; +} + +void InsertLastCDLLL(CDLLL ** manager) +{ + (*manager) = (CDLLL *)malloc(sizeof(CDLLL)); + (*manager)->next = (*manager); + (*manager)->prev = (*manager); +} + +void InsertAfterCDLLL(CDLLL * ptr_before) +{ + CDLLL * ptr_new = (CDLLL *)malloc(sizeof(CDLLL)); + ptr_new->next = ptr_before->next; + ptr_before->next->prev = ptr_new; + ptr_new->prev = ptr_before; + ptr_before->next = ptr_new; +} + +void InsertBeforeCDLLL(CDLLL * ptr_after) +{ + ptr_after = ptr_after->prev; + InsertAfterCDLLL(ptr_after); +} + +void InsertEndCDLLL(CDLLL ** manager) +{ + InsertAfterCDLLL(*manager); + *manager = (*manager)->next; +} + +void DeleteCDLLL(CDLLL * ptr_cur) +{ + ptr_cur->next->prev = ptr_cur->prev; + ptr_cur->prev->next = ptr_cur->next; + free(ptr_cur); +} + +void DeleteLastCDLLL(CDLLL ** manager) +{ + free(*manager); + *manager = NULL; +} \ No newline at end of file diff --git a/Projects/Shola/a.out b/Projects/Shola/a.out new file mode 100644 index 0000000..702c233 Binary files /dev/null and b/Projects/Shola/a.out differ diff --git a/Projects/Shola/game b/Projects/Shola/game new file mode 100644 index 0000000..f7ddd1e Binary files /dev/null and b/Projects/Shola/game differ diff --git a/Projects/Shola/game.c b/Projects/Shola/game.c new file mode 100644 index 0000000..c278a5f --- /dev/null +++ b/Projects/Shola/game.c @@ -0,0 +1,280 @@ +#include "Lib.h" + +#define MAT_SIZE 12 +#define SIGN_UNCOVER '.' +#define ASCII_SPACE ' ' +#define ASCII_ZERO '0' +#define STOP_GAME 999 + +//--------------------------------------------------------------------------------------- +// InputString +// ----------- +// +// General : Input string from user. +// +// Parameters : +// ptr_str - The pointer to save the string from user (char *). +// size - Amount of char to inputs from user (unsigned int). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void InputString(char * ptr_str, unsigned int size) +{ + fgets(ptr_str, size, stdin); +} + +//--------------------------------------------------------------------------------------- +// StringToValue +// ------------- +// +// General : Convert string to value like "12" to 12 +// +// Parameters : +// ptr_start_string - pointer of strat string (char *). +// ptr_end_string - pointer of end string (char *). +// +// Return value : The value (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +unsigned int StringToValue(char * ptr_start_string, char * ptr_end_string) +{ + unsigned int value = ZERO; + while (ptr_start_string < ptr_end_string) + { + value *= TEN; + value += *ptr_start_string - ASCII_ZERO; + ptr_start_string++; + } + + return (value); +} + +//--------------------------------------------------------------------------------------- +// CheckLocationMatrix +// ------------------- +// +// General : Tests how many bombs are located one square away from the desired spot. +// +// Parameters : +// loc_x - Position on X axis (unsigned short). +// lox_y - Position on Y axis (unsigned short). +// row_count - Amount of matrix rows (unsigned short). +// col_count - Amount of matrix column (unsigned short). +// ptr_bomb_vec - A string with all the locations of the mines (char *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +short CheckLocationMatrix(unsigned short loc_x, unsigned short loc_y, unsigned int row_count, unsigned int col_count, char * ptr_bomb_vec) +{ + unsigned short bomb_x; + unsigned short bomb_y; + short count_bombs = ZERO; + ptr_bomb_vec++; + while (*(ptr_bomb_vec--) && count_bombs != -ONE) + { + bomb_x = StringToValue(ptr_bomb_vec, PtrCharInString(ptr_bomb_vec, ASCII_SPACE)); + ptr_bomb_vec = PtrCharInString(ptr_bomb_vec, ASCII_SPACE); + bomb_y = StringToValue(ptr_bomb_vec, PtrCharInString(ptr_bomb_vec, ASCII_SPACE)); + ptr_bomb_vec = PtrCharInString(ptr_bomb_vec, ASCII_SPACE); + (ABS(loc_x - bomb_x) <= ONE && + ABS(loc_y - bomb_y) <= ONE) ? + count_bombs++ : ZERO; + count_bombs = (loc_x == bomb_x && loc_y == bomb_y) ? -ONE : count_bombs; + } + + return (count_bombs); +} + +//--------------------------------------------------------------------------------------- +// PrintChar +// --------- +// +// General : print char. +// +// Parameters : +// c - pointer of char (char *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void PrintChar(char * c) +{ + printf("%c", *c); +} + +//--------------------------------------------------------------------------------------- +// PrintMatrix +// ----------- +// +// General : Print matrix. +// +// Parameters : +// ptr_mat - pointer of matrix (void *). +// col - Amount of matrix column (unsigned short). +// row - Amount of matrix rows (unsigned short). +// print - a function that print the type of matrix (void (void *)). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void PrintMatrix(void * ptr_mat, unsigned short col, unsigned short row, void print(void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + (!(counter % col)) ? printf("\n") : ZERO; + print(ptr_mat++); + printf(" "); + } + printf("\n"); +} + +//--------------------------------------------------------------------------------------- +// CopyChar +// -------- +// +// General : Copies the content from one character pointer to another character +// pointer. +// +// Parameters : +// ch - pointer of char (char *). +// copy - pointer of char with to save content of ch (char *). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void CopyChar(char * ch, char * copy) +{ + *copy = *ch; +} + +//--------------------------------------------------------------------------------------- +// ResetMatrix +// ----------- +// +// General : Initializes the matrix. +// +// Parameters : +// ptr_mat - pointer of matrix (void *). +// col - Amount of matrix column (unsigned short). +// row - Amount of matrix rows (unsigned short). +// type - what to put in all the organs in the matrix (void *). +// insert - a function that copies from one pointer to another +// pointer (void (void *, void *)). +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void ResetMatrix(void * ptr_mat, unsigned short col, unsigned short row, void * type, void insert(void *, void *)) +{ + unsigned int length = col * row; + unsigned int counter; + for (counter = ZERO; counter < length; counter++) + { + insert(type, ptr_mat++); + } +} + +//--------------------------------------------------------------------------------------- +// Minesweeper +// ----------- +// +// General : Minesweeper is a single-player puzzle computer game. The objective of the +// game is to clear a rectangular board containing hidden "mines" or bombs +// without detonating any of them, with help from clues about the number +// of neighboring mines in each field. +// +// Input : Strings of the points where the mines are. And throughout the game +// guessing points (X, Y). +// +// Process : The program initially receives a string of mines locations, then it receives +// point X and Y, and it checks how many mines around the point or if the point +// is at all a mine, if the player is able to discover all the points, he is a +// winner and if he discovers a mine before then He loses. +// +// Output : If the player is win or lose. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 30.12.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + char mat[MAT_SIZE][MAT_SIZE]; + string bombs_string; + unsigned short place_without_bombs; + short count_bombs = ZERO; + char sign_uncover = SIGN_UNCOVER; + unsigned short x_point; + unsigned short y_point; + + ResetMatrix(mat, MAT_SIZE, MAT_SIZE, &sign_uncover, CopyChar); + + // Example for input "1 1 2 1 3 3 " + printf("Enter bombs (\"x y \"): "); + InputString(bombs_string, MAX_SIZE_STRING); + place_without_bombs = (MAT_SIZE * MAT_SIZE) - (StringLenght(bombs_string)) / FOUR; + while (place_without_bombs-- && count_bombs != -ONE) + { + printf("Enter X point: "); + scanf("%hu", &x_point); + printf("Enter Y point: "); + scanf("%hu", &y_point); + if (y_point == STOP_GAME) + { + count_bombs = -ONE; + } + // if the point is uncover + else if (mat[y_point][x_point] != SIGN_UNCOVER) + { + count_bombs = CheckLocationMatrix(x_point, y_point, MAT_SIZE, MAT_SIZE, bombs_string); + mat[y_point][x_point] = count_bombs + ASCII_ZERO; + PrintMatrix(mat, MAT_SIZE, MAT_SIZE, PrintChar); + } + else + { + printf("You was enter this point in past!\n"); + } + + } + if (!place_without_bombs) + { + printf("You won!\n"); + } + else + { + printf("You lose!\n"); + } +} \ No newline at end of file diff --git a/Projects/תרץ1/Lib.h b/Projects/תרץ1/Lib.h new file mode 100644 index 0000000..c0f1b41 --- /dev/null +++ b/Projects/תרץ1/Lib.h @@ -0,0 +1,2089 @@ +#include +#include + +#define DAYS_IN_MONTH 30 +#define MONTHS_IN_YEAR 12 +#define ONE_HUNDRED 100 +#define ONE_THOSEND 10000 +#define BOOLEAN unsigned short +#define TRUE 1 +#define FALSE 0 +#define SEVEN 7 +#define EIGHT 8 +#define TEN 10 +#define TWELVE 12 +#define THIRTY 30 +#define ZERO 0 +#define ONE 1 +#define TWO 2 +#define THREE 3 +#define FOUR 4 +#define FIVE 5 +#define TAKE_SIGNED_MATH(x) (((2 * (x)) + 1) % 2) +#define TAKE_SIGNED(x) ((x) < 0) ? -1 : 1 +#define ABS(x) (x) * (((2 * (x)) + 1) % 2) +#define MAX(x, y) (x > y) ? x : y +#define MIN(x, y) (x < y) ? x : y +#define BACKSLASH_ZERO '\0' +#define MAX_SIZE_STRING 256 +#define MASK_FIRST_BIT 0x1 + +typedef char string[MAX_SIZE_STRING]; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dblword; + +typedef union +{ + int int_; + char char_; + double double_; + void * pointer; +} Data_Type; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} stack; + +typedef struct +{ + Data_Type * values; + unsigned int items; +} queue; + +struct LLL +{ + Data_Type value; + struct LLL * next; +}; + +typedef struct LLL LLL; + +//--------------------------------------------------------------------------------------- +// ChangeYearsToMonths +// ------------------- +// +// General : Change years to months. +// +// Parameters : +// years - number (short) +// +// Return value : years as month. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeYearsToMonths(int *years, short *month) +{ + (*month) = (*years) * MONTHS_IN_YEAR; +} + +void SwapNumbers(int *ptr_number1, int *ptr_number2) +{ + int temp_number = *ptr_number2; + *ptr_number2 = *ptr_number1; + *ptr_number1 = temp_number; +} + +void SwapChars(char *ptr_char1, char *ptr_char2) +{ + char temp_char = *ptr_char2; + *ptr_char2 = *ptr_char1; + *ptr_char1 = temp_char; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToDays +// ------------------ +// +// General : change months to days. +// +// Parameters : +// month - first number (short) +// +// Return value : month as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToDays(short *months, int *days) +{ + (*days) = (*months) * DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeDateToDays +// ---------------- +// +// General : change date to days (from ddmmyyyy). +// +// Parameters : +// date - first number (int) +// +// Return value : date as days. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDateToDays(int *date, int *days) +{ + int years; + short months; + + years = *date % ONE_THOSEND; + *date /= ONE_THOSEND; + months = *date % ONE_HUNDRED; + *date /= ONE_HUNDRED; + *days = *date; + ChangeYearsToMonths(&years, &months); + ChangeMonthsToDays(&months, days); +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToMonths +// ------------------ +// +// General : Change days to months. +// +// Parameters : +// days - first number (int) +// +// Return value : Days as months. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToMonths(int *days, int *months) +{ + *months = *days / DAYS_IN_MONTH; +} + +//--------------------------------------------------------------------------------------- +// ChangeMonthsToYears +// ------------------- +// +// General : Change months to years. +// +// Parameters : +// month - first number (int) +// +// Return value : months as years. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeMonthsToYears(int *months, int *years) +{ + *years = *months / MONTHS_IN_YEAR; +} + +//--------------------------------------------------------------------------------------- +// ChangeDaysToDate +// ---------------- +// +// General : Change days to date (format: ddmmyyyy) +// +// Parameters : +// days - first number (int) +// +// Return value : days as date by format ddmmyyyy +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +void ChangeDaysToDate(int *days, int *date) +{ + int months, + years; + ChangeDaysToMonths(days, &months), + ChangeMonthsToYears(&months, &years); + *date = (*days - (months * DAYS_IN_MONTH)); + *date *= ONE_HUNDRED; + *date += (months - (years * MONTHS_IN_YEAR)); + *date *= ONE_THOSEND; + *date += years; +} + +//--------------------------------------------------------------------------------------- +// DifferentDates +// --------------- +// +// General : Sub between two dates (ddmmyyyy). +// +// Parameters : +// date1 - first date (int) +// date2 - second date (int) +// +// Return value : the different between two dates. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int DifferentDates(int *date1, int *date2, int *different) +{ + int days1, + days2, + new_date; + ChangeDateToDays(date1, &days1); + ChangeDateToDays(date2, &days2); + new_date = days1 - days2; + ChangeDaysToDate(&new_date, different); +} + +//--------------------------------------------------------------------------------------- +// EvenNumber +// ---------- +// +// General : Check if the num is even +// +// Parameters : +// num - first num (int) +// +// Return value : 0 - FALSE, 0 - TRUE. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN EvenNumber(int num) +{ + return (!(num & MASK_FIRST_BIT)); +} + +//--------------------------------------------------------------------------------------- +// OppositeNumber +// -------------- +// +// General : Change number order to Opposite. (123 -> 321) +// +// Parameters : +// num - first number (int) +// +// Return value : Number order opposite +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OppositeNumber(int num) +{ + int temp_num = num, + new_num = ZERO; + for (; temp_num; temp_num /= TEN) + { + new_num *= TEN; + new_num += temp_num % TEN; + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// OddDigitsInNumber +// ----------------- +// +// General : Take tne odd digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of odd numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int OddDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (!EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// EvenDigitsInNumber +// ------------------ +// +// General : Take tne even digits from number and component a +// new number +// +// Parameters : +// num - first number (int) +// +// Return value : A number that consists of even numbers. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int EvenDigitsInNumber(int num) +{ + int temp = num, + new_num = ZERO; + short digit = ZERO; + + for (; temp; temp /= TEN) + { + digit = temp % TEN; + if (EvenNumber(digit)) + { + new_num *= TEN; + new_num += digit; + } + } + + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits +// -------------------------------------------------------- +// +// General : Sum Of Number With Positive Digits And Number With Negative Digits. +// +// Parameters : +// num - first number (int) +// +// Return value : Sum Of Number With Positive Digits And Number With Negative Digits. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int SumOfNumberWithPositiveDigitsAndNumberWithNegativeDigits(int num) +{ + int temp_num = OppositeNumber(num); + int new_num = EvenDigitsInNumber(temp_num) + + OddDigitsInNumber(temp_num); + + return (num); +} + +//--------------------------------------------------------------------------------------- +// Power +// ----- +// +// General : Power on number. +// +// Parameters : +// num - first number (float) +// pow - first second (short) +// +// Return value : number powerd. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +double Power(float num, short pow) +{ + double new_num = ONE; + short sign = ZERO; + + for (sign = (TAKE_SIGNED_MATH(pow) * -ONE); pow; pow += sign) + { + new_num *= num; + } + new_num = (sign == -ONE) ? (new_num) : ((float)ONE / new_num); + return (new_num); +} + +//--------------------------------------------------------------------------------------- +// GetRest +// ------- +// +// General : Get the rest from double number. +// +// Parameters : +// num - first number (double) +// count_digits - second number (unsigned short) +// +// Return value : The rest of a number like int. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +int GetRest(double num, unsigned short count_digits) +{ + int tens = Power((float)TEN, count_digits); + return (int)(((int)(num * tens)) % tens); +} + +//--------------------------------------------------------------------------------------- +// CountDigits +// ----------- +// +// General : COunt digit in number. +// +// Parameters : +// num - first number (int) +// +// Return value : Number of digits count in a number. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountDigits(int num) +{ + unsigned short count; + for (count = ZERO; num; num /= TEN, count++); + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ConvertBaseToDeciaml +// -------------------- +// +// General : Convert a number from some base to base 10. +// +// Parameters : +// num - first number (float) +// base - second number (float) +// rest_size - third number (unsigned short) +// +// Return value : A number that converted from some base to number from base 10. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 26.09.2019 +//--------------------------------------------------------------------------------------- +float ConvertBaseToDeciaml(float num, float base, unsigned short rest_size) +{ + int temp_num = num; + float new_num = ZERO; + int rest = GetRest(num, (rest_size % TEN)); + short pow; + float new_rest = ZERO; + float result = ZERO; + for (pow = ZERO; temp_num; temp_num /= TEN) + { + new_num += ((temp_num % TEN) * Power(base, pow)); + pow++; + } + for (pow = (CountDigits(rest) * -ONE); rest; rest /= TEN) + { + new_rest += ((rest % TEN) * Power(base, pow)); + pow++; + } + + return new_num + new_rest; +} + +//--------------------------------------------------------------------------------------- +// Sum +// --- +// +// General : Sum of two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : Sum of two numbers (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sum(double number1, double number2) +{ + double result = number1 + number2; + + return (result); +} + +//--------------------------------------------------------------------------------------- +// SumOfDigitsNumber +// ----------------- +// +// General : Sum digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOfDigitsNumber(double number) +{ + int new_num = number * Power(TEN, 6); + int sum = 0; + for (; new_num; new_num /= TEN) + { + sum += new_num % TEN; + } + + return (sum); + +} + +//--------------------------------------------------------------------------------------- +// SumEvenDigits +// ------------- +// +// General : Sum even digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum even digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumEvenDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(EvenDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// SumOddDigits +// ------------ +// +// General : Sum odd digits of number. +// +// Parameters : +// number - first number (double) +// +// Return value : Sum odd digits of number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int SumOddDigits(double number) +{ + int new_num = number * Power(TEN, 6);; + + return (SumOfDigitsNumber(OddDigitsInNumber(new_num))); +} + +//--------------------------------------------------------------------------------------- +// CommonDigitsInTwoNumbers +// ------------------------ +// +// General : Check if have common digits in two numbers. +// +// Parameters : +// number1 - first number (double) +// number2 - second number (double) +// +// Return value : If have common digits in two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CommonDigitsInTwoNumbers(double number1, double number2) +{ + int new_number1 = number1 * Power(10, 6); + int new_number2 = number2 * Power(10, 6); + short num1_digit; + BOOLEAN answer = FALSE; + + for (num1_digit = new_number1 % TEN; new_number1 && !answer; new_number2 /= TEN) + { + if (new_number2) + { + new_number1 /= TEN; + num1_digit = new_number1 % TEN; + new_number2 = number2; + } + answer = (num1_digit == new_number2 % TEN) ? TRUE : FALSE; + } + + return(answer); +} + +//--------------------------------------------------------------------------------------- +// Sqrt +// ---- +// +// General : Math sqrt +// +// Parameters : +// number - number (double) +// root - root of sqrt, second number (short) +// +// Return value : Math sqrt on number (double). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +double Sqrt(double number, short root) +{ + double max = number, + min = ZERO, + temp_min, + difference = ONE, + power_min; + while(number != Power(min, root)) + { + difference = (max - min) / TWO; + + temp_min = min + difference; + + power_min = Power(temp_min, root); + number = ((float)temp_min == (float)min) ? power_min: number; + + min = (power_min <= number) ? temp_min : min; + max = (power_min > number) ? temp_min : max; + } + + return min; +} + +//--------------------------------------------------------------------------------------- +// PrimeNumber +// ----------- +// +// General : Check if number is a prime number. +// +// Parameters : +// number - first number (int) +// +// Return value : If the number is a prime (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN PrimeNumber(int number) +{ + BOOLEAN answer = TRUE; + short counter, + max = Sqrt(number, TWO) + ONE; + for (counter = TWO; counter < max; counter++) + { + answer *= (number % counter != ZERO); + } + + return (answer); +} + +double Module(double number, double div) // TODO : FIX IT +{ + unsigned int count; + double temp_number = number; + for (count = ZERO; temp_number > div; temp_number -= div) + { + count++; + } + + return (temp_number); +} + +//--------------------------------------------------------------------------------------- +// DigitInNumber +// ------------- +// +// General : Check if digit in the number. +// +// Parameters : +// number - first number (double) +// digit - second number (unsigned short) +// +// Return value : If the the digit exists in the number (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN DigitInNumber(double number, unsigned short digit) +{ + int new_num = (number * 6) + GetRest(number, 6); + BOOLEAN answer = FALSE; + for (; new_num && !answer; new_num /= TEN) + { + answer = (new_num % 10 == digit); + } + + return (answer); + +} + +//--------------------------------------------------------------------------------------- +// ConcatenationNumbers +// -------------------- +// +// General : Concatenation two numbers to one number. +// +// Parameters : +// number1 - first number (short) +// number2 - second number (short) +// +// Return value : Number with two number (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int ConcatenationNumbers(short number1, short number2) +{ + int new_number = number1; + new_number *= Power(TEN, CountDigits(number2)); + new_number += number2; + + return (new_number); +} + +int Multiplication(short number1, short multiply) // TODO : FIX IT +{ + int new_number = ZERO; + for (; multiply > ZERO; multiply--) + { + new_number += number1; + } + + return (new_number); +} + +//--------------------------------------------------------------------------------------- +// GetDenominator +// --------------- +// +// General : Calculates the denominator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Denominator (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +int GetDenominator(double number) +{ + int denominator; + double temp_number = number; + for (denominator = ONE ; (float)((short)temp_number != (float)temp_number); + temp_number += number) + { + denominator++; + } + + return (denominator); +} + +//--------------------------------------------------------------------------------------- +// GetCounter +// ---------- +// +// General : Calculates the numerator of a number with a decimal point. +// +// Parameters : +// number - first number (double) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetCounter(double number) +{ + double temp_number = number; + while ((float)((short)temp_number) != (float)temp_number) + { + temp_number += number; + } + + return (temp_number); +} + +double Divide(double number, double div) // TODO : FIX IT +{ + double count_high, + temp_number = number; + for (count_high = ZERO; temp_number >= div; temp_number -= div) + { + count_high++; + } + return (count_high); +} + +//--------------------------------------------------------------------------------------- +// SumInArray +// ---------- +// +// General : Checks if there are two numbers whose sum is equal to +// the number entered as "sum". +// +// Parameters : +// array[] - array (int) +// size - array size (unsigned int) +// sum - The amount required (int) +// +// Return value : Counter (int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN SumInArray(int array[], unsigned int size, int sum) +{ + BOOLEAN answer = FALSE; + unsigned int temp_size = size, + count; + double temp_sum; + + for (count = ZERO; count < temp_size && !answer;) + { + temp_sum = array[count] + array[temp_size]; + answer = (temp_sum == sum) ? TRUE : FALSE; + count += (temp_sum < sum) ? ONE : ZERO; + temp_size -= (temp_sum > sum) ? ONE : ZERO; + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// ChangeBool +// ---------- +// +// General : Boolean variable inverse. +// +// Parameters : +// bool1 - Boolean variable (BOOLEAN) +// +// Return value : Boolean variable (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ChangeBool(BOOLEAN bool1) +{ + BOOLEAN answer = ++bool1 % TWO; + return answer; +} + +//--------------------------------------------------------------------------------------- +// Equality +// -------- +// +// General : Checks whether two numbers are equal in value. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If there is an equality between the two numbers (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN Equality(int number1, int number2) +{ + int sub = number1 - number2; + BOOLEAN answer = (ONE / (ABS(sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// NumBBiggerThenNumA +// ------------------ +// +// General : Checks if the second number (B) is greater than the first number (A). +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : If the second number (B) is greater than the first number (A) (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN NumBBiggerThenNumA(int a, int b) +{ + int sub = a - b + ONE; + BOOLEAN answer = (ONE / (ABS(sub) + (sub) + ONE)); + return answer; +} + +//--------------------------------------------------------------------------------------- +// SumOfTimesCharsArray1InCharsArray2 +// ---------------------------------- +// +// General : Checks the number of times the first array values are in the +// second array in the appropriate order. +// +// Parameters : +// array1[] - first array (char[]) +// array1_size - size of array1 (unsigned int) +// array2[] - second array (char[]) +// array2_size - size of array2 (unsigned int) +// +// Return value : The number of times the first array is in the +// second array (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int SumOfTimesCharsArray1InCharsArray2(char array1[], + unsigned int array1_size, + char array2[], + unsigned int array2_size) +{ + unsigned int count = ZERO, + is_in = TRUE, + count_loop_array1, + count_loop_array2; + + for (count_loop_array2 = ZERO; count_loop_array2 < array2_size; count_loop_array2++) + { + for (count_loop_array1 = ZERO; + count_loop_array1 < array1_size && is_in; count_loop_array1++) + { + is_in *= Equality(array1[count_loop_array1], + array2[count_loop_array2 + count_loop_array1]); + } + count += is_in; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CreateMask +// ---------- +// +// General : Creates a number with identical digits. +// +// Parameters : +// size - digits count of number (unsigned short) +// digit_of_mask - type of digits (unsigned short) +// +// Return value : A number that all the digits are the same (unsigned int) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CreateMask(unsigned short size, unsigned short digit_of_mask) +{ + unsigned int mask = digit_of_mask; + unsigned short counter; + for (counter = ONE; counter < size; counter++) + { + mask *= TEN; + mask += digit_of_mask; + } + + return mask; +} + +//--------------------------------------------------------------------------------------- +// CountADigitInNumber +// ------------------- +// +// General : Count the number of times her story appears in number. +// +// Parameters : +// number - a number (int) +// digit - a digit (unsigned short) +// +// Return value : The number of times the number appears in the number (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountADigitInNumber(int number, unsigned short digit) +{ + int temp_num = number; + unsigned count = FALSE; + for (; temp_num; temp_num /= TEN) + { + count += Equality(temp_num % TEN, digit); + } + + return (count); + +} + +//--------------------------------------------------------------------------------------- +// GetDigit +// -------- +// +// General : Takes the digit from the required location. +// +// Parameters : +// number - a number (int) +// location - index of digit (unsigned short) +// +// Return value : The number that is in the number where you want it (short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +short GetDigit(int number, unsigned short location) +{ + int temp_num = number; + unsigned short digit; + for (; location; location--) + { + temp_num /= TEN; + } + digit = temp_num % TEN; + + return (digit); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigitsInSomeIndex +// --------------------------------- +// +// General : Count the number of times there are identical digits between +// two numbers and in the same location. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical +// digits between two numbers and in the same location (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigitsInSomeIndex(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO; + for (temp_num1 = MIN(number1, number2), temp_num2 = MAX(number1, number2); + temp_num1; + temp_num1 /= TEN, temp_num2 /= TEN) + { + count += Equality(temp_num1 % TEN, temp_num2 % TEN); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountOfIdenticalDigits +// ---------------------- +// +// General : Count the number of times there are identical digits +// between two numbers. +// +// Parameters : +// number1 - first number (int) +// number2 - second number (int) +// +// Return value : The number of times there are identical digits +// between two numbers (unsigned short) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountOfIdenticalDigits(int number1, int number2) +{ + int temp_num1, + temp_num2; + unsigned short count = ZERO, + digit_num1; + for (temp_num1 = number1; temp_num1; temp_num1 /= TEN) + { + digit_num1 = temp_num1 % TEN; + for (temp_num2 = number2; temp_num2; temp_num2 /= TEN) + { + count += Equality(digit_num1, temp_num2 % TEN); + } + temp_num2 = number2; + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// ForeignDigits +// ------------- +// +// General : Checks whether all digits are foreign to each other by number. +// +// Parameters : +// number - first number (int) +// +// Return value : If all the numbers are foreign to each other in number (BOOLEAN) +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 21.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ForeignDigits(int number) +{ + int temp_num = number; + BOOLEAN answer = TRUE; + for (; temp_num; temp_num /= TEN) + { + answer *= NumBBiggerThenNumA(CountADigitInNumber(temp_num, temp_num % TEN), TWO); + } + + return (answer); +} + +//--------------------------------------------------------------------------------------- +// CharInString +// ------------ +// +// General :CHecks if the char exist in string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : If the char exist in string (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN CharInString(char text[], char c) +{ + BOOLEAN exist = FALSE; + unsigned short counter = ZERO; + while ((text[counter] != c) * text[counter++]); + exist = (text[--counter] == c); + + return (exist); +} + +char * LastCharOfString(char * start_string) +{ + while (*(start_string++)); + + return (--start_string); +} + +//--------------------------------------------------------------------------------------- +// StringLenght +// ------------ +// +// General : Checks the lenght of string. +// +// Parameters : +// text - string (char[]) +// +// Return value : Lenght of string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short StringLenght(char *start_string) +{ + return (LastCharOfString(start_string) - start_string); +} + +//--------------------------------------------------------------------------------------- +// StringCompare +// ------------------------ +// +// General : Compare 2 strings. +// +// Parameters : +// text1 - string (char[]) +// text2 - string (char[]) +// +// Return value : If this 2 strings are equals (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringCompare(char *start_stringA_index, char *start_stringB_index) +{ + while ((*start_stringA_index) && (*(start_stringA_index++) == *(start_stringB_index++))); + + return (*--start_stringA_index == *--start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// IndexCharInPointers +// ------------------- +// +// General : Find the index of char in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : The first index of the char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexCharInPointers(char *start_pointer, char *end_pointer , char c) +{ + while ((*start_pointer) != c && start_pointer++ < end_pointer); + + return (start_pointer); +} + +//--------------------------------------------------------------------------------------- +// CountCharInString +// ----------------- +// +// General : Count how many the char is in the string. +// +// Parameters : +// text - string (char[]) +// c - char (char) +// +// Return value : Count of char in the string (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned short CountCharInString(char *start_string_index, char *c) +{ + unsigned short count = ZERO; + while (*start_string_index) + { + count += (*(start_string_index++) == *c); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CutString +// --------- +// +// General : Cut the string. +// +// Parameters : +// text - string (char[]) +// start - from where (unsigned short) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : None +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CutString(char *start_textA_index, char *end_textA_index, char *start_textB_index) +{ + while (start_textA_index < end_textA_index) + { + *(start_textB_index++) = *(start_textA_index++); + } + *start_textB_index = BACKSLASH_ZERO; + +} + +//--------------------------------------------------------------------------------------- +// CopyString +// ---------- +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyString(char *start_string_index, char *start_copy_index) +{ + while (*start_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } + *(start_string_index) = BACKSLASH_ZERO; +} + +//--------------------------------------------------------------------------------------- +// LinkingString +// ------------- +// +// General : Copy second string into end of first string. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void LinkingString(char *start_stringA_index, char *start_stringB_index) +{ + CopyString(LastCharOfString(start_stringA_index), start_stringB_index); +} + +//--------------------------------------------------------------------------------------- +// ReverseString +// ------------- +// +// General : Chnage to oppsite the string. +// +// Parameters : +// textA - first text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void ReverseString(char textA[]) +{ + unsigned short textA_lenght = StringLenght(textA) - ONE, + counter, + loop_lenght = (textA_lenght + ONE) / TWO; + char temp_char; + for (counter = ZERO; counter < loop_lenght; counter++) + { + temp_char = textA[counter]; + textA[counter] = textA[textA_lenght - counter]; + textA[textA_lenght - counter] = temp_char; + } +} + +//--------------------------------------------------------------------------------------- +// StringBInStringA +// ---------------- +// +// General : Check if string B exists in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : If string B exists in string A (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN StringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (flag); +} + +//--------------------------------------------------------------------------------------- +// IndexStringBInStringA +// --------------------- +// +// General : Find the index of string B in string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : Index of string B in string A (unsigned short). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +char * IndexStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + BOOLEAN flag = FALSE; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while ((*(address - ONE)) * !flag) + { + SwapChars(&temp, address); + flag = StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (--ptr_string_a_temp); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Counting how many times stringB in stringA. +// +// Parameters : +// *start_string_a - Pointer of first string (char[]) +// *start_string_b - Pointer of second string (char[]) +// +// Return value : Count second string in first string (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +unsigned int CountStringBInStringA(char *start_string_a, char *start_string_b) +{ + char *ptr_string_a_temp = start_string_a; + char temp = BACKSLASH_ZERO; + unsigned short count = ZERO; + unsigned short textB_lenght = StringLenght(start_string_b); + char *address = (ptr_string_a_temp + textB_lenght); + while (*(address - ONE)) + { + SwapChars(&temp, address); + count += StringCompare(ptr_string_a_temp, start_string_b); + SwapChars(&temp, address); + address = ((++ptr_string_a_temp) + textB_lenght); + } + + return (count); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove first string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveStringBFromStringA(char *start_string_a, char *start_string_b) +{ + unsigned short textB_lenght = StringLenght(start_string_b); + char *ptr_index_stringB_in_stringA = IndexStringBInStringA(start_string_a, start_string_b); + CopyString(ptr_index_stringB_in_stringA, ptr_index_stringB_in_stringA + textB_lenght); +} + +//--------------------------------------------------------------------------------------- +// CountStringBInStringA +// --------------------- +// +// General : Remove ALL string B from string A. +// +// Parameters : +// textA - first text (char[]) +// textB - second text (char[]) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void RemoveAllStringBFromStringA(char *start_stringA_index, char *start_stringB_index) +{ + unsigned short loop_lenght = CountStringBInStringA(start_stringA_index, start_stringB_index); + unsigned short counter; + for (counter = ZERO; counter < loop_lenght; counter++) + { + RemoveStringBFromStringA(start_stringA_index, start_stringB_index); + } +} + +//--------------------------------------------------------------------------------------- +// ValidParenthesesTemplate +// ------------------------ +// +// General : checks if the string is a good equation. +// +// Parameters : +// text - string (char[]) +// +// Return value : If the equation is ok (BOOLEAN). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +BOOLEAN ValidParenthesesTemplate(char text[]) +{ + unsigned short counter = ZERO; + short count_parenthesis = ZERO; + while (text[counter] * (count_parenthesis + ONE)) + { + count_parenthesis += (text[counter] == '('); + count_parenthesis -= (text[counter] == ')'); + } + + return (!count_parenthesis); +} + +unsigned short CharToNumber(char *c) +{ + return (unsigned short)((*c) - '0'); +} + +//--------------------------------------------------------------------------------------- +// MaxCountCharInString +// -------------------- +// +// General : Checks which character is most often in the string. +// +// Parameters : +// *start_string_index - Pointer of string (char[]) +// +// Return value : The number of times the character appears most often (unsigned int). +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 12.11.19 +//--------------------------------------------------------------------------------------- +unsigned int MaxCountCharInString(char *start_string_index) +{ + unsigned int max = ZERO, + count_temp; + while (*start_string_index) + { + count_temp = CountCharInString(start_string_index++, start_string_index); + max = (count_temp > max) ? count_temp : max; + } + + return (max); +} + +//--------------------------------------------------------------------------------------- +// CopyPointers +// ------------ +// +// General : Copy second string into first string. +// +// Parameters : +// text - first text (char[]) +// copy - second text (char[]) +// start - from where to start (unsigned short) +// +// Return value : None. +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 04.10.2019 +//--------------------------------------------------------------------------------------- +void CopyPointers(char *start_string_index, char *start_copy_index, char *end_copy_index) +{ + while (start_copy_index <= end_copy_index) + { + *(start_string_index++) = *(start_copy_index++); + } +} + +void PrintVector(int *ptr_vec, int *ptr_vec_end) +{ + while (ptr_vec++ < ptr_vec_end) + { + printf("%hu, ", *ptr_vec); + } +} + +void PrintMatrix(int *ptr_mat, int *ptr_mat_end, unsigned short col) +{ + int *end_vector; + for (; ptr_mat < ptr_mat_end; ptr_mat += col) + { + end_vector = ptr_mat + col; + PrintVector(ptr_mat, end_vector); + printf("\n"); + } +} + +BOOLEAN EvenBits(byte b) +{ + BOOLEAN even = TRUE; + unsigned short loop_length; + for (loop_length = sizeof(b) * EIGHT; loop_length; loop_length--) + { + even ^= b & MASK_FIRST_BIT; + b >>= ONE; + } + + return (even); +} + +unsigned short CountBits(byte b) +{ + unsigned short counter = ZERO, + loop_length = sizeof(b) * EIGHT; + while (loop_length--) + { + counter += !EvenNumber(b); + b >>= ONE; + } + + return (counter); +} + +void Multiply(float *ptr_number1, float *ptr_number2, double *ptr_result) +{ + float number1_float = *ptr_number1; + float number2_float = *ptr_number2; + float temp_number; + unsigned long long number1, + counter_loop1; + unsigned int number2; + double type_number_for_multiply = 0.000001, + type_number_for_multiply_counter; + unsigned short counter_loop2; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number1_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number1_float += temp_number; + } + } + number1 = number1_float; + + for (counter_loop1 = ZERO; counter_loop1 < THREE; counter_loop1++) + { + temp_number = number2_float; + for (counter_loop2 = ONE; counter_loop2 < TEN; counter_loop2++) + { + number2_float += temp_number; + } + } + number2 = number2_float; + + if (number2 < ZERO) + { + number2 = number2 - number2 - number2; + } + + temp_number = number1; + for (counter_loop1 = ONE; counter_loop1 < number2; counter_loop1++) + { + number1 += temp_number; + } + + if (number1 < ZERO) + { + number1 = number1 - number1 - number1; + } + + + if ((number1_float < ZERO && number2_float > ZERO) || (number2_float < ZERO && number1_float > ZERO)) + { + type_number_for_multiply = type_number_for_multiply - type_number_for_multiply - type_number_for_multiply; + } + + *ptr_result = ZERO; + type_number_for_multiply_counter = type_number_for_multiply; + for (counter_loop1 = ONE; number1; number1 -= counter_loop1) + { + type_number_for_multiply_counter += type_number_for_multiply_counter; + counter_loop1 += counter_loop1; + if (counter_loop1 > number1) + { + counter_loop1 = ONE; + type_number_for_multiply_counter = type_number_for_multiply; + } + *ptr_result += type_number_for_multiply_counter; + } +} + +void InitStack(stack * sk) +{ + (*sk).items = ZERO; +} + +BOOLEAN IsEmptyStack(stack * sk) +{ + return (!(*sk).items); +} + +void PushStack(stack * sk , Data_Type item) +{ + if (!((*sk).items)) + { + (*sk).values = (Data_Type *)malloc((++((*sk).items)) * sizeof(Data_Type)); + } + else + { + (*sk).values = (Data_Type *)realloc((*sk).values, ((++((*sk).items)) * sizeof(Data_Type))); + } + *((*sk).values + (*sk).items - ONE) = item; +} + +Data_Type PopStack(stack * sk) +{ + Data_Type item; + if ((*sk).items > ZERO) + { + item = *((*sk).values + (*sk).items - ONE); + (*sk).values = (Data_Type *)realloc((*sk).values, ((--((*sk).items)) * sizeof(Data_Type))); + } + else + { + free((*sk).values); + } + + return (item); +} + +void EmptyStack(stack * sk) +{ + while (!IsEmptyStack(sk)) + { + PopStack(sk); + } +} + +void CopyStack(stack * sk, stack * copy) +{ + stack temp1_sk; + Data_Type item; + InitStack(&temp1_sk); + + while (!IsEmptyStack(sk)) + { + PushStack(&temp1_sk, PopStack(sk)); + } + while (!IsEmptyStack(&temp1_sk)) + { + item = PopStack(&temp1_sk); + PushStack(copy, item); + PushStack(sk, item); + } +} + +void OppositeStack(stack * sk) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + EmptyStack(sk); + while (!IsEmptyStack(&temp_sk)) + { + PushStack(sk, PopStack(&temp_sk)); + } +} + +BOOLEAN IsEqualsStack(stack * sk1, stack * sk2) +{ + BOOLEAN flag = TRUE; + Data_Type item_sk1; + Data_Type item_sk2; + stack temp_sk; + InitStack(&temp_sk); + while (!IsEmptyStack(sk1) && !IsEmptyStack(sk2) && flag) + { + item_sk1 = PopStack(sk1); + item_sk2 = PopStack(sk2); + // flag = (*item_sk1 == *item_sk2); //BlackBox + } +} + +unsigned int ItemsStack(stack * sk) +{ + unsigned int counter = ZERO; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + PopStack(&temp_sk); + counter++; + } + + return (counter); +} + +int SumStack(stack * sk) +{ + int sum = ZERO; + Data_Type item; + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk)) + { + sum += (PopStack(&temp_sk)).int_; + } + + return (sum); +} + +BOOLEAN FindNumberInStack(stack * sk, Data_Type item) +{ + stack temp_sk; + InitStack(&temp_sk); + CopyStack(sk, &temp_sk); + while (!IsEmptyStack(&temp_sk) && (PopStack(&temp_sk)).int_ != item.int_); + + return (!IsEmptyStack(&temp_sk)); +} + +void UnionStack(stack * sk1, stack * sk2) +{ + CopyStack(sk1, sk2); +} + +void InitQueue(queue * q) +{ + (*q).items = ZERO; +} + +void InsertQueue(queue * q, Data_Type item) +{ + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +Data_Type RemoveQueue(queue * q) // Fix it +{ + Data_Type item; + if (!((*q).items)) + { + (*q).values = (Data_Type *)malloc((++((*q).items)) * sizeof(Data_Type)); + } + else + { + (*q).values = (Data_Type *)realloc((*q).values, ((++((*q).items)) * sizeof(Data_Type))); + } + *((*q).values + (*q).items - ONE) = item; +} + +//----------------------------------------------------------- +// InsertAfterList +// --------------- +// +// General : The function adds creates a new node for +// storage +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void InsertAfterList(LLL * manager) +{ + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = (*manager).next; + (*manager).next = con_ls; +} + +//----------------------------------------------------------- +// PushList +// -------- +// +// General : The function adds the data to strat of +// link +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PushList(LLL ** manager) +{ + if (*manager == NULL) + { + *manager = (LLL *)malloc(sizeof(LLL)); + } + else + { + LLL * con_ls = (LLL *)malloc(sizeof(LLL)); + (*con_ls).next = *manager; + *manager = con_ls; + } +} + +//----------------------------------------------------------- +// PopList +// ------- +// +// General : The function cancels the connections of +// the first item in the list and empties it +// +// Parameters : **manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void PopList(LLL ** manager) +{ + LLL * con_ls; + if ((**manager).next != NULL) + { + con_ls = (**manager).next; + free(*manager); + (*manager) = con_ls; + } + else + { + free(*manager); + } + +} + +//----------------------------------------------------------- +// DeleteList +// ---------- +// +// General : A function cancels the connections of the +// current figure in the list and empties it +// +// Parameters : *manager - pointer linear Linked List(IN) +// +// Return Value : None. +// +//------------------------------------------------------------ +// Programer : Cohen Idan +// Student No. : 211675038 +// Date : 12.12.2019 +//------------------------------------------------------------ +void DeleteList(LLL * manager) +{ + LLL * con_ls = (*((*manager).next)).next; + free((*manager).next); + (*manager).next = con_ls; +} + +LLL * GetLoactionList(LLL ** manager, unsigned short location) +{ + LLL * pos = *manager; + while ((*pos).next != NULL && location--) + { + pos = (*pos).next; + } + + return (pos); +} \ No newline at end of file diff --git a/Projects/תרץ1/a.out b/Projects/תרץ1/a.out new file mode 100644 index 0000000..680018b Binary files /dev/null and b/Projects/תרץ1/a.out differ diff --git a/Projects/תרץ1/ex13a b/Projects/תרץ1/ex13a new file mode 100644 index 0000000..e481035 Binary files /dev/null and b/Projects/תרץ1/ex13a differ diff --git a/Projects/תרץ1/ex13a.c b/Projects/תרץ1/ex13a.c new file mode 100644 index 0000000..ab00cc2 --- /dev/null +++ b/Projects/תרץ1/ex13a.c @@ -0,0 +1,224 @@ +#include "Lib.h" + +#define APPEND_BINARY "a+b" +#define FILE_NAME "starship.dat" +#define PRINT "print" +#define EXIT "exit" +#define CREATE "create" +#define UPDATE "update" + +typedef struct +{ + int id; + char name[8]; + char star_name[15]; + int age; +} alien; + + +// ------------------------------------------------------- + +/* close file */ +int CloseFile(FILE * fp) +{ + return (fclose(fp)); +} + +/* print alien */ +void PrintAlien(alien * aln) +{ + printf("ID : %d\nName : %s\nStar Name : %s\nAlien age : %d\n\n", + aln->id, aln->name, aln->star_name, aln->age); +} + +/* get all data from file */ +void GetAllDataFromFile(alien ** aln_arr) +{ + alien * aln_data; + FILE * fp = fopen(FILE_NAME , APPEND_BINARY); + *aln_arr = (alien *)malloc((ftell(fp) / sizeof(alien)) + (TWO * sizeof(alien))); + aln_data = *aln_arr; + rewind(fp); + while (!feof(fp)); + { + fread(aln_data, sizeof(alien), ONE, fp); + aln_data++; + } + aln_data->id = ZERO; + fclose(fp); // fix +} + +/* print aliens in arr */ +void PrintArrayAliens(alien * arr_alien) +{ + while (arr_alien->id != ZERO) + { + PrintAlien(arr_alien); + arr_alien++; + } +} + +/* print data */ +void PrintAllAlienData() +{ + alien * aliens_data; + GetAllDataFromFile(&aliens_data); + PrintArrayAliens(aliens_data); + free(aliens_data); + OutputErrorOpenReadFile(); + +} + +/* write in file */ +void WriteInFile(alien * aln, unsigned int location) +{ + FILE * fp = fopen(FILE_NAME , APPEND_BINARY); + fseek(fp, (sizeof(alien) * location), SEEK_SET); + fwrite(aln, sizeof(alien), ONE, fp); + CloseFile(fp); +} + +/* check if the alien is exists in file */ +BOOLEAN ValueExistsInFile(alien * aln) +{ + alien * temp_aln = (alien *)malloc(sizeof(alien)); + FILE * fp = fopen(FILE_NAME , APPEND_BINARY); + fseek(fp, ZERO, SEEK_SET); + while (fread(temp_aln, sizeof(alien), ONE, fp) > ZERO && temp_aln->id != aln->id); + CloseFile(fp); + return (temp_aln->id == aln->id); +} + +/* Get the pointer of alien in file */ +unsigned int GetLocationValueInFile(alien * aln) +{ + FILE * fp; + unsigned int count = -ONE; + alien * temp_aln = (alien *)malloc(sizeof(alien));; + fp = fopen(FILE_NAME , APPEND_BINARY); + fseek(fp, ZERO, SEEK_SET); + while (fread(temp_aln, sizeof(alien), ONE, fp) > ZERO && temp_aln->id != aln->id) + { + count++; + } + CloseFile(fp); + return count; +} + +void GetInputIdAlien(alien * aln) +{ + int id; + printf("Enter ID: "); + scanf("%d", &id); + aln->id = id; +} + +void GetInputNameAlien(alien * aln) +{ + printf("Enter name: "); + scanf("%s", (aln->name)); +} + +void GetInputStarNameAlien(alien * aln) +{ + printf("Enter star name: "); + scanf("%s", (aln->star_name)); +} + +void GetInputAgeAlien(alien * aln) +{ + int age; + printf("Enter age: "); + scanf("%d", &age); + aln->age = age; +} + +void GetInputUpdateAlien(alien * aln) +{ + GetInputNameAlien(aln); + GetInputStarNameAlien(aln); + GetInputAgeAlien(aln); +} + +void GetInputAlien(alien * aln) +{ + GetInputIdAlien(aln); + GetInputUpdateAlien(aln); +} + +/* create data */ +void CreateData(alien * aln) +{ + unsigned int location; + alien temp = *aln; + if (!ValueExistsInFile(&temp)) + { + location = GetLocationValueInFile(aln) + ONE; + WriteInFile(aln, location); + } + else + { + printf("The alien is exists already!\n"); + } +} + +/* update data */ +void UpdateData(alien * aln) +{ + if (ValueExistsInFile(aln)) + { + GetInputUpdateAlien(aln); + WriteInFile(aln, GetLocationValueInFile(aln)); + } + else + { + printf("The alien is not exists!\n"); + } +} + + +//--------------------------------------------------------------------------------------- +// Project +// ------- +// +//--------------------------------------------------------------------------------------- +// Programmer : Cohen Idan +// Student No : 211675038 +// Date : 19.12.2019 +//--------------------------------------------------------------------------------------- +void main(void) +{ + string command = " "; + alien aln; + int id = ZERO; + string exit_command = EXIT; + string print_command = PRINT; + string create_command = CREATE; + string update_command = UPDATE; + + while (!StringCompare(command, exit_command)) + { + // print request for command + printf("Enter command (\"print\", \"create\", \"update\" and \"exit\"): "); + + // Input command + scanf("%s", command); + if (StringCompare(command, print_command)) + { + PrintAllAlienData(); + } + else if (StringCompare(command, create_command)) + { + /* get input from user about new alien */ + /* if alien is not exists create new alien else output error */ + GetInputAlien(&aln); + CreateData(&aln); + } + else if (StringCompare(command, update_command)) + { + GetInputIdAlien(&aln); + UpdateData(&aln); + } + } + +} \ No newline at end of file diff --git a/Projects/תרץ1/starship.dat b/Projects/תרץ1/starship.dat new file mode 100644 index 0000000..5f32c70 Binary files /dev/null and b/Projects/תרץ1/starship.dat differ diff --git a/מצב.docx b/מצב.docx new file mode 100644 index 0000000..4946df0 Binary files /dev/null and b/מצב.docx differ