C - Cümlenin Harf Histogramı
-
Merhaba arkadaşlar. Soru Dennis Ritchie nin kitabında yazan bir sorudur. Aklıma şöyle bir çözüm geldi fakat başka çözümleri de görmek istiyorum :)
Soru: Size verilen bir cümledeki harfleri kaç kez geçtiğini yazan bir program yazın. Büyük - küçük harf farketmeyecek.
Örnek input:
dEnemE YAPiyORUm ben burada
output:
A:3
B:2
D:2
E:4
I:1
M:2
N:2
O:1
P:1
R:2
U:2
Y:2
Bu da benim çözümüm:
#include <stdio.h>
#include <string.h>
char a[250],b[250];
int i;
int main(){
fgets(b,100,stdin);
for (i=0;i<strlen(b);i++) {
if (b[i]>=97){
a[b[i]-32]+=1;
} else if(b[i]==32) {
continue;
} else {
a[b[i]]+=1;
}
}
for (i=0;i<250;i++) {
if (a[i]!=0){
printf ("%c:%d \n", i, a[i]);
}
}
return 0;
}
-
Alttaki de bu işin C++'cesi.
// Girilen sözcükteki harf frekanslarını sayıyla ve çubuk grafiğiyle verir. // 2012 - YeniHarman #include <cstdlib> #include <iostream> #include <string> #include <cctype> #include <vector> using std::string; using std::cout; using std::cin; using std::endl; using std::vector; typedef vector<int> FTABLE; FTABLE * LetterFrequence(string &Str) { FTABLE * FTable = new FTABLE(27,0); for(int i = 0; i < Str.size(); ++i) { ++FTable->at ( (isalpha(Str[i]) ? (toupper(Str[i]) - 'A') : 26) ); } return FTable; } void PrintFTable(FTABLE &ft) { FTABLE::iterator it; for(it = ft.begin(); it < ft.end() - 1; ++it) { static int i = 0; if (*it > 0) { cout << (char)(i + 'A') << ": " << *it << endl; } ++i; } cout << "Harf olmayanlar: " << ft.back() << endl; } void DrawFTable(FTABLE &ft) { FTABLE::iterator it; for(it = ft.begin(); it < ft.end() - 1; ++it) { static int i = 0; if (*it > 0) { cout << (char)(i + 'A') << '\t'; for(int k = 0; k < *it ; ++k) { cout << '-'; } cout << endl; } ++i; } cout << "Diger "; for(int k = 0; k < *it ; ++k) { cout << '-'; } cout << endl; } int main(int argc, char *argv[]) { string str; cout << "Harf frekansinin ogrenilecegi sozcugu giriniz (Turkce karakterler olmadan): "; cin >> str; cin.ignore(255,'\n'); FTABLE * FrekansTablosu = LetterFrequence(str); PrintFTable(*FrekansTablosu); DrawFTable(*FrekansTablosu); cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS; }
-
Türkçe karakterler için de yapmak mümkün mü bunu?
-
manialith bunu yazdı
Türkçe karakterler için de yapmak mümkün mü bunu?
Benim yazdığım kodda değil. ASCII kodları küçükle büyük harfler için ayarlı fakat türkçe karaterlerin ASCII kodları farklı. Ondan olmaz.
-
ben de c# ile yaptım :)
class Program { static void Main(string[] args) { Console.Write("Harf Frekanslarını Öğrenmek İstediğiniz Metni Girin: "); string metin = Console.ReadLine(); Cozumle(metin); Console.ReadKey(); } private static void Cozumle(string metin) { var yeniMetin = new String(metin.ToUpper().Where(Char.IsLetter).ToArray()); SortedDictionary<char,int> harfler= new SortedDictionary<char, int>(); foreach (char c in yeniMetin) { if(harfler.ContainsKey(c)) harfler[c] = Convert.ToInt32(harfler[c]) +1; else harfler.Add(c,1); } foreach (KeyValuePair<char, int> harfSayi in harfler) Console.WriteLine(String.Format("{0} : {1}",harfSayi.Key,harfSayi.Value)); } }
Bu da ikinci versiyonu, çubuk grafikle :)
class Program { static void Main(string[] args) { Console.Write("Harf Frekanslarını Öğrenmek İstediğiniz Metni Girin: "); string metin = Console.ReadLine(); Cozumle(metin); Console.ReadKey(); } private static void Cozumle(string metin) { var yeniMetin = new String(metin.ToUpper().Where(Char.IsLetter).ToArray()); SortedDictionary<char,int> harfler= new SortedDictionary<char, int>(); foreach (char c in yeniMetin) { if(harfler.ContainsKey(c)) harfler[c] = Convert.ToInt32(harfler[c]) + 1; else harfler.Add(c,1); } string tmpSeviye; foreach (KeyValuePair<char, int> harfSayi in harfler) { tmpSeviye = ""; for (int i = 0; i < harfSayi.Value; i++) tmpSeviye += "-"; Console.WriteLine(String.Format("{0} : {1} \t {2}", harfSayi.Key, harfSayi.Value,tmpSeviye)); } } }
unbalanced tarafından 09/Şub/13 04:28 tarihinde düzenlenmiştir