Gönderen Konu: [çözüldü]Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program  (Okunma sayısı 5839 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Ozgurluk

  • Yeşil Çay
  • *
  • İleti: 280
Kod: [Seç]
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(){
    int i,k,b;
    char cumle[100];
    printf("Bir Cumle Giriniz.=");
    gets(cumle);

    k=0;
    b=0;

   
    for(i=0; i<=strlen(cumle); i=i+1); /*strlen ile cumlenin uzunlugu kadar donguyu calistirmayi amacladim.*/
    {
             if (islower(cumle[i]))
             /*For döngüsünün içinde islower fonksiyonu ile harfin kucuk olduğunu kucukse k=k+1, degisel b=b+1 arttıran*/
             k=k+1;
             else
             b=b+1;
    }
    printf("Cumlede %d Tane Buyuk Harf Vardir.",b);
    printf("Cumlede %d Tane Kucuk Harf Vardir.",k);
getch();
}
islower fonksiyonu ile, harfin küçük olduğunu denetleme mantığına gittim. fakat ekran çıktılarında cümlerde Kaç Tane Büyük Harf ve Kaç Tane Küçük harf olduğunu bulamadım. Belkide islower fonksiyonunu yanlış kullanıyorumdur. Programın doğru çıktı üretebilmesi için Acil yardımlarınızı bekliyorum. Şimdiden Yardımcı olan herkese teşşekkürlerimle. Cok uğraştım ama başaramadım. :(

Saygılarımla
« Son Düzenleme: 27 Kasım 2011 - 03:11:50 Gönderen: if »

Çevrimdışı travego0403

  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 793
  • Segmentation fault :(
    • Kişisel Blog
  • Dağıtım: Ubuntu
  • Sürüm: 12.10
C++ Reference sayfasında aşağıdakine benzer bir şekilde kullanılmış. Şu an çalışıyor fakat kelime arasındaki boşlukları  büyük harf olarak sayıyor. C fazla bilmiyorum, gerekli yerleri C ye çevirebilirsin. cout printf() gibi.

Kod: [Seç]
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main(){
    int i,k,b;
    char cumle[100];
    cout<<"Bir Cumle Giriniz.="<<endl;
    gets(cumle);

    k=0;
    b=0;
    i=0;
   
    while(cumle[i])
    {
        if (islower(cumle[i]))
                k=k+1;
        else
                b=b+1;
        i++;
    }
    cout<<"Cumlede "<< b <<"Tane Buyuk Harf Vardir."<<endl;
    cout<<"Cumlede "<< k <<" Tane Kucuk Harf Vardir."<<endl;

}

Çevrimiçi alquirel

  • Ubuntu Türkiye Tayfası
  • *
  • İleti: 3425
  • Dağıtım: Ubuntu
  • Sürüm: 14.04
Kendi "islower" fonksiyonunu yazabilirsin :)

Şöyle ki iki adet dizi oluşturursun, birinde büyük harfler diğerinde küçük harfler olacak şekilde.
O anki karakter hangi dizide yer alıyorsa ona göre değer döndürürsün.

Bunu yapmanın şöyle de bir avantajı var. Bildiğim kadarıyla islower fonksiyonu, ya da alternatif olarak ASCII aralığına göre karşılaştırma yapma işlemi Türkçe karakterleri kapsamaz.

Çevrimdışı Ozgurluk

  • Yeşil Çay
  • *
  • İleti: 280
@travego0403, C'ye uyarladım çalışıyor. Dediğiniz gibi, boşlukları da büyük harf sayıyor. Teşekkürler cevabınız için.
@alquirel fonksiyonu tam olarak nasıl yazacağımı anlamadım. Fakat islower fonksiyonunda Türkçe karakterlerde sorun çıkmıyor. Sorun islower'in boşlukları büyük karakterden sayması. Teşekkürler cevabınız için.

Şimdi sorum şu boşlukları büyük harf sayısından nasıl çıkarabilirim? Birçok karar yapısı denedim döngünün içinde tutmadı.

Kod: [Seç]
while(cumle[i])
    {
        if (islower(cumle[i]))
           k=k+1;
           else{
                if (cumle[i]=' ')
                b=b-1;
                else
                b=b+1;
                }
        i++;
    }

While döngüsünün içinde böyle bir şeyler denedim. Eğer cumle=' ' boşluk karatkeri ise yani cumlenin döngü çalışırken dizide ki i'nin ci indisin değeri whitespace(boşluk karakteri) olursa büyük sayıyı bir azalt dedim. Böyle karar yapıları kullandım. İç içe yuvalanmış if gene sonuca ulaşamadım. Tam olarak doğru sonuca ulaşmak için islower fonksiyonun büyük harfden saydığı boşlukları nasıl büyük harf sayısından çıkarabilirim. Saygılarımla...
« Son Düzenleme: 25 Kasım 2011 - 16:54:28 Gönderen: cerencalici »

Çevrimiçi alquirel

  • Ubuntu Türkiye Tayfası
  • *
  • İleti: 3425
  • Dağıtım: Ubuntu
  • Sürüm: 14.04
Döngünün başına ekleyeceğiniz boşluk karakteri kontrolüyle bu sorunu aşarsınız diye düşünüyorum.
Şöyle ki
if (cumle=' ') continue;

continue dedikten sonra döngüyü bir kez döndürür. Tabii bu durumda while kullanıyorsanız i'yi arttırma işini continue'den önce yapmanız gerekir, yoksa kısır döngüye girer. Veya da for döngüsü kullanırsınız. Farketmez.

Kod: [Seç]
while(cumle[i])
    {
        i++;
        if (cumle[i]=' ') continue;
        if (islower(cumle[i]))
           k=k+1;
       else
           b=b+1;
    }

Çevrimdışı Ozgurluk

  • Yeşil Çay
  • *
  • İleti: 280
@alquirel, teşekkür ederim yardımlarınız için minettarım ama kardeş bu program bu sefer hiç sonuç üretmez oldu. Contiune deyimi boşluk karakteri ise devam et ya da atla gibi, bir ifade oluşturmak için mi kullandınız?
« Son Düzenleme: 25 Kasım 2011 - 17:08:44 Gönderen: cerencalici »

Çevrimdışı travego0403

  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 793
  • Segmentation fault :(
    • Kişisel Blog
  • Dağıtım: Ubuntu
  • Sürüm: 12.10
@Ozgurluk @alquirel sana çok güzel bir ipucu vermiş. Ben denedim çalışıyor. Hata yaptığınız yer büyük olasılıkla döngü değişkenin artıp artmamasıdır. Bir de if else leri de biraz kurcalayın. Kodu hazır olarak buraya vermiyorum. Biraz hazırcılık olmasın diye çünkü programlama böyle küçük gözüken ama öğreticiliği yüksek olan problem çözümleriyle öğrenilebilir.
« Son Düzenleme: 25 Kasım 2011 - 17:44:33 Gönderen: cerencalici »

Çevrimiçi alquirel

  • Ubuntu Türkiye Tayfası
  • *
  • İleti: 3425
  • Dağıtım: Ubuntu
  • Sürüm: 14.04
Continue ifadesi çalıştığı zaman içindeki döngünün kapatma parantezine atlatır. Yani döngü içerisinde continue ifadesinden sonraki yerler bir döngülük atlanmış olur.
Yani karakter boşluk ise küçük büyük harf karşılaştırması yapma, sonraki karaktere bak demiş oluyor oradaki continue.

Çevrimdışı Ozgurluk

  • Yeşil Çay
  • *
  • İleti: 280
@travego0403 Hazırcılık peşinde değilim de contiune deyimi nasıl bir işlev görüyor anlamadım.


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : [time]25 Kasım 2011 - 17:21:03[/time]
@alquirel Şimdi conitune deyimini anladım son yazdığınızdan sonra, teşekkür ederim, bir de programı ilk yazdığım gibi for döngüsü ile deneyeceğim.
@travego0403 ve @alquirel teşekkür ederim size tekrardan. Deneme yaptıktan sonra döneceğim. Umarım ben de bu sefer nihai sonuca ulaşırım. :D
« Son Düzenleme: 25 Kasım 2011 - 17:46:01 Gönderen: cerencalici »

Çevrimdışı travego0403

  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 793
  • Segmentation fault :(
    • Kişisel Blog
  • Dağıtım: Ubuntu
  • Sürüm: 12.10
Anladıysan sorun yok :) Şu kod parçasını çalıştırıp incelersen çok daha iyi anlayacağını düşünüyorum.
Kod: [Seç]
for(int i=0;i<=5;i++){
        if(i==3)
            continue;
        cout<<i<<endl;
    }

Çevrimdışı Ozgurluk

  • Yeşil Çay
  • *
  • İleti: 280
contiune deyimi ile sonuç üretmiyor. bir de şöyle denedim.

 
Kod: [Seç]
while(cumle[i])
    {   
        if (cumle[i]=' ')
            goto buyuk;
        else if (islower(cumle[i]))
             k=k+1;
        else
             b=b+1;
        buyuk:
        i++;
           
    }

Çok koşullu karar yapıları kullandım ve aynı continue deyimi gibi iş gören goto komutu kullandım. Sonuç hüsranla bitti :(


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : [time]25 Kasım 2011 - 18:06:16[/time]
Acaba işaretçi mi kullanmam gerekiyor? Dizi değerlerinin adreslerini tutan. Bence o geliyor artık bir tek aklıma.
@travego0403 siz C++ ile mi çalıştırdınız?
« Son Düzenleme: 25 Kasım 2011 - 18:47:46 Gönderen: cerencalici »

Çevrimdışı travego0403

  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 793
  • Segmentation fault :(
    • Kişisel Blog
  • Dağıtım: Ubuntu
  • Sürüm: 12.10
Kod: [Seç]
while(cumle[i])
    {
        if(cumle[i]==' '){
            i++;
            continue;
        }else{
                if (islower(cumle[i]))
                        k=k+1;
                else
                        b=b+1;
         
        }
        i++;
    }
Şu şekilde bir dener misin?
« Son Düzenleme: 26 Kasım 2011 - 20:00:57 Gönderen: cerencalici »

Çevrimdışı Ozgurluk

  • Yeşil Çay
  • *
  • İleti: 280
Abi çok özür dilerim dalgınlık benimkisi, Basic, C arasında giderken, == operatörünü yanlış kullanıyormuşum, eşitlik yerine hep atama kullandık koşullarda. ide'de ses etmiyor haa Mantık hatası çünkü niye ses etsinki yazım hatası değil sonuçta. Benim mantıksızlığım. Çok çok özür. Neyse bir soru çok çok türlü çözmek de iyidir.

Kod: [Seç]
while(cumle[i])
    {
        i++;
        if (cumle[i]==' ') continue;
        if (islower(cumle[i]))
           k=k+1;
       else
           b=b+1;
    }

@alquirel çok teşşekkür ederim. Kurduğunuz mantık doğru. Saat gibi çalışıyor teşekkürler.
@travego0403 kardeş kodları yazıp göndermesem 40 yıl düşünsem == operatörünün yerine Atama operatörü = kullandığım aklıma gelmezdi.
Tekrar çok teşekkür ederim. Çalışmalarınızda kolaylıklar diliyorum. Yardımlarınızın değeri benim için çok büyüktü.
« Son Düzenleme: 26 Kasım 2011 - 20:02:17 Gönderen: cerencalici »

Çevrimiçi alquirel

  • Ubuntu Türkiye Tayfası
  • *
  • İleti: 3425
  • Dağıtım: Ubuntu
  • Sürüm: 14.04
Ben de şöyle bir şey yazdım şimdi.

Kod: [Seç]
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char cumle[100];
int i=0,s=0,b=0,k=0;
int main(void){
    printf("Cümlenizi girin (En fazla 100 karakter) :\n");
    gets(cumle);
    printf("\n'%s' cümleniz çözümleniyor...\n",cumle);
    s=strlen(cumle);
    for(;i<s;i++){
        if(islower(cumle[i])) k++;
        else if(isupper(cumle[i])) b++;
    }
    printf("Sonuç \nBüyük Harf : %d adet\nKüçük Harf : %d adet\n",b,k);
    return 0;
}

Bunu yazınca aklıma geldi, boşluğu büyük karakterden saymasının sebebi büyük harfleri "küçük değilse" şeklinde saydığımız için. Yani küçük harf olmayan her şeyi büyük harf sayan bir kodumuz vardı. Büyük harfleri de isupper fonksiyonuyla sayarsak hiçbir sorun kalmıyor.

Ancak denemelerimde Türkçe karakterleri saymadığını farkettim.

Çevrimdışı Ozgurluk

  • Yeşil Çay
  • *
  • İleti: 280
@aquirrel emeklerin için onlarca kez teşşekkür. Gönderdiğiniz ilk kod bloğu conitune deyimli olan gayet sorunsuz çalışıyor, Sadece yazım hatası varmış. eşitlik denediğimiz yerde, atama operatörü kullanmışız.  @travego0403 yeni kod gönderince orada anladım ve Türkçe karakterleride ben DEV C++ altında derliyorum sayıyor. Gerçekten emeğin için yardımlaşman için sonsuz teşşekkürü bir kere daha size ve travego0403 borç bilirim.

Çevrimiçi alquirel

  • Ubuntu Türkiye Tayfası
  • *
  • İleti: 3425
  • Dağıtım: Ubuntu
  • Sürüm: 14.04
@aquirrel emeklerin için onlarca kez teşşekkür. Gönderdiğiniz ilk kod bloğu conitune deyimli olan gayet sorunsuz çalışıyor, Sadece yazım hatası varmış. eşitlik denediğimiz yerde, atama operatörü kullanmışız.  @travego0403 yeni kod gönderince orada anladım ve Türkçe karakterleride ben DEV C++ altında derliyorum sayıyor. Gerçekten emeğin için yardımlaşman için sonsuz teşşekkürü bir kere daha size ve travego0403 borç bilirim.

Continue olanlı çalışıyordur doğrudur ama doğrusu varken o yamalı olmuş oluyor :)
Yani boşlukları sayma hatamızı asıl düzeltişimiz bu son gönderdiğim koddaki gibi olmalı, continue olanlı sol kulağı sağ elle tutmak gibi ;)

Çevrimdışı sem

  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 6077
  • FTS
  • Dağıtım: Ubuntu
  • Sürüm: Trusty
Her şeyi okuyamadım maalesef =) Boşluk sorunu ile ilgili şöyle bir öneri getireyim ben de;

dosya sonuna kadar tüm kelimeler fscanf ile okunur. fscanf fonksiyonu boşluk ve satır sonu karakterlerini okumadığı için boşluk sorunu ortadan kalkmış olur.

Eğer alquirel'in dediği gibi karakter sıkıntı olursa gcc'nin charset gibi parametresi vardı. Belki o şekilde bir parametre ile o sıkıntı da halledilebilir.
".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?

Çevrimdışı Ozgurluk

  • Yeşil Çay
  • *
  • İleti: 280
@sem0900 Kardeş fscanf fonksiyonun kullanımından bahseder misin? Parametreleri nasıl alır, nasıl kullanılır gibi, programımda kullanmak istiyorum. Böylece kodu daha kısa yazmış olacağım. Teşekkür ederim.
« Son Düzenleme: 26 Kasım 2011 - 20:06:38 Gönderen: cerencalici »

Çevrimiçi alquirel

  • Ubuntu Türkiye Tayfası
  • *
  • İleti: 3425
  • Dağıtım: Ubuntu
  • Sürüm: 14.04
@sem0900 Kardeş fscanf fonksiyonun kullanımından bahseder misin? Parametreleri nasıl alır, nasıl kullanılır gibi, programımda kullanmak istiyorum. Böylece kodu daha kısa yazmış olucam. Teşşekkür ederim.

Eğer benim dediğim gibi küçük harf ve büyük harf sayımını "küçük harfse, küçük harf değilse" şeklinde değil de "küçük harfse" ve "büyük harfse" şeklinde yaparsan ek bir işlem yapmana, ek bir fonksiyon öğrenmene gerek kalmaz.

Çünkü bugün boşluk karakteri sorun çıkarmış olabilir, yarın da nokta virgül sorun çıkarır. Bu durumda ne fscanf fonksiyonu ne de kodun continue'lu şekli bir işe yaramaz. Yani continue'lu kod şuan sorun çıkarmıyor ama şuanki haliyle yarın da nokta virgülü büyük harften saymaya başlar.

Dediğim gibi sen benim en son gönderdiğim kodları incele, "küçükse küçük, büyükse büyük" şeklinde sayım yap.

Çevrimdışı travego0403

  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 793
  • Segmentation fault :(
    • Kişisel Blog
  • Dağıtım: Ubuntu
  • Sürüm: 12.10
Kullanılacak bir program için yazıyorsan bunu @alquirelin dediği gibi yapman iyi olur. Yukarıda sırf sen böyle bir algoritma kullanmışsın diye çalışır halini verdim.

Çevrimdışı sem

  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 6077
  • FTS
  • Dağıtım: Ubuntu
  • Sürüm: Trusty
Aslında bence ne kadar fonksiyon kullanılırsa o kadar çok gelişmiş olur kişi. Hele ki fscanf gibi temel şeyleri öğrenmek lazım... Bir çok yerde döküman bulabilirsiniz. fscanf ile ilgili. fscanf fonksiyonu okuma işlemi yapar, hemen hemen scanf ile aynıdır. Tek farkı bir parametre fazla alır.

Yalnız burada alquirel'in dediği nokta çok önemli... Şimdi islower ile kontrol yapmışsınız gördüğüm kadarı ile. Bunlar standart  C makrolarıdır ve bir çok şeyi kontrol etmemize yarar.. Bunlar sınama parametresine göre 0 ya da başka bir değer döndürür. Yani doğru ya da yanlış durumuna göre çalışır.

Siz sadece "küçük harf mi?" diye soruyorsunuz. Şimdi boşluk küçük harf değilr, bu durumda yanlış döner, ya da nokta virgül de aynı şekilde... O yüzden eleminasyonu daha da genişletmeniz gerekir. Öncelikle elimizdeki bir karakter mi? Bir numerik mi? Bir noktalama işareti mi bunu bilmemiz gerekir.

O nedenle öncellikle sorulması gereken elimzdeki birim karakter mi?  Cevap veriyorum =) "isalpha()"... =)

Öncelik isalpha ile elinizdekinin ne olduğunu sorgulayın... Yani algoritma;

char a;

....
..../*a sınanmam için dolduruluyor, yani sizdeki cumle[ii] düşünebilirsiniz*/
....

islower(a)


Şeklinde olmamalı. islower dan önce alpha sınanmalı...

isalpha(a)
{
//demek ki a boşluk ya da başka bir şey değil,  alfabetik bir karakter. O zaman islower sınanabilir.
    if(islower(a))
    {//küçük harflere bir ekle}
    else
    {//büyük harflere bir ekle}
}


Şeklinde bir yol izlenebilir..

Diğer alternatifleri görmek için;

http://en.wikipedia.org/wiki/C_character_classification


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 26 Kasım 2011 - 09:16:46
EK: cumle[ii] kısını bilerek iki tane i ile yaptım yoksa BBC italik yapıyor =)
".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?

Çevrimiçi alquirel

  • Ubuntu Türkiye Tayfası
  • *
  • İleti: 3425
  • Dağıtım: Ubuntu
  • Sürüm: 14.04
EK: cumle[ii] kısını bilerek iki tane i ile yaptım yoksa BBC italik yapıyor =)

"code" etiketi kullansaydın :P

Çevrimdışı utdmr

  • Utku Demir
  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 1037
  • imagine all the people, living life in peace...
    • Bir şeyler var burada!
  • Dağıtım: Arch Linux
  • Sürüm: x86_64 - KDE
Bütünleşik fonksiyonları kullanmak daha yararlıdır ama, ben de bir harfin büyük küçük olduğunu anlamak için şöyle bir yol söyleyeyim:

ASCII tablosunda karakterler sırayla gittiği için doğrudan büyük-küçük olarak deneyebilirsiniz.

Kod: [Seç]
if('A' <= chr <= 'Z') /*buyukse */
else if('a' <= chr <= 'z') /* kucukse */
else /*ne buyuk ne kucukse */
gibi :).

Edit: Aynı zamanda bir küçük harfi büyütmek için 32 çıkarabilir, bir büyük harfi küçültmek için 32 ekleyebilirsiniz ('U' + 32 == 'u').
« Son Düzenleme: 26 Kasım 2011 - 19:20:47 Gönderen: utdmr »
Kişisel Blogum: Çoğunlukla Zararsız - cogunluklazararsiz.org
--
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -and a lot of courage- to move in the opposite direction.

Çevrimdışı travego0403

  • Uygulama Geliştirme Tayfası
  • *
  • İleti: 793
  • Segmentation fault :(
    • Kişisel Blog
  • Dağıtım: Ubuntu
  • Sürüm: 12.10
Programlamanın bu güzel yanını seviyorum.Farklı çözümlerin olmasını... :)
@utdmr
Gerçekten güzel yöntemmiş. Alfabetik sıra için kullanılıyor olduğunu görmüştüm ama bu şekilde kullanmak aklıma gelmezdi.

Çevrimiçi alquirel

  • Ubuntu Türkiye Tayfası
  • *
  • İleti: 3425
  • Dağıtım: Ubuntu
  • Sürüm: 14.04
Bence bu yeni yöntemin Türkçe karakterleri de içerecek şekilde genişletilmesi gerekir.
Çünkü ASCII'de a ve z aralığı bizim karakterlere tripli :)