1. viewtopic.php?f=6&t=5424&start=0 -> Ο βασικός οδηγός του git
2. viewtopic.php?f=61&t=12494&start=50 -> extra συμβουλές απο τον σίμο για απλοποίηση της διαδικασίας.
3. http://en.wikipedia.org/wiki/Git_%28software%29 -> Η τεκμηριωση της Wiki.
Ο κωδικας που θα δοθει παρακατω
έχει ορισμένα λογικά σφάλματα αλλα καταφέραμε να τρέξει κανονικα. Οποιος θελει μπορεί να τον συμπληρώσει και να τον διορθώσει οσο θα τον κοιταω και εγω οταν θα εχω χρονο... προς το παρον θα τον βάλουμε ετσι μιας και αυτα που θέλουμε να πούμε γυρω απο αυτον τα καλύπτει και έτσι οπως ειναι.
Καταρχην οπως το λέει και ο τίτλος θέλουμε να δουλέψουμε με λειτουργικές μονάδες. ΟΙ λειτουργικες μονάδες / modules ειναι πηγαία αρχεία. Πηγαίο αρχείο ειναι ένα αρχείο το οποίο ειναι γραμμένο σε κάποια γλώσσα προγραμματισμού
paragontiko : Συναρτηση που υλοποιεί την συνάρτηση του παραγοντικού n!
gcd : ΠΟυ υπολογιζει τον μεγιστο κοινό διαιρέτη 2 αριθμών (αυτη ισως θελει καποιο αρχειο επικεφαλιδας να συμπεριληφθει αλλιως θα παιζει λογικό σφάλμα στην κλήση της
pow: η συναρτηση η οποια υπολογιζει την δύναμη ενος αριθμού
Οι 3 αυτες συναρτήσεις αρχικά ξεκινάνε απο το αρχείο module.c
- Κώδικας: Επιλογή όλων
#include "module.h"
char main_interface(char ch)
{
int n, a, b;
double k, m;
switch (ch) {
case 'A':
printf("To apotelesma einai: %d", paragontiko(n));
break;
case 'B':
printf("To apotelesma einai: %d", gcd(a, b));
case 'C':
printf("To apotelesma einai: %f", pow(k, m));
break;
default:
break;
}
}
int paragontiko(int n)
{
printf("Dwste to n");
scanf("%d", &n);
if (n == 0)
return 1;
else
return n * paragontiko(n - 1);
}
int gcd(int a, int b)
{
printf("Dwste to a");
scanf("%d", &a);
printf("Dwste to b");
scanf("%d", &b);
if (b == 0)
return a;
else
return gcd(b, a % b);
}
double pow(double k, double m)
{
printf("Dwste ton k");
scanf("%lf", &k);
printf("Dwste ton m");
scanf("%lf", &m);
if (k == 0)
return 1;
else
return m * pow(m, k - 1);
}
Ο simosx τονισε πως το να κάνεις include άλλα αρχεία δεν είναι σωστή προγραμματιστική τεχνική. Πιστεύω διαθέτει περισσότερη εμπειρία απο μενα στον προγραμματισμό αλλα ειναι και θέμα προσωπικής προτίμησης. Τελος παντων μπορει να συζητηθεί παρακάτω και αυτο.
η 2η λειτουργική μονάδα που θα χρειαστούμε ειναι το αρχείο επικεφαλίδας header module.h μεσα στο οποιο ειναι δηλωμένα τα πρωτότυπα των συναρτήσεων που χρησιμοποιούμε στην 1η λειτουργική μονάδα module.c
- Κώδικας: Επιλογή όλων
#include<stdio.h>
int paragontiko(int n);
int gcd(int a, int b);
double pow(double k, double m);
char main_interface(char ch);
η 3η λειτουργική μονάδα εχει να κάνει με το interface του χρήστη. Με λιγα λογια ... ως εδω έχουμε φτιάξει το 1ο αρχείο μεσα στο οποίο θα ορίσουμε τις συναρτήσεις ως προς την λειτουργία τους. (ΤΙ θελουμε να κάνουν και τι θα πρέπει να επιστρέφουν , με πιο απλα λόγια αλλωστε μια συνάρτηση ειναι μια εντολή η οποια εκτελεί μια ενέργεια συνήθως τροποποιούμενη βάση των ορισμάτων που της δίνεις . Η ενέργεια που εκτελεί έχει να κάνει με τον ορισμό της) -οχι την δηλωσή της στην αρχή.
η 3η λειτουργική μονάδα έχει τον παρακάτω κώδικα
- Κώδικας: Επιλογή όλων
#include "module.h"
#include<stdio.h>
int main(void)
{
int ch;
printf
("Dwste A gia to paragontiko , B gia ton MKD kai C gia tin dunami \n");
printf("Dwste q an thelete na bgeite apo to programma\n");
while ((ch = getchar()) != 'q') {
main_interface(ch);
}
printf("Bye World");
return 0;
}
Σε γενικές γραμμές ο χρήστης ανάλογα με το τί θα επιλέξει (και οσο δεν επιλέγει το q ) μεταφέρεται στην 1η λειτουργική μονάδα στην αντίστοιχη ετικέτα οπου εκεί καλείται η αντιτοιχη συνάρτηση... υλοποιεί τους υπολογισμούς της και επιστρέφει ενα αποτέλεσμα. Φυσικα αυτη η συνάρτηση για να καταφέρει να δουλέψει και να αναγνωριστεί θα πρέπει πρωτα να έχει δηλωθεί και ακριβως αυτος ειναι και ο λογος υπαρξης του 2ου πηγαίου αρχείου - λειτουργικής μονάδας. ΟΙ κώδικες υπάρχουν και στην τοποθεσία
https://github.com/simos/starlight
επίσης απο εδω μπορουμε να δούμε με ποιο τρόπο παράγεται το εκτελέσιμο prog
δίνοντας απο το τερματικό την εντολή Makefile και αφου εχουμε εγκαταστήσει το git
η διαδικασία βγαινει μονη της.
2 λογια για τις οντότητες που εμπλέκονται στην διαδικασία
1. Μεταγλωττιστής => Παίρνει σαν είσοδο το αρχικό αρχείο πηγαίου κώδικα σε C με κατάληξη .c και παράγει το αντικειμενικό αρχείο (.o για λινουξ - .obj για windows) . H δουλεια του μεταγλωττιστή ειναι να εξετάσει το αρχειο απο συντακτικά λάθη - τα λογικά δεν τον αφορούν.
2. Το αντικειμενικό αρχείο δεν μπορει να εκτελεστεί με την μορφή που έχει μιας και υπάρχει κώδικα που του λείπει θα πρέπει να γίνει λοιπον η σύνδεση. Η σύνδεση σε γενικές γραμμές χρησιμοποιείται για να το αντικειμενικό αρχείο η ANSI C βιβλιοθήκη και άλλες βιβλιοθήκες για να δημιουργηθεί ο δυαδικός κωδικας - εκτελέσιμο αρχείο.
TIP 1->
Καθώς ειμαστε στον μεταγλωττιστη και εργαζόμαστε όταν πληκτρολογήσουμε την συνθήκη ελέγχου if αμέσως μετα το (f) αν πατήσουμε tab μας βγάζει τον συντακτικό της ορισμό.. δηλαδή τις αγκύλες και τις παρενθέσεις που θα πρέπει να έχει χωρις να χρειάζεται να θυμόμαστε κατι απέξω για αυτήν.
TIP 2 ->
Μιας και μιλήσαμε για include αλλων αρχείων - λειτουργικών μονάδων μεσα στο αρχείο που εργαζόμαστε ή και κάποιο άλλο απο την "ομάδα μας!" καλό θα είναι να θυμόμαστε οτι οι γωνιώδεις αγκύλες στην οδηγία *προεπεξεργαστή #include <stdio.h> λένε στον C προεπεξεργαστή να ψάξει για το αρχείο επικεφαλίδας σε έναν κατάλογο εκτός απο τον τρέχοντα. ΑΝτίθετα αν βάζαμε #include "stdio.h" θα ωθούσαμε τον προεπεξεργαστή να ψάξει πρωτα στον τρέχοντα κατάλογο και μετα αλλού.
*προεπεξεργαστής : ενα πρόγραμμα που κάνει κάποια προετοιμασία στον C μεταγλωττιστή πριν μεταγλωττιστεί ο κωδικάς μας.
Π.Σ Ελπίζω να βοηθήσει αν και θέλει ορισμένες βελτιώσεις... δεν ειναι ακομη 100% έτοιμος



.
