THMMY.gr

Μαθήματα Βασικού Κύκλου => Δομημένος Προγραμματισμός => Topic started by: vasilis94 on May 26, 2014, 19:52:10 pm



Title: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: vasilis94 on May 26, 2014, 19:52:10 pm
Άσκηση G

        Για την καταχώρηση των εισερχομένων κλήσεων που έγιναν προς έναν αριθμό τηλεφώνου η εταιρία κρατά ένα αρχείο κλήσεων για κάθε συνδρομητή. Το όνομα του αρχείου ταυτίζεται με τον αριθμό κλήσης του συνδρομητή. Όταν ο συνδρομητής έχει μια εισερχόμενη κλήση αναζητείται το αντίστοιχο αρχείο το οποίο ανοίγει για να προστεθεί στο τέλος του ο αριθμός του τηλεφώνου από το οποίο έγινε η κλήση.
        Να γραφεί το πρόγραμμα το οποίο αρχικά δημιουργεί ένα αρχείο με το όνομα numpers. Στη συνέχεια να διαβάζει τους αριθμούς κλήσης των συνδρομητών της εταιρίας και τους καταχωρεί με τη μορφή strings στο αρχείο. Αυτά τα strings θα είναι τα ονόματα των αρχείων που θα αντιστοιχούν σε κάθε συνδρομητή. Το πρόγραμμα να ορίζει μια ατέρμονα ανακύκλωση σε κάθε επανάληψη της οποίας να διαβάζεται ο αριθμός κλήσης ενός συνδρομητή και ο αριθμός του τηλεφώνου που πραγματοποίησε την κλήση. Στη συνέχεια να αναζητείται στο αρχείο numpers το όνομα του αρχείου που αντιστοιχεί στον συνδρομητή, να ανοίγει το αντίστοιχο αρχείο συνδεόμενο με ένα δυαδικό κανάλι και να καταχωρείται σε αυτό ο αριθμός του τηλεφώνου που τον κάλεσε. Η ανακύκλωση να σταματά αν ως αριθμός του συνδρομητή δοθεί το 0. Στην περίπτωση αυτή το πρόγραμμα να εκτυπώνει για κάθε συνδρομητή τους αριθμούς των τηλεφώνων που τον έχουν καλέσει.

       Βοηθητικές παρατηρήσεις
       Ο αριθμός του συνδρομητή να διαβάζεται και να καταχωρείται με τη μορφή string ενώ ο αριθμός του τηλεφώνου που τον καλεί με τη μορφή ακεραίου τύπου long.
       Για την καταχώρηση και ανάγνωση των ονομάτων των αρχείων που αντιστοιχούν στους συνδρομητές να χρησιμοποιήσετε τις συναρτήσεις fscanf και fprintf.
       Για τη σύγκριση των strings μπορείτε να χρησιμοποιήσετε έτοιμες συναρτήσεις που διαθέτει ο μεταγλωττιστής που χρησιμοποιείτε. (Η σχετική συνάρτηση στον μεταγλωττιστή της Borland είναι η strcmp και ορίζεται στο αρχείο string.h).


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: Γρηγόρης on May 26, 2014, 23:34:18 pm
(http://mmoqq.com/wp-content/uploads/2011/10/i_m12yearsold.jpg)

Τα λόγια είναι περιττά!  ;D ;D


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: lady_of_winter on May 28, 2014, 00:11:23 am
έχει κανείς καμία ιδέα πως θα κάνουμε τα αρχεία για κάθε συνδρομητή?
εγώ σκέφτηκα να κάνω ένα πίνακα που περιέχει pointers και κάθε ένας από τους pointers θα αντιστοιχεί στο αρχείο ενός συνδρομητή.
και για το  μέγεθος του πίνακα θα κάνω ένα malloc. είναι αυτό σωστο?



Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: nikitas350 on May 28, 2014, 00:25:26 am
έχει κανείς καμία ιδέα πως θα κάνουμε τα αρχεία για κάθε συνδρομητή?
εγώ σκέφτηκα να κάνω ένα πίνακα που περιέχει pointers και κάθε ένας από τους pointers θα αντιστοιχεί στο αρχείο ενός συνδρομητή.
και για το  μέγεθος του πίνακα θα κάνω ένα malloc. είναι αυτό σωστο?



I think so.


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: lady_of_winter on May 28, 2014, 00:28:05 am
χαίρομαι για αυτό :p και κάτι τελευταίο τον πίνακα τον βάζουμε σαν FILE έτσι δεν ειναι?


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: nikitas350 on May 28, 2014, 01:10:40 am
χαίρομαι για αυτό :p και κάτι τελευταίο τον πίνακα τον βάζουμε σαν FILE έτσι δεν ειναι?

Ναι, FILE**.


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: lady_of_winter on May 28, 2014, 01:13:17 am
ευχαριστώ πολυ!! :) :)


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: zwitsa on May 28, 2014, 17:43:44 pm
χαίρομαι για αυτό :p και κάτι τελευταίο τον πίνακα τον βάζουμε σαν FILE έτσι δεν ειναι?

Ναι, FILE**.

γιατί FILE**?


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: nikitas350 on May 28, 2014, 18:51:01 pm
χαίρομαι για αυτό :p και κάτι τελευταίο τον πίνακα τον βάζουμε σαν FILE έτσι δεν ειναι?

Ναι, FILE**.

γιατί FILE**?

Γιατί συνήθως τα FILE τα χειρίζεσαι με τον pointer τους.
http://www.cplusplus.com/reference/cstdio/FILE/


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: lady_of_winter on May 28, 2014, 19:40:29 pm
για οσούς ενδιαφέρονται την ίδια εργασία έβαλε και το 2010 και η λύση της υπάρχει στα downloads και είναι η άσκηση G.


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: nikitas350 on May 28, 2014, 20:27:42 pm
Πάρτε και την δικιά μου [του 2010] τότε:

Δεν είχα χρησιμοποιήσει FILE**, μάλλον δεν χρειάζεται να κρατάς στην μνήμη όλα τα αρχεία.

#include <stdio.h>
#include <string.h>

int main()
{
   char name[11], called[11], temp[11];
   unsigned int i, N;
   unsigned long int caller, tempnum;
   
   FILE *numpers, *tmp;
   numpers = fopen("numpers", "w");

   printf("Give the number of the costumers\n"), scanf("%d", &N);
   
   for (i = 0; i < N; i++) {
      printf("Give the call number of the costumer %d\n", i);
      scanf("%s", name);
      fprintf(numpers, "%s\n", name);
      tmp = fopen(name, "w");
      fclose(tmp);
   }
   
   fclose(numpers);
   
   numpers = fopen("numpers", "r");


   printf("Give the caller's number and the subscriber's number\n");
   scanf("%lu %s", &caller, called);
   
   while (*called != '0') {
      for (i = 0; i < N && strcmp(temp, called); i++) {
         fscanf(numpers,"%s", temp);
      }
      rewind(numpers);
      
      if (strcmp(temp,called))
         printf("Wrong subscriber's phone, please retry\n");
      else {
         tmp = fopen(called, "ab");
         fprintf(tmp, "%lu\n", caller);
         fclose(tmp);
      }
      printf("Give the caller's number and the subscriber's number\n");
      scanf("%lu %s", &caller, called);
   }

   
   for(i = 0; i < N; i++) {
      fscanf(numpers,"%s", temp);
      printf("Calls for number %s\n\n", temp);
      tmp = fopen(temp, "rb");
      while(!feof(tmp)) {
         fscanf(tmp,"%lu", &tempnum);
         if (!feof(tmp))
            printf("%lu\n",tempnum);
      }
      fclose(tmp);
      printf("\n");
   }
   fclose(numpers);
   return 0;
}


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: airpap on May 29, 2014, 09:55:09 am
να ρωτησω και εγω κατι... με το fprintf ή με το fscanf γινεται η καταχωρηση?


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: airpap on May 29, 2014, 17:09:27 pm
βασικα μπορει να μου πει καποιος την λειτουργια τους??  :)


Title: Re: [Δομημένος Προγραμματισμός] Άσκηση G (Hμ/νία λήξης δηλώσεων: 1/06/2014)
Post by: Ancient on June 01, 2014, 17:41:11 pm
Δε χρειάζεται πίνακας με pointers αφού σε κάθε επανάληψη ο χρήστης θα δίνει τον αριθμό κλήσης του συνδρομητή, οπότε γνωρίζεις ποιο αρχείο πρέπει να ανοίξεις.