Menu
Coddy logo textTech

Zaman Aritmetiği

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 63 / 68.

Artık time.Time nesnelerini ve time.Duration değerlerini anladığınıza göre, geçmiş veya gelecek zamanları hesaplamak için aritmetik işlemler gerçekleştirebilirsiniz. Go, zaman aritmetiği için iki temel yöntem sunar: Add ve Sub.

Add yöntemi bir time.Duration alır ve orijinal zaman artı süreyi temsil eden yeni bir time.Time döndürür:

now := time.Now()
tomorrow := now.Add(24 * time.Hour)
fmt.Println(tomorrow)

Sub yöntemi iki şekilde çalışır. Bir time.Time değerini diğerinden çıkardığınızda, aralarındaki farkı temsil eden bir time.Duration döndürür:

start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // 2h0m0s döndürür

Bu yöntemler; son teslim tarihlerini hesaplamayı, geçen süreyi ölçmeyi veya gelecekteki etkinlikleri planlamayı kolaylaştırır. Orijinal time.Time nesnesi değişmeden kalır; Go'nun değişmez (immutable) işlem tercihine uygun olarak her iki yöntem de yeni değerler döndürür.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

challenge icon

Görev

Kolay

Proje kilometre taşlarını ve son teslim tarihlerini belirlemek için zaman aritmetiğini kullanan bir proje son teslim tarihi hesaplayıcısı oluşturun. Bu zorluk, gelecekteki tarihleri ve olaylar arasındaki zaman farklarını hesaplamak için time.Time nesneleri üzerindeki Add ve Sub metotlarını kullanma yeteneğinizi test edecektir.

İki girdi alacaksınız:

  • "year:month:day:hour:minute" formatında proje başlangıç bilgilerini içeren bir dize (örneğin, "2024:1:15:9:0")
  • "task1:duration_value:duration_unit,task2:duration_value:duration_unit" formatında görev sürelerini içeren bir dize (örneğin, "Planning:5:Day,Development:3:Week,Testing:10:Day")

Göreviniz şunları yapmaktır:

  1. Yıl, ay, gün, saat ve dakika değerlerini çıkarmak için ilk girdiyi iki nokta üst üste işaretlerinden ayırarak ayrıştırın
  2. Bu dize değerlerini tam sayılara dönüştürün ve time.Date kullanarak bir proje başlangıç zamanı oluşturun (konum için time.UTC, saniye ve nanosaniye için 0 kullanın)
  3. Bireysel görev girişlerini almak için ikinci girdiyi virgüllerden ayırarak ayrıştırın
  4. Her görev girişi için, görev adını, süre değerini ve süre birimini çıkarmak üzere iki nokta üst üste işaretlerinden ayırın
  5. Süre değerlerini tam sayılara dönüştürün ve uygun sabitleri kullanarak time.Duration nesneleri oluşturun:
    • "Day" için: 24 * time.Hour ile çarpın
    • "Week" için: 7 * 24 * time.Hour ile çarpın
    • "Hour" için: time.Hour ile çarpın
  6. Uygulama başlığını görüntüleyin: "=== PROJECT DEADLINE CALCULATOR ==="
  7. Proje başlangıcını görüntüleyin: "Project start time: [start_time_object]"
  8. Her bir görev süresini önceki görevin bitiş zamanına ekleyerek görev son tarihlerini hesaplayın (ilk görev proje başlangıç zamanında başlar):
  9. Her görev için şunları görüntüleyin:
    • "Task: [task_name]"
    • " Duration: [duration_object]"
    • " Start: [task_start_time]"
    • " End: [task_end_time]" (Add metodu kullanılarak hesaplanır)
  10. Proje zaman çizelgesini hesaplayın ve görüntüleyin:
    • "=== PROJECT TIMELINE ==="
    • "Project start: [start_time_object]"
    • "Project end: [final_task_end_time]"
    • "Total project duration: [total_duration_object]" (proje bitişi ve başlangıcı arasında Sub metodu kullanılarak hesaplanır)
  11. Görev analizini görüntüleyin:
    • "=== TASK ANALYSIS ==="
    • "Number of tasks: [number_of_tasks]"
    • "Longest task: [longest_task_name] ([longest_duration_object])"
    • "Shortest task: [shortest_task_name] ([shortest_duration_object])"
  12. Ardışık görevler arasındaki süreyi hesaplayın ve boşlukları görüntüleyin:
    • "=== TASK TRANSITIONS ==="
    • Her ardışık görev çifti için: "[first_task_name] to [second_task_name]: [time_difference_object]" (görevler ardışık olduğu için 0 olmalıdır)
  13. Proje istatistiklerini görüntüleyin:
    • "=== PROJECT STATISTICS ==="
    • "Total working days: [total_duration_in_hours_divided_by_24]"
    • "Total working hours: [total_duration_in_hours]"
    • "Project spans [number_of_calendar_days] calendar days"
  14. Tamamlanma mesajını görüntüleyin: "Project timeline calculation completed successfully"

Zaman işlemleri için time paketini, girdi dizelerini ayırmak için strings paketini, dizeleri tam sayılara dönüştürmek için strconv paketini ve formatlı çıktı için fmt paketini kullanın. Add metodunun orijinal zaman artı süreyi temsil eden yeni bir time.Time nesnesi döndürdüğünü ve Sub metodunun iki zaman arasındaki farkı temsil eden bir time.Duration döndürdüğünü unutmayın. Bu zorluk, zaman aritmetiği işlemlerini kullanarak eksiksiz bir proje zaman çizelgesinin nasıl oluşturulacağını gösterir.

Kopya kağıdı

Go, zaman aritmetiği için iki temel yöntem sunar: Add ve Sub.

Add yöntemi bir time.Duration alır ve yeni bir time.Time döndürür:

now := time.Now()
tomorrow := now.Add(24 * time.Hour)

Sub yöntemi bir time.Time değerini diğerinden çıkarır ve bir time.Duration döndürür:

start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // 2h0m0s döndürür

Her iki yöntem de orijinal time.Time nesnesini değiştirmeden yeni değerler döndürür.

Kendin dene

package main

import (
	"fmt"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Girdiyi oku
	var startInfo string
	var taskInfo string
	fmt.Scanln(&startInfo)
	fmt.Scanln(&taskInfo)
	
	// Başlangıç zamanı bilgisini ayrıştır
	startParts := strings.Split(startInfo, ":")
	year, _ := strconv.Atoi(startParts[0])
	month, _ := strconv.Atoi(startParts[1])
	day, _ := strconv.Atoi(startParts[2])
	hour, _ := strconv.Atoi(startParts[3])
	minute, _ := strconv.Atoi(startParts[4])
	
	// Proje başlangıç zamanını oluştur
	startTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
	
	// Görev bilgisini ayrıştır
	taskEntries := strings.Split(taskInfo, ",")
	
	// TODO: Kodunuzu aşağıya yazın
	// - İsim, süre değeri ve birimi çıkarmak için her bir görev girişini işleyin
	// - Her görev için süre nesneleri oluşturun
	// - Görev başlangıç ve bitiş zamanlarını hesaplayın
	// - En uzun ve en kısa görevleri bulun
	// - Proje istatistiklerini hesaplayın
	// - Gerekli tüm çıktı bölümlerini görüntüleyin
	
	// Çıktı, yukarıdaki uygulamanız tarafından oluşturulacaktır
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler