LEthaL
19/11/2003, 22:52
Gerekli açıklamaları kodun satır aralarında yaptım.
Girilen karakter dizisini onluk sayısal sisteme çeviren bir kod dizemiz var.
Programın daha hızlı çalışması, kodlamadaki fazlalıklar...
Yapabileceğimiz iyileştirmeleri yazarsanız -gerek bana gerekse ilgilenenlere- yararı olacağına inanıyorum.
#include <stdio.h>
#include <string.h>
/* Bu kisim kullanilmiyor. #define kullanip yapmayi dusunmustum ama
vazgectim :)
/*
#define M 1000
#define C 100
#define L 50
#define X 10
#define V 5
#define I 1
*/
/* Global Roma rakamlarinin tutulacagi dizi
Baslangicta hepsinin degeri 0 (neden 0 oldugunu ilerki kisimda anlayacagiz)
*/
int rom[]={0,0,0,0,0,0,0,0,0,0};
/* rom dizisi sayi tipinde oldugu icin icindekiler aslinda harlerin
sayisal karsiliklari C icin 88 gibi asagidaki islev string.h
baslik kutuphanesinde yoktu ben de yazayim dedim.
Bir dizi icinde aranan harfi istenilen sayi ile degistirme gorevini
goruyor. rom dizimizin icindeki harfleri teker teker degistirmek icin
*/
char *cevir(char aranan,int degistirilecek,int *str){
int i=0;
while(str[i]) {
if( (int) aranan == str[i] )
str[i] = degistirilecek;
++i;
}
return str;
}
// Kullanicinin girdigi "CCCXIV" gibi seti rom dizimize yerlestiriyor.
void rome2dig(char *rkm){
int i;
for(i=0;i<strlen(rkm);++i) {
rom[i]=rkm[i];
// printf("%d\n",rom[i]); Kontrol amacli yazdirma islemi
}
}
// Isi goren Islev (fonksiyon)
int main() {
int i,j,vr=0;
int sayi,toplam=0;
char *girilen;
clrscr();
printf("Roma Rakimini Giriniz: ");
gets(girilen);
// Kullanicidan gelen karakter dizisini diziye oldugu gibi yerlestiriyoruz
rome2dig(strupr(girilen));
// strupr kullanicidan gelen xi gibi kucuk harfler icin.
// Teker teker tum roma rakamlari sayisal degerlerine cevrilip
// diziye yerlestiriliyor. cevir islevimizi cagiriyoruz
cevir('C',100,rom);
cevir('M',1000,rom);
cevir('L',50,rom);
cevir('X',10,rom);
cevir('V',5,rom);
cevir('I',1,rom);
/* Diziye yerlestirdik, sayisal degerlerine cevirip c->100, l->50 gibi
tekrar rom isimli dizimizi duzenledikten sonra asil sayisal cevrim isi
basliyor.
*/
for(i=9;i>=0;--i) {
j=i-1;
sayi=rom[i];
while(rom[i]>rom[j]) {
if(j<0)
break;
sayi -= rom[j];
--j;
vr=1;
}
toplam += sayi;
if(vr) {
i=j+1;
vr=0;
}
}
printf("Sayisal Cevrim: %d\n\n\tCikmak icin herhangi bir tusa basin...",toplam);
getch();
return 0;
}
Girilen karakter dizisini onluk sayısal sisteme çeviren bir kod dizemiz var.
Programın daha hızlı çalışması, kodlamadaki fazlalıklar...
Yapabileceğimiz iyileştirmeleri yazarsanız -gerek bana gerekse ilgilenenlere- yararı olacağına inanıyorum.
#include <stdio.h>
#include <string.h>
/* Bu kisim kullanilmiyor. #define kullanip yapmayi dusunmustum ama
vazgectim :)
/*
#define M 1000
#define C 100
#define L 50
#define X 10
#define V 5
#define I 1
*/
/* Global Roma rakamlarinin tutulacagi dizi
Baslangicta hepsinin degeri 0 (neden 0 oldugunu ilerki kisimda anlayacagiz)
*/
int rom[]={0,0,0,0,0,0,0,0,0,0};
/* rom dizisi sayi tipinde oldugu icin icindekiler aslinda harlerin
sayisal karsiliklari C icin 88 gibi asagidaki islev string.h
baslik kutuphanesinde yoktu ben de yazayim dedim.
Bir dizi icinde aranan harfi istenilen sayi ile degistirme gorevini
goruyor. rom dizimizin icindeki harfleri teker teker degistirmek icin
*/
char *cevir(char aranan,int degistirilecek,int *str){
int i=0;
while(str[i]) {
if( (int) aranan == str[i] )
str[i] = degistirilecek;
++i;
}
return str;
}
// Kullanicinin girdigi "CCCXIV" gibi seti rom dizimize yerlestiriyor.
void rome2dig(char *rkm){
int i;
for(i=0;i<strlen(rkm);++i) {
rom[i]=rkm[i];
// printf("%d\n",rom[i]); Kontrol amacli yazdirma islemi
}
}
// Isi goren Islev (fonksiyon)
int main() {
int i,j,vr=0;
int sayi,toplam=0;
char *girilen;
clrscr();
printf("Roma Rakimini Giriniz: ");
gets(girilen);
// Kullanicidan gelen karakter dizisini diziye oldugu gibi yerlestiriyoruz
rome2dig(strupr(girilen));
// strupr kullanicidan gelen xi gibi kucuk harfler icin.
// Teker teker tum roma rakamlari sayisal degerlerine cevrilip
// diziye yerlestiriliyor. cevir islevimizi cagiriyoruz
cevir('C',100,rom);
cevir('M',1000,rom);
cevir('L',50,rom);
cevir('X',10,rom);
cevir('V',5,rom);
cevir('I',1,rom);
/* Diziye yerlestirdik, sayisal degerlerine cevirip c->100, l->50 gibi
tekrar rom isimli dizimizi duzenledikten sonra asil sayisal cevrim isi
basliyor.
*/
for(i=9;i>=0;--i) {
j=i-1;
sayi=rom[i];
while(rom[i]>rom[j]) {
if(j<0)
break;
sayi -= rom[j];
--j;
vr=1;
}
toplam += sayi;
if(vr) {
i=j+1;
vr=0;
}
}
printf("Sayisal Cevrim: %d\n\n\tCikmak icin herhangi bir tusa basin...",toplam);
getch();
return 0;
}