C'de boyle bir sey mumkun mu?

Başlatan empax, 14 Temmuz 2011 - 13:46:54

« önceki - sonraki »

0 Üyeler ve 4 Ziyaretçi konuyu incelemekte.

empax

Merhabalar.


C'de mesela ekranda,
Bir sayi giriniz
seklinde bekleyen mesaji alttaki gibi yapabilir miyiz?
Bir sayi giriniz[ ]
Klavyeden o anda girilen sayi [ ] koseli parantezler arasinda gorunecek. Bir sayi giriniz[5] seklinde ve enter tusuna basildiktan sonra degiskene o deger atanmis olacak. Bu mumkun mudur ?

Bilemiyorum anlatabildim mi buda kodlanmis hali;  :)
printf("Bir sayi giriniz[scanf("%d",&a);]");
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

microanaliz

evet mümkün ama senin yazdığın gibi değil...
MicroAnaliz

travego0403

İlk aklıma gelen yöntem şöyle
Her tuşa basıldığında eski yazı silinecek  yerine yeni basılan tuşta eklenerek yazılacak?

Belki bu kaçırma karakterleri (? tam adını bilmiyorum \n \t gibi ) kullanılarakta yapılabilir gibi geliyor.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

sema

İstenen şu mu:

#include<stdio.h>
int main()
{
int sayi;
printf("Bir sayi girin\n");
scanf("%d", &sayi);
printf("Sayiniz [%d]\n",sayi);
return 0;
}


Çıktısı:

Sayiniz [5]su@su:~$ gcc a.c -o a
su@su:~$ ./a
Bir sayi girin
6
Sayiniz [6]
su@su:~$
susema

empax

Alıntı yapılan: microanaliz - 14 Temmuz 2011 - 15:37:47
evet mümkün ama senin yazdığın gibi değil...

Aciklayabilmek icin yazmistim onu. Cozum nedir acab?

Alıntı yapılan: travego0403 - 14 Temmuz 2011 - 15:47:59
İlk aklıma gelen yöntem şöyle
Her tuşa basıldığında eski yazı silinecek  yerine yeni basılan tuşta eklenerek yazılacak?

Belki bu kaçırma karakterleri (? tam adını bilmiyorum \n \t gibi ) kullanılarakta yapılabilir gibi geliyor.

Koda dokmeniz mumkun mu?




Alıntı yapılan: sema - 14 Temmuz 2011 - 16:10:10
İstenen şu mu:

#include<stdio.h>
int main()
{
int sayi;
printf("Bir sayi girin\n");
scanf("%d", &sayi);
printf("Sayiniz [%d]\n",sayi);
return 0;
}


Çıktısı:

Sayiniz [5]su@su:~$ gcc a.c -o a
su@su:~$ ./a
Bir sayi girin
6
Sayiniz [6]
su@su:~$


Hayir @sema. Demek istedigim ekranda "Bir sayi giriniz[]" mesaji beklerken klavyeden girilen sayi enter tusuna basmadan once [ ] parentezler arasinda gorunecek.
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

travego0403

Sanırım istediğinize yakın bir şey bu.
Programın algoritması aklıma ilk gelen yöntemdi, belki daha kolay bir yolu vardır. Daha sonra diğer arkadaşlarda başka çözüm yolları önerebilir.
getch() fonksiyonu Linux ta olmadığı bu forumda paylaşılan bunun alternatifini kullandım.
Değişken olarak stringleri kullandım eğer bu alınan değişkenle işlem yapılacaksa int, double....vs tip dönüşümü yapılması gerekir.
Girdi, Çıktı kontrol edilmiyor, hatalara açık :)
C++ olarak kodladım.Gerekli yerleri C ye çevirilebilir.

#include <iostream>
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


using namespace std;

int mygetch(void)
{
    struct termios oldt,newt;
    int ch;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}

int main()
{
    bool durum=true;
    string gecici;
    string degisken="";
    cout<<"Bir sayi giriniz.[]";
    while(durum){
        system("clear");
        gecici=mygetch();
        if(gecici=="\n"){
            durum=false;
            break;
        }
        degisken+=gecici;
        cout<<"Bir sayi giriniz.[ ";
        cout<<degisken<<"]";
    }
    cout<<"\nGirdiğiniz sayi : "<<degisken<<endl;
    return 0;
}
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

klbecit

  degisken+=gecici;
        cout<<"Bir sayi giriniz.[ ";
        cout<<degisken<<"]";
    }
    cout<<"\nGirdiğiniz sayi : "<<degisken<<endl;
    return 0;


işine karışmak gibi olmasın ama ikinci cout yerine cin yazmak gerekiyor sanırım:S

sem

travego0403 ün bahsettiği getch fonksiyonu ile daha şık bir hal alabilir...

#include <stdio.h>



int main()
{
   int val;

   fprintf(stdout, "Bir sayi girin[]");
   system("clear"); //ekran temizleme
   fscanf(stdin, "%d", &val);
   system("clear"); //ekranı temizleyelim
   fprintf(stdout, "Bir sayi girin[%d]\n", val);
   
}


@klbecit, ikinci cout 'da değer yazdırılıp parantez kapatılıyor... Yani sorun yok gibi duruyor...
".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?

ersinkandemir

Alıntı yapılan: travego0403 - 14 Temmuz 2011 - 15:47:59
İlk aklıma gelen yöntem şöyle
Her tuşa basıldığında eski yazı silinecek  yerine yeni basılan tuşta eklenerek yazılacak?

Belki bu kaçırma karakterleri (? tam adını bilmiyorum \n \t gibi ) kullanılarakta yapılabilir gibi geliyor.
\b galiba bahsettiğiniz. (Backspace)
Where there's a shell, there's a way.



klbecit

ben değer girişinin yapıldığı yeri göremedim de ondan dolayı öyle düşünüyorum...

sem

Kaçma karakterleri benim kulandığım system çağrısında clear yerine kullanılabilir... Fakat \t ve \n iş görür mü bilmem, \b ya da \r daha yararlı gibi görünüyor.

tüm ekranı temizlemek yerine \r ile sadece satır yenilenebilir...


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 14 Temmuz 2011 - 19:13:51

Alıntı yapılan: klbecit - 14 Temmuz 2011 - 19:11:59
ben değer girişinin yapıldığı yeri göremedim de ondan dolayı öyle düşünüyorum...

değer girişi C++ ile daha doğrusu " cin" ile değil  de getch'nin Linux versiyonu ile yapılmış sanırım şu satır ile;

gecici=mygetch();
".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?

travego0403

Evet değer girişi mygetch() fonksiyonu ile yapıldı, daha önce bu forumda konuşulmuştu bu konu.

Valla programın ana hattı bu, süslemeleri size kalmış. :) Ekran yerine satır silinmesi daha hoş olur tabi ki.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

klbecit

mygetch() kullanmamıştım hiç... hatta hiç duymamıştım diyebilirim. öğrendiğim iyi oldu... teşekkürler...

empax

Ben bir-iki satirla halledilir diye tahmin ediyordum.  ;D
Herkesin eline saglik.
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

sem

Maalesef C'de problemlerin geneli C tarafında bir iki satır ile çözülemiyor =)
".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?

empax

Alıntı yapılan: sem0900 - 14 Temmuz 2011 - 20:14:39
Maalesef C'de problemlerin geneli C tarafında bir iki satır ile çözülemiyor =)

Evet ama en azindan bu soru icin 1-2 satir bekliyordum.  :D
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

sem

@empax, aynen dediğiniz gibi aslında çok basit gibi görünüyor problem. Fakat benim izlenimim o yönde oldu, küçük şeyler aslında gerçekten daha fazla detay içeriyor.

Örneğin top komutunun çok basitini düşünelim... processlerin bellek, CPU, PId numaraları hiç bir bilgisini vermesin. Sadece şu kadarını alsak;

* bir yandan ekrana adımızı yazarken esc tuşuna basınca dursun.


Problem bu... Aslında basit gibi ama gerçekten çok detay içeriyor ve paralel programlamaya kadar gidiyor iş =) Gerçi esc kısmı belki paralel programlamaya girmeden sinyaller ile halledilebilir. ESC tuşu sinyal yayıyordu yanlış hatırlamıyorsam... Ama sinyallerin de paralel programlamadan aşağı kalır yanı yok vallahi =)

(not: top komutu q ya basınca duruyor esc basınca değil... o geldi şimdi aklıma =))
".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?

eribol

@empax soru öyle böyle değil ki cevabı basit olsun :) İstenen basit ama soru değil. Diğer dillerde bile kolay bir yöntemi olacağını sanmıyorum.

empax

Dediginiz gibi soru cok basit gorunuyor, o yuzden cevabida basit olur seklinde bir fikre kapildim.  :)
Nerden aklima geldiyse bu soru ama iyi beyin jimnastigi oldu.  :P
بسم الله الرحمن الرحيم
|ACEMİLER İÇİN İLK DURAK|Çözüldü|Kod etiketi|

sem

Güzel ama böyle sorular...

Ne zaman scanf ne zaman gets kullanmam gerektiğini bu şekilde sorular ile kavrayabilmiştim ben de... Yararlı buluyorum böyle soruları =)
".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?

travego0403

Bu tür şeyler iyi beyin jimnastiği yaptırıyor. :) Belki daha kolay yöntemleride vardır.

Bunun için ekran silme komutlarını araştırdım, ekstra birşeyler öğrenmiş oldum. :)

"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

egcodes

Bana kalırsa console uygulamalarında bu tarz hareketler fanteziye giriyor :)

Konsollar tasarım gereği harfleri sağa doğru basar sonra aşağı iner yine sağa :)

Kolay gelsin.
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

microanaliz

Bu tarz çalışmalar C dilinin ayrıntılarını bilgisayarın mantığını gün yüzüne çıkarıyor bu tarz soruları daha çok kendi adıma beklerim...(bizi öğrenmeye yöneltiyor)
MicroAnaliz

microanaliz

printf("%d",printf("microanaliz\n"));
http://www.kadifeli.com/fedon/stdcprtr.php?1_p
sitesindeki bir soru bu kod ne yapmaya çalışıyor denedim ilginç bir sonuç oldu benim için;
microanaliz
6
sayısı çıktı...
MicroAnaliz

sem

6 çıktığına emin misiniz? 6 çıktısı ise bir sorun var demektir, içsel printf değerini ikiye bölmüş olma ihtimaliniz var mı =)
".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?