ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4



Σχετικά έγγραφα
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #3

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

Εισαγωγή στον Προγραμματισμό

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2

12. Συναρτήσεις (Μέρος ΙI)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Ανάπτυξη και Σχεδίαση Λογισμικού

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 7 Ο. Αριθμητικές πράξεις Τυχαίοι αριθμοί Εφαρμογές σε προβλήματα ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραμματισμός Ι (ΗΥ120)

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Προγραμματισμός Ι. Συναρτήσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Η βασική συνάρτηση προγράμματος main()

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός (ΤΛ1006)

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Διαδικασιακός Προγραμματισμός

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

Συναρτήσεις. Εισαγωγή

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομημένος Προγραμματισμός

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

Διαδικασιακός Προγραμματισμός

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

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

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εργαστηριακή Άσκηση 1

Μεθόδων Επίλυσης Προβλημάτων

Η γλώσσα προγραμματισμού C

Μεθόδων Επίλυσης Προβλημάτων

Διαδικασιακός Προγραμματισμός

Εργαστήριο 9: Αρχεία

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Εισαγωγή στον Προγραμματισμό

Δομημένος Προγραμματισμός (ΤΛ1006)

γρηγορότερα. Αν θέλουμε να μηδενίσουμε όλα τα υπόλοιπα bit μπορούμε να χρησιμοποιήσουμε την εντολή:

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

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

Η γλώσσα προγραμματισμού C

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Μεθόδων Επίλυσης Προβλημάτων

Προγραμματισμός Ι (ΗΥ120)

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ ΤΟΥΣ

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

Δομημένος Προγραμματισμός (ΤΛ1006)

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Δομημένος Προγραμματισμός (ΤΛ1006)

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στον προγραμματισμό. Τμήμα Πληροφορικής & Επικοινωνιών ΤΕΙ Σερρών Εργαστήριο 2

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Εισαγωγή στον Προγραμματισμό

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσμία: Τετάρτη 23/11/2016, 21:00

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Χpήσιµες Βιβλιοθήκες της γλώσσας C

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Η γλώσσα προγραμματισμού C

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην εξοικείωση με τη διαδικασία κατασκευής ενός Λεξικού Αναλυτή κάνοντας χρήση του lex.

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Εξοικ Εξ ε οικ ίωση ε με το το πρόγ ραμμα πρόγ DEV C++ Επικοι Επικ νωνία οι Χρήσ Χρήστη τη Υπολ Υπο ογισ λ τή

Transcript:

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων και συμβολοσειρών. Πιο συγκεκριμένα, στο Πρόβλημα 1 θα μάθουμε να χρησιμοποιούμε τις συναρτήσεις rand() και srand(), οι οποίες παράγουν τυχαίους αριθμούς σε ένα διάστημα τιμών που μπορούμε να ορίσουμε. Η τεχνική αυτή είναι χρήσιμη σε περιπτώσεις που θέλουμε να δώσουμε τιμές σε πίνακες με μεγάλο πλήθος στοιχείων, χωρίς να πληκτρολογούμε το κάθε στοιχείο ξεχωριστά. Στη συνέχεια, στο Πρόβλημα 2, θα χρησιμοποιήσουμε πίνακες χαρακτήρων και θα ασχοληθούμε με θέματα επεξεργασίας συμβολοσειρών. Για τέτοια προβλήματα, χρησιμοποιούμε συνήθως συναρτήσεις που περιέχονται στις βιβλιοθήκες <ctype.h> και <string.h>. Όταν χρησιμοποιούμε πίνακες χαρακτήρων, πρέπει να τοποθετούμε μετά τον τελευταίο χαρακτήρα το σύμβολο \0, το οποίο δηλώνει το τέλος της συμβολοσειράς, έτσι ώστε να μπορούμε να επεξεργαστούμε τον πίνακα ως συμβολοσειρά (και να κάνουμε χρήση των παραπάνω βιβλιοθηκών συναρτήσεων).

«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 3 Πρόβλημα 1 Να γραφεί πρόγραμμα που να μετατρέπει έναν τυχαίο 1 δεκαδικό αριθμό (έστω num, όπου 0 <= num < 2 20 ) στον αντίστοιχο δυαδικό. Ο τυχαίος δεκαδικός αριθμός θα παράγεται από τον υπολογιστή, με τη χρήση των συναρτήσεων rand() και srand(seed). Η μετατροπή ενός δεκαδικού αριθμού στον αντίστοιχο δυαδικό γίνεται με διαδοχικές διαιρέσεις του ακέραιου υπολοίπου του αριθμού με το 2 (μέχρι αυτό να γίνει μηδέν) και κρατώντας κάθε φορά το υπόλοιπο της διαίρεσης. Έτσι, για παράδειγμα, ο αριθμός 14 μετατρέπεται στον αντίστοιχο δυαδικό ως εξής: Διαδοχικές διαιρέσεις με το 2 Ακέραιο Πηλίκο Υπόλοιπο (14) 7 0 3 1 1 1 0 1 Τα πηλίκα των διαδοχικών διαιρέσεων (θεωρώντας τα από κάτω προς τα πάνω, όπως αυτά παρουσιάζονται στον παραπάνω πίνακα) μας δίνει τον δυαδικό αριθμό 1110, ο οποίος είναι ίσος με τον δεκαδικό αριθμό 14 (γράφουμε 14 10 = 1110 2 ). Ανάλυση του προβλήματος Ο ορισμός του προβλήματος απαιτεί την παραγωγή τυχαίων αριθμών με τη χρήση των συναρτήσεων rand() και srand(seed), που περιέχονται στην βιβλιοθήκη <stdlib.h>. Η συνάρτηση srand(time(null)) τροφοδοτεί κάθε φορά την rand() με διαφορετική τιμή, μιας και παράγει έναν αριθμό δεχόμενη ως «σπόρο» (seed) την ώρα του συστήματος (time). Έτσι, η μοναδική πιθανότητα να παραχθεί ο ίδιος αριθμός δύο φορές, είναι εάν εκτελέσουμε το πρόγραμμά μας την ίδια ακριβώς χρονική στιγμή. Η γενική χρήση της rand() είναι η εξής: μεταβλητή = a + rand() % b, όπου a είναι ο πρώτος πιθανός αριθμός που επιθυμούμε να επιστρέφει (κάτω όριο) και b ο ανώτερος πιθανός αριθμός (άνω όριο). Για παράδειγμα, για να «προσομοιώσουμε» τις πιθανές περιπτώσεις του ριξίματος ενός ζαριού, θα γράψουμε την ακόλουθη εντολή: dice_roll = 1 + rand() % 6, που θα επιστρέφει μια από τις τιμές 1,2,,6} στην μεταβλητή dice_roll. Ένα δεύτερο ζήτημα που πρέπει να εξετασθεί είναι και η δήλωση του μεγέθους του πίνακα που θα αποθηκεύει το πηλίκο των διαδοχικών διαιρέσεων (ουσιαστικά, όλα τα ψηφία του δυαδικού αριθμού). Ο μέγιστος αριθμός που μπορεί να μετατραπεί, σύμφωνα με την εκφώνηση της άσκησης είναι ο 2 20, πράγμα που σημαίνει ότι θα χρειαστούμε 20 θέσεις για να αποθηκεύσουμε τον αριθμό αυτό. Άρα, θα πρέπει να ορίσουμε μια σταθερά (έστω SIZE) που θα δηλώνει το μέγεθος 1 Στην πραγματικότητα η συνάρτηση rand() παράγει έναν ψευδοτυχαίο ακέραιο αριθμό κάθε φορά που καλείται, βάσει του «σπόρου» (τιμής) με τον οποίο τροφοδοτείται από το σύστημα. Έτσι, αν καλείται μόνο μία φορά στο σώμα ενός προγράμματος, θα παράγει τον ίδιο τυχαίο αριθμό κάθε φορά που θα εκτελούμε το πρόγραμμα. Για το λόγο αυτό θα πρέπει να καλείται περισσότερες της μιας φοράς ή να τροφοδοτείται με διαφορετικό «σπόρο» κάθε φορά που εκτελούμε το πρόγραμμα. Το ρόλο αυτό έχει η συνάρτηση srand(seed) η οποία τροφοδοτεί την rand() με διαφορετικό «σπόρο» σε κάθε εκτέλεση του προγράμματος.

«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 4 του πίνακα (η σταθερά αυτή θα πρέπει να τροποποιηθεί κατάλληλα, αν θέλουμε να μετατρέψουμε αριθμούς μεγαλύτερους από τον προτεινόμενο της άσκησης). Ένα τελευταίο ζήτημα που θα μας απασχολήσει είναι και ο αλγόριθμος που θα μετατρέπει τον δεκαδικό αριθμό σε δυαδικό. Η τεχνική που ακολουθείται είναι απλή (δείτε και το βοηθητικό υλικό που έχει αναρτηθεί στην ιστοσελίδα «Πρόγραμμα Διαλέξεων» του μαθήματος, Εβδ. 3): Όσο ο αριθμός είναι μεγαλύτερος του μηδενός, αποθηκεύουμε το ακέραιο υπόλοιπο της διαίρεσης με το 2 στο στοιχείο p[i] του πίνακα (p[i]=num % 2) και στη συνέχεια διαιρούμε τον αριθμό αυτόν με το 2 (num=num/2). Σύμφωνα με τα παραπάνω, προκύπτει ο παρακάτω πίνακας Σταθερών και Μεταβλητών: Πίνακας Μεταβλητών & Σταθερών Ονομασία Μεταβλητή / Σταθερά Τύπος Περιγραφή p[size] Μεταβλητή Πίνακα int Πίνακας ακεραίων, του οποίου κάθε στοιχείο θα κρατά το πηλίκο της διαίρεσης num Μεταβλητή int Ο τυχαίος δεκαδικός αριθμός i Μεταβλητή (βοηθητική) int Μετρητής (χρησιμοποιείται στις εντολές επανάληψης) Υπόδειξη: Δοκιμάστε να υλοποιήσετε το πρόγραμμα αλλάζοντας το μέγεθος (SIZE) του πίνακα έτσι ώστε να μπορούν να αποθηκευθούν ακόμα μεγαλύτεροι αριθμοί. Επίσης χρησιμοποιήστε την συνάρτηση rand() παραλείποντας την srand που την τροφοδοτεί με τυχαίο «σπόρο». Τι παρατηρείτε; Συχνά Προγραμματιστικά Σφάλματα: Η παραγωγή τυχαίων αριθμών με τη χρήση της συνάρτησης rand() χωρίς τη χρήση μιας εντολής επανάληψης (for) ή χωρίς την τροφοδότησή της με κάποιο «σπόρο» (srand), οδηγεί ουσιαστικά στη παραγωγή του ίδιου κάθε φορά αριθμού. Προγραμματιστικές Συμβουλές Για να επεξεργαστούμε τα στοιχεία ενός πίνακα Κ θέσεων, θα πρέπει πρώτα να αποδώσουμε τιμές σε κάθε ένα από τα στοιχεία αυτά (είθισται να δίνουμε αρχική τιμή 0). Μια καλή τεχνική είναι ο ορισμός μιας συνάρτησης που θα «γεμίζει» με τιμές τον πίνακα αυτόν και θα καλείται στην αρχή του προγράμματος.

«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 5 Προτεινόμενη Λύση: /* Προγραμματιστής : Όνομα Επώνυμο, Αριθμός Μητρώου Ημερομηνία συγγραφής : 24/4/2002 Λειτουργία Προγράμματος : Μετατρέπει έναν τυχαίο δεκαδικό αριθμό, σε δυαδικό */ #include <stdio.h> /* Βιβλιοθήκη βασικών συναρτήσεων Εισόδου/Εξόδου */ #include <stdlib.h> /* Βιβλιοθήκη που περιέχει συναρτήσεις μετατροπής αριθμών, διαχείρησης μνήμης και παραγωγής τυχαίων αριθμών */ #include <time.h> /* Περιέχει συναρτήσεις για διαχείριση ημερομηνίας και ώρας */ #define SIZE 20 /* Το μέγεθος του πίνακα */ main() int p[size]; /* Δήλωση πίνακα SIZE θέσεων */ int num, i; /* Δήλωση μεταβλητών */ for (i=0; i<size; i++) p[i] = 0; /* Δίνουμε αρχική τιμή 0 σε όλα τα στοιχεία του πίνακα */ srand( time(null) ) ; num = rand() %1048576; /* Τροφοδοτεί την rand() με έναν διαφορετικό "σπόρο" κάθε φορά που εκτελείται το πρόγραμμα, χρησιμοποιώντας την ώρα του συστήματος */ /* Περιορίζουμε την ανώτερη τιμή που μπορεί να επιστρέψει η rand(), στο 1.048.575 (2 20 ) */ printf("\n Ο αριθμός που παρήγαγε το σύστημα είναι ο: %d \n O αντίστοιχος δυαδικός είναι ο : ", num); for (i=0; num>0; i++) p[i] = num % 2; num = num/2; /* Υπολογισμός του δυαδικού αριθμού*/ } for (i=size-1; i>=0; i--) printf("%d",p[i]); /* Εκτυπώνει όλα τα στοιχεία του πίνακα */ }

«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 6 Πρόβλημα 2 Να γραφεί ένα πρόγραμμα που να δέχεται ως είσοδο γραμμές κειμένου (συμβολοσειρές) με μέγιστο μήκος 80 χαρακτήρες, και για κάθε γραμμή να τυπώνει την εξής αναφορά: 1. Τη συμβολοσειρά που εισάγεται, αλλά σε κεφαλαία γράμματα. 2. Το συνολικό αριθμό χαρακτήρων. 3. Το σύνολο των αλφαριθμητικών χαρακτήρων (μόνο γράμματα και αριθμοί). 4. Το σύνολο των κενών διαστημάτων. 5. Το σύνολο των σημείων στίξης. 6. Μήνυμα για το εάν βρέθηκε το όνομά σας στο κείμενο. Η εκτέλεση του προγράμματος θα πρέπει να τελειώνει με την εισαγωγή του χαρακτήρα τέλους αρχείου EOF (Control-D). Ανάλυση του προβλήματος Στο συγκεκριμένο πρόβλημα, θα εξετάσουμε την ομαδική επεξεργασία χαρακτήρων ανά γραμμή. Η επεξεργασία των χαρακτήρων γίνεται παράλληλα με την ανάγνωσή τους (συνάρτηση getchar() ) και στη συνέχεια, αφού μετατραπούν σε κεφαλαία (συνάρτηση toupper(χαρακτήρας)), αποθηκεύονται σε έναν πίνακα, έστω sentence[80], ο οποίος είναι ένας πίνακας χαρακτήρων 80 θέσεων (κάθε γραμμή κειμένου «χωρά» μέχρι 80 χαρακτήρες). Ορίζουμε επίσης και τη μεταβλητή char c, που θα περιέχει το γράμμα που διαβάζεται ως είσοδος. Στο αλγοριθμικό μέρος της άσκησης, η επεξεργασία των χαρακτήρων υλοποιείται με τη χρήση των συναρτήσεων διαχείρισης χαρακτήρων (isalnum, isspace, ispunct) που περιέχονται στη βιβλιοθήκη <ctype.h>. Έτσι, ανάλογα με το είδος του χαρακτήρα που διαβάζεται, αυξάνεται και ο αντίστοιχος μετρητής χαρακτήρων. Επίσης, θα χρειαστούμε τη συνάρτηση strstr(string1, string2) που επιστρέφει τη θέση της συμβολοσειράς string2 μέσα στην string1 και περιέχεται στη βιβλιοθήκη συναρτήσεων χειρισμού συμβολοσειράς <string.h>. Παρατηρήστε πως ο έλεγχος των χαρακτήρων (μέσω κάποιας εντολής if), μπορεί να γίνεται μέσω μιας συνάρτησης, έστω void evaluate_char(χαρακτήρας), που ορίζεται από το χρήστη (user defined function). Η συγκεκριμένη συνάρτηση θα καλείται σε δύο σημεία του προγράμματος και δεν θα επιστρέφει τιμή (τύπου void), αλλά απλώς θα ελέγχει την τιμή του χαρακτήρα που δέχεται ως παράμετρο κλήσης και θα αυξάνει τον αντίστοιχο μετρητή.

«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 7 Σύμφωνα με τα παραπάνω, προκύπτει ο παρακάτω πίνακας Σταθερών και Μεταβλητών: Πίνακας Μεταβλητών & Σταθερών Ονομασία Μεταβλητή / Σταθερά Τύπος Περιγραφή c Μεταβλητή char Το γράμμα που εισάγεται sentence[80] Μεταβλητή Πίνακα char Αποθηκεύει την γραμμή κειμένου myname[] Μεταβλητή Πίνακα char Περιέχει το όνομα του προγραμματιστή i, alpha, spaces, punct Μεταβλητές int Μετρητές (τι μετράει ο καθένας;) Συχνά Προγραμματιστικά Σφάλματα: Μην παραλείπετε την προσθήκη του ειδικού χαρακτήρα \0, που δηλώνει το τέλος της συμβολοσειράς, στο τέλος του πίνακα χαρακτήρων. Τυχόν παράλειψη του συγκεκριμένου χαρακτήρα αφαιρεί από τη C τη δυνατότητα επεξεργασίας του πίνακα χαρακτήρων με τη χρήση συναρτήσεων συμβολοσειράς. Προγραμματιστικές Συμβουλές Οι βιβλιοθήκες συναρτήσεων διαχείρισης συμβολοσειρών και χαρακτήρων <string.h> και <ctype.h> περιέχουν αρκετά χρήσιμα εργαλεία που μπορούν να χρησιμοποιηθούν σε προγράμματα που επεξεργάζονται χαρακτήρες ή συμβολοσειρές.

«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 8 Προτεινόμενη Λύση /* Προγραμματιστής : Όνομα Επώνυμο, Αριθμός Μητρώου Ημερομηνία συγγραφής : 25/4/2002 Λειτουργία Προγράμματος : Επεξεργάζεται γραμμές κειμένου και τυπώνει μια αναφορά για κάθε γραμμή */ #include <stdio.h> /* Βιβλιοθήκη συναρτήσεων Ε/Ε */ #include <ctype.h> /* Βιβλιοθήκη συναρτήσεων χειρισμού χαρακτήρων */ #include <string.h> /* Βιβλιοθήκη συναρτήσεων χειρισμού συμβολοσειρών */ void evaluate_char(char ch); /* Ορισμός συνάρτησης */ char c, sentence[80], myname[]= "ALEX"; int i = 0, alpha=0, spaces=0,punct=0; /*Δήλωση του πίνακα γραμμής κειμένου και του ονόματος ως καθολικών (global) μεταβλητών. ΓΙΑΤΙ;;*/ main() printf("πληκτρολογείστε μια γραμμή κειμένου (Ctrl-D για έξοδο):\n" ); while ( ( c=getchar() )!= EOF ) sentence[i] = toupper(c); /* Για να μην χάσουμε το πρώτο χαρακτήρα */ evaluate_char(c); while ( ( c = getchar() )!= '\n' ) sentence[++i ] = toupper(c); evaluate_char(c); /* Αποθηκεύει τον χαρακτήρα στην επόμενη θέση του πίνακα, μετατρέποντάς τον σε κεφαλαίο */ } sentence[++i] = '\0'; /* Εισάγει το χαρακτήρα τέλους συμβολοσειράς στο τέλος */ /* Εκτύπωση της αναφοράς */ printf( "\nτο κείμενο που πληκτρολογήσατε ήταν: %s", sentence ); printf("\nμήκος κειμένου: %lu \naλφαριθμητικοί Χαρακτήρες: %d \nκενά Διαστήματα: %d \nσημεία Στίξης: %d\n", strlen(sentence), alpha,spaces,punct); if ( strstr(sentence, myname)!= NULL) printf("το \"%s\" περιέχεται στο κείμενο που πληκτρολογήσατε!\n\n",myname); /* Έλεγχος για το αν περιέχεται το όνομα στη γραμμή κειμένου */ else printf("το \"%s\" δεν βρέθηκε στην πρόταση!\n\n", myname);

«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 9 printf("πληκτρολογείστε την επόμενη γραμμή (Ctrl-D για έξοδο):\n"); i=alpha=spaces=punct=0; /* Μηδενίζει τους μετρητές για να επεξεργαστούμε τη νέα γραμμή κειμένου*/ } /* Τέλος του while EOF */ } /* Τέλος της main */ void evaluate_char(char ch) if ( isalnum(sentence[i])) alpha++; else if (isspace(sentence[i])) spaces++; else if (ispunct(sentence[i])) punct++; return; } /* Συνάρτηση ελέγχου του κάθε χαρακτήρα, με αύξηση του αντίστοιχου μετρητή */