• Καλώς ήρθατε στο Μαθήματα Ανάπτυξης Λογισμικού & Κωδικοποίησης.
 

Τελευταία μηνύα

#1
Kotlin / Kotlin: Κατασκευή Απλού Χρονομ...
Τελευταίο μήνμα από Arzuy - Απρ 01, 2025, 12:02 ΜΜ
Η Kotlin είναι μια σύγχρονη γλώσσα προγραμματισμού που χρησιμοποιείται ευρέως για την ανάπτυξη εφαρμογών Android. Σε αυτό το άρθρο, θα δείξουμε πώς να δημιουργήσετε ένα απλό χρονόμετρο (stopwatch) χρησιμοποιώντας την Kotlin. Θα σας δώσουμε έναν πλήρη οδηγό με παραδείγματα κώδικα για να ξεκινήσετε εύκολα. Αυτός ο οδηγός είναι ιδανικός για αρχάριους και για όσους θέλουν να εξασκήσουν τις δεξιότητές τους στην Kotlin.

Τι θα χρειαστούμε;
Για να φτιάξουμε ένα απλό χρονόμετρο, θα χρησιμοποιήσουμε:
  • Μια διεπαφή χρήστη (UI) με κουμπιά για έναρξη, παύση και επαναφορά.
  • Την κλάση CountDownTimer ή έναν χειροκίνητο χρονοδιακόπτη με Handler.
  • Βασικές γνώσεις Kotlin και XML για το layout.
Ας ξεκινήσουμε!

Βήμα 1: Ρύθμιση του Layout (XML)
Πρώτα, δημιουργούμε το layout της εφαρμογής στο αρχείο activity_main.xml:

Κώδικας [Επιογή]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/timerText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="00:00"
        android:textSize="40sp"
        android:textStyle="bold"/>

    <Button
        android:id="@+id/startButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Έναρξη"
        android:layout_marginTop="20dp"/>

    <Button
        android:id="@+id/pauseButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Παύση"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/resetButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Επαναφορά"
        android:layout_marginTop="10dp"/>

</LinearLayout>


Αυτό το layout περιλαμβάνει ένα TextView για την εμφάνιση του χρόνου και τρία κουμπιά: Έναρξη, Παύση και Επαναφορά.

Βήμα 2: Κώδικας Kotlin για το Χρονόμετρο
Στο αρχείο MainActivity.kt, υλοποιούμε τη λογική του χρονομέτρου χρησιμοποιώντας έναν Handler για να ενημερώνουμε το χρόνο κάθε δευτερόλεπτο.

Κώδικας [Επιογή]
package com.example.stopwatch

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.appcompat.app.AppCompatActivity
import com.example.stopwatch.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private var seconds = 0
    private var isRunning = false
    private val handler = Handler(Looper.getMainLooper())

    private val runnable = object : Runnable {
        override fun run() {
            if (isRunning) {
                seconds++
                updateTimerText()
                handler.postDelayed(this, 1000) // Εκτέλεση κάθε 1 δευτερόλεπτο
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Κουμπί Έναρξης
        binding.startButton.setOnClickListener {
            if (!isRunning) {
                isRunning = true
                handler.post(runnable)
            }
        }

        // Κουμπί Παύσης
        binding.pauseButton.setOnClickListener {
            isRunning = false
            handler.removeCallbacks(runnable)
        }

        // Κουμπί Επαναφοράς
        binding.resetButton.setOnClickListener {
            isRunning = false
            handler.removeCallbacks(runnable)
            seconds = 0
            updateTimerText()
        }

        updateTimerText()
    }

    private fun updateTimerText() {
        val minutes = seconds / 60
        val secs = seconds % 60
        val time = String.format("%02d:%02d", minutes, secs)
        binding.timerText.text = time
    }
}



Επεξήγηση του Κώδικα
  • Μεταβλητές:
    • seconds: Μετράει τα δευτερόλεπτα.
    • isRunning: Ελέγχει αν το χρονόμετρο τρέχει.
    • handler: Εκτελεί τον κώδικα σε τακτά χρονικά διαστήματα.
  • Runnable: Ενημερώνει τον χρόνο κάθε δευτερόλεπτο αν το isRunning είναι true.
  • Λειτουργίες Κουμπιών:
    • Έναρξη: Ξεκινά το χρονόμετρο.
    • Παύση: Σταματά το χρονόμετρο χωρίς να μηδενίζει τον χρόνο.
    • Επαναφορά: Μηδενίζει τον χρόνο και σταματά το χρονόμετρο.
  • updateTimerText: Μετατρέπει τα δευτερόλεπτα σε μορφή "MM:SS" και ενημερώνει το TextView.

Εναλλακτική Μέθοδος με CountUpTimer
Αν θέλετε μια πιο προσαρμοσμένη λύση, μπορείτε να δημιουργήσετε μια κλάση CountUpTimer:

Κώδικας [Επιογή]
abstract class CountUpTimer(private val interval: Long) {
    private var handler = Handler(Looper.getMainLooper())
    private var elapsedTime = 0L

    private val runnable = object : Runnable {
        override fun run() {
            elapsedTime += interval
            onTick(elapsedTime)
            handler.postDelayed(this, interval)
        }
    }

    fun start() {
        handler.post(runnable)
    }

    fun stop() {
        handler.removeCallbacks(runnable)
    }

    fun reset() {
        stop()
        elapsedTime = 0L
        onTick(elapsedTime)
    }

    abstract fun onTick(millisElapsed: Long)
}

// Χρήση στην MainActivity
val timer = object : CountUpTimer(1000) {
    override fun onTick(millisElapsed: Long) {
        val secs = millisElapsed / 1000
        val minutes = secs / 60
        val seconds = secs % 60
        binding.timerText.text = String.format("%02d:%02d", minutes, seconds)
    }
}

binding.startButton.setOnClickListener { timer.start() }
binding.pauseButton.setOnClickListener { timer.stop() }
binding.resetButton.setOnClickListener { timer.reset() }



Συμβουλές για τη Βελτίωση
  • Στυλ: Προσαρμόστε το UI με χρώματα και γραμματοσειρές.
  • Ακρίβεια: Χρησιμοποιήστε μικρότερα διαστήματα (π.χ. 100ms) για πιο ακριβές χρονόμετρο.
  • Αποθήκευση: Αποθηκεύστε τον χρόνο σε SharedPreferences για να μην χαθεί κατά την περιστροφή οθόνης.

Συμπέρασμα
Η δημιουργία ενός απλού χρονομέτρου στην Kotlin είναι ένας εξαιρετικός τρόπος να μάθετε βασικές έννοιες όπως η διαχείριση γεγονότων και η ενημέρωση της διεπαφής χρήστη. Με τα παραδείγματα που δώσαμε, μπορείτε να ξεκινήσετε άμεσα και να προσαρμόσετε τον κώδικα στις δικές σας ανάγκες. Δοκιμάστε το και εξερευνήστε περισσότερες δυνατότητες της Kotlin!
#2
Python / Python NumPy: Δομή Πινάκων (Ar...
Τελευταίο μήνμα από Arzuy - Απρ 01, 2025, 11:59

Η βιβλιοθήκη NumPy είναι ένα από τα πιο ισχυρά εργαλεία στην Python για την επεξεργασία αριθμητικών δεδομένων και τη δημιουργία πινάκων (arrays). Χρησιμοποιείται ευρέως σε επιστημονικούς υπολογισμούς, ανάλυση δεδομένων και μηχανική μάθηση. Σε αυτό το άρθρο, θα εξετάσουμε τη δομή των πινάκων NumPy, πώς να τους δημιουργήσουμε και να τους χειριστούμε, με πρακτικά παραδείγματα κώδικα. Αυτός ο οδηγός είναι ιδανικός για αρχάριους και για όσους θέλουν να εμβαθύνουν τις γνώσεις τους.

Τι είναι η NumPy και οι Πίνακες της;
Η NumPy (Numerical Python) είναι μια βιβλιοθήκη ανοιχτού κώδικα που προσφέρει υποστήριξη για πολυδιάστατους πίνακες και μαθηματικές λειτουργίες. Οι πίνακες της NumPy (arrays) είναι παρόμοιοι με τις λίστες της Python, αλλά πιο αποδοτικοί και κατάλληλοι για μαθηματικές πράξεις.

Για να ξεκινήσουμε, πρέπει πρώτα να εγκαταστήσουμε τη NumPy (αν δεν είναι ήδη εγκατεστημένη):

Κώδικας [Επιογή]
pip install numpy


Δημιουργία Πινάκων NumPy
Ας δούμε πώς μπορούμε να δημιουργήσουμε πίνακες με τη NumPy και τις βασικές της λειτουργίες.

1. Δημιουργία Πίνακα από Λίστα
Μπορούμε να μετατρέψουμε μια λίστα Python σε πίνακα NumPy χρησιμοποιώντας τη συνάρτηση array().

Κώδικας [Επιογή]
import numpy as np

# Δημιουργία μονοδιάστατου πίνακα
lista = [1, 2, 3, 4]
pinakas = np.array(lista)

print(pinakas)  # Έξοδος: [1 2 3 4]
print(type(pinakas))  # Έξοδος: <class 'numpy.ndarray'>


2. Δημιουργία Πολυδιάστατου Πίνακα
Οι πίνακες NumPy μπορούν να είναι πολυδιάστατοι (2D, 3D κ.λπ.).

Κώδικας [Επιογή]
import numpy as np

# Δημιουργία 2D πίνακα
pinakas_2d = np.array([[1, 2, 3], [4, 5, 6]])

print(pinakas_2d)
# Έξοδος:
# [[1 2 3]
#  [4 5 6]]
print("Διαστάσεις:", pinakas_2d.shape)  # Έξοδος: (2, 3)



Βασικές Λειτουργίες με Πίνακες NumPy
1. Αριθμητικές Πράξεις
Οι πίνακες NumPy επιτρέπουν εύκολες μαθηματικές πράξεις στοιχείο-προς-στοιχείο.

Κώδικας [Επιογή]
import numpy as np

pinakas1 = np.array([1, 2, 3])
pinakas2 = np.array([4, 5, 6])

# Πρόσθεση
athroisma = pinakas1 + pinakas2
print("Πρόσθεση:", athroisma)  # Έξοδος: [5 7 9]

# Πολλαπλασιασμός
pollaplasiasmos = pinakas1 * 2
print("Πολλαπλασιασμός:", pollaplasiasmos)  # Έξοδος: [2 4 6]


2. Δημιουργία Πινάκων με Ειδικές Τιμές
Η NumPy προσφέρει συναρτήσεις για τη δημιουργία πινάκων με μηδενικά, μονάδες ή τυχαίες τιμές.

Κώδικας [Επιογή]
import numpy as np

# Πίνακας με μηδενικά
midena = np.zeros((2, 3))
print("Μηδενικά:\n", midena)
# Έξοδος:
# [[0. 0. 0.]
#  [0. 0. 0.]]

# Πίνακας με μονάδες
monades = np.ones((2, 2))
print("Μονάδες:\n", monades)
# Έξοδος:
# [[1. 1.]
#  [1. 1.]]

# Τυχαίος πίνακας
tyxaios = np.random.rand(3)
print("Τυχαίος:", tyxaios)  # Έξοδος: π.χ. [0.23 0.67 0.89]


3. Τεμαχισμός (Slicing) Πινάκων
Μπορούμε να επιλέξουμε τμήματα ενός πίνακα χρησιμοποιώντας τεμαχισμό.

Κώδικας [Επιογή]
import numpy as np

pinakas = np.array([10, 20, 30, 40, 50])

# Επιλογή πρώτων 3 στοιχείων
temaxia = pinakas[:3]
print("Τεμάχια:", temaxia)  # Έξοδος: [10 20 30]

# Επιλογή στοιχείων από το 2ο έως το τέλος
temaxia2 = pinakas[1:]
print("Από 2ο και μετά:", temaxia2)  # Έξοδος: [20 30 40 50]



Χαρακτηριστικά Πινάκων NumPy
  • Διαστάσεις (shape): Υποδεικνύει το μέγεθος του πίνακα (γραμμές, στήλες).
  • Τύπος Δεδομένων (dtype): Καθορίζει τον τύπο δεδομένων (int, float κ.λπ.).
  • Μέγεθος (size): Συνολικός αριθμός στοιχείων.

Παράδειγμα:

Κώδικας [Επιογή]
import numpy as np

pinakas = np.array([[1, 2], [3, 4]])
print("Διαστάσεις:", pinakas.shape)  # Έξοδος: (2, 2)
print("Τύπος δεδομένων:", pinakas.dtype)  # Έξοδος: int64
print("Μέγεθος:", pinakas.size)  # Έξοδος: 4



Συμβουλές για τη Χρήση της NumPy
  • Απόδοση: Οι πίνακες NumPy είναι ταχύτεροι από τις λίστες Python χάρη στη βελτιστοποιημένη εσωτερική υλοποίηση.
  • Μαθηματικές Συναρτήσεις: Χρησιμοποιήστε ενσωματωμένες συναρτήσεις όπως np.sum(), np.mean(), np.max() για γρήγορους υπολογισμούς.
  • Τεκμηρίωση: Εξερευνήστε την επίσημη τεκμηρίωση της NumPy για περισσότερες δυνατότητες.

Συμπέρασμα
Η NumPy είναι απαραίτητη για κάθε προγραμματιστή Python που ασχολείται με αριθμητικά δεδομένα. Σε αυτό το άρθρο, εξετάσαμε τη βασική δομή των πινάκων, τη δημιουργία τους και τον χειρισμό τους με παραδείγματα κώδικα. Δοκιμάστε τα παραδείγματα μόνοι σας και πειραματιστείτε για να ανακαλύψετε τις δυνατότητες της NumPy!
#3
C# / C# τιμές ανταλλαγής δύο μεταβλ...
Τελευταίο μήνμα από Arzuy - Δεκ 04, 2024, 10:46
#4
C# / C# Επαυξημένοι Χειριστές Εκχώρ...
Τελευταίο μήνμα από Arzuy - Δεκ 04, 2024, 10:46
#5
C# / C# αριθμητικοί τελεστές (Βίντε...
Τελευταίο μήνμα από Arzuy - Δεκ 04, 2024, 10:45
#6
C# / Τύποι δεδομένων C# (Βίντεο Μάθ...
Τελευταίο μήνμα από Arzuy - Δεκ 04, 2024, 10:44
#7
C# / Μεταβλητές C# (Εφαρμοσμένη Αφή...
Τελευταίο μήνμα από Arzuy - Δεκ 04, 2024, 10:44
#8
SQL / Πρωτεύοντα και ξένα κλειδιά SQ...
Τελευταίο μήνμα από Arzuy - Δεκ 04, 2024, 10:43
#9
SQL / SQL παραγγελία με Ταξινόμηση λ...
Τελευταίο μήνμα από Arzuy - Δεκ 04, 2024, 10:42
#10
SQL / SQL όπου και φιλτράρισμα δεδομ...
Τελευταίο μήνμα από Arzuy - Δεκ 04, 2024, 10:42