ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΥ ΕΡΓΑΣΤΗΡΙΟ 9 ΑΣΚΗΣΕΙΣ (με ενδεικτική λύση) 1) Γράψτε ένα πρόγραμμα (χρησιμοποιώντας μία συνάρτηση με όνομα metafora()) το οποίο αφού εισάγει 3 ακέραιες τιμές έστω α, β, γ, στην συνέχεια με την χρήση της συνάρτησης metafora να μεταφέρει την τιμή του β στο α, του γ στο β και του α στο γ. void metafora(int *, int *, int *); int a, b, c; printf("\nεισαγωγή a, b, c:"); scanf("%d%d%d", &a, &b, &c); metafora(&a, &b, &c); printf("\nοι τιμές άλλαξαν σειρά. Τώρα είναι:"); printf("\n%10d%10d%10d\n\n", a, b, c); void metafora(int *x, int *y, int *z) int temp; temp = *x; *x = *y; *y = *z; *z = temp; 2) Να γραφεί πρόγραμμα το οποίο να δημιουργεί δυναμικά ένα πίνακα 2 διαστάσεων (το πλήθος γραμμών Ν και στηλών Μ να εισάγεται από τον χρήστη) και στην συνέχεια να εισάγει τα στοιχεία του και να τον εκτυπώνει. Ηλίας Κ. Σάββας 1
int N,M; /* Διάσταση του πίνακα */ float **X, meg; int i, j, megethos; printf("\n Εισαγωγή αριθμού γραμμών και στηλών:"); scanf("%d%d", &N, &M); megethos = N * sizeof(int); /* Δημιουργία Ν δεικτών */ X = malloc(megethos); /* Οι δείκτες είναι int */ for (i=0; i<n; i++) /* Δημιουργία πίνακα 2 διαστάσεων */ megethos = M * sizeof(float); X[i] = malloc(megethos); if (! X) /* Εισαγωγή πίνακα */ for (i=0; i<n; i++) for (j=0; j<m; j++) printf("\nεισαγωγή του %d - %d στοιχείου:", i+1, j+1); scanf("%f", &X[i][j]); for (i=0; i<n; i++) printf("\n"); printf("%10.2f", X[i][j]); for (j=0; j<m; j++) free(x); 3) Να γραφεί πρόγραμμα το οποίο: α) να δημιουργεί δυναμικά ένα μονοδιάστατο πίνακα ακεραίων, β) να εισάγει στον πίνακα τυχαίες τιμές στο διάστημα 1 100, γ) να εισάγει από το πληκτρολόγιο ένα αριθμό, και τέλος δ) με χρήση Ηλίας Κ. Σάββας 2
συνάρτησης να μετράει και εκτυπώνει πόσες φορές βρέθηκε αυτό το στοιχείο στον πίνακα. int search_array(int *, int, int, int); int *A, N, megethos; int i, x, t; printf("\nεισαγωγή μεγέθους πίνακα:"); scanf("%d", &N); /* Ορισμός πίνακα */ megethos = N * sizeof(int); A = malloc(megethos); if (A == NULL ) /* Εισαγωγή τυχαίων τιμών στον πίνακα στο διάτημα 1 -- > 100 */ srand(time(null)); for (i=0; i<n; i++) A[i] = rand()%100+1; printf("\nεισαγωγή τιμής προς αναζήτηση:"); scanf("%d", &x); t = search_array(a, 0, N, x); if ( t == 0) printf("\n\nto %d δεν βρέθηκε!\n\n", x); else printf("\n\nto %d βρέθηκε %d φορές!\n\n", x, t); free(a); int search_array(int *X, int a, int t, int s) int i, c=0; Ηλίας Κ. Σάββας 3
for (i=a; i<t; i++) if ( X[i] == s) c++; return c; 4) Αφού ορίσετε την δομής <Σημείο> σαν δύο πραγματικούς αριθμούς στην συνέχεια να γραφεί πρόγραμμα το οποίο: α) να εισάγει ένα πολύγωνο (σαν ένα δυναμικό πίνακα σημείων, όπου το Ν (πλήθος κορυφών) να δίνεται από τον χρήστη), β) με χρήση συνάρτησης η οποία να υπολογίζει το μήκος ενός ευθύγραμμου τμήματος δεδομένων των σημείων αρχής τέλους του, να υπολογίζει την περίμετρό του (άθροισμα όλων των πλευρών του) και να την εκτυπώνει. struct Simio /* Δομή σημείου */ float x; float y; ; float mikos(struct Simio, struct Simio); struct Simio *Pol; /* Πολύγωνο σαν σύνολο σημείων */ int N, i, megethos; float per=0.0; printf("\nεισαγωγή πλήθους κορυφών πολυγώνου:"); scanf("%d", &N); /* Ορισμός πίνακα */ megethos = N * sizeof(struct Simio); Pol = malloc(megethos); if (Pol == NULL ) /* Εισαγωγή σημείων κορυφών του πολυγώνου */ for (i=0; i<n; i++) printf("\nεισαγωγή συντεταγμένων χ,ψ της %d κορυφής:", i+1); scanf("%f%f", &Pol[i].x, &Pol[i].y); /* Υπολογισμός περιμέτρου */ /* απο άθροισμα των μηκών των πλευρώ του */ Ηλίας Κ. Σάββας 4
for (i=0; i<n-1; i++) per += mikos(pol[i], Pol[i+1]); per += mikos(pol[n-1], Pol[0]); printf("\n\nπερίμετρος =%.3f\n\n", per); free(pol); /* Υπολογισμός μήκους */ float mikos(struct Simio A, struct Simio B) float mik; mik = sqrt(pow((a.x-b.x),2)+pow((a.y-b.y),2)); return mik; Ηλίας Κ. Σάββας 5