Menghitung Jumlah Karakter

Kali ini saya akan memberikan contoh kode program untuk menghitung jumlah karakter dari file teks dengan bahasa C++. Kalau kalian mau melihat versi bahasa C, C++, dan pascal yang pakai input biasa (tanpa file); scroll ke bawah.

Kode program yang akan saya buat saya pisahkan ke dalam 3 function.

  1. baca_file : untuk membaca file
  2. hitung_huruf : untuk menghitung karakter.
  3. tampilkan_array : untuk menampilkan isi array yang menyimpan jumlah karakter.

Sebelum membuat programnya, kalian perlu membuat file teks kosong dengan notepad, qedit atau teks editor apapun. Kalian bisa mengisi filenya dengan kalimat apa saja. Tapi, syaratnya, isi file tersebut cuma boleh pakai huruf, spasi, angka, dan tanda baca yang ada di keyboard karena saya cuma menghitung karakter ASCII. Simpan filenya dengan nama "fileku.txt" pakai format UTF-8, jangan UTF-16!

Kalau kalian mau pakai teks yang isinya karakter unicode dengan format UTF-16, programnya perlu sedikit diubah dengan tipe wstring. Setelah teks-nya dibuat dan disimpan, mari kita lanjutkan untuk buat kodenya!

Function pertama adalah function baca_file yang dipakai untuk membaca file dan menyimpan isinya ke dalam string.

stringku baca_file(stringku nama){
std::ifstream fl;
stringku s="";
char c;
    fl.open(nama);
    if(fl.is_open()){
    	while(fl.get(c)){
    	    s+=c;
    	}
    	fl.close();
        cetak << "Teks : " << s << "\n";
    }else cetak << "Buat fileku.txt";
    return s;
}

Function selanjutnya kita gunakan untuk menghitung karakter dan menyimpannya ke dalam array. Kode ASCII tiap karakter akan digunakan sebagai indeks array.

void hitung_karakter(stringku s, int *a){
	int c;
	int n=s.length();
	for(int i=0;i<n;i++){
	    c=toupper(s[i]);
	    a[c]++;
	}
}

Function di atas menggunakan function toupper untuk mengubah semua huruf jadi huruf kapital. Kalau kalian mau memisahkan hitungan huruf besar dan kecil, ganti "c=toupper(s[i])" dengan "c=s[i]".

Function terakhir adalah function tampilkan_array yang memperlihatkan hasil perhitungan karakter.

void tampilkan_array(int *a, int n){
int spasi =' ';
	cetak << "Spasi : " << a[spasi];
	cetak << std::endl << std::endl;
	for(int i=0; i<n; i++){
	    if(a[i]!=0){
	    	if(i!=' '){
	            cetak << char(i) << " : ";
	            cetak << a[i] << std :: endl;
	    	}
	    }
	}
}

Semua kode program dengan bahasa C++ butuh fungsi utama. Fungsi utama yang akan kita gunakan adalah seperti di bawah ini.

int main(){
    stringku s;
    int arr[j_char];
    int unik=0;

    //kosongkan array
    for(int i=0; i<j_char; i++)arr[i]=0;
    s=baca_file(nama_file);
    cetak << "Panjang teks : " << s.length() << "\n\n";
    cetak << "mulai hitung ..." << "\n";
    hitung_karakter(s, arr);

    //tampilkan isi array
    unik=tampilkan_array(arr, j_char);
    cetak << "Ragam Karakter : " << unik;
}

Oh ya, lupa! Kalian perlu beberapa baris di luar fungsi seperti header definisi tipe, dan konstanta. Saya mengganti std::cout dengan cetak. Std::string juga saya ubah jadi tipe stringku dengan typedef. Nama_file bisa kalian sesuaikan dengan nama file yang kalian buat.

#include <iostream>
#include <fstream>

#define j_char 256
#define nama_file "fileku.txt"
#define cetak std::cout

typedef std::string stringku;

program utuhnya bisa kalian lihat di bawah ini.

#include <iostream>
#include <fstream>

#define j_char 256
#define nama_file "fileku.txt"
#define cetak std::cout

typedef std::string stringku;

stringku baca_file(stringku nama){
std::ifstream fl;
stringku s="";
char c;
    fl.open(nama);
    if(fl.is_open()){
    	while(fl.get(c)){
    	    s+=c;
    	}
    	fl.close();
        cetak << "Teks : " << s << "\n";
    }else cetak << "Buat fileku.txt";
    return s;
}

void hitung_karakter(stringku s, int *a){
	int c;
	int n=s.length();
	for(int i=0;i<n;i++){
	    c=toupper(s[i]);
	    a[c]++;
	}
}

int tampilkan_array(int *a, int n){
    int spasi =' ';
    int unik=0;
    cetak << "Spasi : " << a[spasi];
    cetak << "\n\n";
    for(int i=0; i<n; i++){
	if(a[i]!=0){
	    if(i!=' '){
	        cetak << char(i) << " : ";
	        cetak << a[i] << "\n";
	    }
            unik++;
        }
    }

    return unik;
}

int main(){
    stringku s;
    int arr[j_char];
    int unik=0;

    //kosongkan array
    for(int i=0; i<j_char; i++)arr[i]=0;
    s=baca_file(nama_file);
    cetak << "Panjang teks : " << s.length() << "\n\n";
    cetak << "mulai hitung ..." << "\n";
    hitung_karakter(s, arr);

    //tampilkan isi array
    unik=tampilkan_array(arr, j_char);
    cetak << "Ragam Karakter : " << unik;
}
Text :
Teks : Nama Saya Geri. Saya suka belajar pemrograman.
  
Output
Teks : Nama Saya Geri. Saya suka belajar pemrograman.
Panjang teks : 46

mulai hitung ...
Spasi : 6

. : 2
A : 11
B : 1
E : 3
G : 2
I : 1
J : 1
K : 1
L : 1
M : 3
N : 2
O : 1
P : 1
R : 4
S : 3
U : 1
Y : 2
Ragam Karakter : 18

Simpan file kode dan teksnya di folder yang sama. Kalau kalian pakai code::block, letakkan file teksnya di dalam folder project kalian.

Menyimpan dengan Map

Selain menyimpan dengan array statis, kalian bisa menggunakan map supaya penyimpanannya lebih fleksibel. Variabel hanya akan menyimpan karakter yang ada di dalam teks. Function yang perlu diubah adalah function hitung_karakter dan tampilkan_array. Kalian tidak perlu mengubah function baca_file.
#include <iostream>
#include <fstream>
#include <map>

#define j_char 256
#define nama_file "fileku.txt"
#define cetak std::cout
#define mapku std::map<char, int>

typedef std::string stringku;

stringku baca_file(stringku nama){
std::ifstream fl;
stringku s="";
char c;
    fl.open(nama);
    if(fl.is_open()){
    	while(fl.get(c)){
    	    s+=c;
    	}
        fl.close();
        cetak << "Teks : " << s << "\n";
    }else cetak << "Buat fileku.txt";
    return s;
}

void hitung_karakter(stringku s, mapku *a){
	char c;
	int n=s.length();
	for(int i=0;i<n;i++){
	    c=toupper(s[i]);
	    if(a->find(c) != a->end()){
	    	(*a)[c]++;
	    }else a->insert(std::pair<char, int>(c, 1));
	}
}

int tampilkan_array(mapku *a){
   int spasi =' ';
   int unik=0;
   if(a->find(' ')!=a->end())cetak << "Spasi : " << a->at(spasi);
   cetak << "\n\n";
   for(auto p=a->begin();p!=a->end();p++){
	if(p->first!=' '){
	    cetak << p->first << " : ";
	    cetak << p->second << "\n";
	}
    unik++;
    }

    return unik;
}

int main(){
    stringku s;
    mapku arr;

    //kosongkan array
    s=baca_file(nama_file);
    cetak << "Panjang teks : " << s.length() << "\n\n";
    cetak << "mulai hitung ..." << "\n";
    hitung_karakter(s, &arr);

    //tampilkan isi array
    tampilkan_array(&arr);
    cetak << "Ragam Karakter : " << arr.size();
}

Tanpa File?

Kalau kalian ingin pakai input biasa tanpa file, kalian bisa menghapus fungsi baca_file, dan menggantinya dengan getline. Kalian juga perlu sedikit mengubah fungsi utamanya.

#include <iostream>
#include <fstream>
#define j_char 256
#define nama_file "fileku.txt"
#define cetak std::cout

typedef std::string stringku;

void hitung_karakter(stringku s, int *a){
	int c;
	int n=s.length();
	for(int i=0;i<n;i++){
	    c=toupper(s[i]);
	    a[c]++;
	}
}

int tampilkan_array(int *a, int n){
    int spasi =' ';
    int unik=0;
	cetak << "Spasi : " << a[spasi];
	cetak << "\n\n";
	for(int i=0; i<n; i++){
	    if(a[i]!=0){
	    	if(i!=' '){
	            cetak << char(i) << " : ";
	            cetak << a[i] << std :: endl;
	    	}
	    	unik++;
	    }
	}

	return unik;
}

int main(){
    stringku s;
    int arr[j_char];
    int unik=0;

    //kosongkan array
    for(int i=0; i<j_char; i++)arr[i]=0;
    cetak << "Teks : ";
	std::getline(std::cin, s);
	cetak << "Panjang teks : " << s.length() << "\n\n";
	cetak << "mulai hitung ..." << "\n";
	hitung_karakter(s, arr);

    //tampilkan isi array
    unik=tampilkan_array(arr, j_char);
    cetak << "Ragam Karakter : " << unik;
}

Kalau kalian ingin coba versi bahasa C dan Pascal, kalian bisa mencoba dua kode di bawah ini.

Versi C :
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define j_char 256
#define nama_file "fileku.txt"

typedef char stringku[1024];

void hitung_karakter(stringku s, int *a){
	int c;
	int n=strlen(s);
	for(int i=0;i<n;i++){
	    c=toupper(s[i]);
	    a[c]++;
	}
}

int tampilkan_array(int *a, int n){
    int spasi =' ';
    int unik=0;
	printf("Spasi : %d\n\n", a[spasi]);
	for(int i=0; i<n; i++){
	    if(a[i]!=0){
	    if(i!=' '){
	        printf("%c : %d\n", i, a[i]);
	    }
	    unik++;
	}
    }

    return unik;
}

int main(){
    stringku s;
    int arr[j_char];
    int unik=0;

    //kosongkan array
    for(int i=0; i<j_char; i++)arr[i]=0;
    printf("Teks : ");scanf("%[^\n]", s);
    printf("Panjang teks : %d\n\n", strlen(s));
    printf("mulai hitung ...\n");
    hitung_karakter(s, arr);

    //tampilkan isi array
    unik=tampilkan_array(arr, j_char);
    printf("Ragam Karakter : %d", unik);
}

Versi Pascal :

program Hitung_file;
uses crt;

type arrayku=array[0..255] of Integer;

const j_char:integer=255;
var arr:arrayku;
var i:integer;s:string;

procedure hitung_karakter(s:string;var a:arrayku);
	var n:integer;
	    t:string;
	    c:char;
begin
	n:=length(s);
	t:=upcase(s);
	for i:=1 to n do
	begin
	    c:=t[i];
	    inc(a[ord(c)]);
	end;
end;

function tampilkan_array(var a:arrayku;n:integer):integer;
var unik:integer=0;
begin
    writeln('Spasi : ', a[ord(' ')]);writeln;
    for i:=1 to n do
    begin
        if((a[i]>0) and (chr(i)<>' '))then
        begin
            writeln(chr(i), ' : ', a[i]);
            inc(unik);
        end;
    end;
    tampilkan_array:=unik;
end;

var ragam:integer;

begin
  clrscr;
  //kosongkan array
  for i:=0 to j_char do arr[i]:=0;
  write('Teks : ');readln(s);
  writeln('Panjang teks : ', length(s));
  writeln('mulai hitung ...');writeln;
  hitung_karakter(s, arr);

  //tampilkan isi array
  ragam:=tampilkan_array(arr, j_char);
  write('Ragam Karakter : ', ragam);
  readln;
end.

Klik di sini untuk mendapatkan source kodenya.