[Çözüldü] Cümledeki kelimelerin ilk harfini büyük yapan program

Başlatan fırtına mühendis, 29 Nisan 2012 - 09:34:45

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

fırtına mühendis

Arkadaşlar  cümledeki kelimelerin ilk harfini büyük yapan program
aşağıdaki gibi.
#include <stdio.h>
#include <ctype.h>

int main (void) {
int c; int state = 1;
for ( ; ; ) {
c = getchar();
if (c == EOF) break;
switch (state) {
case 1:
if (isalpha(c)) {
putchar(toupper(c));
state = 2;
}
else putchar(c);
break;
case 2:
if (!isalpha(c)) state = 1;
putchar(c);
break;
}
}
return 0;
}

Bu kodun aşağıdaki kısmını  ve özellikle !isalpha işlevini ne demek olduğunu anlamadım.
case 2:
if (!isalpha(c)) state = 1;
putchar(c);
break;

Yardımcı olabilir misiniz?

sem

isalpha bir makrodur. Parametre olarak aldığı değişken içeriğinin alfabetik bir değer olup olmadığını sınar(a- z, A-;Z).  ctype.h içerisinde bu gibi alfabetik mi, nümerik mi, alfanümerik mi gibi gibi kontrolleri yapmaya yarayan bir çok makro vardır.

Anlamadığınız bölüm şu işlemi yapıyor;

* state 2 ise (case 2:)
* getchar ile alınan c değeri alfabetik değilse (if(isalpha(c)))
* state değişkenine 1 değerini ata (state = 1)
* c değişkenini ekrana yaz (putchar(c))
* case 2'den çık. (break)
".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?

ct

isalpha() bir fonksiyon ve int döndürüyormuş. İçindeki değerin karakter olup olmadığnı kontrol ediyor. Şurada referansı var:

http://www.cplusplus.com/reference/clibrary/cctype/isalpha/

if'in içinde kullanırsanız eğer sıfırdan farklıysa bu döndürdüğü int değeri if'in devamındaki kodu çalıştırır. Değilse atlar. !isalpha() ise bunun tersi. Yani bu karakter değilse aşağıdaki işlemi yaptır demek oluyor.

toupper için referansa bakmaya gerek yok zaten adından da anlaşılacağı gibi harfi büyültüyor. putchar ise stdout'a gönderiyor yani yazdırıyor o karakterleri. C bilgim zayıf ama önerim bu tarz örnek kod yerine kitapla ilerlemeniz. Böylece temelini, mantığını öğrenmiş olursunuz.



fırtına mühendis

switch (state) {
case 1:
if (isalpha(c)) {
putchar(toupper(c));
state = 2;
}
else putchar(c);
break;
case 2:
if (!isalpha(c)) state = 1;
putchar(c);
break;

bu kodda case 2' ye neden ihtiyaç duyuyoruz?
case 1 ve case 2 arasında nasıl bir ilişki var?
Kısacası bunun çalışma mantığını örnek
üzerinde anlatabilir misiniz?

sem

case 1 büyük harfi yazdırıyor ve state değişkenine 2 atıyor. case 2 ise karakteri olduğu gibi yazıyor.case 2 de karakter olmayan bir değer görülürse yazdırılıyor ve state 1 olarak değiştiriliyor. Böylece karakter olmayan değerden sonraki gelen karakterler case 1 e gönderiliyor ve büyük harf ile başlanması sağlanıyor. Kod tamamen doğru mudur? değildir. Nümerik olmama gibi bir test yok. Tabii ihtiyaca göre diyelim... Doğru çalışabilir fakat her ihtiytacı karşılamayabilir. Aşağıdaki çıktıda olduğu gibi;


Alıntı YapA123fff
A123Fff
a...b
A...B
a, b
A, B

Mesela ilk örnekteki 3 ten sonra gelen f harfi her zaman büyük yazılması istenmeyebilir.

case 1 ile case 2 arasındaki ilişki buna odaklı... Mesela

A123fff

için uygulama sırası ile;

case 1 (çünkü alfabetik)
case2  (çünkü bir önceki alfabetikti ve state 2 oldu. Yani case1'den sonra gelen rakam da alfabetik de olsa büyük yazılmasına gerek yok)
case1  (çünkü bir önceki case 2 idi ve alfabetik değildi. Bu harf büyük yazılabilir, eğer harf ise)
case2  (çünkü bir önceki nümerikti ve state 2 olarak değiştirildi. Yani bir önceki case 1 den sonra rakam da nümerik de gelse ekrana olduğu gibi yazılmalı)
case1 (çünkü aynı şekilde bir önceki karakter alfabetik değildi o nedenle bu karakter büyük yazılabilir. Ki yazıldı da, burası büyük yazılan F harfinin olduğu yer)
case2
...

şeklinde gidiyor.
".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?

fırtına mühendis