Συζήτηση Τμήματος:C

Τελευταίο σχόλιο: πριν από 14 έτη από Konsnos στο θέμα Cαρχεία

Σειρά μαθημάτων

επεξεργασία

Νομίζω ότι συμφωνούμε για την σειρά, δηλαδή pointers μετά τις functions. Απλά πρότεινα να πάνε διαδοχικά functions-arrays-pointers ως πιο κατάλληλη σειρά, επειδή και οι πίνακες κατά κάποιον τρόπο είναι pointers και θα γινόταν έτσι καλύτερη εισαγωγή σε αυτούς. - SpyrosCS 21:16, 23 Ιουλίου 2009 (UTC)Απάντηση

Συγκεκριμένα προτείνω:

  1. Εισαγωγή στην C, Hello World, Μεταγλώττιση και Εκτέλεση.
  2. Δεδομένα, Μεταβλητές, Σταθερές, Είσοδος/Έξοδος Δεδομένων.
  3. Εκφράσεις, Τελεστές.
  4. Δομή ελέγχου if, Δομή επιλογής switch.
  5. Δομές επανάληψης while, do..while και for.
  6. Συναρτήσεις (functions)
  7. Πίνακες
  8. Δείκτες (pointers)
  9. Συμβολοσειρές (strings)
  10. Δομές (structures)
  11. Αρχεία (files)

Αυτά θα είναι τα βασικά μαθήματα και μπορεί μετά να προστεθούν συμπληρωματικά τα:

  1. Advanced Program Control
  2. Pointers: Beyond the Basics
  3. C Function Library
  4. Advanced Compiler Use

Περιμένω απόψεις, προτάσεις, διαφωνίες κτλ. - SpyrosCS 21:33, 23 Ιουλίου 2009 (UTC)Απάντηση

  • Τις συμβολοσειρές τις πρόσθεσα στο C/Μάθημα 6ο. Πιστεύω πως πρέπει να μπουν μαζί με τους πίνακες ή τουλάχιστον μετά από αυτούς. Μετά Functions, δείκτες, και αρχεία, όπως περιγράφεις και εσύ.
  • Όσον αφορά στα προχωρημένα μαθήματα, δεν γνωρίζω το αντικείμενο που περιγράφουν και δεν μπορώ να βοηθήσω, αλλά μου φαίνονται εντάξει ως προς αυτό που πραγματεύονται.

--Konsnos 07:12, 24 Ιουλίου 2009 (UTC)Απάντηση

Cαριθμητική

επεξεργασία

πώς επεξεργαζόμασται modουλα, divουλα, απόλυτες τιμές, ακεραία μέρη, περιττά μέρη, χειρισμός bytes αποθήκευσης των αριθμών ktl,ktl?

  • εδώ θα βρεις ότι χρειάζεσαι. Η αποθήκευση των αριθμών γίνεται με ανάθεση της τιμής σε μια μεταβλητή.

--Konsnos 17:15, 10 Απριλίου 2010 (UTC)Απάντηση

Ευχαριστώ --Περίεργος 16:35, 15 Απριλίου 2010 (UTC)Απάντηση

Cαρχεία

επεξεργασία

Με ποιές εντολές η C διαχειρίζεται αρχεία (άνοιγμα, δημιουργία, κλείσιμο, προσπέλαση δεδομένων από αρχείο, εγγραφή δεδομένων σε αρχείο); --Περίεργος 16:47, 15 Απριλίου 2010 (UTC)Απάντηση

  • Κάποια στιγμή πρέπει να συνεχίσω τα μαθήματα.... Πριν πας στα αρχεία πρέπει να μάθεις για τους δείκτες. Οι δείκτες αυτό που κάνουν είναι να "δείχνουν" σε μια διεύθυνση μνήμης πχ. ADDF 564D F423 (σε δεκαεξαδικό σύστημα αρίθμησης). Σε αυτή την διεύθυνση μνήμης μπορεί να υπάρχει οτιδήποτε, από αριθμό, πίνακα, όνομα μεταβλητής, μέχρι αρχεία, ή ακόμα και το USB κτλ. Για να δηλώσουμε έναν δείκτη χρησιμοποιούμε τον αστερίσκο *.
  • Χρησιμοποιούμε λοιπόν την βιβλιοθήκη stdio, και δηλώνουμε μια μεταβλητή τύπου FILE σε μια διεύθυνση μνήμης δηλαδή:
FILE *p1, *p2;

και κατόπιν σε αυτή την μέχρι στιγμής κενή διεύθυνση μνήμης αναθέτουμε την διεύθυνση στην οποία βρίσκεται το αρχείο.

p1=fopen(file,mode); // όπου file = "C:/blablabla.txt", και mode ="r", ή "w" ή "a"(read, write, append).

Στο mode υπάρχουν και άλλες τιμές, αλλά συνηθίζουμε να δημιουργούμε δύο αρχεία το ένα για ανάγνωση και το άλλο για εγγραφή. Επίσης συνηθίζεται να φτιάχνουμε ένα αρχείο temp το οποίο στην συνέχεια σβήνουμε, απλά για να κρατάει τα δεδομένα μας, χωρίς να σβήνει το πρωτότυπο. Εννοείτε πως πρέπει ως χρήστης του υπολογιστή σου να έχεις και τα απαραίτητα δικαιώματα να επεξεργάζεσαι τα αρχεία που θα χρησιμοποιήσεις. Τέλος το κλείνουμε

fclose(p1);

Αλλά πριν το κλείσουμε λογικά θα θέλουμε να το χρησιμοποιήσουμε. Υπάρχουν συναρτήσεις όπως getc(), putc(), fprintf(), fscanf(), getw(), putw(), fseek(), ftell(), rewind(), και η προσωπικά αγαπημένη remove(), της οποίες θα μου πάρει ώρα να εξηγήσω, αλλά πιστεύω το έπιασες το νόημα. Κάτι ακόμα αξιοσημείωτο είναι πως ένα αρχείο τελειώνει με τον χαρακτήρα FEOF, οπότε μέχρι να τον συναντήσεις σημαίνει πως το αρχείο περιέχει ακόμα δεδομένα.

  • Νομίζω πως με αυτά θα μπορέσεις να συνεχίσεις.

--Konsnos 10:53, 16 Απριλίου 2010 (UTC)Απάντηση

Δεν το κατάλβα ακόμα, το παρακάτω παράδειγμα δε λειτουργεί:

#include<stdio.h>

FILE *eis,*ex;

int main()
{
    eis=fopen("C:\f.txt","r");
    ex=fopen("C:\D.txt","w");
    int i=1;
    while (i,100,i++)
    {
          char cuc;
          cuc=getc(eis);
          putc(cuc,ex);
          eis=eis+1;
          ex=ex+1;
    }
    return 1;
}

--Περίεργος 08:27, 17 Απριλίου 2010 (UTC)Απάντηση

  • Κάτι που πρέπει οπωσδήποτε να μάθεις είναι να κοιτάς τι errors σου βγάζει εκτός και αν τα είδες και δεν τα κατάλαβες. Στην προκειμένη περίπτωση το error στον δικό μου compiler πάνω στα windows είναι:
8:15 C:\Dev-Cpp\test\main.c [Warning] unknown escape sequence '\D' 

Αυτό που θέλει να πει ο ποιητής είναι πως στην γραμμή 8 που γράφεις ex=fopen("C:\D.txt","w"); νομίζει πως το σύμβολο \D είναι κάποιος ειδικός χαρακτήρας, όπως ο \n που είναι το Enter, ή το \f. Ενημερωτικά το συγκεκριμένο error συμβαίνει στα windows, και για να αποφευχθεί θα πρέπει να γραφεί με τον τρόπο \\ που είναι ο συμβολισμός του χαρακτήρα '\', δηλαδή eis=fopen("C:\\f.txt","r");

  • Έχεις κάνει και ένα λάθος στην λογική του κώδικά σου. Προσπάθησε να το βρεις γιατί σίγουρα θα συμβεί αρκετές φορές στο μέλλον. Πάντως βλέπω πως το θέμα με τα αρχεία το κατάλαβες :) .

--Konsnos 14:23, 17 Απριλίου 2010 (UTC)Απάντηση

Μάλλον το ένα λάθος ήταν το while(i;100;i++). Όμως και το διορθωμένο εξακολουθεί να μη λειτουργεί:

#include<stdio.h>
#include<stdlib.h>

FILE *eis,*ex,*re,*wr;

int main()
{
    re=fopen("C:\f.txt","r");
    wr=fopen("C:\\D.txt","w");
    eis=re;
    ex=wr;
    int i=1;
    for (i=1;i<=100;i++)
    {
          int cuc;
          system("pause");
          cuc=getc(eis);
          system("pause");
          putc(cuc,ex);
          system("pause");
          eis=eis+1;
          ex=ex+1;
    }
    int c=fclose(re);
    c=fclose(wr);
    return 0;
}

Το πρόγραμμα σκάει μετά το πρώτο system("pause"); ανεξάρτητα πώς έχω δηλώσει την cuc. --Περίεργος 09:19, 18 Απριλίου 2010 (UTC)Απάντηση

  • Ξέχασες στο άνοιγμα του αρχείου f να βάλεις την διπλή κάθετο re=fopen("C:\\f.txt","r"); . Πρέπει πάντα να μπαίνει για προγράμματα που τρέχουν σε Windows, αλλιώς νομίζει πως είναι ειδικός χαρακτήρας.
  • Επίσης μπορείς πριν το 2ο pause να γράψεις μία printf για να βλέπεις αν πράγματι αντιγράφει το σωστό γράμμα. Έτσι μπορείς να εντοπίζεις εύκολα που βρίσκεται ένα λάθος.

--Konsnos 16:25, 18 Απριλίου 2010 (UTC)Απάντηση

Μια λειτουργική λύση του πρώτου προβλήματος είναι αυτή:

#include<stdio.h>

FILE *eis,*ex;

int main()
{
    eis=fopen("C:\\f.txt","r");
    ex=fopen("C:\\D.txt","w");
    int i;
    char cuc;
    for (i = 0;i<100;i++)
    {
          char cuc;
          cuc=getc(eis);
          putc(cuc,ex);
    }
    return 1;
}

Όταν διαβάζεις έναν χαρακτήρα η μνήμη πηγαίνει από μόνη της στον επόμενο χαρακτήρα.

--Konsnos 16:38, 18 Απριλίου 2010 (UTC)Απάντηση

Ευχαριστώ, λειτούργησε! Επειδή έχω και άλλες απορίες, μόλις δημιουργηθεί το κεφάλαιο για τα αρχεία μπορείς να μου στείλεις ένα μήνυμα στη σελίδα συζήτησής μου; --Περίεργος 18:56, 18 Απριλίου 2010 (UTC)Απάντηση

  • Επειδή λόγο υποχρεώσεων θα αργήσει αυτό το κεφάλαιο, καλύτερα ανέφερέ τις.

--Konsnos 20:06, 19 Απριλίου 2010 (UTC)Απάντηση

  • Γιατί η αποτυχγάνει η παρακάτω απόπειρα;
#include<stdio.h>

FILE *eis,*ex;

int main()
{
    eis=fopen("C:\\f.txt","r");
    ex=fopen("C:\\D.txt","w");
    int i=1;
    while (i;100;i++)
    {
          char cuc;
          cuc=getc(eis);
          putc(cuc,ex);
          eis=eis+1;
          ex=ex+1;
    }
    return 1;
}


  • μπορώ να διαγράψω αρχεία μέσω της C (και της Pascal);
#include<stdio.h>

FILE *eis

int main()
{
    eis=fopen("C:\f.txt","a");
    //* Afto to paradeigma den leitourgei*//
    delete(eis);
    return 1;
}
  • πώς fscanfάρεται ο χαρακτήρας FEOF; ποιές συνθήκες είναι οι αντίστοιχες των Pascalικών eoln και eof;
  • πώς εμφανίζονται τα ονόματα των αρχείων στα ελληνικά στην εντολή fopen;
"C:\Documents and Settings\Usix\Τ? ?????φ? μ??\???.txt"
  • επιπλέον: πώς ορίζω τύπους δεδομένων στη C; (Ποιό είναι το type της C;)

π.χ. στην Pascal ισχύει ο τύπος:

type
 snat:0..255;
  • Πώς μπορώ να καθυστερήσω το άνοιγμα ενός αρχείου με ένα άλλο κατά 10 δευτερόλεπτα;

--Περίεργος 18:09, 21 Απριλίου 2010 (UTC)Απάντηση

  1. Ενώ έχεις βάλει while χρησιμοποιείς σύνταξη της for. Η while δέχεται ως παραμέτρους ένα true ή false expression C/Μάθημα 5ο#while. Αυτό μάλλον είναι λάθος απροσεξίας.
  2. Εντολή delete() δεν υπάρχει στην C. Αυτό που θέλεις είναι η remove η οποία δέχεται ως όρισμα την απόλυτη ή σχετική διεύθυνση ενός αρχείου, αν έχεις εμπειρία από γραμμή εντολών. πχ. remove("C://f.txt"); Στο ίδιο πρόγραμμα έχεις και άλλα λάθη όπως ένα ερωτηματικό που λείπει.
Γίνονται και μετονομασίες;
rename( oldname , newname );
  1. Ενδιαφέρον το ότι ξέρεις pascal. Πια έκδοση ξέρεις, γιατί η καινούργια είναι αντικειμενοστραφής και αρκετά διαφορετική από την κλασική pascal. Η feof συντάσσεται ως feof(FILE *). Θα μπορούσες πχ. να γράψεις !feof(eis).
Για να είμαι ειλικρινής δεν ξέρω! Μάλλον γνωρίζω την Turbo Pascal. Η υλοποίηση που ξέρω δεν έχει ιδιαίτερα χαρακτηριστικά, τα πιο σύγχρονα χαρακτηριστικά που έχει είναι οι συμβολοσειρές και τη διαχείρηση αρχείων. Ο μεταγλωτιστής που χρησιμοποιώ είναι ο Free Pascal IDE for Win32 v0.9.2 του PΓrczi Gibor, Piere Muller και Peter Vreman.
  1. Δεν έχω ασχοληθεί και δεν το γνωρίζω. Θεωρητικά θα πρέπει να βάλεις στον ASCII να χρησιμοποιεί μια έκδοση extended ASCII που να περιέχει τα ελληνικά. Το πως δεν έχει τύχει να με απασχολήσει ποτέ, και δεν ξέρω καν είναι αυτή η λύση είναι ορθολογική. Με την πρώτη ευκαιρία θα το ψάξω.
Μα ο κώδικας ASCII έχει ελληνικούς χαρακτήρες! (σύμφωνα με το μεταγλωτιστή της Pascal που έχω)
Ίσως είναι ιδιομορφία του μεταγλωττιστή. Στην 1.5 turbo pascal που χρησιμοποιήσα δεν υπήρχαν ελληνικά, και ούτε στην C που χρησιμοποιώ. Αν και πλέον την έχω ξεχάσει την Pascal. Δεν μου ήταν ιδιαίτερα συμπαθής :( .
  1. Ή δεν υπάρχει ή δεν το γνωρίζω. Τύπους δεδομένων στην C μπορείς να ορίσεις με structs αλλά δεν έχουν την λογική της type. Μέσα σε μία struct μπορείς να ορίσεις πάλι κάποια από τις αρχικούς/πρωτογενείς τύπους.

Δηλαδή μια Pascalikή εγγραφή όπως η παρακάτω πώς είναι στη C;

type
 list=record;
  perix=char;
  poitix=^list;
end;
Δεν μπορώ να κάνω την μεταφορά. Πάντως ένα struct δηλώνεται ως

struct foo{         int m;         char str[40];         double d;

       // ..... 

};

  1. Ορθολογικά θα πρέπει να βρεις την ώρα και να την συγκρίνεις ξανά και ξανά μέχρι η αφαίρεση να σου βγάλει 10 δευτερόλεπτα, αλλά πολύς κόπος για το τίποτα. Βάλε μία for που να τρέχει μέχρι το 1 δισεκατομμύριο και θα είσαι ντάξει.

--Konsnos 21:01, 21 Απριλίου 2010 (UTC)Απάντηση

  • Τί κάνουν οι εντολές write και read στην C;
  • Πώς μπορώ στην Pascal ή C να εμφανίζω πεδία για να βάλλει ο χρήστης τιμές; (Για παράδειγμα αντί να τις εισάγη στη μαύρη οθόνη να τις εισάγει σε κάποιο παράθυρο)--Περίεργος 12:33, 22 Απριλίου 2010 (UTC)Απάντηση
  • Για αυτό και για οποιεσδήποτε εντολές καλό είναι να τις διαβάζεις από κάποιο reference. Το καλύτερο είναι αυτό: [1] όπου θα βρεις ουσιαστικά τα πάντα. Οποιαδήποτε εξήγηση και να σου δώσω δεν θα την πω όσο πλήρες τα λέει αυτό.
  • Η C δεν σχηματίζει παράθυρα. Για παραθυρικές εφαρμογές πρέπει να χρησιμοποιήσεις κάποιο framework όπως το Qt ή το πιο εύκολο .NET ή άλλα.

--Konsnos 20:23, 22 Απριλίου 2010 (UTC)Απάντηση

Επιστροφή στη σελίδα "C".