Προς το περιεχόμενο

Συλλογή άρθρων και βοηθημάτων/tutorials εκτός Insomnia


ZauZ

Προτεινόμενες αναρτήσεις

Κάποιο καλό tutorial με τα βασικά της Prolog και του λογικού προγραματισμού στα ελληνικά;

Δες αν θες τις σημειώσεις που χρησιμοποιούμε για την τεχνητή νοημοσύνη στο teithe: http://aetos.it.teithe.gr/~demos/teaching_GR.html

 

Κατέβασε το zip "Σημειώσεις διαλέξεων του μαθήματος".

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...
  • 3 μήνες μετά...
  • 6 μήνες μετά...
  • Moderators

Εισαγωγή στον πρoγραμματισμό υπολογιστών 

με τη γλώσσα C

 

http://fourier.math.uoc.gr/~mk/prog0001/prog/progS/

 

Το hello world:

#include <stdio.h>
main()
{
    printf("Hello, world!\n");
}

Πιο κάτω:

 

Όλες οι μέθοδοι ανακύκλωσης εκτός από το goto θεωρούνται μέθοδοι δομημένου προγραμματισμού, το δε goto θα δείτε πάρα πολλά βιβλία προγραμματισμού να σας συνιστούν να το αποφεύγετε, επειδή η χρήση του καθιστά ένα πρόγραμμα δυσκολοδιάβαστο.

Αυτό είναι εν μέρει μόνο σωστό. Υπάρχουν περιπτώσεις όπου η χρήση ενός goto για την υλοποίηση ενός loop, απλοποιεί πολύ τα πράγματα σε σχέση με το αν είχαμε χρησιμοποιήσει μια από τις άλλες τρεις μεθόδους ανακύκλωσης, που θεωρούνται αποδεκτές στη φιλοσοφία του δομημένου προγραμματισμού. Είναι ΟΚ να χρησιμοποιεί κανείς σε ένα μέρος ενός κώδικα ένα ή και δύο goto. Αν όμως βλέπει κανείς να χρησιμοποιεί πολλά labels, τότε μαλλον το loop του χρειάζεται ανασχεδιασμό και υλοποίηση με κάποια από τις άλλες μεθόδους ανακύκλωσης.

 

Δεν το διάβασα όλο αλλά μόνο απ' αυτά τα 2 δε νομίζω να θέλω να το διαβάσω όλο.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλά για το "GOTO" αλλά στο Hello World, τι δεν σου αρέσει;;;

#include <stdio.h>

int main(void)  // or int main(int argc, char *argv[])
{
    printf("Hello, world!\n");

    return 0;
}

Εκτός κι αν κάνει compile με C99, οπότε και δεν είναι απαραίτητο το return. Δεν το νομίζω όμως.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η χρήση του Goto είναι για προχωρημένους προγραμματιστές μόνο! Δηλαδή η αξία του δεν γίνεται αντιληπτή σε αρχάριους! Δεν χρειάζεται goto για κώδικα των 100 γραμμών...Όμως πιθανόν χρειάζεται για πολύ μεγαλύτερο! 
Ο κώδικας παρακάτω είναι για το ColorDataEvent ενός αντικειμένου TextViewer που οδηγεί ένα user control μετατρέποντάς το σε επεξεργαστή κειμένου. Στο Event χρωματίζεται ο κώδικας. Τα goto εδώ είναι απαραίτητα. Είναι σαν να χρησιμοποιείς λογική με σύρματα...τα Goto ενώνουν τα σημεία. Τη ρουτίνα την έγραψα με εμπλουτισμό. Αν έπρεπε να την σκεφτώ στο χαρτί, θα έκανα ένα μήνα και παραπάνω. Την έφτιαξα για τα βασικά και μέσα σε λίγες μέρες έφτασε στο "τέρας" που είναι τώρα. Ευτυχώς στην Vb6 μπορείς να τρέχεις το πρόγραμμα και να φτιάχνεις και το κώδικα ταυτόχρονα! Δηλαδή σταματάς το κώδικα, τον αλλάζεις και συνεχίζεις από εκεί που ήσουν (σε εξαιρετικές περιπτώσεις δεν σε αφήνει). 
Κάποια στιγμή χρησιμοποιώ ετικέτα με όνομα marvel...είναι η θαυμάσια σκέψη που μου έδωσε τη λύση.(γράφω διαισθητικά περισσότερο, δηλαδή ξέρω πως πρέπει περίπου να γράψω το κώδικα, τι χρειάζεται πριν το κάνω να δουλέψει σωστά, οπότε έχω κέρδος ότι ξεκινάω με καλή βάση, αυτό είναι ταλέντο που μπορεί να κοντραριστεί μόνο με μεγάλη εμπειρία)
 
Οπότε αν κάτι σας λένε ότι δεν είναι καλό αλλά δεν σας εξηγούν γιατί δεν το αφαιρούν από τη γλώσσα, τότε μάλλον είναι καλό για προχωρημένους! Το Goto ή Προς το έχει και η Μ2000.

 

Private Sub mDoc_ColorDataEvent(thispara As Long, data As String, col() As Variant, feedback As Long)
Dim feedthis As Long
If NoColor Then
If UBound(col()) > 1 Then
ReDim col(1)
End If
Exit Sub
End If
ReDim col(1)
Dim A$, k As Long, drop$, pos1 As Long, pos2 As Long, onetime As Boolean, kind As Long
Dim lastcol As Long
A$ = data
onetime = True
 k = Len(A$)
If k < 1 Then
makebase col(), 14
Exit Sub
End If
If feedback > 0 Then
lastcol = 15
GoTo marvel
Else
lastcol = 14
End If
again:
If RTrim$(A$) = "" Then
If pos2 > 0 Then
  addone col(), pos2, lastcol
  Else
  makebase col(), 14
  End If

Exit Sub
Rem FOR TESTS
  pos1 = 0
  For k = 1 To UBound(col()) Step 2
    If VarType(col(k)) = 0 Then Exit Sub
    If col(k) > pos1 Then pos1 = col(k)
    If col(k) < pos1 Then Exit Sub
  Next k
    For k = 0 To UBound(col()) Step 2
   If col(k) > 15 Then Exit Sub
  Next k
  
End If
While FastSymbol(A$, ":")
If pos2 > 0 Then
addone col(), pos2, 14
Else
addone col(), 1, 14
End If
 pos2 = k - Len(A$) + 1
Wend
drop$ = "@(": kind = Abs(FastSymbol(A$, drop$)) * 4
If kind = 0 Then
If IsSymbol(A$, "@") Then
        If pos2 > 0 Then
        addone col(), pos2, 14
        Else
        addone col(), 1, 14
        End If
     pos2 = k - Len(A$) + 1
End If
End If
kind = IsLabelDot("", A$, drop$)

If kind = 0 Then drop$ = "$(": kind = Abs(FastSymbol(A$, drop$)) * 4
If kind = 0 Then drop$ = "~(": kind = Abs(FastSymbol(A$, drop$)) * 4
If kind = 0 Then drop$ = ""
If kind > 0 Then
    If ismine(drop$) Then
                lastcol = 11
                If pos2 > 0 Then
                   addone col(), pos2, 11
                Else
                   addone col(), k - Len(A$) - Len(drop$) + 1, 11
                   End If
                If ismine2(drop$) Then
              
                kind = -2
                If Trim$(A$) <> "" Then
                                        pos2 = k - Len(A$) + 1
                                        If FastSymbol(A$, "{") Then
                                            addone col(), pos2, 14
                                            pos2 = k - Len(A$) + 1
                                            onetime = True
                                            GoTo again
                                        ElseIf ismine3(drop$) Then
                                        onetime = True
                                        kind = -2
                                        GoTo again2
                                        End If
                                End If
                ElseIf ismine1(drop$) Then
                  
                kind = -1
                                If Trim$(A$) <> "" Then
                                                  pos2 = k - Len(A$) + 1
                                        If FastSymbol(A$, "{") Then
                                                  addone col(), pos2, 14
                                                  pos2 = k - Len(A$) + 1
                                                  onetime = True
                                                  GoTo again
                                          Else
                                           
                                                  Exit Sub
                                        End If
                                End If
                            
                End If
    
   Else
                lastcol = 10
                If pos2 > 0 Then
                 addone col(), pos2, 10
                Else
                 addone col(), k - Len(A$) - Len(drop$) + 1, 10
                
                 End If
  End If
  pos2 = k - Len(A$) + 1
  If kind > 3 Then
 
  pos1 = 1
 drop$ = aheadstatus(A$, False, pos1)

marvel:

  If pos1 > 1 Then
marvel2:
 ColorizeExpressions Mid$(A$, 1, pos1 - 1), col(), k - Len(A$) + pos1 - 1, pos2, feedthis
 feedback = feedthis

  A$ = Mid$(A$, pos1)
  If FastSymbol(A$, ",") Then
    pos2 = k - Len(A$) + 1
  pos1 = 1
  drop$ = aheadstatus(A$, False, pos1)
GoTo marvel2
End If
  
  End If

    If FastSymbol(A$, ")") Then
  addone col(), pos2, lastcol ' 'lastcol
    pos2 = k - Len(A$) + 1
  End If
  End If

If FastSymbol(A$, ".") Then
  addone col(), pos2, lastcol
    pos2 = k - Len(A$) + 1
End If
If FastSymbol(A$, "<=") Then
  addone col(), pos2, 15
    pos2 = k - Len(A$) + 1
    Else
  
again4:
  If FastSymbol(A$, "=") Then
  addone col(), pos2, 15
    pos2 = k - Len(A$) + 1
  ElseIf MaybeIsSymbol(A$, "+-*/", "=", True) Then
  addone col(), pos2, 14
    pos2 = k - Len(A$) + 1
  ElseIf MaybeIsSymbolNoSpace(A$, "~", True) Then
  addone col(), pos2, 14
    pos2 = k - Len(A$) + 1
End If
  End If
again2:
Do
again3:
  pos1 = 1

A$ = NLtrim$(A$)
  drop$ = aheadstatus(A$, False, pos1)
  
  If pos1 > 1 Or drop$ = "S" Then
  If pos1 = 1 Then
  drop$ = A$
  pos1 = Len(A$) + 1
  Else
  drop$ = Mid$(A$, 1, pos1 - 1)
  If drop$ = "" Then drop$ = " "
  End If
feedback = 0
 ColorizeExpressions drop$, col(), k - Len(A$) + pos1 - 1, pos2, feedback

 
  A$ = Mid$(A$, pos1)

If InStr(drop$, " ") = 0 Or kind >= 0 Then GoTo again3
  End If
    If MaybeIsSymbol(A$, ",;", , True) Then
     addone col(), pos2, 14
    pos2 = k - Len(A$) + 1
    onetime = False
    ElseIf FastSymbol(A$, "}") Then
         addone col(), pos2, 14
    pos2 = k - Len(A$) + 1
    onetime = True
    GoTo again
   Else
   onetime = True
   Exit Do
   End If
   Loop

GoTo again
ElseIf MaybeIsSymbol(A$, "\'") Then
If pos2 > 0 Then
 addone col(), pos2, 7

Else
addone col(), 1, 7
End If
 pos2 = k - Len(A$) + 1
 Exit Sub

ElseIf Not onetime Then
If FastSymbol(A$, ",") Then
ElseIf FastSymbol(A$, ":") Then
onetime = True
ElseIf FastSymbol(A$, ")") Then
addone col(), pos2, lastcol
pos2 = k - Len(A$) + 1
    GoTo again4
ElseIf FastSymbol(A$, ";") Then
addone col(), pos2, 14
    pos2 = k - Len(A$) + 1
    GoTo again2
ElseIf FastSymbol(A$, "}") Then
addone col(), pos2, 14
addone col(), k - Len(A$), 11
pos2 = k - Len(A$) + 1
    GoTo again3

ElseIf FastSymbol(A$, "{") Then
onetime = True
ElseIf FastSymbol(A$, "?") Then
addone col(), pos2, 14
addone col(), k - Len(A$), 11
pos2 = k - Len(A$) + 1
GoTo again2
Else
addone col(), pos2, lastcol
 
Exit Sub
End If
addone col(), pos2, 14
    pos2 = k - Len(A$) + 1
    GoTo again
ElseIf IsSymbol(A$, "?") Then

addone col(), 1, 11
        pos2 = k - Len(A$) + 1
        GoTo again2
ElseIf IsSymbol(A$, "=") Then

If pos2 > 0 Then
addone col(), pos2, 11
Else
addone col(), 1, 11
End If
        pos2 = k - Len(A$) + 1
        GoTo again2
ElseIf FastSymbol(A$, "{") Then
onetime = True
If pos2 > 0 Then
addone col(), pos2, 14
Else
addone col(), 1, 14
End If
        pos2 = k - Len(A$) + 1
        GoTo again

ElseIf FastSymbol(A$, "}") Then
If pos2 > 0 Then
addone col(), pos2, 14
Else
addone col(), 1, 14
End If
        pos2 = k - Len(A$) + 1
        GoTo again

ElseIf pos2 = 0 Then
If IsNumberLabel(A$, drop$) Then
        addone col(), k - Len(A$) - Len(drop$) + 1, 15
        pos2 = k - Len(A$) + 1
        GoTo again
 End If
 End If
If pos2 > 0 Then addone col(), pos2, 14

End Sub
Private Sub ColorizeExpressions(ByVal A$, col(), k As Long, pos2 As Long, feedthis As Long)
Dim drop$, pos1 As Long, kind As Long
Dim lastcol As Long
again:
If A$ = "" Then Exit Sub
drop$ = "@(": kind = Abs(FastSymbol(A$, drop$)) * 4
If kind = 0 Then
If IsSymbol(A$, "@") Then

If pos2 > 0 Then
addone col(), pos2, 14
Else
addone col(), 1, 14
End If
 pos2 = k - Len(A$) + 1
End If
kind = IsLabelOnly(A$, drop$)
End If

If kind = 0 Then drop$ = "$(": kind = Abs(FastSymbol(A$, drop$)) * 4
If kind = 0 Then drop$ = "~(": kind = Abs(FastSymbol(A$, drop$)) * 4
If kind = 0 Then drop$ = ""
If kind > 0 Then
    If ismine(drop$) Then
    lastcol = 11
    If pos2 > 0 Then
       addone col(), pos2, 11
    Else
       addone col(), k - Len(A$) - Len(drop$) + 1, 11
       End If
   Else
   If kind = 10 Then lastcol = 14 Else lastcol = 10
   If pos2 > 0 Then
       addone col(), pos2, lastcol
   Else
       addone col(), k - Len(A$) - Len(drop$) + 1, lastcol
      
       End If
  End If
  pos2 = k - Len(A$) + 1
  If kind > 3 Then
  Do
  pos1 = 1
  drop$ = aheadstatus(A$, False, pos1)
  If pos1 > 1 Then
  ColorizeExpressions Mid$(A$, 1, pos1 - 1), col(), k - Len(A$) + pos1 - 1, pos2, feedthis
  If feedthis > 0 And pos1 >= Len(A$) Then Exit Sub
  feedthis = 0
   A$ = Mid$(A$, pos1)
   End If
   If FastSymbol(A$, ",") Then
     addone col(), pos2, 14
    pos2 = k - Len(A$) + 1
   Else
   Exit Do
   End If
   Loop
    If FastSymbol(A$, ")") Then
  addone col(), pos2, lastcol
    pos2 = k - Len(A$) + 1
  End If
  End If

GoTo again
ElseIf IsSymbol(A$, ",") Then
addone col(), pos2, 14
pos2 = k - Len(A$) + 1
    GoTo again
ElseIf MaybeIsSymbol(A$, "{", , True) Then
addone col(), pos2, 15

drop$ = blockString(A$)
If drop$ <> "" Or (drop$ = "" And Left$(A$, 1) = "}") Then
feedthis = 0

If Not MaybeIsSymbol(A$, "}", , True) Then feedthis = 15
Else
feedthis = 15
End If
drop$ = ""
pos2 = k - Len(A$) + 1
If feedthis = 15 Then Exit Sub
    GoTo again

ElseIf MaybeIsSymbol(A$, Chr(34)) Then

If Not ISSTRINGA(A$, drop$) Then
A$ = ""
addone col(), pos2, 10
Else
addone col(), pos2, 15
End If
drop$ = ""
pos2 = k - Len(A$) + 1
    GoTo again

Else
addone col(), pos2, 14
A$ = Mid$(A$, 2)
    pos2 = k - Len(A$) + 1
    GoTo again

 End If
If pos2 > 0 Then addone col(), pos2, 14



End Sub

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Offtopic

 

 

Θες να γράψεις ένα παράδειγμα όπου είναι αναγκαία η χρήση του goto (δηλαδή ο κώδικας έχει σχεδιαστεί σωστά αλλά η χρήση του goto θα μας δώσει πιο readable κώδικα); Δε μιλάω για κώδικα 300 γραμμών σε vb6, πιο πολύ ένα μικρό παράδειγμα με ψευδοκώδικα ή ακόμα και με λόγια. Γιατί ο μόνος λόγος που μπορώ να σκεφτώ για τη χρήση του goto είναι κάποιο τρελό optimization σε embedded ή κάτι τέτοιο (δε λέω ότι με goto γίνεται το optimization, απλώς είναι το μόνο context που εμένα τουλάχιστον μου φαίνεται λογικό να χρησιμοποιηθεί).

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Offtopic

 

 

Θες να γράψεις ένα παράδειγμα όπου είναι αναγκαία η χρήση του goto (δηλαδή ο κώδικας έχει σχεδιαστεί σωστά αλλά η χρήση του goto θα μας δώσει πιο readable κώδικα); Δε μιλάω για κώδικα 300 γραμμών σε vb6, πιο πολύ ένα μικρό παράδειγμα με ψευδοκώδικα ή ακόμα και με λόγια. Γιατί ο μόνος λόγος που μπορώ να σκεφτώ για τη χρήση του goto είναι κάποιο τρελό optimization σε embedded ή κάτι τέτοιο (δε λέω ότι με goto γίνεται το optimization, απλώς είναι το μόνο context που εμένα τουλάχιστον μου φαίνεται λογικό να χρησιμοποιηθεί).

 

 

Offtopic

 

 

Ναι, υπάρχουν περιπτώσεις που η χρήση goto θα κατέληγε σε ευανάγνωστο κώδικα.

Single point of exit:

char *malloc_wrp(size_t bytes)
{
    if (length <= 0) goto ERROR;

    char *s_ptr = malloc(bytes);
    if (!s_ptr) goto ERROR;

    return s_ptr;

ERROR:
    return NULL;
} 

Εντελώς χαζό παράδειγμα, δε χρειάζεται να δούμε τί κάνει, αλλά όταν έχουμε ένα μαζεμένα τα return σε ένα σημείο, τότε όλα φαίνονται πιο ξεκάθαρα.

 

Άλλο case είναι όταν θες να βγεις από ένα τρίπατο nested loop. Δε θα μπλέξεις προφανώς με breaks και ifs σε κάθε επίπεδο. Θα βάλεις μία goto. Αν και για να έφτασες σε αυτό το σημείο τότε κάτι πάει στραβά από άποψη σχεδιασμού.

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Να ξεκαθαρίσω, δεν γίνεται όπως το σκέφτεσαι Kercyn. Δηλαδή να έχουμε ήδη μια στρωτή περίπτωση δίχως Goto και να πάμε στο Goto. Δεν συζητώ για Optimization. Αν και βοηθάει το goto αν δεν θέλουμε να καλέσουμε ρουτίνα/διαδικασία.

 

Συζητώ για την χρήση του από την αρχή επειδή είναι το μόνο φάρμακο! Δεν γίνεται να μην το χρησιμοποιήσεις όταν έχεις φωλιασμένες επαναλήψεις και εσωτερικά πολλαπλά Αν που αν επιλεγούν τότε ως τελευταία εντολή ορίζουν σε ποια εξωτερική επανάληψη θα ξαναμπεί η ροή.

 

Με πρόλαβε ο gon1332..

 

Να ένα παράδειγμα με Goto...Το έφτιαξα ειδικά για εδώ! Σε Μ2000.

 

 

 

 Α$="   +13243.423423, "
Κ=Μήκος(Α$)
Αν Κ=0 τότε έξοδος
ι=1
Β$=Μεσ$(Α$,ι,1)
προ=ψευδές
δεκ=Ψευδές
κενά=1
{
οκ5:
Αν Β$=" " τότε κενά++ : προς οκ0
οκ4:
Αν προ Αλλιώς Αν Β$ ~ "[+-]" τότε προ~ : προς οκ1
προ=αληθές
οκ3:
Αν δεκ Αλλιώς Αν Β$ = "." τότε δεκ~ : προς οκ1
οκ2:
Αν όχι Β$ ~ "[1234567890]" τότε Αν όχι Β$ ~ "[ ,]" Τότε { λαθος "οχι αριθμός"} Αλλιώς Έξοδος
οκ1:
ι++
Αν ι<=κ τότε {
       Β$=Μεσ$(Α$,Ι,1)
       Αν προ και όχι δεκ τότε προς οκ3
       Αν προ και δεκ τότε προς οκ2
       προς οκ4
}
οκ0:
Αν ι<κ τότε ι++ : Β$=Μεσ$(Α$,Ι,1) : Προς οκ5
Αν ι=κενά και προ τότε Λαθος "μόνο πρόσημο"
Αν ι=κενά και δεκ τότε Λαθος "μόνο τελεία"
Αν ι=κενά και δεκ και προ τότε Λάθος "Δεν έχω αριθμό"
Αν κ<κενά τότε Λάθος "Δεν έχω αριθμό"
}
Τύπωσε "Σωστός Αριθμός", Μες$(Α$, κενά, ι-κενά)

 

 

 

 

Επεξ/σία από M2000
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...