uni

University stuff
git clone git://git.christosmarg.xyz/uni-assignments.git
Log | Files | Refs | README | LICENSE

commit aeb0b8ea3fb7d0df0b59403bccd19ade7cbb4705
parent 2425721cf91be54df0c8dd453136d5bfd0341d48
Author: Christos Margiolis <christos@margiolis.net>
Date:   Wed,  8 Jan 2020 22:11:17 +0200

initial commmit

Diffstat:
Aassignment-1.5-arrays-pointers-files/examples/1DDynamic.c | 223+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aassignment-1.5-arrays-pointers-files/examples/Lexico.c | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aassignment-1.5-arrays-pointers-files/examples/mystring.c | 103+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aassignment-1.5-arrays-pointers-files/minesweeper/Makefile | 32++++++++++++++++++++++++++++++++
Aassignment-1.5-arrays-pointers-files/minesweeper/include/ccolors.h | 32++++++++++++++++++++++++++++++++
Aassignment-1.5-arrays-pointers-files/minesweeper/include/minesweeper.h | 20++++++++++++++++++++
Aassignment-1.5-arrays-pointers-files/minesweeper/src/main.c | 26++++++++++++++++++++++++++
Aassignment-1.5-arrays-pointers-files/minesweeper/src/minesweeper.c | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aassignment-1.5-arrays-pointers-files/minesweeper/todo.md | 33+++++++++++++++++++++++++++++++++
9 files changed, 703 insertions(+), 0 deletions(-)

diff --git a/assignment-1.5-arrays-pointers-files/examples/1DDynamic.c b/assignment-1.5-arrays-pointers-files/examples/1DDynamic.c @@ -0,0 +1,223 @@ +#include <stdio.h> +#include <stdlib.h> + +int GetIntWithinLimits (int, int); +int *ReadMatrix (int); +int ReadMatrix1 (int **M, int S); +void PrintMatrix (int *, int); +int CompareMatrices (int *M1, int M2[], int S); +int GetRandom (int, int); +void RandomFill (int *, int, int, int); +int IsSorted (int *, int); +int LudicrousSort (int *, int); +void Strange1 (int *, int); + +int main (int argc, char **argv) +{ + int *Mat1; + int *Mat2; + int *Mat3; + int NoN; + + srand (time (NULL)); + + NoN = GetIntWithinLimits (1, 100000); + printf ("\n\n"); + Mat1 = ReadMatrix (NoN); + PrintMatrix (Mat1, NoN); + printf ("\n\n"); + if (ReadMatrix1 (&Mat2, NoN)) + PrintMatrix (Mat2, NoN); + else + printf ("Not enough memory...\n"); + printf ("\n\n"); + if (CompareMatrices (Mat1, Mat2, NoN)) + printf ("Matrices are Equal\n"); + else + printf ("Matrices are not Equal\n"); + printf ("\n\n"); + // Δοκιμάστε το παρακάτω για λίγο μεγαλύτερους πίνακες, π.χ. με 15 στοιχεία. + Mat3 = (int *) malloc (5 * sizeof (int)); + RandomFill (Mat3, 5, -5, 300); + PrintMatrix (Mat3, 5); + printf ("Matrix 3 Sorted. Steps: %d\n", LudicrousSort (Mat3, 5)); + PrintMatrix (Mat3, 5); + printf ("\n\n"); + Strange1 (Mat1, NoN); + PrintMatrix (Mat1, NoN); + + +} + +/** + * Διαβάζει από το πληκτρολόγιο και επιστρέφει ένα ακέραιο αριθμό μέσα σε συγκεκριμένο διάστημα. + * Παρόμοια τεχνική πρέπει να χρησιμοποιείται κάθε φορά που πρέπει να εισαχθούν τιμές και να γίνει έλεγχος ορθότητάς τους + */ +int GetIntWithinLimits (int L1, int L2) +{ + int R; + do + { + printf ("Enter an Integer Between %d and %d : ", L1, L2); + scanf ("%d", &R); + } + while (R < L1 || R > L2); + return R; +} + +/* + * Δημιουργεί έναν δυναμικά δεσμευμένο πίνακα ακεραίων συγκεκριμένου μεγέθους, τον γεμίζει με τιμές από την standard είσοδο + * και τον επιστρέφει. Σε περίπτωση προβλήματος δέσμευσης μνήμης η εκτέλεση του προγράμματος διακόπτεται. + * Πώς θα μπορούσε να επιστρέφεται η πληροφορία ότι δεν έγινε η δέσμευση μνήμης (αν αποτύχει η malloc) και να μην χρειαστεί να τερματιστεί το πρόγραμμα; + */ +int *ReadMatrix (int S) +{ + int *T, i; + T = (int *) malloc (S * sizeof (int)); + if (T == NULL) + { + //Ενημέρωση χρήστη για μοιραίο πρόβλημα... + exit (1); + } + for (i = 0; i < S; i++) + { + printf ("Enter Value for Position %d: ", i + 1); + scanf ("%d", T + i); //Γιατί T + i και όχι &T[i]; + } + return T; +} + +/* + * Δημιουργεί έναν δυναμικά δεσμευμένο πίνακα ακεραίων συγκεκριμένου μεγέθους, τον γεμίζει με τιμές από την standard είσοδο + * και επιστρέφει true αν η δέσμευση έγινε κανονικά, false διαφορετικά. + * Η διαφορά με την προηγούμενη συνάρτηση είναι ότι η διεύθυνση του πίνακα δεν επιστρέφεται με return αλλά τοποθετείται + * στον pointer που δίδεται ως είσοδος. Η τεχνική αυτή χρησιμοποιείται αν η συνάρτηση πρέπει να δημιουργήσει περισότερους + * του ενός πίνακες ή αν πρέπει να επιστρέψει και κάποια άλλη πληροφορία, όπως σε αυτή την περίπτωση. + * Είναι κατανοητό γιατί ο pointer είναι διπλός; + */ +int ReadMatrix1 (int **M, int S) +{ + int i; + *M = (int *) malloc (S * sizeof (int)); + if (*M == NULL) + return 0; + for (i = 0; i < S; i++) + { + printf ("Enter Value for Position %d: ", i + 1); + scanf ("%d", *M + i); + } + return 1; +} + +/* + * Τυπώνει τα στοιχεία ενός πίνακα ακεραίων. + * Τροποποιείστε την συνάρτηση ώστε κάθε ένα συγκεκριμένο αριθμό γραμμών να σταματά το + * τύπωμα και να περιμένει να πατηθεί <Enter> από τον χρήστη. + */ +void PrintMatrix (int *Mat, int N) +{ + int i; + for (i = 0; i < N; i++) + printf ("Element %4d Value: %5d\n", i + 1, Mat[i]); +} + +/** + * Συγκρίνει τα περιεχόμενα 2 πινάκων και επιστρέφει true αν όλα τα στοιχεία τους είναι ίσα ένα προς ένα. + * Δοκιμάστε την με και χωρίς το else. + */ +int CompareMatrices (int *M1, int M2[], int S) +{ + int i; + for (i = 0; i < S; i++) + if (M1[i] != *(M2 + i)) + return 0; + //else + return 1; +} + +/** + * Επιστρέφει ένα τυχαίο αριθμό στο διάστημα [L1...L2]. + * Το L2 πρέπει να είναι μεγαλύτερο ή ίσο του L1 με ευθύνη του προγραμματιστή + */ +int GetRandom (int L1, int L2) +{ + return random () % (L2 - L1 + 1) + L1; +} + +/** + * Γεμίζει έναν πίνακα ακεραίων με τυχαίες τιμές σε συγκεκριμένα όρια + */ +void RandomFill (int *P, int N, int O1, int O2) +{ + int i; + for (i = 0; i < N; P[i++] = GetRandom (O1, O2)); +} + +/** + * Ελέγχει αν είνας πίνακας είναι ταξινομημένος. + * Δουλεύει αν ο πίνακας έχει ένα μόνο ή κανένα στοιχείο; + */ +int IsSorted (int *P, int S) +{ + int i; + for (i = 1; i < S; i++) + if (P[i] < P[i - 1]) + return 0; + return 1; +} + +/** + * Ταξινομεί έναν πίνακα με ένα καθόλου έξυπνο αλγόριθμο και επιστρέφει το πλήθος των επαναλήψεων που πραγματοποιήθηκαν. + * Ο αριθμός που θα επιστρέφεται θα είναι πάντα σωστός; Αν όχι σε ποια περίπτωση και τι μπορεί να γίνει για αυτό; + * Βελτιώστε την απόδοση της συνάρτησης διατηρώντας την βασική ιδέα. + */ +int LudicrousSort (int *Mat, int N) +{ + int C = 0; + int tmp; + int i, j; + while (!IsSorted (Mat, N)) + { + C++; + i = GetRandom (0, N - 1); + j = GetRandom (0, N - 1); + tmp = Mat[i]; + Mat[i] = Mat[j]; + Mat[j] = tmp; + } + return C; +} + +/** + * Τι κάνει αυτή η συνάρτηση; + * Υλοποιείστε την με διαφορετικό τρόπο + */ +void Strange1 (int *P, int S) +{ + int i; + char *p; + p = (char *)P; + for (i = 0; i < S; i++) + { + *p = *p & (unsigned char ) 254; + p += sizeof (int); + } +} + +/* +================================================================================================= +Γράψτε μία συνάρτηση η οποία θα επιστρέφει τους δύο μεγαλύτερους αριθμούς ενός πίνακα σαρώνοντάς +τον μόνο μία φορά. + +Υλοποιείστε μία δική σας συνάρτηση η οποία θα λειτουργεί όπως η "realloc" + +Υλοποιείστε σειριακή και δυαδική αναζήτηση +*/ + + + + + + + + diff --git a/assignment-1.5-arrays-pointers-files/examples/Lexico.c b/assignment-1.5-arrays-pointers-files/examples/Lexico.c @@ -0,0 +1,149 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int GetSize (void); +void ClearBuf (void); +void RemoveEnter (char *); +char **ReadWords (int); +void PrintWords (char **, int); +void FreeMem (char **, int); +void SortWords (char **, int); +void SortWordsByLength (char **, short int *, int); +short int *CreateLexeisSize (char **, int); +void ShowMemory (char **, int); + +int main (int argc, char **argv) +{ + char **Lexeis; + short int *LexeisSize; + int N; + N = GetSize (); + Lexeis = ReadWords (N); + PrintWords (Lexeis, N); + SortWords (Lexeis, N); + PrintWords (Lexeis, N); + LexeisSize = CreateLexeisSize (Lexeis, N); + SortWordsByLength (Lexeis, LexeisSize, N); + PrintWords (Lexeis, N); + ShowMemory (Lexeis, N); + FreeMem (Lexeis, N); + +} + +int GetSize () +{ + int S; + do + { + printf ("Enter Number of Words: "); + scanf ("%d", &S); + } + while (S < 1); + ClearBuf (); + return S; +} + +void ClearBuf () +{ + char ch; + while (( ch = getc (stdin)) != '\n' && ch != EOF); +} + +void RemoveEnter (char *W) +{ + int i; + for (i = 0; W[i] != 10 && W[i] != 13; i++); + W[i] = 0; +} + +char **ReadWords (int S) +{ + char **Words; + char *Buf; + int i; + Buf = (char *) malloc (201); + Words = (char **) malloc (S * sizeof (char *)); + for (i = 0; i < S; i++) + { + printf ("Enter word %d: ", i + 1); + fgets (Buf, 201, stdin); + RemoveEnter (Buf); + Words[i] = (char *) malloc (strlen (Buf) + 1); + strcpy (Words[i], Buf); + } + free (Buf); + return Words; +} + +void PrintWords (char **Words, int NoW) +{ + int i; + printf (" AA Word Length\n"); + for (i = 0; i < NoW; i++) + printf ("[%3d] %-30s (%2d)\n", i + 1, Words[i], strlen (Words[i])); + printf ("----------------------------------------------------------------------------------\n\n"); +} + +void FreeMem (char **L, int N) +{ + int i; + for (i = 0; i < N; i++) + free (*(L + i)); + free (L); +} + +void SortWords (char **Words, int S) +{ + char *tmp; + int i, j; + for (i = 0; i < S - 1; i++) + for (j = i + 1; j < S; j++) + if (strcmp (Words[i], Words[j]) > 0) + { + tmp = Words[i]; + Words[i] = Words[j]; + Words[j] = tmp; + } +} + +void SortWordsByLength (char **Words, short int *WL, int S) +{ + short int tmp; + char *tmp1; + int i, j; + for (i = 0; i < S - 1; i++) + for (j = i + 1; j < S; j++) + if (WL[i] > WL[j]) + { + tmp = WL[i]; + WL[i] = WL[j]; + WL[j] = tmp; + tmp1 = Words[i]; + Words[i] = Words[j]; + Words[j] = tmp1; + } +} + +short int *CreateLexeisSize (char **Words, int S) +{ + short int *Mat; + int i; + Mat = (short int *) malloc (S * sizeof (short int)); + for (i = 0; i < S; i++) + *(Mat + i) = strlen (*(Words + i)); + return Mat; +} + +void ShowMemory (char **W, int P) +{ + int i; + printf ("The Lexeis pointer Contains: %p\n", W); + printf (" Lexeis+i Lexeis[i] Word\n"); + printf (" --------------\n"); + for (i = 0; i < P; i++) + { + printf (" %10p | %10p | ---> %s\n", W + i, *(W + i), *(W + i)); + printf (" --------------\n"); + } +} diff --git a/assignment-1.5-arrays-pointers-files/examples/mystring.c b/assignment-1.5-arrays-pointers-files/examples/mystring.c @@ -0,0 +1,103 @@ +#include <stdio.h> +#include <string.h> + +int mystrcmp (char *, char *); +int mystrlen (char *); +void mystrcpy (char *, char *); +char *mystrcat (char *, char *); + +int main (int argc, char **argv) +{ + char Str1[50] = "Thanasis"; + char Str2[50] = "Maria"; + char Str3[50] = "MariaP"; + char Str4[50] = ""; + + printf ("Name 1 : %s\n", Str1); + printf ("Name 2 : %s\n", Str2); + printf ("Name 3 : %s\n", Str3); + printf ("Name 4 : %s\n", Str4); + + printf ("\n"); + printf ("Compare Name 1 with Name 2: %d \n", mystrcmp (Str1, Str2)); + printf ("Compare Name 2 with Name 1: %d \n", mystrcmp (Str2, Str1)); + printf ("Compare Name 1 with Name 1: %d \n", mystrcmp (Str1, Str1)); + printf ("Compare Name 2 with Name 3: %d \n", mystrcmp (Str2, Str3)); + printf ("Compare Name 3 with Name 2: %d \n", mystrcmp (Str3, Str2)); + + printf ("\n"); + printf ("Length of Name 1 : %d\n", mystrlen (Str1)); + printf ("Length of Name 2 : %d\n", mystrlen (Str2)); + printf ("Length of Null String : %d\n", mystrlen ("")); + + printf ("\n"); + mystrcpy (Str4, Str1); + printf ("Name 4: %s is copy of Name 1: %s\n", Str4, Str1); + + printf ("\n"); + mystrcat (Str4, Str2); + printf ("New Name 4: %s\n", Str4); + + +} + +/* + * Υλοποίηση της "strcmp" + * Αυτό που επιστρέφει είναι το ίδιο / συμβατό με αυτό που επιστρέφει η έτοιμη συνάρτηση; + * Υλοποιείστε την strncmp + */ + +int mystrcmp (char *s1, char *s2) +{ + int i; + for (i = 0; s1[i] == s2[i] && s1[i] != 0; i++); + return s1[i] - s2[i]; +} + +/* + * Υλοποίηση της "strlen". + * Ξεκαθαρείστε το νόημα της συνθήκης, συντακτικά και λογικά + */ +int mystrlen (char *s) +{ + int i; + for (i = 0; s[i]; i++); + return i; +} + +/* + * Υλοποίηση της "strcpy" + * Είναι κατανοητό πως δουλεύει; + * Σε τι διαφέρει από την έτοιμη συνάρτηση; Διορθώστε την ώστε να πληροί τις προδιαγραφές της έτοιμης συνάρτησης. + * Υλοποιείστε την με έναν... πιο αλγοριθμικό τρόπο. + * Υλοποιείστε την strncpy + */ +void mystrcpy (char *d, char *s) +{ + int i = 0; + while (d[i]=s[i++]); +} + +/* + * Υλοποίηση της "strcat" + * Υλοποιείστε την χωρίς την κλήση άλλης συνάρτησης. + * Υλοποιείστε την strncat + */ +char *mystrcat (char *d, char *s) +{ + char *tmp; + tmp = d; + while (*tmp) + tmp++; + // while (*(tmp++)); // Γιατί όχι μόνο αυτό; + mystrcpy (tmp, s); + return d; +} + +/* + * Υλοποιείστε τις παρακάτω συναρτήσεις: + * -strdup + * -strlwr + * -strupr + */ + diff --git a/assignment-1.5-arrays-pointers-files/minesweeper/Makefile b/assignment-1.5-arrays-pointers-files/minesweeper/Makefile @@ -0,0 +1,31 @@ +EXEC = minesweeper + +SRC_DIR = src +OBJ_DIR = obj + +SRC = $(wildcard $(SRC_DIR)/*.c) +OBJ = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) + +MKDIR_P = mkdir -p + +CPPFLAGS += -Iinclude +CFLAGS += -Wall +LDFLAGS += -Llib +LDLIBS += -lm + +.PHONY: all clean + +all: $(EXEC) + +$(EXEC): $(OBJ) + $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ + +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c + $(MKDIR_P) $(OBJ_DIR) + $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ + +run: + ./$(EXEC) + +clean: + $(RM) $(OBJ) $(EXEC)+ \ No newline at end of file diff --git a/assignment-1.5-arrays-pointers-files/minesweeper/include/ccolors.h b/assignment-1.5-arrays-pointers-files/minesweeper/include/ccolors.h @@ -0,0 +1,31 @@ +#ifndef C_COLORS_H +#define C_COLORS_H + +#include <stdio.h> + +enum options {RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, BOLD_RED, BOLD_GREEN, BOLD_YELLOW, BOLD_BLUE, BOLD_MAGENTA, BOLD_CYAN, STANDARD}; +enum options color; + +void set_color(enum options color) +{ + switch (color) + { + case RED: printf("\033[0;31m"); break; + case GREEN: printf("\033[0;32m"); break; + case YELLOW: printf("\033[0;33m"); break; + case BLUE: printf("\033[0;34m"); break; + case MAGENTA: printf("\033[0;35m"); break; + case CYAN: printf("\033[0;36m"); break; + + case BOLD_RED: printf("\033[1;31m"); break; + case BOLD_GREEN: printf("\033[1;32m"); break; + case BOLD_YELLOW: printf("\033[1;33m"); break; + case BOLD_BLUE: printf("\033[1;34m"); break; + case BOLD_MAGENTA: printf("\033[1;35m"); break; + case BOLD_CYAN: printf("\033[1;36m"); break; + + case STANDARD: printf("\033[0m"); break; + } +} + +#endif+ \ No newline at end of file diff --git a/assignment-1.5-arrays-pointers-files/minesweeper/include/minesweeper.h b/assignment-1.5-arrays-pointers-files/minesweeper/include/minesweeper.h @@ -0,0 +1,19 @@ +#ifndef MINESWEEPER_H +#define MINESWEEPER_H + +#include <stdbool.h> + + +extern bool gameOver; + +int set_width(); +int set_height(); +int set_mine_number(); +void init(); +void draw_table(); +void place_mines(); +void input(); +void logic(); + + +#endif+ \ No newline at end of file diff --git a/assignment-1.5-arrays-pointers-files/minesweeper/src/main.c b/assignment-1.5-arrays-pointers-files/minesweeper/src/main.c @@ -0,0 +1,25 @@ +#include <stdio.h> +#include <stdbool.h> +#include "minesweeper.h" + + +int main(int argc, char **argv) +{ + int WIDTH = set_width(); + int HEIGHT = set_height(); + int MINE_NUMBER = set_mine_number(); + bool gameOver; + + init(); + + if (!gameOver) + { + draw_table(); + place_mines(); + input(); + logic(); + } + + + return 0; +}+ \ No newline at end of file diff --git a/assignment-1.5-arrays-pointers-files/minesweeper/src/minesweeper.c b/assignment-1.5-arrays-pointers-files/minesweeper/src/minesweeper.c @@ -0,0 +1,84 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <time.h> +#include "minesweeper.h" +#include "ccolors.h" + + +int set_width() +{ + int WIDTH; + + do + { + printf("Width (between 10 and 100): "); + scanf("%d", &WIDTH); + } while (WIDTH < 10 || WIDTH > 100); + + + return WIDTH; +} + + +int set_height() +{ + int HEIGHT; + + do + { + printf("Height (between 10 and 100): "); + scanf("%d", &HEIGHT); + } while (HEIGHT < 10 || HEIGHT > 100); + + + return HEIGHT; +} + + +int set_mine_number() +{ + int MINE_NUMBER; + + do + { + printf("Number of mines (between 1 and 20): "); + scanf("%d", &MINE_NUMBER); + } while (MINE_NUMBER <= 0 || MINE_NUMBER > 20); + + + return MINE_NUMBER; +} + + +void init(int WIDTH, int HEIGHT) +{ + bool gameOver = false; + + int mineX = rand() % WIDTH; + int mineY = rand() % HEIGHT; +} + + +void draw_table(int WIDTH, int HEIGHT) +{ + +} + + +void place_mines() +{ + +} + + +void input() +{ + +} + + +void logic() +{ + +}+ \ No newline at end of file diff --git a/assignment-1.5-arrays-pointers-files/minesweeper/todo.md b/assignment-1.5-arrays-pointers-files/minesweeper/todo.md @@ -0,0 +1,32 @@ +// Variables + +// Create world + + // Define M and N + // Malloc world array + // Fill array + +// Create stats board + +// Place mines + // rand + // Directions + +// system("clear||cls") +// Print world + +// Game logic + + // Show stats + // Show mines + +// Game over menu + + // Press key to continue + +// Export to text + + // Get file name + // Write to file + +// free()+ \ No newline at end of file