Οικονομικό Πανεπιστήμιο Αθηνών

Τμήμα Πληροφορικής

Μάθημα : Εισαγωγή στον Προγραμματισμό των Υπολογιστών

Διδάσκων: Καθηγητής Ι. Κάβουρας

Εξετ. Περίοδος: Ιανουαρίου 2001

Ημερομηνία: Δευτέρα 5/2/2001, ώρα εξέτασης:15.30

 

Οδηγίες

1.      Διάρκεια εξέτασης 2 ώρες και 30 λεπτά.

2.      Απαντήστε σ’ όλα τα θέματα.

3.      Στο τέλος των ερωτήσεων δίνονται οι μέθοδοι των τάξεων String, RandomAccessFile, DataInputStream, DataOutputStream.

4.      Ο ελάχιστος χρόνος παραμονής στην αίθουσα εξέτασης είναι μισή ώρα μετά τη λήψη των θεμάτων.

5.      Δεν επιτρέπεται η χρήση βοηθητικών σημειώσεων, βιβλίων, φορητών υπολογιστών και κινητών τηλεφώνων.

 

 

ΚΑΛΗ ΣΑΣ ΕΠΙΤΥΧΙΑ

ΘΕΜΑ 1ο (40%)

 

Ένα αρχείο τυχαίας προσπέλασης (pelates.dat), περιέχει τα στοιχεία των πελατών μιας εταιρίας. Για κάθε πελάτη, αποθηκεύονται στο αρχείο, τα εξής δεδομένα (πεδία εγγραφής):

 

int Κωδικός (ακέραιος αριθμός από 1 έως 100)

boolean Διαγραμμένος

string Ονοματεπώνυμο[40]

string Αριθμός_Τηλεφώνου[12]

 

α) Ένας τρόπος για τη διαγραφή της εγγραφής ενός πελάτη από το αρχείο, είναι η αλλαγή της τιμής του πεδίου "Διαγραμμένος" της εγγραφής, από ψεύδος (false) σε αλήθεια (true). Ουσιαστικά, με τον τρόπο αυτό,  "σημαδεύεται" μια εγγραφή και θεωρείται διαγραμμένη.

 

Γράψτε μια περιληπτική λύση πρώτου επιπέδου ενός προγράμματος και το πρόγραμμα αυτό (σε γλώσσα Java) που να διαγράφει, με τον προαναφερόμενο τρόπο, τα στοιχεία ενός πελάτη από το αρχείο (pelates.dat). Ο κωδικός του πελάτη που πρέπει να διαγραφεί  πρέπει να δίνεται ως παράμετρος του προγράμματος.

 

β) Γράψτε μια περιληπτική λύση πρώτου επιπέδου ενός προγράμματος και το πρόγραμμα αυτό (σε γλώσσα Java) που να αντιγράφει από το αρχείο (pelates.dat) σ' ένα νέο αρχείο (newpelates.dat) όλες τις εγγραφές του αρχικού αρχείου (pelates.dat) που έχουν τιμή "ψεύδος" (false) στο πεδίο "Διαγραμμένος" έτσι ώστε, μετά το τέλος της εκτέλεσης του προγράμματος, το νέο αρχείο (newpelates.dat) να περιέχει μόνο τις εγγραφές του αρχικού αρχείου που δεν έχουν διαγραφεί.

 

ΘΕΜΑ 2ο (20%)

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

java thema2   7  8  4  1

 

 

import java.io.*;

 

class thema2 {

 

   public static void main ( String args[] ) throws IOException

   {

 

      int []a = new int[4];

 

      for (int i = 0; i < a.length; i++)

         a[i] = Integer.parseInt(args[i]);

 

      method1(a);

 

   }

 

   static void method1(int a[]){

  

   int hold;

 

   for (int j = a.length-1; j > 0; j--)

 

       for (int i = 0; i <= j-1; i++){

 

           if (a[i] > a[i+1]) {

 

                  hold = a[i];

 

                  a[i] = a[i+1];

 

                  a[i+1] = hold;

           }

           for (int k = 0; k < a.length; k++)

 

               System.out.print(a[k]+" ");

 

           System.out.println();

       } //for

 

  } method1

 

} //thema2

 

 

ΘΕΜΑ 3ο (40%)

 

Έστω η τάξη Τηλεφωνικός_κατάλογος που παριστάνει έναν τηλεφωνικό κατάλογο σαν έναν πίνακα συνδρομητών. Ο κάθε συνδρομητής του καταλόγου αποτελείται από ένα ονοματεπώνυμο (Onoma) και έναν αριθμό (Arithmo). Ο πίνακας συνδρομητών έχει ένα μέγιστο αριθμό θέσεων MAX=100.

 

Το παρακάτω πρόγραμμα καλεί επαναληπτικά τις μεθόδους Prosthese() και Entopise() της τάξης Τηλεφωνικός_κατάλογος:

 

*   Η μέθοδος Prosthese() διαβάζει δεδομένα ενός συνδρομητή και τα αποθηκεύει στον τηλεφωνικό κατάλογο (εφόσον ο κατάλογος δεν είναι γεμάτος).

 

*   Η μέθοδος Entopise() ψάχνει (βάσει ενός ονοματεπωνύμου) τον τηλεφωνικό κατάλογο και τυπώνει τον αριθμό που αντιστοιχεί στο συνδρομητή. Αν ο συνδρομητής δεν υπάρχει στον κατάλογο τυπώνει ένα κατάλληλο μήνυμα.

 

import java.io.*;

 

public class phones {

 

   public static void main ( String args[] ) throws IOException

   {

      tnlefwnikos_katalogos katalogos=new tnlefwnikos_katalogos();

     

      char ep=ReadEpilogi();

 

      while (ep != '*')

      {

         if (ep == 'p') katalogos.Prosthese();

 

         else if (ep =='e') katalogos.Entopise();

 

         ep=ReadEpilogi();

 

      }  //while

 

   } //main

 

 

   static char ReadEpilogi () throws IOException

   {

      System.out.print ("Epilogi ? ");

 

      return (char)System.in.read();

 

   } // ReadEpilogi

 

} // phones

 

α) Ζητείται να κατασκευάσετε την τάξη "Συνδρομητής" που περιέχει, εκτός από τις ιδιότητες του συνδρομητή και τις μεθόδους:

*   κατασκευαστή που παίρνει ως παραμέτρους δύο συμβολοσειρές που παριστάνουν έναν ορισμένο συνδρομητή

*   PrintOnoma και PrintArithmo που εμφανίζουν το όνομα και τον αριθμό τηλεφώνου ενός συνδρομητή και

*   CompareOnoma που παίρνει ως παράμετρο μια συμβολοσειρά, τη συγκρίνει με το όνομα ενός συνδρομητή και επιστρέφει -1, 0 ή 1 εάν η συμβολοσειρά είναι λεξικογραφικά μικρότερη, ίση ή μεγαλύτερη του ονόματος.

β) Ζητείται να κατασκευάσετε την τάξη "Τηλεφωνικός_κατάλογος" και τις μεθόδους της τάξης Prosthese() και Entopise().

Χρησιμοποιείστε όπου χρειάζεται τη μέθοδο ReadStr() που διαβάζει μια ροή χαρακτήρων (μέχρι να διαβάσει το χαρακτήρα αλλαγής γραμμής) από την προκαθορισμένη είσοδο και επιστρέφει την αντίστοιχη συμβολοσειρά (string).

γ) Γράψτε τη μέθοδο ReadStr() έτσι όπως περιγράφεται στο α) παραπάνω.

Πλαίσιο κειμένου: ΤΕΛΟΣ ΤΩΝ ΕΡΩΤΗΣΕΩΝ
 


 


Μέθοδοι της τάξης String

 

    public char charAt(int  index);    

    public int compareTo(String  anotherString);       

    public String concat(String  str); 

    public boolean endsWith(String  suffix);   

    public boolean equals(Object  anObject);   

    public boolean equalsIgnoreCase(String  anotherString);    

    public int indexOf(int  ch);       

    public int indexOf(String  str);   

    public int length();       

    public String replace(char  oldChar, char  newChar);

    public boolean startsWith(String  prefix); 

    public boolean startsWith(String  prefix, int toffset);   

    public String substring(int  beginIndex);  

    public String substring(int  beginIndex, int endIndex);  

    public String toLowerCase();       

    public String toString(); 

    public String toUpperCase();      

    public static String valueOf(boolean  b);  

    public static String valueOf(char  c);     

    public static String valueOf(char  data[]);

    public static String valueOf(double  d);   

    public static String valueOf(float  f);    

    public static String valueOf(int  i);      

    public static String valueOf(long  l);     

 

Μέθοδοι της τάξης RandomAccessFile

 

    public void close();   

    public long getFilePointer();    

    public long length();     

    public int read();

    public int read(byte  b[]);

    public int read(byte  b[], int  off, int  len);  

    public final boolean readBoolean();

    public final byte readByte();      

    public final char readChar();      

    public final double readDouble(); 

    public final float readFloat();   

    public final int readInt();

    public final String readLine();   

    public final long readLong();     

    public final short readShort();  

    public final String readUTF();     

    public void seek(long  pos);     

    public int skipBytes(int  n);     

    public void write(byte  b[]);   

    public void write(int  b); 

    public final void writeBoolean(boolean  v);

    public final void writeByte(int  v);       

    public final void writeChar(int  v);       

    public final void writeChars(String  s);   

    public final void writeDouble(double  v);  

    public final void writeFloat(float  v);    

    public final void writeInt(int  v);

    public final void writeLong(long  v);      

    public final void writeShort(int  v);      

    public final void writeUTF(String  str);   

 

 

 

Μέθοδοι της τάξης DataInputStream

 

    public final int read(byte  b[]);  

    public final int read(byte  b[], int  off, int  len);      

    public final boolean readBoolean();

    public final byte readByte();      

    public final char readChar();      

    public final double readDouble();  

    public final float readFloat();    

    public final int readInt();

    public final long readLong();      

    public final short readShort();    

    public final String readUTF();     

    public final int skipBytes(int  n);

 

Μέθοδοι της τάξης DataOutputStream

 

    public void flush();       

    public final int size();   

    public void write(byte  b[], int  off, int  len);  

    public void write(int  b); 

    public final void writeBoolean(boolean  v);

    public final void writeByte(int  v);       

    public final void writeChar(int  v);       

    public final void writeChars(String  s);   

    public final void writeDouble(double  v);  

    public final void writeFloat(float  v);    

    public final void writeInt(int  v);

    public final void writeLong(long  v);      

    public final void writeShort(int  v);      

    public final void writeUTF(String  str);