ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ
Τμήμα Ηλεκτρονικών Μηχ. και Μηχ. Υπολογιστών

ΛΟΓ 102: Τεχνολογία Λογισμικού Ι
http://www.softlab.ntua.gr/~nickie/TUC/log102/

2η Σειρά Ασκήσεων

Ημερομηνία παράδοσης (με δισκέττα): Τρίτη 11 Απριλίου 2000
Ποσοστό επί της συνολικής βαθμολογίας:

10%

Η παράδοση των ασκήσεων μπορεί να γίνει με έναν από τους ακόλουθους τρόπους κατά σειρά προτίμησης:


Άσκηση 1 (50%)

Να γραφεί ένα πρόγραμμα σε C που να υλοποιεί την εφαρμογή wc του λειτουργικού συστήματος Unix. Η εφαρμογή αυτή μετράει τον αριθμό των γραμμών, λέξεων και χαρακτήρων που περιέχονται σε αρχεία κειμένου. Τα ονόματα των αρχείων δίνονται στη γραμμή εντολής. Παραδείγματα χρήσης της εφαρμογής δίνονται παρακάτω. Οι γραμμές που ξεκινούν με το χαρακτήρα $ είναι οι γραμμές εντολών που δίνονται στο Unix.

Παράδειγμα 1: Αν δοθεί ένα μόνο όνομα αρχείου, τυπώνεται ο αριθμός γραμμών, λέξεων και χαρακτήρων του αρχείου όπως παρακάτω.

$ wc hanoi.c
   lines   words   chars file
      19      50     321 hanoi.c

Παράδειγμα 2: Αν δοθούν περισσότερα ονόματα αρχείων, τυπώνεται ο αριθμός γραμμών, λέξεων και χαρακτήρων για καθένα από αυτά τα αρχεία και στο τέλος τυπώνονται συγκεντρωτικά αθροίσματα, όπως παρακάτω.

$ wc filecopy.c hanoi.c hello.c recursive.c reverse.c reversep.c sum.c
   lines   words   chars file
      26      59     433 filecopy.c
      19      50     321 hanoi.c
       5       9      62 hello.c
      56     154    1063 recursive.c
      18      47     229 reverse.c
      34     124     788 reversep.c
      16      47     218 sum.c
----------------------------------------------
     174     490    3114 total

Παράδειγμα 3: Αν δε δοθούν ονόματα αρχείων, η εφαρμογή χρησιμοποιεί το αρχείο τυπικής εισόδου stdin και μετρά τις γραμμές, λέξεις και χαρακτήρες που διαβάζει από αυτό. Στην παρακάτω γραμμή χρησιμοποιείται αυτή η λειτουργία με ανακατεύθυνση της τυπικής εισόδου από το Unix.

$ cat *.c | wc
     174     490    3114 <stdin>


Άσκηση 2 (50%)

Να υλοποιηθεί σε C μια εφαρμογή εκτύπωσης αποδείξεων είσπραξης χρημάτων. Η εφαρμογή αυτή θα διαβάζει ένα αρχείο παραγγελιών, με όνομα "orders.txt" και θα γράφει τις αποδείξεις σε ένα άλλο αρχείο με όνομα "receipts.txt".

Το αρχείο των παραγγελιών περιέχει στην πρώτη του γραμμή τον συνολικό αριθμό των παραγγελιών που περιέχονται σε αυτό. Στη συνέχεια, για κάθε παραγγελία περιέχει τα ακόλουθα πεδία, κατά σειρά και σε ξεχωριστή γραμμή το καθένα:

Το συνολικό ποσό της παραγγελίας υπολογίζεται ως εξής. Κατ' αρχήν υπολογίζεται το συνολικό κόστος της παραγγελίας, δηλαδή το γινόμενο της ποσότητας επί την τιμή μονάδας. Επί του ποσού αυτού γίνεται έκπτωση, και προκύπτει το καθαρό ποσό πληρωμής. Στο καθαρό ποσό προστίθεται Φ.Π.Α. 18% και έτσι υπολογίζεται το τελικό εισπρακτέο ποσό. Στην απόδειξη πρέπει αναγράφονται, όπως φαίνεται στο παράδειγμα, το καθαρό ποσό πληρωμής, το ποσό του Φ.Π.Α. και το τελικό ποσό.

Η έκπτωση που γίνεται σε κάθε παραγγελία δεν είναι σταθερή αλλά υπολογίζεται με τον ακόλουθο τρόπο. Στην παραγγελία με το μεγαλύτερο συνολικό κόστος γίνεται έκπτωση 10%. Στην παραγγελία με το μικρότερο συνολικό κόστος δε γίνεται καμία έκπτωση. Στις υπόλοιπες παραγγελίες, το ποσοστό της έκπτωσης κυμαίνεται γραμμικά μεταξύ 0 και 10%, βάσει του κόστους της παραγγελίας.

Για παράδειγμα, παρακάτω δίνονται τα περιεχόμενα του αρχείου orders.txt αριστερά και τα επιθυμητά αποτελέσματα δεξιά. Επισημαίνεται ότι στην τέταρτη παραγγελία έγινε έκπτωση 10% (κόστος 38150, μετά την έκπτωση 34335), στην πρώτη παραγγελία δεν έγινε καμία έκπτωση, ενώ στη δεύτερη παραγγελία έχει γίνει έκπτωση 5.91% (κόστος 25000, μετά την έκπτωση 23523).

Αρχείο "orders.txt"

4
Charalambakis Konstantinos
Iroon Polytechniou 4
0821-99342
12/3/2000
5
1200
Kountouriotis Mixalis
Palamidiou 11
0821-43293
13/3/2000
100
250
Flessas Anargyros
Alkminis 99
01-8374932
13/3/2000
1500
20.5
Papandreou Artemis
Thessalias 7
031-234829
14/3/2000
1
38150

Αρχείο "receipts.txt"

I received from Charalambakis Konstantinos,
resident of Iroon Polytechniou 4, tel. 0821-99342,
the amount of 7080 GRD (6000 + 1080 VAT)
Chania, 12/3/2000.

I received from Kountouriotis Mixalis,
resident of Palamidiou 11, tel. 0821-43293,
the amount of 27757 GRD (23523 + 4234 VAT)
Chania, 13/3/2000.

I received from Flessas Anargyros,
resident of Alkminis 99, tel. 01-8374932,
the amount of 33492 GRD (28383 + 5109 VAT)
Chania, 13/3/2000.

I received from Papandreou Artemis,
resident of Thessalias 7, tel. 031-234829,
the amount of 40515 GRD (34335 + 6180 VAT)
Chania, 14/3/2000

Νίκος Παπασπύρου (nickie@softlab.ntua.gr). 27/3/2000 .