Gönderen Konu: Problem: Hasta Saat(Kolay)  (Okunma sayısı 11629 defa)

Çevrimdışı batı

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 126
Problem: Hasta Saat(Kolay)
« : Aralık 04, 2008, 12:01:05 ÖÖ »
Problem Demeci:

Lewis Carroll'a göre, durmuş bir saat, 5 dakika geri bir saatten daha doğrudur. Der ki, durmuş olan günde 2 defa doğru zamanı gösterir, ama 5 dakika geri olan saat, doğru zamanı hiç göstermez. Aslında her zaman 5 dakika geri olan saat, bir bakıma mükemmel çalışır. Fakat genellikle saatin geri yada ileri olmasının sebebi farklı hızda çalışıyor olmasıdır. O yüzden gerçek zamanla olan uyumsuzluğu sürekli değişir. Böyle bir saat eğer ayarlanmazsa, doğru zamanı er ya da geç gösterecektir.

Size iki adet "hh:mm:ss" biçiminde karakter katarı(string) verilecek. İlki, olması gereken gerçek zamanı, ikincisi hastalıklı saatimizin gösterdiği zamanı temsil edecek. Bu hastalıklı saat öyle birşey ki, sabit ama olması gerekenden daha yavaş veya daha hızlı dönüyor. Yani saat başı bir tamsayı değeri kadar ileri gidiyor. Yapılması gereken, hastalıklı saatin doğru saati ilk göstereceği zaman aralığını hesaplamak.

Tanım:

Problem: HastaSaat
Metod: sonrakiBulusma
Parametreler: String, String, int
Döndürülen:
double

double sonrakiBulusma(String gercekSaat, String hastaSaat, int saatlikKazanc)
İsterseniz String yerine karakter katarı da kullanabilirsiniz. "char[]"

Notlar:

- gercekSaat ve hastaSaat "hh:mm:ss" (hour, minute, second) (saat, dakika, saniye) formatında yazılmış olup 8 karakter taşır içinde. "hh", 01-12 arasında değişirken "mm" ve "ss" 00-59 arasında değişir.
-saatlikKazanc -1800 ile 3600 arasında değişen bir tamsayıdır. '-' olması saatin geri kaldığını, + olması ileri gittiğini belirtir.

Örnekler:

0)

gercekSaat: "07:07:07"
hastaSaat:   "07:07:07"
saatlikKazanc: 354

Döndürdüğü değer: 0.0

Saat zaten doğruyu gösteriyor. O yüzden döndürdüğü değer 0 olmalı.

1)

gercekSaat: "11:59:58"
hastaSaat:   "12:03:28"
saatlikKazanc: -3

Döndürdüğü değer: 70.0

Bu hastaSaat her saat 3 saniye kaybediyor. Gerçek zamanı 70 saat içinde yakalar.

2)

gercekSaat: "03:03:02"
hastaSaat:   "03:01:47"
saatlikKazanc: 5

Döndürdüğü değer: 15.0

3)

gercekSaat: "03:03:02"
hastaSaat:   "03:01:47"
saatlikKazanc: -5

Döndürdüğü değer: 8625.0

4)

gercekSaat: "07:08:09"
hastaSaat:   "09:08:07"
saatlikKazanc: -321

Döndürdüğü değer: 22.42367601246106



Varsa canı sıkılan, çözmeye çalışsın. Soru için ->Kolay yazdığıma bakmayın, zorların yanında kolay, yoksa o kadar da kolay değil. Takıldığınız yerde istediğiniz soruları sorabilirsiniz. Ya da ne yapmanız gerektiğinizi anlamadıysanız filan sormaktan çekinmeyin. Bu ilk örnek olduğu için muhtemelen kimse birşey yapmayacak bende çözümü vereceğim sizlere, ama en azından uğraşırsanız ve birşeyler çıkartırsanız sevinirim. Bir de, "ben çözemedim ama konsepti sevdim, bu tarz sorular gelmeye devam etsin uğraşalım." ya da "bu ne ya, amma saçmalamışsınız bunla mı uğraşcaz" gibi düşünceleriniz varsa da söyleyin yani biz de boşuna uğraşmayalım :)
Kendimi durduracak değilim...

Çevrimdışı batı

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 126
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #1 : Aralık 05, 2008, 10:21:19 ÖS »
Tam beklediğim gibi kimse birşey yazmamış. Olsun önemli değil, bir ipucu veriyorum.

Karakter katarı ya da string olarak aldığımız zaman değişkenini nasıl bir tamsayı'ya çeviririz?
Yani bize gelen bilgi "10:30:00" gibi bir bilgi olacağından bunun saat, dakika ya da saniye cinsinden karşılığını bulmamız, işlem yapma açısından işimizi kolaylaştıracaktır. Yani saatin 10buçuk olması kaç saniye eder bunu hesaplamak istesek mesela nasıl yaparız?

gercekSaat'in "11:30:00" a eşit olduğunu düşünelim ve bunun kaç saat olduğunu bulmaya çalışalım. (cevabın 11 etmesi gerekir.)

gercekSaat, bir dizi olduğu için bu dizinin 0. elemanı bize '1' vermelidir. Yani gercekSaat[0] = '1' dir. Bunun gibi gercekSaat[1] = '1' , gercekSaat[2] = ':', gercekSaat[3] = '3', gercekSaat[4] = '0' ve böyle devam eder. Fakat burada dikkat edilmesi gereken nokta alınan değerlerin karakter tipinde olduğu, tamsayı olmadığıdır. Yani siz gercekSaat[0] üzerinde matematiksel bir işlem yapmaya kalkarsanız istediğiniz sonuçları elde edemezsiniz çünkü gercekSaat[0] karakter olarak '1' etse de, tamsayı olarak sizin de tecrübe edebileceğiniz gibi karşılığı 49 dur.

Ne alaka diye soracak olursanız, ASCII tablosunda (http://www.asciitable.com/) '1' karakterinin değeri 49'dur. Her rakam, kendisine 48 eklenerek çıkar karşımıza. Bu yüzden eğer bir karakterin sayısal değeri üzerinde işlem yapmak istiyorsak, onun int (yani tamsayı) değerinden 48 çıkartmamız gerekecektir. Diyelim ki gercekSaat[0] değerini 10' la çarpıp üzerine gercekSaat[1] değerini eklemek istiyoruz.

int saat = (int(gercekSaat[0]) - 48) * 10 + (int(gercekSaat[1]) - 48);

(int(gercekSaat[0]) - 48) * 10 => gercekSaat[0] karakterini tamsayıya dönüştür, bu değerden 48 çıkart ve sonucu 10 ile çarp.

Burada adım adım inceleyebilirsiniz ne yaptığımızı...

gercekSaat[0] = '1' (karakter)
int(gercekSaat[0]) = 49 (tamsayı)
int(gercekSaat[0]) - 48 = 1 (tamsayı)
(int(gercekSaat[0]) - 48) * 10 = 10 (tamsayı)
(int(gercekSaat[0]) - 48) * 10 + (int(gercekSaat[1]) - 48) = 11 (tamsayı)

Bu kadar ipucu şimdilik yeter sanırım. Hadi kolay gelsin.
Kendimi durduracak değilim...

Çevrimdışı Mustafa Tiftikçi

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 162
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #2 : Aralık 06, 2008, 12:03:22 ÖÖ »
yaa pardon ama ben bu saatlikKazanc ın neyi ifade ettiğini anlayamadım ? :S :S

Çevrimdışı Hasan Murat

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 828
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #3 : Aralık 06, 2008, 04:14:56 ÖÖ »
Soruda bi tane bug var..
AM-PM olayında 12 gibi bir saat değeri olmaz.. 0 - 11 dir o : )

Batı seni üzeni üzerim ulan..al sana çalışan program.. c nin dayanılmaz alt seviyeliğine tercih ettim c# ı..

not:soru asıl kafa kullanılacak yer olan güzide üniversitemize hazırlanırken girdiğiniz bir deneme sınavının uzun açıklamalı fakat 10 saniyede cevabını işaretlediğiniz bir sorusu kadar kolay..

Çevrimdışı batı

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 126
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #4 : Aralık 06, 2008, 11:37:49 ÖÖ »
yaa pardon ama ben bu saatlikKazanc ın neyi ifade ettiğini anlayamadım ? :S :S

Birinci örneği inceleyerek saatlikKazanc olayının ne anlama geldiği daha açık görülebilir. Problemin sunuş şekli karmaşık geldiği zaman örneklerden yola çıkarak anlayabilirsiniz. Hasan'ın da söylediği gibi bu sorunun tek satırlık çok kolay bir çözümü var. Ama problemi anlamanız gerekiyor. Saatlik Kazanç olayının ne olduğunu inceleyelim şimdi.

1)

gercekSaat: "11:59:58"
hastaSaat:   "12:03:28"
saatlikKazanc: -3

Döndürdüğü değer: 70.0


hastaSaat'in o anki değeri 12:03:28. Bir saat sonra bu hastaSaat, saatlikKazanc kadar ileri gidecek. Örnekte saatlikKazanc eksi olduğu için bu, hastaSaatin geri gideceği anlamına geliyor. Yani üzerine eklemeniz yeterli.
hastaSaat'in bir saat sonraki değeri = hastaSaat + saatlikKazanc.
Yani eğer hastaSaat 12:03:28 ise bir saat sonra 1:03:25 olacak demektir. Sonraki saat 2:03:22, 3:03:19... Sürekli 3 saniye geride kalacaktır yani.

Hasan bu arada sağolasın program çatır çatır çalışıyor. Tek bir ufak sorun var o da hastaSaat ile gercekSaat eşit olduğu zaman 0 döndürmüyor. Daha güzel sorularımızda var merak etme, yavaştan geliyoruz. :)
Kendimi durduracak değilim...

Çevrimdışı Ufuk Sevim

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 451
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #5 : Aralık 07, 2008, 11:01:13 ÖÖ »
ben de çalışan bir PHP kodu yazdım ancak henüz paylaşmak için erken :) hele birileri bişiler yazsın... o zaman bu soruyu biraz daha güzelleştirelim :) sonraki buluşma hangi tam sayı (!) saat sonra gerçekleşecektir? bu her zaman gerçekleşir mi? gerçekleşme(me)si için gerek ve yeter koşullar nelerdir? :)
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

Çevrimdışı Ilgaz Somer

  • OTOKON Üyesi
  • *
  • İleti: 123
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #6 : Haziran 21, 2011, 06:42:38 ÖS »
Kod: [Seç]
#include<stdio.h>

main()
{
      float x,y,z,a,b,c,fark,saatlikKazanc;
      float dondurulendeger;
   
      printf("Hasta Saat:");
              scanf(" %d:%d:%d", &x, &y,&z ) ;
     
      if( 0< x <= 11 || 0 <= y <= 59 || 0 <= z <= 59 )
      {
          printf("Gercek Saat:");
          scanf(" %d:%d:%d", &a, &b,&c ) ;
   
     
               if( 0< a <= 11 || 0 <= b <= 59 || 0 <= c <= 59 )
               {
               printf("saatlikKazanc:" );
               scanf(" %d", &saatlikKazanc ) ;
               }
     else
     {
          printf("Gercek Saat:");
          scanf(" %d:%d:%d", &a, &b,&c ) ;
     }
     }
       
         fark=  (a-x)*60*60 + (b-y)*60 + (c-z);
                         dondurulendeger = fark/ saatlikKazanc;
                         printf("Dondurulen deger  : %f", dondurulendeger);   
     
     
   
                while(1);
                           
                                 }       
 



Şimdi biraz daha kısaldı sanırım. Biliyorum konu kim bilir kaç yıllıktır ,biraz hortlatmış olabilirim buraları.
İki sorum  var, ben o saat değerlerini string almadım yani direk int oldu onlar, string olsa nasıl olurdu?
Birde istenmeyen saat değerleri girildiğinde program normal bir şekilde çalışmaya düzgün sonuçlar vermeye devam ediyor. Nasıl olur? Çok uğraştım nerde hatalıyım ?
Teşekkürler ^^
« Son Düzenleme: Haziran 21, 2011, 09:01:16 ÖS Gönderen: Ilgaz Somer »

Çevrimdışı Mertcan Cibooğlu

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 883
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #7 : Haziran 22, 2011, 12:16:45 ÖÖ »
Kod: [Seç]
#include<stdio.h>

main()
{
      float x,y,z,a,b,c,fark,saatlikKazanc;
      float dondurulendeger;
   
      printf("Hasta Saat:");
              scanf(" %d:%d:%d", &x, &y,&z ) ;
     
      if( 0< x <= 11 || 0 <= y <= 59 || 0 <= z <= 59 )
      {
          printf("Gercek Saat:");
          scanf(" %d:%d:%d", &a, &b,&c ) ;
   
     
               if( 0< a <= 11 || 0 <= b <= 59 || 0 <= c <= 59 )
               {
               printf("saatlikKazanc:" );
               scanf(" %d", &saatlikKazanc ) ;
               }
     else
     {
          printf("Gercek Saat:");
          scanf(" %d:%d:%d", &a, &b,&c ) ;
     }
     }
       
         fark=  (a-x)*60*60 + (b-y)*60 + (c-z);
                         dondurulendeger = fark/ saatlikKazanc;
                         printf("Dondurulen deger  : %f", dondurulendeger);   
     
     
   
                while(1);
                           
                                 }       
 



Şimdi biraz daha kısaldı sanırım. Biliyorum konu kim bilir kaç yıllıktır ,biraz hortlatmış olabilirim buraları.
İki sorum  var, ben o saat değerlerini string almadım yani direk int oldu onlar, string olsa nasıl olurdu?
Birde istenmeyen saat değerleri girildiğinde program normal bir şekilde çalışmaya düzgün sonuçlar vermeye devam ediyor. Nasıl olur? Çok uğraştım nerde hatalıyım ?
Teşekkürler ^^
kanka düzgün çalışıyor dion hatam nerde dion anlamadım :D, senn programın direk int olarak alıo, string olarak alsaydı bi dizi girmiş gibi olcaktı. O zaman da dizinin ilk elemanı,2. elemanı saatin ASCII haline denk geliyor( üstten alıntı ha :D). Yani sadece ascıı dönüşüm işlemi yapacan bi string alırsan. Ben de deneyecem :D yaparsam o zaman sölerim tam olarak, emin olduğumdan deil. sadece okuduğumu ve anladığımı sölemek istedim :)
son teknoloji robotlar yapacam :D

Çevrimdışı Ilgaz Somer

  • OTOKON Üyesi
  • *
  • İleti: 123
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #8 : Haziran 22, 2011, 12:55:01 ÖÖ »
Olm istemediğimiz değerler girdiğinde de çalışıyor halbuki o kadar şart yazıyorum. Mesela 122 saat 764 dakika 122 saniye gibi .

Çevrimdışı Rıza Özdülger

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 1321
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #9 : Haziran 22, 2011, 09:24:05 ÖÖ »
Kod: [Seç]
#include<stdio.h>

main()
{
      float x,y,z,a,b,c,fark,saatlikKazanc;
      float dondurulendeger;
   
      printf("Hasta Saat:");
              scanf(" %d:%d:%d", &x, &y,&z ) ;
     
      if( 0< x <= 11 || 0 <= y <= 59 || 0 <= z <= 59 )
      {
          printf("Gercek Saat:");
          scanf(" %d:%d:%d", &a, &b,&c ) ;
   
     
               if( 0< a <= 11 || 0 <= b <= 59 || 0 <= c <= 59 )
               {
               printf("saatlikKazanc:" );
               scanf(" %d", &saatlikKazanc ) ;
               }
     else
     {
          printf("Gercek Saat:");
          scanf(" %d:%d:%d", &a, &b,&c ) ;
     }
     }
       
         fark=  (a-x)*60*60 + (b-y)*60 + (c-z);
                         dondurulendeger = fark/ saatlikKazanc;
                         printf("Dondurulen deger  : %f", dondurulendeger);   
     
     
   
                while(1);
                           
                                 }       
 



Şimdi biraz daha kısaldı sanırım. Biliyorum konu kim bilir kaç yıllıktır ,biraz hortlatmış olabilirim buraları.
İki sorum  var, ben o saat değerlerini string almadım yani direk int oldu onlar, string olsa nasıl olurdu?
Birde istenmeyen saat değerleri girildiğinde program normal bir şekilde çalışmaya düzgün sonuçlar vermeye devam ediyor. Nasıl olur? Çok uğraştım nerde hatalıyım ?
Teşekkürler ^^

Olm istemediğimiz değerler girdiğinde de çalışıyor halbuki o kadar şart yazıyorum. Mesela 122 saat 764 dakika 122 saniye gibi .

Yazdığın else'te koşulu sağlamamasına rağmen a,b,c değerlerini almaya devam ediyor.Halbuki koşulunu sağlamadığı için x,y,z değerlerini tekrar alman gerekiyor.(Bunu, doğru değeri alana kadar devam etmen gerekiyor.Yani bunu döngü içinde kontrol etmen gerekebilir.(do-while yapısı))

Ayrıca koşulda or değil ve kullanman doğru olur.Çünkü o koşulların hepsini aynı anda doğru olması gerekiyor.

Aşağıda örnek bir düzeltme yaptım senin kodun üzerinden.Bir incele anlamadığın yerler olursa bakarız tekrar birlikte.Hesaplamanın doğru olup olmamasına bakmadım sadece koşulları düzelttim.

Kod: [Seç]
#include<stdio.h>

main()
{
      float x,y,z,a,b,c,fark,saatlikKazanc;
      float dondurulendeger;
     
      do                                                                           //ilk önce bir kere işi yapıyor do-while yapısı sonra koşulu kontrol ediyor.
      {                                                                            //sonra koşul doğruysa tekrar yapıyor işlemi.yani ilk girişi aldıktan sonra while gibi
                                                                                    //çalışıyor.
                 printf("Hasta Saat:");
                 scanf(" %d:%d:%d", &x, &y,&z );
                
      }while(!(0< x <= 11 && 0 <= y <= 59 && 0 <= z <= 59));  //koşulun içindeki ünlem parantez içindekilerin değil'i anlamında.yani o değerler
                                                                                     //aralığında olmadığı sürece while koşulu doğru olmuş olacak tekrar değer
                                                                                     //isteyecek.
   
      do
      {
                 printf("Gercek Saat:");
                 scanf(" %d:%d:%d", &a, &b,&c ) ;
                 
      }while(!(0< a <= 11 && 0 <= b <= 59 && 0 <= c <= 59))
 
      printf("saatlikKazanc:" );
      scanf(" %d", &saatlikKazanc ) ;
     
      fark=  (a-x)*60*60 + (b-y)*60 + (c-z);
      dondurulendeger = fark/ saatlikKazanc;
      printf("Dondurulen deger  : %f", dondurulendeger);
                            
      while(1);     
}   


"İnsanın bildiğini zannettiği bir şeyi öğrenmesi imkansızdır."  (Epiktetos)

Çevrimdışı Ilgaz Somer

  • OTOKON Üyesi
  • *
  • İleti: 123
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #10 : Haziran 24, 2011, 04:08:21 ÖS »
Sağıol rıza ilgin için de hala ben benim if'lerin neden işe yaramadığını anlamıyorum, yani istemediğimiz bir koşul olsa bile if'in içine giriyor yine de. Allah allah.

Çevrimdışı İsmail ULUTÜRK

  • Mezun olmuş OTOKON'cu
  • *
  • İleti: 1386
  • Festina Lente
Ynt: Problem: Hasta Saat(Kolay)
« Yanıtla #11 : Haziran 24, 2011, 05:10:25 ÖS »
Sağıol rıza ilgin için de hala ben benim if'lerin neden işe yaramadığını anlamıyorum, yani istemediğimiz bir koşul olsa bile if'in içine giriyor yine de. Allah allah.
Senin istemediğin koşulla programın istemediği koşulun aynı konuş olduğuna emin misin?

(0< a <= 11 || 0 <= b <= 59 || 0 <= c <= 59) bana biraz heyecan dolu bir ifade gibi geldi mesela, 0 < a <= 11 i 0 <= b <= 59 u felan teker teker farklı degerler vererek dene bakalım ne sonuç alıyorsun, gerçekten programla aynı fikirde misin?
Progress isn't made by early risers. It's made by lazy men trying to find easier ways to do something.
- Robert Heinlein