Ubuntu Türkiye

Yazılım => Programlama => C/C++ => Konuyu başlatan: Ozgurluk - 25 Kasım 2011 - 14:02:21

Başlık: [çözüldü]Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 25 Kasım 2011 - 14:02:21

#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
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: travego0403 - 25 Kasım 2011 - 14:31:19
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.

#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;

}
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: alquirel - 25 Kasım 2011 - 14:55:11
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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 25 Kasım 2011 - 16:23:57
@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ı.


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...
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: alquirel - 25 Kasım 2011 - 16:46:00
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.


while(cumle[i])
    {
        i++;
        if (cumle[i]=' ') continue;
        if (islower(cumle[i]))
           k=k+1;
       else
           b=b+1;
    }
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 25 Kasım 2011 - 17:03:15
@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?
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: travego0403 - 25 Kasım 2011 - 17:15:23
@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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: alquirel - 25 Kasım 2011 - 17:16:13
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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 25 Kasım 2011 - 17:17:53
@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 : 25 Kasım 2011 - 17:21:03

@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
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: travego0403 - 25 Kasım 2011 - 17:24:32
Anladıysan sorun yok :) Şu kod parçasını çalıştırıp incelersen çok daha iyi anlayacağını düşünüyorum.
for(int i=0;i<=5;i++){
        if(i==3)
            continue;
        cout<<i<<endl;
    }
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 25 Kasım 2011 - 18:04:07
contiune deyimi ile sonuç üretmiyor. bir de şöyle denedim.

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 : 25 Kasım 2011 - 18:06:16

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?
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: travego0403 - 25 Kasım 2011 - 18:15:55
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?
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 25 Kasım 2011 - 18:23:00
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.


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ü.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: alquirel - 25 Kasım 2011 - 18:32:07
Ben de şöyle bir şey yazdım şimdi.


#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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 25 Kasım 2011 - 18:37:26
@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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: alquirel - 25 Kasım 2011 - 18:44:13
Alıntı yapılan: Ozgurluk - 25 Kasım 2011 - 18:37:26
@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 ;)
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: sem - 25 Kasım 2011 - 18:46:52
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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 25 Kasım 2011 - 19:21:22
@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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: alquirel - 25 Kasım 2011 - 20:44:55
Alıntı yapılan: Ozgurluk - 25 Kasım 2011 - 19:21:22
@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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: travego0403 - 25 Kasım 2011 - 21:20:49
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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: sem - 26 Kasım 2011 - 09:15:39
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 =)
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: alquirel - 26 Kasım 2011 - 14:53:17
Alıntı yapılan: sem0900 - 26 Kasım 2011 - 09:15:39
EK: cumle[ii] kısını bilerek iki tane i ile yaptım yoksa BBC italik yapıyor =)

"code" etiketi kullansaydın :P
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: utdmr - 26 Kasım 2011 - 19:01:16
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.

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').
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: travego0403 - 26 Kasım 2011 - 19:10:20
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.
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: alquirel - 26 Kasım 2011 - 19:32:18
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 :)
Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: Ozgurluk - 27 Kasım 2011 - 03:03:34
Alıntı yapılan: travego0403 - 25 Kasım 2011 - 21:20:49
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.

Bu program, sadece ödev için. 

@utdmr, gerçekten güzel çözüm bunu denedim ama olmadı. Neyse dediğim gibi, ödev içindi sadece bu. Teşşekkür ederim kodu kaydettim ben gene ilerde bunu tekrar denerim.
@sem0900 teşşekkürler, scanf fonksiyonun kullanimi daha kolay olduğu için C Derslerinin başında galiba genellikle onu gösteriyorlar.
@alquirel haklısın, bizim karatkerlere, tiripli bu bilgisayar dünyası. @utdmr, yöntemini denediğimde sonuç alamadım. Alsam daha güzel bir ödev olacaktı. Hep büyük saydı karakterleri döngü içinde kod. Küçükleri saymadı.
@travego0403,@utdmr,@sem0900,@alquirel Sizlere tekrar tekrar teşşekkür ederim. Konuya vakit ayırdığınız için. Benim ödevim için bu kod ingilizce karakterlerle çalışır durumda. Artık öyle teslim ederim.

Saygılarımla!..

Başlık: Ynt: Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program
Gönderen: if - 27 Kasım 2011 - 03:11:35
O zaman konuyu çözüldü olarak etiketleyelim. Eğer Türkçe harflerle de çalışır halini siz ya da diğer arkadaşlar yazarsa 'Kilidinin açılmasını istediğiniz konular'dan istekte bulunursunuz, eklersiniz.