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ürBu 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.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayProje 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:
- 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
- Bu dize değerlerini tam sayılara dönüştürün ve
time.Datekullanarak bir proje başlangıç zamanı oluşturun (konum içintime.UTC, saniye ve nanosaniye için 0 kullanın) - Bireysel görev girişlerini almak için ikinci girdiyi virgüllerden ayırarak ayrıştırın
- 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
- Süre değerlerini tam sayılara dönüştürün ve uygun sabitleri kullanarak
time.Durationnesneleri oluşturun:"Day"için:24 * time.Hourile çarpın"Week"için:7 * 24 * time.Hourile çarpın"Hour"için:time.Hourile çarpın
- Uygulama başlığını görüntüleyin:
"=== PROJECT DEADLINE CALCULATOR ===" - Proje başlangıcını görüntüleyin:
"Project start time: [start_time_object]" - 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):
- Her görev için şunları görüntüleyin:
"Task: [task_name]"" Duration: [duration_object]"" Start: [task_start_time]"" End: [task_end_time]"(Addmetodu kullanılarak hesaplanır)
- 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ındaSubmetodu kullanılarak hesaplanır)
- 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])"
- 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)
- 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"
- 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ürHer 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
}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
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar