[çözüldü]Bir Cumledeki Büyük Harf ve Küçük Harf Sayılarını bulan program

Başlatan Ozgurluk, 25 Kasım 2011 - 14:02:21

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Ozgurluk


#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

travego0403

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;

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

alquirel

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.

Ozgurluk

@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...

alquirel

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

Ozgurluk

@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?

travego0403

@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.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

alquirel

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.

Ozgurluk

@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

travego0403

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;
    }
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Ozgurluk

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?

travego0403

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?
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Ozgurluk

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ü.

alquirel

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.

Ozgurluk

@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.

alquirel

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

sem

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?

Ozgurluk

@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.

alquirel

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.

travego0403

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.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

sem

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?

alquirel

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

utdmr

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').
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.

travego0403

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.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

alquirel

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 :)