Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα, στην σχολή είχαμε 2 εργασίες .

Τη πρώτη τη παρέδωσα , είχα μερικά λάθη αλλά βαθμολογήθηκε 2,1/2.5

Τώρα στήν 2η εργασία θέλει με τα ίδια σχήματα να τα έχω σε φόντο και βάσει θέση εισαγωγής 

Ένω έχω φτιάξει τα 2 πρώτα σχήματα και βγαίνουν έχω κολλήσει στα υπόλοιπα 3 .

Εχω υλοποιήσει μέρος του κώδικά , και εάν δέν τα καταφέρω θα παρουσιάσω μέχρι εκεί που έχω κάνει.

Υποχρεωτικά θέλει να χρησιμοποιώ τη συνάρτηση void print_array() μου την έχει δώσει υλοποιημένη 

Γενικά είμαι αρχάριος στην γλώσσα C και το προσπαθώ , παρόλο που έχω κοπεί στο μάθημα .

Τη εργασία θα τη παραδώσω εάν δω οτι δεν τα καταφέρνω με τα 2 σχήματα μόνο ως έχει 

Δηλαδή έχω μπερδευτεί ως πρός τη θέση των σχημάτων (υπόλοιπα 3) , στην ουσία έχω στο τετράδιο ένα δυσδιάστατο πίνακα και την παραμετροποιήση ως πρός το ύψος.

 

Αναφορά σε κείμενο

Στην δεύτερη εργασία του εργαστηρίου θα υλοποιήσετε ένα πρόγραμμα, όπου θα δίνει την επιλογή στον χρήστη της αυτόματης και παραμετρικής δημιουργίας απλών γραφικών του γνωστού βιντεοπαιχνιδιού Super Mario, μέσα σε οθόνη, η οποία θα προσομοιώνεται με πίνακα. Πιο συγκεκριμένα, θα δίνει τη δυνατότητα στον χρήστη, να δημιουργεί το φόντο (background), προσθέτοντας ένα-ένα στοιχείο κάθε φορά. Π.χ. Να μπορώ να δημιουργήσω ως φόντο (1η πίστα) το: Δηλαδή καταπακτή, τουβλάκια (στον αέρα, προφανώς), σκάλα με τη σημαία στον τερματισμό, και το κάστρο που θα μπει για να πάει στην επόμενη πίστα ο Mario. Ένα άλλο φόντο (2η πίστα) θα μπορούσε να είναι το: Δεδομένου ότι ασχολούμαστε με το φόντο, τα σχήματα τα οποία μπορούν να εισαχθούν (από την 1η άσκηση) είναι τα: - Σκάλα με σημαία - Κάστρο - Καταπακτή - Πλατφόρμα - Εμπόδια στις υπόγειες πίστες - Φράκτης Τα οποία βρίσκονται υποχρεωτικά στο έδαφος. Σε αυτά θα προσθέσουμε τα απλά τουβλάκια, τα οποία μπορούν να βρίσκονται και στον αέρα. Παράμετροι του προγράμματος: Αρχικά, ο χρήστης δίνει τις διαστάσεις της οθόνης (μήκος και ύψος), όπου και δεσμεύεται ο 2D πίνακας. Στη συνέχεια, το πρόγραμμα δίνει τη δυνατότητα στον χρήστη να εισάγει κάποιο από τα 7 σχήματα, με τις αντίστοιχες παραμέτρους του. Π.χ. για να δημιουργηθεί η 1η πίστα, ο χρήστης θα πρέπει να διαλέξει (τα νούμερα δεν είναι ακριβώς, απλά να καταλάβετε πως γίνεται): 1. Ύψος φόντου: 20 , Πλάτος φόντου: 60. 2. Εισαγωγή Καταπακτής μεγέθους 3, στη θέση 2 (η τετμημένη της). 3. Εισαγωγή 6 τούβλων, στη θέση (12,5) (12 η τετμημένη και 5 η τεταγμένη). 4. Εισαγωγή σκάλας-σημαίας μεγέθους 8 στη θέση 25 (η τετμημένη της). 5. Εισαγωγή κάστρου μεγέθους 4 στη θέση 50. Η επιλογή διαστάσεων του φόντου γίνεται στην αρχή. Τα υπόλοιπα 4 βήματα μπορούν να γίνουν και με άλλη σειρά (π.χ. πρώτα το κάστρο (στην ίδια θέση, όμως), μετά τα 6 τούβλα (στην ίδια θέση), κλπ).

 

 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void print_array(char** array, int height, int width);
void kastro(char** array, int height, int width);
void skala(char** array, int height, int width);
void katapakti(char** array, int height, int width);
void platforma(char** array, int height, int width);
void empodia(char** array, int height, int width);

int main()
{
	int height, width, i, j;
	char **array;
	
	////////////////////////   YOUR VARIABLES' DECLARATION  /////////////////////////////
	int epilogi=0;
	//////////////////////// END OF VARIABLES' DECLARATION /////////////////////////////

	printf("\nInsert height fontou: "); scanf("%d", &height);
	printf("\nInsert width fontou: "); scanf("%d", &width);
		
	array = (char**)malloc(height*sizeof(char*));
	for(i=0; i<height; i++) array[i] = (char*)malloc(width*sizeof(char));
	
	for(i=0; i<height; i++)
		for(j=0; j<width; j++)	
			array[i][j] = ' ';
					
	//////////////////////// YOUR CODE GOES HERE /////////////////////////////
	do{
		printf("\nGive yours choices 1.SkALA, 2.KASTRO, 3. KATAPAKTI, 4.PLATFOTMA, 5.EMPODIA, 6.TOYBLAKIA, 7.EXODOS:"); // δώσε ποιο σχήμα θές 
        scanf("%d",&epilogi);
        switch(epilogi)
        {
        case 1:
            skala(array, height, width);
            break;
        case 2:
            kastro(array,height, width);
            break;
        case 3:
            katapakti(array, height, width);
            break;
        case 4:
            platforma(array, height, width);
            break;
        case 5:
            empodia(array, height,width);
            break;
        case 6:
        case 7:
		    exit(0);
            return;
        }
        if(epilogi<1 || epilogi>7)
            printf("The value is not valid");
		print_array(array, height, width);
	}while(epilogi!=7);
	
	////////////////////////  END OF YOUR CODE  //////////////////////////////
	for(i=0; i<height; i++) free(array[i]);
	free(array);
	printf("\n\n");
	return 0;
}

void print_array(char** array, int height, int width)
{
	int i,j;
	printf("\n\n   ");
	for(i=0; i<width; i++)
		printf("%d", i%10);
	
	printf("\n  |"); for(j=0; j<width; j++) printf("-"); 
	printf("|\n ");
	for(i=0; i<height; i++)
	{
		
		printf("%d|",i%10);
		for(j=0; j<width; j++) printf("%c", array[i][j]);
		printf("|\n ");
	}
	printf(" |"); for(j=0; j<width; j++) printf("-"); 
	printf("|");
	printf("\n\n");
}

void kastro(char** array, int height, int width)
{
    int i,j,k,thesi,iyos;
    printf("\nGive thesi kastrou:");
	scanf("%d",&thesi);
	printf("\nGive iyos kastrou:"); // ύψος κάστρου
    scanf("%d",&iyos);
		
    for(i=0; i<iyos+2; i++)
    {
        if(i==0)
        {
            for(j=0; j<iyos+1; j=j+1)
                array[height-iyos+i-2][thesi+(2*j)]='*';
			array[height-iyos+i-2][thesi+(2*j)]='*';
        }
        else if(i<iyos-1)
        {
            for(j=0; j<2*iyos+3; j++)
                array[height-iyos+i-2][thesi+j]='*';
			
        }
        else
        {
            for(j=0;j<iyos;j++)
                array[height-iyos+i-2][thesi+j]='*';//printf("*");
            for(j=0;j<iyos;j++)
                array[height-iyos+i-2][thesi+j+iyos+3]='*';//printf("*");
        }
    }

}


void skala(char** array, int height, int width)
{
    int i,j,k,thesi, iyos;
    printf("\nGive position thesi :"); // θέση σκάλας 
    scanf("%d",&thesi);
	printf("\nGive iyos:"); // ύψος σκάλας 
    scanf("%d",&iyos);
		
    for(i=0; i<iyos+3; i++)
    {

         if(i<3)
        {
              if(i==0)
			  	array[height-iyos-3][thesi+(2*iyos+1)]='*';
              else if(i==1)
              {		 
				array[height-iyos-3+i][thesi+(2*iyos-1)]='*';
				array[height-iyos-3+i][thesi+(2*iyos)]='*';
				array[height-iyos-3+i][thesi+(2*iyos+1)]='*';
			  }
              else
              {
				  array[height-iyos-3+i][thesi+(2*iyos+1)]='*';
				  array[height-iyos-3+i][thesi+(2*iyos)]='*';
				 
			  }
        }
        else if(i==iyos+2)
        {
            for(k=0; k<iyos+1; k++)
                array[height-iyos-3+i][thesi+k]='*';
            array[height-iyos-3+i][thesi+2*iyos]='*';
			array[height-iyos-3+i][thesi+2*iyos+1]='*';
			array[height-iyos-3+i][thesi+2*iyos+2]='*';
        }
        else
        {
            for(j=iyos-i+1; j<iyos; j++)
                array[height-iyos-3+i][thesi+j+1]='*';
			array[height-iyos-3+i][thesi+(2*iyos+1)]='*';
        }
    }
}




    }


}

 

Επεξ/σία από meletis_m
Δημοσ.

Δηλαδή έκανες το κάστρο με πόρτα βλέπω επάλξεις πολεμίστρες κλπ, έκανες τη σκάλα με σημαία από πίσω, και κολλάς στα τουβλάκια;  Κάτι δεν μας λες σωστά:D

 

 

Δημοσ.
5 λεπτά πριν, k33theod είπε

Δηλαδή έκανες το κάστρο με πόρτα βλέπω επάλξεις πολεμίστρες κλπ, έκανες τη σκάλα με σημαία από πίσω, και κολλάς στα τουβλάκια;  Κάτι δεν μας λες σωστά:D

Και εγώ εκεί κολλάω... δεν ξέρω που να βάλω το σενάζ, και γκρεμίζονται συνέχεια τα τουβλάκια :D

Δημοσ. (επεξεργασμένο)

Μια και πέρασε καιρός να γράψω κάποια σχόλια για την λογική του κώδικα. Δυστυχώς δεν μπορώ να βοηθήσω για το πώς πρέπει να υλοποιηθούν οι καταπακτές και λοιπά γιατί δεν έχω ιδέα πως πρέπει να είναι. Ίσως θα έπρεπε ο καθηγητής να δώσει πώς πρέπει να φαίνεται μία συγκεκριμένη "πίστα" ώστε να μπορεί ο φοιτητής να ελέγχει την ορθότητα του κώδικά του. Για παράδειγμα δεν μου κάθεται καλά ότι το κάστρο έχει 3 κενά είτε έχει πλάτος 5 είτε έχει πλάτος 20.

Αν βαριέσαι να διαβάσεις τα σχόλια μου, εδώ είναι ο κώδικας μετά τις αλλαγές μου

Spoiler

commit 2ce0862f186442c7306da6819e55eedb19ea442f

    Πέρασμα από indent
    
    Ο αρχικός κώδικας είχε λάθος επίπεδα εσοχών, αλλού spaces και αλλού
    tabs, κτλ για αυτό περάστηκε από το πρόγραμμα indent όπου
    χρησιμοποιήθηκε το πρότυπο linux.

commit b3ce7eb4ece401694dea41288d4043b865378f4b

    Αφαίρεση των exit και return από την επιλογή 7
    
    Όταν ο χρήστης επέλεγε την επιλογή 7 για έξοδο, τότε το πρόγραμμα
    έτρεχε την συνάρτηση exit και μετά την δήλωση return. Αυτό
    έχει ως συνέπεια αφενός να μην τρέχει ποτέ η return αφετέρου
    να μην τρέξει ποτέ ο κώδικας του καθηγητή που κάνει free
    την μνήμη των δεικτών. Εφόσον το πρόγραμμα θα τερματίσει,
    θα γίνει αυτόματα free η μνήμη αλλά και πάλι δεν είναι σωστό
    λογικά.

diff --git a/mario.c b/mario.c
index 77a69a8..8a51d2a 100644
--- a/mario.c
+++ b/mario.c
@@ -53,8 +53,7 @@ int main()
 			break;
 		case 6:
 		case 7:
-			exit(0);
-			return 0;
+			break;
 		}
 		if (epilogi < 1 || epilogi > 7)
 			printf("The value is not valid");

commit 334f3ff441b1ca76fb6e091305f1961f89deab19

    Μεταφορά του μηνύματος λάθους μέσα στην switch
    
    Η δήλωση switch υποστηρίζει την δήλωση default η οποία τρέχει για όλες
    τις τιμές οπότε μπορούμε να μεταφέρουμε το μήνυμα λάθους τιμής μέσα
    στην case και να γλυτώσουμε το if.
    
    Στην προκείμενη περίπτωση κράτησα το if ώστε να μην τυπώνεται ο πίνακας
    της πίστας κάθε φορά που δίνουμε λάθος τιμή. Έχει νόημα να τυπώνεται;

diff --git a/mario.c b/mario.c
index 8a51d2a..ec13118 100644
--- a/mario.c
+++ b/mario.c
@@ -54,10 +54,12 @@ int main()
 		case 6:
 		case 7:
 			break;
+		default:
+			printf("\nThe value is not valid\n");
+			break;
 		}
-		if (epilogi < 1 || epilogi > 7)
-			printf("The value is not valid");
-		print_array(array, height, width);
+		if (epilogi > 0 && epilogi < 7)
+			print_array(array, height, width);
 	} while (epilogi != 7);
 
 	////////////////////////  END OF YOUR CODE  //////////////////////////////

commit 06a7bfb989d4e54554b3a46f781add198418aac9

    Απλοποίηση του κώδικα του κάστρου
    
    Το κάστρο έχει αστερίσκους κάθε 2 θέσεις στην κορυφή του και κάθε 1 θέση
    από εκεί και πέρα. Ο βρόχος της πρώτης περίπτωσης πήγαινε μέχρι ύψος + 1
    και έβαζε αστερίσκο κάθε 2j και στο τέλος έβαζε ακόμη έναν.
    
    Πλέον αλλάζει ώστε να είναι ίδιος με τον κώδικα της δεύτερης περίπτωσης
    και πηγαίνει μέχρι 2 * ύψος + 3 απλά αυξάνει το j κατά 2 αντί κατά 1.

diff --git a/mario.c b/mario.c
index ec13118..9324397 100644
--- a/mario.c
+++ b/mario.c
@@ -105,9 +105,8 @@ void kastro(char **array, int height, int width)
 
 	for (i = 0; i < iyos + 2; i++) {
 		if (i == 0) {
-			for (j = 0; j < iyos + 1; j = j + 1)
-				array[height - iyos + i - 2][thesi + (2 * j)] = '*';
-			array[height - iyos + i - 2][thesi + (2 * j)] = '*';
+			for (j = 0; j < 2 * iyos + 3; j = j + 2)
+				array[height - iyos + i - 2][thesi + j] = '*';
 		} else if (i < iyos - 1) {
 			for (j = 0; j < 2 * iyos + 3; j++)
 				array[height - iyos + i - 2][thesi + j] = '*';

commit d0f3d6abad8579520db7cf68607c56efe8669ada

    Απλοποίηση του κώδικα του κάστρου 2
    
    Και οι 4 βρόχοι χρησιμοποιούσαν σαν γραμμή του πίνακα την παράσταση
    height - iyos + i - 2 οπότε, χάριν ευκολίας ανάγνωσης, εισάγεται
    μια μεταβλητή row η οποία παίρνει μία φορά ως τιμή την παράσταση
    και χρησιμοποιείται παντού αυτή.
    
    Επίσης αφαιρούνται τα περιττά σχόλια printf "*"

diff --git a/mario.c b/mario.c
index 9324397..cb42b2a 100644
--- a/mario.c
+++ b/mario.c
@@ -98,24 +98,27 @@ void print_array(char **array, int height, int width)
 void kastro(char **array, int height, int width)
 {
 	int i, j, k, thesi, iyos;
+	int row;
 	printf("\nGive thesi kastrou:");
 	scanf("%d", &thesi);
 	printf("\nGive iyos kastrou:"); // ύψος κάστρου
 	scanf("%d", &iyos);
 
 	for (i = 0; i < iyos + 2; i++) {
+
+		row = height - iyos + i - 2;
 		if (i == 0) {
 			for (j = 0; j < 2 * iyos + 3; j = j + 2)
-				array[height - iyos + i - 2][thesi + j] = '*';
+				array[row][thesi + j] = '*';
 		} else if (i < iyos - 1) {
 			for (j = 0; j < 2 * iyos + 3; j++)
-				array[height - iyos + i - 2][thesi + j] = '*';
+				array[row][thesi + j] = '*';
 
 		} else {
 			for (j = 0; j < iyos; j++)
-				array[height - iyos + i - 2][thesi + j] = '*';  //printf("*");
+				array[row][thesi + j] = '*';
 			for (j = 0; j < iyos; j++)
-				array[height - iyos + i - 2][thesi + j + iyos + 3] = '*';       //printf("*");
+				array[row][thesi + j + iyos + 3] = '*';
 		}
 	}
 

commit af76e8eef0660b4188d772541acff77d78be1333

    Απλοποίηση του κώδικα του κάστρου 3
    
                    } else {
                            for (j = 0; j < iyos; j++)
                                    array[row][thesi + j] = '*';
                            for (j = 0; j < iyos; j++)
                                    array[row][thesi + j + iyos + 3] = '*';
                    }
    Ο παραπάνω κώδικας τρέχει 2 ολόιδιους βρόχους χωρίς το σώμα του 2ου
    να επηρρεάζεται από το αποτέλεσμα του 1ου βρόχου. Έτσι, μπορεί
    να αφαιρεθεί ο 2ος βρόχος και οι δύο αναθέσεις να τρέχουν σαν σώμα
    του 1ου.

diff --git a/mario.c b/mario.c
index cb42b2a..ecfca78 100644
--- a/mario.c
+++ b/mario.c
@@ -115,10 +115,10 @@ void kastro(char **array, int height, int width)
 				array[row][thesi + j] = '*';
 
 		} else {
-			for (j = 0; j < iyos; j++)
+			for (j = 0; j < iyos; j++) {
 				array[row][thesi + j] = '*';
-			for (j = 0; j < iyos; j++)
 				array[row][thesi + j + iyos + 3] = '*';
+			}
 		}
 	}
 

commit 4012de2408cdfffb0243f56bb72614bd3eba4a92

    Απλοποίηση του κώδικα της σκάλας
    
    Όπως και στο κάστρο, βλέπουμε ότι πολλές αναθέσεις χρησιμοποιούν
    την ίδια μορφή. Έτσι, μπορούμε να ορίσουμε δύο νέες μεταβλητές row, col
    και να αλλάξουμε τον κώδικα ώστε να τις χρησιμοποιεί.
    
    Με αυτή τη μορφή είναι πιο εύκολο να απλοποιήσουμε και άλλο τον κώδικα.

diff --git a/mario.c b/mario.c
index ecfca78..4e0531b 100644
--- a/mario.c
+++ b/mario.c
@@ -127,35 +127,38 @@ void kastro(char **array, int height, int width)
 void skala(char **array, int height, int width)
 {
 	int i, j, k, thesi, iyos;
+	int row, col;
 	printf("\nGive position thesi :");      // θέση σκάλας 
 	scanf("%d", &thesi);
 	printf("\nGive iyos:"); // ύψος σκάλας 
 	scanf("%d", &iyos);
 
 	for (i = 0; i < iyos + 3; i++) {
+		row = height - iyos - 3;
+		col = thesi + 2 * iyos;
 
 		if (i < 3) {
 			if (i == 0)
-				array[height - iyos - 3][thesi + (2 * iyos + 1)] = '*';
+				array[row][col + 1] = '*';
 			else if (i == 1) {
-				array[height - iyos - 3 + i][thesi + (2 * iyos - 1)] = '*';
-				array[height - iyos - 3 + i][thesi + (2 * iyos)] = '*';
-				array[height - iyos - 3 + i][thesi + (2 * iyos + 1)] = '*';
+				array[row + i][col - 1] = '*';
+				array[row + i][col] = '*';
+				array[row + i][col + 1] = '*';
 			} else {
-				array[height - iyos - 3 + i][thesi + (2 * iyos + 1)] = '*';
-				array[height - iyos - 3 + i][thesi + (2 * iyos)] = '*';
+				array[row + i][col + 1] = '*';
+				array[row + i][col] = '*';
 
 			}
 		} else if (i == iyos + 2) {
 			for (k = 0; k < iyos + 1; k++)
-				array[height - iyos - 3 + i][thesi + k] = '*';
-			array[height - iyos - 3 + i][thesi + 2 * iyos] = '*';
-			array[height - iyos - 3 + i][thesi + 2 * iyos + 1] = '*';
-			array[height - iyos - 3 + i][thesi + 2 * iyos + 2] = '*';
+				array[row + i][thesi + k] = '*';
+			array[row + i][col] = '*';
+			array[row + i][col + 1] = '*';
+			array[row + i][col + 2] = '*';
 		} else {
 			for (j = iyos - i + 1; j < iyos; j++)
-				array[height - iyos - 3 + i][thesi + j + 1] = '*';
-			array[height - iyos - 3 + i][thesi + (2 * iyos + 1)] = '*';
+				array[row + i][thesi + j + 1] = '*';
+			array[row + i][col + 1] = '*';
 		}
 	}
 }

commit f8b0d8b2b7e230e51965835ab5fb89cfc2a268ea

    Απλοποίηση του κώδικα της σκάλας 2
    
                    if (i < 3) {
                            if (i == 0)
                                    array[row][col + 1] = '*';
                            else if (i == 1) {
                                    array[row + i][col - 1] = '*';
                                    array[row + i][col] = '*';
                                    array[row + i][col + 1] = '*';
                            } else {
                                    array[row + i][col + 1] = '*';
                                    array[row + i][col] = '*';
    
                            }
                    } else if (i == iyos + 2) {
                            for (k = 0; k < iyos + 1; k++)
                                    array[row + i][thesi + k] = '*';
                            array[row + i][col] = '*';
                            array[row + i][col + 1] = '*';
                            array[row + i][col + 2] = '*';
                    } else {
                            for (j = iyos - i + 1; j < iyos; j++)
                                    array[row + i][thesi + j + 1] = '*';
                            array[row + i][col + 1] = '*';
                    }
    
    Ο αρχικός κώδικας μετά την χρήση των row, col είναι ο παραπάνω.
    
    Βλέπουμε ότι όλες οι αναθέσεις χρησιμοποιούν row + i εκτός από την πρώτη
    που χρησιμοποιεί σκέτο row αλλά είναι για i == 0 οπότε μπορεί και αυτό
    να εκφραστεί σαν row + i.
    
    Μετά από αυτήν την αλλαγή βλέπουμε ότι η ανάθεση για [col + 1] γίνεται
    σε όλες τις περιπτώσεις οπότε μπορούμε να την βγάλουμε έξω από τα if.
    
    Μέσα στο i < 3 έχουμε ένα διαφορετικό if για 0, 1, else (δηλαδή 2) οπότε
    για όλες τις περιπτώσεις. Έτσι δεν μας χρησιμεύει σε τίποτα το εξωτερικό
    if (i < 3) και μπορεί να φύγει.
    
    Έτσι φτάνουμε στον και πάλι πολύπλοκο αλλά λίγο πιο απλοποιημένο κώδικα
    που φαίνεται παρακάτω
    
                    array[row + i][col + 1] = '*';
                    if (i == 1) {
                            array[row + i][col - 1] = '*';
                            array[row + i][col] = '*';
                    } else {
                            array[row + i][col] = '*';
                    } else if (i == iyos + 2) {
                            for (k = 0; k < iyos + 1; k++)
                                    array[row + i][thesi + k] = '*';
                            array[row + i][col] = '*';
                            array[row + i][col + 2] = '*';
                    } else {
                            for (j = iyos - i + 1; j < iyos; j++)
                                    array[row + i][thesi + j + 1] = '*';
                    }

diff --git a/mario.c b/mario.c
index 4e0531b..63edd96 100644
--- a/mario.c
+++ b/mario.c
@@ -137,28 +137,21 @@ void skala(char **array, int height, int width)
 		row = height - iyos - 3;
 		col = thesi + 2 * iyos;
 
-		if (i < 3) {
-			if (i == 0)
-				array[row][col + 1] = '*';
-			else if (i == 1) {
-				array[row + i][col - 1] = '*';
-				array[row + i][col] = '*';
-				array[row + i][col + 1] = '*';
-			} else {
-				array[row + i][col + 1] = '*';
-				array[row + i][col] = '*';
+		array[row + i][col + 1] = '*';
+		if (i == 1) {
+			array[row + i][col - 1] = '*';
+			array[row + i][col] = '*';
+		} else if (i == 2) {
+			array[row + i][col] = '*';
 
-			}
 		} else if (i == iyos + 2) {
 			for (k = 0; k < iyos + 1; k++)
 				array[row + i][thesi + k] = '*';
 			array[row + i][col] = '*';
-			array[row + i][col + 1] = '*';
 			array[row + i][col + 2] = '*';
 		} else {
 			for (j = iyos - i + 1; j < iyos; j++)
 				array[row + i][thesi + j + 1] = '*';
-			array[row + i][col + 1] = '*';
 		}
 	}
 }

 

Προσπάθησα να κάνω μόνο μία απλοποίηση σε κάθε βήμα ώστε να διακρίνεται πιο εύκολα η διαφορά και γιατί γίνεται η απλοποίηση.

Επεξ/σία από imitheos
Δημοσ.

Πριν δεν το έγραψα γιατί είναι προχωρημένο για την άσκηση αλλά ας το αναφέρω σε περίπτωση που σε ενδιαφέρει για το μέλλον ή ενδιαφέρει κάποιον που θα διαβάσει το νήμα.

Το πρόγραμμά σου πληρεί κάποιες προϋποθέσεις:

α) Όλες οι συναρτήσεις που έχεις δηλώσει παίρνουν ακριβώς τα ίδια ορίσματα και επιστρέφουν ακριβώς το ίδιο πράγμα.

β) Χρησιμοποιείς if / switch για να επιλέξεις ποια συνάρτηση θα κληθεί με βάση κάποια αριθμητική μεταβλητή.

Αυτά τα δύο φωνάζουν function pointers τους οποίους λογικά δεν θα έχετε διδαχτεί (αν και η άσκηση περιέχει διπλούς δείκτες οπότε ίσως να έχετε διδαχθεί και function pointers).

Τι μπορούμε λοιπόν να κάνουμε:

void kastro(char **array, int height, int width);
void skala(char **array, int height, int width);
void katapakti(char **array, int height, int width);
void platforma(char **array, int height, int width);
void empodia(char **array, int height, int width);
void toublakia(char **array, int height, int width);

Όταν θέλεις να δηλώσεις ένα δείκτη σε char τότε γράφεις "char *p". Στην παρούσα περίπτωση θέλουμε να δηλώσουμε ένα δείκτη που να μπορεί να δείξει στις παραπάνω συναρτήσεις.

  • Ξεκινάμε πρώτα με το όνομα το οποίο επέλεξα να είναι blding_ptr.
  • Αυτό πρέπει να είναι δείκτης οπότε έχουμε *blding_ptr.
  • Πρέπει να είναι δείκτης σε συνάρτηση οπότε γίνεται (*blding_ptr)(). Αν δεν βάλουμε την παρένθεση τότε δηλώνουμε μια συνάρτηση που επιστρέφει ένα δείκτη και όχι ένα δείκτη σε συνάρτηση
  • Τα ορίσματα μας είναι τα παραπάνω οπότε γίνεται (*blding_ptr)(char **, int, int)
  • "Επιστρέφει" void οπότε η τελική έκφραση είναι void (*blding_ptr)(char **, int, int)

Ορίσαμε λοιπόν ένα δείκτη ο οποίος μπορεί να δείξει στις παραπάνω συναρτήσεις. Τι μπορούμε να τον κάνουμε τώρα αυτόν; Το επόμενο βήμα είναι να ορίσουμε ένα πίνακα από τέτοιους δείκτες που να δείχνουν στις συναρτήσεις μας.

static void (*blding_ptr[])(char **, int, int) = {
	NULL, skala, kastro, katapakti, platforma, empodia, toublakia 
};

int main()
{
	do {
		printf("\nGive yours choices 1.SkALA, 2.KASTRO, 3. KATAPAKTI, 4.PLATFOTMA, 5.EMPODIA, 6.TOYBLAKIA, 7.EXODOS:"); // δώσε ποιο σχήμα θές 
		scanf("%d", &epilogi);
		if (epilogi < 1 || epilogi > 7) {
			printf("\nThe value is not valid\n");
			continue;
		}
		if (epilogi < 7)
			blding_ptr[epilogi](array, height, width);
		print_array(array, height, width);
	} while (epilogi != 7);

Με βάση το printf μας, δηλώνουμε τον πίνακα ώστε blding_ptr[1] να δείχνει στην συνάρτηση skala και πάει λέγοντας. Έπειτα αντί να έχουμε 500 if ή 500 case μέσα στην switch, το μόνο που έχουμε να κάνουμε είναι καλέσουμε την συνάρτηση blding_ptr[epilogi]. Αν ο χρήστης δώσει τιμή 3 στην μεταβλητή epilogi, τότε ο κώδικας θα τρέξει το 4ο στοιχείο του πίνακα blding_ptr που είναι η συνάρτηση katapakti.

  • Like 4
  • 2 εβδομάδες αργότερα...
Δημοσ.
Στις 13/1/2020 στις 6:36 ΜΜ, imitheos είπε

Πριν δεν το έγραψα γιατί είναι προχωρημένο για την άσκηση αλλά ας το αναφέρω σε περίπτωση που σε ενδιαφέρει για το μέλλον ή ενδιαφέρει κάποιον που θα διαβάσει το νήμα.

Το πρόγραμμά σου πληρεί κάποιες προϋποθέσεις:

α) Όλες οι συναρτήσεις που έχεις δηλώσει παίρνουν ακριβώς τα ίδια ορίσματα και επιστρέφουν ακριβώς το ίδιο πράγμα.

β) Χρησιμοποιείς if / switch για να επιλέξεις ποια συνάρτηση θα κληθεί με βάση κάποια αριθμητική μεταβλητή.

Αυτά τα δύο φωνάζουν function pointers τους οποίους λογικά δεν θα έχετε διδαχτεί (αν και η άσκηση περιέχει διπλούς δείκτες οπότε ίσως να έχετε διδαχθεί και function pointers).

Τι μπορούμε λοιπόν να κάνουμε:


void kastro(char **array, int height, int width);
void skala(char **array, int height, int width);
void katapakti(char **array, int height, int width);
void platforma(char **array, int height, int width);
void empodia(char **array, int height, int width);
void toublakia(char **array, int height, int width);

Όταν θέλεις να δηλώσεις ένα δείκτη σε char τότε γράφεις "char *p". Στην παρούσα περίπτωση θέλουμε να δηλώσουμε ένα δείκτη που να μπορεί να δείξει στις παραπάνω συναρτήσεις.

  • Ξεκινάμε πρώτα με το όνομα το οποίο επέλεξα να είναι blding_ptr.
  • Αυτό πρέπει να είναι δείκτης οπότε έχουμε *blding_ptr.
  • Πρέπει να είναι δείκτης σε συνάρτηση οπότε γίνεται (*blding_ptr)(). Αν δεν βάλουμε την παρένθεση τότε δηλώνουμε μια συνάρτηση που επιστρέφει ένα δείκτη και όχι ένα δείκτη σε συνάρτηση
  • Τα ορίσματα μας είναι τα παραπάνω οπότε γίνεται (*blding_ptr)(char **, int, int)
  • "Επιστρέφει" void οπότε η τελική έκφραση είναι void (*blding_ptr)(char **, int, int)

Ορίσαμε λοιπόν ένα δείκτη ο οποίος μπορεί να δείξει στις παραπάνω συναρτήσεις. Τι μπορούμε να τον κάνουμε τώρα αυτόν; Το επόμενο βήμα είναι να ορίσουμε ένα πίνακα από τέτοιους δείκτες που να δείχνουν στις συναρτήσεις μας.


static void (*blding_ptr[])(char **, int, int) = {
	NULL, skala, kastro, katapakti, platforma, empodia, toublakia 
};

int main()
{
	do {
		printf("\nGive yours choices 1.SkALA, 2.KASTRO, 3. KATAPAKTI, 4.PLATFOTMA, 5.EMPODIA, 6.TOYBLAKIA, 7.EXODOS:"); // δώσε ποιο σχήμα θές 
		scanf("%d", &epilogi);
		if (epilogi < 1 || epilogi > 7) {
			printf("\nThe value is not valid\n");
			continue;
		}
		if (epilogi < 7)
			blding_ptr[epilogi](array, height, width);
		print_array(array, height, width);
	} while (epilogi != 7);

Με βάση το printf μας, δηλώνουμε τον πίνακα ώστε blding_ptr[1] να δείχνει στην συνάρτηση skala και πάει λέγοντας. Έπειτα αντί να έχουμε 500 if ή 500 case μέσα στην switch, το μόνο που έχουμε να κάνουμε είναι καλέσουμε την συνάρτηση blding_ptr[epilogi]. Αν ο χρήστης δώσει τιμή 3 στην μεταβλητή epilogi, τότε ο κώδικας θα τρέξει το 4ο στοιχείο του πίνακα blding_ptr που είναι η συνάρτηση katapakti.

Τώρα είδα τήν απάντηση .

Την εργασία τη παρέδωσα . Είχα καταφέρει μόνο τα 2 σχήματα και το μενού.

Επειδή είχα χρησιμοποιήσει συναρτήσεις , με ρώτησε εάν με έχει βοηθησει κάποιος.

Με ρώτησε που δηλώνω τις συναρτήσεις και τι κάνει η case .

Του απάντησα. Εν ολίγοις πήρα 1/2.5 και έγραψα και τις τελικές εξετάσεις.

Αναμένω να δω τη βαθμολογία γιατι έχω κοπεί 2 φορές στο συγκεκριμένο μάθημα με διαφορετικό καθηγητή.

Είμαι στην κατεύθυνση τηλεπικοινωνιών 

Συναρτήσεις όντως δέν έχουμε κάνει στο Προγραμματισμό 1  αλλά ειχα βιβλίο απο συμφοιτητή .

Δημοσ.

Να τολμήσω να ρωτήσω για ποια σχολή μιλάμε? 

Πραγματικά είμαι περίεργος γιατί το γεγονός ότι έχετε κάνει pointers και δεν έχετε κάνει functions ή/και switch είναι τουλάχιστον... ανορθόδοξο!

Δημοσ.
3 ώρες πριν, kaliakman είπε

Να τολμήσω να ρωτήσω για ποια σχολή μιλάμε? 

Πραγματικά είμαι περίεργος γιατί το γεγονός ότι έχετε κάνει pointers και δεν έχετε κάνει functions ή/και switch είναι τουλάχιστον... ανορθόδοξο!

Μηχανικών πληροφορικής Τ.Ε. . Συναρτήσεις έχει στο επόμενο εξάμηνο προγραμματισμός 2 είναι αλυσίδα ωστόσο

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...