Çözüldü C'de metinsel ifadeyi sayısal ifadeye çevirme nasıl yapılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

kutalikor

Centipat
Katılım
25 Aralık 2022
Mesajlar
77
Daha fazla  
Cinsiyet
Erkek
Sayının tek mi çift mi olduğunu anlamak için bir program yazdım, değişken için int kullandım. Mesela kullanıcı '40' yazmak yerine 'kırk' yazarsa bunu nasıl '40' olarak alabilirim?
C:
#include <stdlib.h>
#include <stdio.h>

int main()
{
    int sayi = 0;
    printf(" sayıyı girin\n");
    scanf("%d",& sayi);
    sayi=sayi%2;
    if (sayi == 0){
        printf("çift");
    }else{
        printf("tek"); }
}
 
Çözüm
Input'u string olarak alıp, stringteki karakterlerin numeric olup olmadığına bakarsın. Numeric olmayan karakter varsa sayı girin dersin, aksi halde atoi kullanıp sayiya dönüştürürsün. Yapamadım dersen örnek kod atarım elimin boş zamanında.

Tek çift kontrolünü biliyorsun zaten, ayrı fonksiyona aldım sadece;
C:
int iseven(int num) {
    return num % 2 == 0;
}

Sonraki aşamada verilen stringin tamamen numeric olup olmadığına bakmak var;
C:
int isnum(char * str) {
    while(*str != '\0' && str) {
        if(!isdigit(*str))
            return 0;
        str++;
    }
    return 1;
}

Son olarak da input alıp, aldığımız inputu validate edip, atoi kullanarak int'e dönüştürmek ve oradan da iseven'a göndermek var.

C:
int main(void) {
    char * input = (char*)malloc(sizeof(char) * 1024);
    printf("Enter a number to evaluate: ");
    scanf("%s", input);

    if(!isnum(input)) {
        printf("Given input \"%s\" is not a number.", input);
        return -1;
    }

    printf("Result: %s", iseven(atoi(input)) ? "Even" : "Odd");

    return 0;
}

Bu kadar. atoi (array to integer) karakter array (string) alıp, o karakter arrayi sonrasında, integera dönüştürür. Error checking yapmaz.
Hem bildiğim kadarıyla hem de yapay zekadan öğrendiğim kadarıyla her "kırk" gibi metinsel ifadelerin sayısal karşılığını tanımlamanız gerekir. Bu da sınırlı sayıda yapılabilir.
 
Dillerin çoğunda sayılar belli bir patterni takip eder. Buna göre bir parse mekanizması yazabilirsin. Sözlük olusturursun bu sayılara karşılık gelenleri eklersin. Örneğin Türkçe'de, 11 sayısı on bir şeklinde yazılır. Bu da aslında 10 + 1. Doğru ayarlarsan milyonlara kadar parse edebilmelisin.

Bir'den on'a kadar tüm sayıları, on'dan yüz'e kadar onar onar ara sayıları ve bir kere de yüzü tanimlasan, ilk 999 sayıyı tanımlamış olursun. "Dokuz yüz doksan dokuz". Rahatça parse edilebilir. Tabii amele işi olur biraz. Bir de kullanıcının bunları doğru yazması var.
 
Veya Python'da except ile yaptığımız gibi halledebilir miyiz? Örneğin: "sayi" değişkeninin rakamlarla yazılmadığını anladığında "sayi girin" yaz, gibi.
 
Input'u string olarak alıp, stringteki karakterlerin numeric olup olmadığına bakarsın. Numeric olmayan karakter varsa sayı girin dersin, aksi halde atoi kullanıp sayiya dönüştürürsün. Yapamadım dersen örnek kod atarım elimin boş zamanında.

Tek çift kontrolünü biliyorsun zaten, ayrı fonksiyona aldım sadece;
C:
int iseven(int num) {
    return num % 2 == 0;
}

Sonraki aşamada verilen stringin tamamen numeric olup olmadığına bakmak var;
C:
int isnum(char * str) {
    while(*str != '\0' && str) {
        if(!isdigit(*str))
            return 0;
        str++;
    }
    return 1;
}

Son olarak da input alıp, aldığımız inputu validate edip, atoi kullanarak int'e dönüştürmek ve oradan da iseven'a göndermek var.

C:
int main(void) {
    char * input = (char*)malloc(sizeof(char) * 1024);
    printf("Enter a number to evaluate: ");
    scanf("%s", input);

    if(!isnum(input)) {
        printf("Given input \"%s\" is not a number.", input);
        return -1;
    }

    printf("Result: %s", iseven(atoi(input)) ? "Even" : "Odd");

    return 0;
}

Bu kadar. atoi (array to integer) karakter array (string) alıp, o karakter arrayi sonrasında, integera dönüştürür. Error checking yapmaz.
 
Son düzenleyen: Moderatör:
Çözüm
Turkce sayilari ifade etmek icin cok sistematik ve guzel bir dil oldugu icin ( Oktay Sinanoglu'nu buradan rahmetle yad ediyoruz ) aslinda bunu Turkce icin yapmak gorece kolay, fakat basli basina bir kutuphane cikar bundan.

Finansal islerde de bolca kullanilir. ( Yalniz yetmis iki bin on uc Turk lirasi vs )

Girilen string'i 3 lu gruplara ayirip onlari takip eden (ya da etmeyen) substring uzerinden decimal noktasina ulasabilirsin.

Kabaca

yuz on uc milyon ile basliyorsa 113 * 1m;
yuz on uc bin ile basliyorsa 113 * 1k;
yuz on uc ile bitiyorsa <onceki_parse> + 113 gibi.
 
Anladım, birkaç denemeyle daha da iyi anlayabilirim, çok teşekkürler.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…