You are on page 1of 11

Ελληνικό Μεσογειακό Πανεπιστήμιο

Σχολή Μηχανικών
Τμήμα Ηλεκτρονικών Μηχανικών
ΠΜΣ: Ηλεκτρονικά Συστήματα Τηλεπικοινωνιών & Αυτοματισμών

Τεχνικές Προγραμματισμού
και Αλγόριθμοι
(ΠΜΣ 03 )
Δρ. Μηχ. Νικόλαος Πετράκης,
Λέκτορας
nik.s.petrakis@hmu.gr
Διάλεξη 2ης εβδομάδας.

Ιστοσελίδα Μαθήματος:
https://eclass.chania.teicrete.gr/courses/EL342/

Εξάμηνο: Εαρινό 2019-20


Προσπέλαση Αρχείων
Δήλωση μεταβλητής ως δείκτη αρχείου:
FILE *fp;
Για το άνοιγμα ενός αρχείου (σύνδεση αρχείου):
fopen() //FILE *fopen(char *name, char *mode);
Η κλήση της fopen() σε ένα πρόγραμμα είναι:
fp = fopen (name , mode);
"x.dat" "r" // για read
"w" // για write
"a" // append
"b" // binary (όχι text)
01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 2
Προσπέλαση Αρχείων (2)
Για ανάγνωση/εγγραφή χαρακτήρα-χαρακτήρα:
getc() // int getc(FILE *fp);
putc() // int putc(int c, FILE *fp);
Για φορμαρισμένη είσοδο και έξοδο:
fscanf() // int fscanf(FILE *fp, char *format ……..);
fprintf() // int fprintf(FILE *fp, char *format ……..);
EOF για τέλος αρχείου ή λάθος και για τις δυο.
Για το κλείσιμο ενός αρχείου (διακοπή σύνδεσης):
fclose() // int fclose(FILE *fp);
01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 3
Κώδικας που γράψαμε στην τάξη
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])


{ char ch; int n=0;
char str[50];
FILE *fpw,*fpr;
/*
if ((fpw=fopen("mytextfile.txt", "w"))==NULL)
{ printf("Cannot open File...\n"); exit(1); }
*/
if ((fpr=fopen("mytextfile.txt", "r"))==NULL)
{ printf("Cannot open File...\n"); exit(1); }
// printf ("Type anything you want Ctrl-Z for end.\n");
printf("To arxeio exei:\n");
while ((ch=getc(fpr))!=EOF) // ((ch=getchar())!=EOF)
{ n++;
putchar(ch); // putc(ch,fpw);
}
printf("N=%d\n",n);
// fclose(fpw);
fclose(fpr);
if ((fpr=fopen("mytextfile.txt", "r"))==NULL)
{ printf("Cannot open File...\n");
exit(1);
}
fscanf(fpr,"%s", str);
if (strcmp("blue",str)==0)
system("color 3a");
system("PAUSE");
return 0;
}
01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 4
Σύνθετοι τύποι δεδομένων
Ο τύπος struct (δομή = structure)
Δομή είναι μια συλλογή από μεταβλητές (συνήθως
διαφορετικών τύπων δεδομένων) που ομαδοποιούνται
με ένα μόνο όνομα για ευκολία στον χειρισμό τους. Οι
μεταβλητές αυτές αποτελούν τα μέλη (members) της
δομής.
Π.χ. Δήλωση τριών μεταβλητών ως ημερομηνίες:
struct date { Δήλωση με αρχικοποίηση:
int day; struct date d = {01, 04, 2020};
int month;
int year; Δήλωση δείκτη διεύθυνσης:
struct date *dp;
} a, b, c;

01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 5


Σύνθετοι τύποι δεδομένων (2)
Ο τύπος struct (δομή = structure)
Π.χ. Ορισμός νέου τύπου δεδομένων για ημερομηνίες:
typedef struct { Δήλωση με αρχικοποίηση:
int day; MyDateType d5 = {01, 04, 2020};
int month;
Δήλωση δείκτη διεύθυνσης:
int year;
MyDateType *dp1;
} MyDateType;
Ο τελεστής τελεία (dot operator) επιλέγει
d5.day = 25;
ένα μέλος μιας μεταβλητής τύπου δομής
Ο τελεστής βέλος (arrow operator) επιλέγει
dp1->month=4; ένα μέλος μιας μεταβλητής δείκτη
διεύθυνσης που δείχνει σε δομή, δηλαδή,
ισοδύναμο με το: (*dp1).month=4;
01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 6
Σύνθετοι τύποι δεδομένων
Ο τύπος union (ένωση)
Ένωση είναι ένας τύπος δεδομένων που ορίζεται από
τον χρήστη και μπορεί να αποθηκεύει τιμές από
διαφορετικούς τύπους σε διαφορετικές χρονικές
στιγμές. Είναι παρόμοιος με την δομή δεδομένων με την
διαφορά ότι όλα τα μέλη του αρχίζουν από την ίδια
θέση στην μνήμη. Μια μεταβλητή τύπου union μπορεί
να περιέχει μόνο ένα από τα μέλη της σε μια δεδομένη
χρονική στιγμή. Άρα, το μέγεθος της union είναι
τουλάχιστο ίσο με το μέγεθος του μεγαλύτερου μέλους
της.
Στην πράξη, συνήθως, οι ενώσεις συνδυάζονται με δομές,
όπως θα δείτε στο παράδειγμα που ακολουθεί:
01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 7
Απλό παράδειγμα
union value { Ένωση που μπορεί να αποθηκεύσει είτε
char c; ένα χαρακτήρα (8μπιτ), είτε έναν ακέραιο
int i; (32μπιτ), είτε έναν πραγματικό, διπλής
double r; ακρίβειας (64μπιτ).
};
struct uvalue {
Δομή με δύο μέλη:
enum {Char, Int, Real} kind;
μια απαρίθμηση
union value v;
και μια ένωση.
}uv;

uv.kind = Real; Κάθε φορά εγγράφουμε ή
uv.v.r = 1234.75; ελέγχουμε και τα δύο μέλη
… με κατάλληλο τρόπο.
if ((uv.kind == Real)&&(uv.v.r > … ))

01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 8
Κι άλλο παράδειγμα
Θεωρήστε ότι μια ασφαλιστική εταιρεία συνάπτει
τριών ειδών συμβόλαια: ζωής, αυτοκινήτου και
οικίας. Είναι λογικό ότι και για τα τρία είδη
ασφάλισης χρειαζόμαστε τόσο το όνομα και την
διεύθυνση του δικαιούχου όσο και το ποσό.
Επίσης, χρειαζόμαστε και άλλα συμπληρωματικά
στοιχεία ανάλογα με το κάθε είδος ασφάλισης.

Η δομή για ένα τέτοιο ασφαλιστικό συμβόλαιο θα


μπορούσε να έχει ως εξής:

01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 9


Κι άλλο παράδειγμα
………
(συνέχεια)
#define LIFE 1 int kind; /*LIFE, AUTO or HOME*/
#define AUTO 2 union {
#define HOME 3 struct {
char benefname[30];
struct addr { struct date birthday;
char street[50]; ………
char city[10]; } life;
char state[4]; struct {
char zip[6]; char platenumber[8];
}; char licence[10];
char state[4];
struct date { char model[15];
int day; int year;
int month; ………
int year; } auto;
}; struct {
struct policy { struct addr homeaddr;
int polnumber; int yearbuilt;
char fullname[30]; ………
struct addr addrress; } home;
int amount; } policyinfo;
01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 10
……… };
Άσκηση 1 (για το σπίτι)
Να γραφεί ένα πρόγραμμα, το οποίο να ορίζει τον τύπο μιας δομής με τέσσερα
μέλη: (α) το όνομα, (β) το επίθετο, (γ) τον αριθμό μητρώου και (δ) τον μέσο όρο
της βαθμολογίας, ενός φοιτητή, σε όλα τα μαθήματα που έχει περάσει μέχρι
στιγμής. Επίσης, θα πρέπει να δηλωθεί ένας μονοδιάστατος πίνακας, με Ν=10
(συμβολική σταθερά) στοιχεία, όπου το κάθε στοιχείο να είναι ίδιου τύπου με
την παραπάνω δομή. Το πρόγραμμα θα πρέπει να περιέχει τις εξής συναρτήσεις:
α) μια συνάρτηση για το γέμισμα του πίνακα με στοιχεία από την κονσόλα, και β)
μια συνάρτηση για την εκτύπωση του πίνακα υπό μορφή κατάστασης όπως το
παρακάτω παράδειγμα:
Α/Α ΟΝΟΜΑ ΕΠΙΘΕΤΟ ΑΡΙΘΜ.ΜΗΤΡΩΟΥ ΒΑΘΜΟΣ
------------------------------------------------------
1 Ιωάννη Παπαδάκης 789 6,78
2 Κώστας Γιαννούλης 1273 5,60
3 Γιώργος Καραμανώλης 490 7,53
4 ……………… ………………… ……… ………
Αν θέλετε να πειραματιστείτε λίγο περισσότερο, χρησιμοποιείστε αρχεία.
Δηλαδή, κάθε φορά πριν κλείσετε το πρόγραμμα αποθηκεύστε τα στοιχεία του
πίνακα σε ένα αρχείο κειμένου, έτσι ώστε την επόμενη φορά που θα το τρέξετε
να τα ξαναφορτώσετε από το αρχείο και πάλι στην μνήμη του υπολογιστή.
01/04/2020 "Τεχνικές Προγραμματισμού και Αλγόριθμοι", Ν. Πετράκης, ΕΛ.ΜΕ.ΠΑ. 11

You might also like