Kronometre bir tuşa basınca dursun , tekrar basıldığında ise devam etsin...

Başlatan noktakom, 09 Mart 2011 - 18:34:10

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

noktakom

Aşağıdaki gibi bir kronometre programı yazdım. ancak bir tuşa basınca durmasını  , tekrar basıldığında ise devam etmesini nasıl sağlayabileceğimi bilemedim ve yardımlarınıza başvurmak istedim...


#include <stdio.h>
#include <unistd.h>

void chronometer(void);

int main()
{
chronometer();
return 0;
}

void chronometer(void) {

int hour=0,min=0,sec=0,i;

while(1){
for(i=0; i != 23; i++) printf("\n");
if(sec==60) {sec=0;min++;}
if(min==60) {min=0;sec++;}
printf("%d:%d:%d",hour,min,sec);
sleep(1);
sec++;
}
}

hyperThread

öncelikle chronometer fonksiyonundaki while döngüsü içerisindeki 1'i kaldır. yerine bool gibi kullanabileceğin bir integer veya unsigned char koy, farkmaz. Ana fonksiyon içerisinde de bir tuş için toggle fonksiyonu yaz. Ayrı da yazılabilir problem olmaz. O toggle fonksiyonunun geridönüş değerini de 1 ve 0 olarak ayarlarsan, rahatlıkla chronometer içerisindeki while döngüsünü kontrol etmiş olursun ;)

noktakom

@ hyperThread usta, bu bahsettiğiniz toggle fonksiyonu ve bool hakkında sizden biraz daha ayrıntılı bilgi alabilir miyiz ? Zira netten net bir bilgi bulamadım. Acemilik te var tabi daha standart c'yi kavrayamadık tam olarak :)

sem

toggle ile kasıt edilen şu sanırım; fonksiyonun durumları birbirinden bağımsız olmayacak. Yani fonksiyonu çağırdığınızda kronometre çalışıyorsa durduracak, durdurulmuş ise aynı yerden devam ettirecek...

Medya oynatıcılardaki ses kısma (mute) tuşu gibi düşünün... Bastığımızda ses açıksa kısıyor - kısıksa açıyor...

BOOL ise programlama dillerinde mantıksal tür olarak tanımlanıyor... TRUE ve FALSE gibi değerleri tanımlamak için... FALSE 0 ı işaret ediyor... C de bunu define komutu ile rahatlıkla sağlayabilirsiniz... GTK gibi kütüphanelerde zaten tanımlanmış oluyor bu türler... siz de kendiniz için define ile tanımlayabilirsiniz...

Yani

#define FALSE 0
#define TRUE  1  // ya da daha uygun bir değer...

int DURUM = TRUE;

şeklinde tanımlama ile while içerisine 1 değil de DURUM değişkenini koyarsanız (burada bool türünü int ile typedef olarak tanımlamış da olabilirsiniz tabii ki)..

toggle olarak yazılan fonksiyon DURUM == TRUE doğruluğunda kronometreyi durduracak, DURUM == FALSE doğruluğunda ise tekrardan başlatacak...

Bu arada time.h kullanarak saniyeden daha düşük birimlerde çalışabilirsiniz... Bu durum bir kronometre için daha uygun olacaktır...

Burada kadar ki kısımda sıkıntı yok gibi... Bence asıl sıkıntı şu;

while(DURUM){
// kronometre çalışıyor, yani DURUM = TRUE
}

Şu durumda while döngüsü içerisndeyiz... Bu döngü içerisine yazmış olduğunuz toggle fonksiyonunu nasıl entegre edeceksiniz buna karar vermeniz gerekiyor bence...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

noktakom

Hıh işte "Bence asıl sıkıntı şu"  diye başladığınız yerde sorunumun tam üstüne basmışsınız. Orayı nasıl yapacağımı, toggle fonksyonun nasıl yazılacağını, çalışma mantığının ne olduğu, programın akış diyagramının nasıl olacağını, hem kavyeden karakter alan bir fonksyon kullanıp hem de tuşa basılmaması durumunda o fonksyonun programın çalışmasını nasıl durdurmayacağını vs. vs. inanın hiç anlamadım, herhangi bir bilgiye de ulaşamadım :)

sem

Bu durum sizinle alakalı hkndvc... Canınız nasıl isterse, paşa gönlünüz nasıl isterse ya da bilgi durumunuza göre hangisi kolayınıza gelirse öyle yapabilirsiniz...

fork, thread gibi yapılar bu durumlarda kullanılabilir... Ben bu konulara hakim değilim. O nedenle örnek verecek bir program yazamayacağım... Araştırıp bunları kullanacaksanız eğer bir akış kullanıcıdan giriş alırken, diğer akış kullanacıdan alınan girişe göre kronemetreyi durduracak ya da çalıştıracak... Bu şekilde olmalı... Yani bir yandan sayarken bir yandan kullanıcı girişi beklenmeli...

dediğim gibi örnek program yazamam çünkü hakim olduğum konular değil ama size alternatif sunabilirim...

C bölümünde yani şu an yazıştığımız bölümde bir Aritmetik Oyun paylaşmıştım... 1. ya da 2. sayfa da olabilir. Bu oyunda kullanıcıdan sorunun cevabını bilebilmesi için 10 ya da 11 saniye idi sanırm... böyle bir süre veriliyor... Kişi 9 saniye de bilirse 9, 8 saniye de bilirse 8 puan veriliyor...

Bu programı inceleyerek mantığını kendi programınıza entegre edebilirsiniz...

Siz sleep ile 1 saniye bekletiyorsunuz programı... Bu beklemeyi stdin, yani klavye girişini 1 saniye bekleterek yapabilirsiniz... Bu bir saniye içerisinde kişi bir tuşa basarsa kronometre durur... Durmuşken basarse devam eder gibi...

Aritmetik Oyun'u incelemenizi taviye ederim...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

sem

".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

hyperThread

Toggle kısmını semetey güzel açıklamış ben de diğer kısmlarda yardımcı olayım. Şimdi bu programda kronometreyi durdurmak ve yeniden başlatmak için toggle yapısı olarak bahsettiğimiz aç kapa metodları kullanılır. Tıpkı bir anahtar gibi. Anahtar fonksiyonunu yazmak için bir if else döngüsü kullanabilirsin. Bir tane  global değişkeni veya yerel bir değişkeni giriş olarak alan, çıkış olarak da 1 veya 0 veren bir fonksiyon, if else kullanan, senin anahtar fonksiyonun olabilir rahatlıkla. Peki bu anahtar fonksiyonu nerede kullanabilirsin? direk olarak chronometer fonksiyonu içerisinde kullanabilirsin. Peki zaten while(1) dönüyor? O vakit while(1) yerine while(foo) gibi bir değişken kullanırsın, döngü içerisinde de  "foo" değişkenini, anahtar fonksiyonun ile kontrol edersin. Spesifik bir durumda o anahtar fonksiyonun 0 olursa, foo = 0 olur, döngün sonlanır ;)

Ee döngü sonlandı ama program da sonlandı? Bunun çözümü de ana döngü içerisine bir while döngüsü kullanman. O döngü while(1){   } olabilir. Aynı anahtar fonksiyonu burada da kullanabilirsin veya bir if else yapısı kurabilirsin. İstediğin bir durumda bu if else yapısında break komutuyla döngü dışına çıkabilirsin, böylelikle programın sonlanmış olur. 

Bu klavyeden karakter okuma işi için getchar() vardır, oldukça detaylı bilgi için terminal ekranına   man getchar    yazabilirsin. Ancak bu noktada şu sıkıntıyla karşılaşman olası. getchar() karakter okumadan sonraki komutları işletmiyor. bu problem için internette bir araştırma yapmanı öneririm ;)

edit: semetey benden önce yazmış :D