BİLİŞİM - BİLGİSAYAR - EĞİTİM
  atoi - atof - atol İşlevleri
 

6.2  atoi , atof, atol .. İşlevlerini Gerçekleme:

                Genellikle bir programın akışı boyunca bazı verilerin tiplerinin değiştirilmesi gerekir. Bu değişim string tipindeki bir değişkenin sayısal tipe dönüştürülmesi veya tersi biçiminde olabilir.  Sayısal string : içeriği C'nin sayı gösterimine uygun olan metin.             '5.87'  ,  '0.3E5'  , '3423'

 

Örnek 6.2.1: String tipi bir değişkenin değerini  tamsayısal tipe dönüştüren işlevi yazınız.(atoi (stdlib.h))

Girdi : Tamsayısal string

Çıktı : Karşılık gelen sayı

#include <stdlib.h>

#include <string.h>

int deger (char *);

main()

{

  char *c;

  int i;

c="93t54";

  i=deger(c);

  printf("%s dizi katarının sayısal karşılığı %d n",c, i);

}

int deger( char *s)

{

  int i,j;

  int x;   /*sayı */

  x = 0;

  for (i = 0; i<strlen(s); i++) {

      j = s[i] - '0';

      x = x * 10 + j ;

  }

  return x; }

Örnek 6.2.2 : Önceki örnekteki değer işlevini ondalık sayıları da (nokta dikkate alınacak) işleyecek şekilde geliştiriniz.

 

Yukarıda yazmaya çalıştığımız işlevin C dilinde  karşılığı mevcuttur (stdlib.h).

int atoi(char *s) : tamsayıya dönüştürür.

long int atol(char *s) : uzun tamsayıya dönüştürür.

double atof(char *s) : gerçel sayıya dönüştürür.

Bu işlevler dönüştürme işlemine s içerisinde geçersiz bir karakter ile karşılaşıldığında son verir. Ve bu noktaya

kadar karakterlerin oluşturduğu sayıyı verir. İlk karakter geçersiz ise işlevin değeri tanımsızdır. Aynı işlevlerin biraz daha gelişmişleri ise;

double strtod(const char *s, char **ss) :                  

long int strtol(const char *s, char **ss, int base) :   

unsigned int strtol(const char *s, char **ss, int base) :

s  : string bilgi

ss : s değişkeninde ilk geçersiz karakter ve sonrasında katar dizini gösterir

base : dönüşümün hangi tabana göre yapılacağını belirtir.

 

Örnek 6.2.3: atoi, atol, atof işlevlerinin davranışları.

 

main()

{

  char *s;

  int i;

  long x;

  double f;

s="5";

  printf("%d   %ld   %fn",atoi(s),atol(s),atof(s));

  s="5.4";

  printf("%d   %ld   %fn",atoi(s),atol(s),atof(s));

  s="5.2e4=KL";

  printf("%d   %ld   %fn",atoi(s),atol(s),atof(s));

}

s değeri                    çıktı

--------------------------------------------------

   5                        5      5      5.000000

   5                        5      5      5.400000

   5                        5      5      52000.000000

 

Giriş İşlevleri

main()

{

  char c1, c2;

  char s[10];

  clrscr();

  c1 = getchar(); /* klavyeden ENTER tuşuna basılana kadar tuş bekler */

                  /* cursor on, karakter yazılır */

  c2 = getchar(); /* klavyenin tamponundaki sıradakini okur */

  printf("n%c  ,  %cn",c1,c2);

  c1 = getche(); /* tuş basılmasını bekler,  ENTER beklenmez*/

                  /* cursor on, karakter yazılır */

  c2 = getche(); /* tuş basıldıktan sonra kontrol bu satıra geçer */

  printf("n%c  ,  %cn",c1,c2);

  c1 = getch(); /* tuş basılmasını bekler,  ENTER beklenmez */

                  /* cursor on, karakter yazılmaz    x  int putch(int c): c ekrana yazılır*/

  c2 = getch(); /* tuş basıldıktan sonra kontrol bu satıra geçer */

  printf("n%c  ,  %cn",c1,c2);

}

 

Örnek 6.2.4: Tamsayı bir değeri dizgiye dönüştüren programı yazınız. (ecvt, fcvt, gcvt var ancak ANSI C değil)

 

#include <stdio.h>

int main()

 {

    char *s;

    int i;

    i = 2137;

    itostr(s, i);

    printf("%d   %sn",i, s);

}

itostr(char *hedef, int sayi)

{

  int i, j, kb;

  j = sayi;

  for (kb = 0; j>0; kb++)

      j = j / 10;

  i = sayi;

  for (j=kb-1; j>=0; j--) {

      hedef[j] = '0' + i % 10;

      i = i / 10;

  }

  hedef[kb] = '';

}

sprintf işlevi : sayısal değeri dizgiye dönüştürmek için kullanılabilir. Yapısı;

sprintf( dizgi, kontrol, değişkenler)

 

Kullanım şekli printf işlevine yakındır. Kontrol ve değişken bilgisine göre ekrana yazılması gereken bilgi parametre olarak gönderilen dizgiye kopyalanır.

 

char *s;

int i = 57;

sprintf(s, "%d", i);

 

ifadesi sonunda s dizgisinde "57" değeri oluşur.

 

float f = 2.1;

sprintf(s, "%f", f);

ifadesi sonunda s dizgisinde "2.100000" değeri oluşur.

 

Örnek 6.2.5: Bir dizginin belirli bir parçasını veren işlev. (strncpy(s2, s1, n))

 

#include <stdio.h>

int main()

 {

    char *s1;

    char *s2;

    s1 = "01234567890";

    altdizgi(s2, s1, 0, 5);

    printf("%sn",s2);

}

void altdizgi(char *hedef, char *kaynak, int bas, int uzunluk)

{

  int i;

  for(i = 0; i < uzunluk && kaynak[bas + i] != ''; i++)

        hedef[i] = kaynak[i + bas];

  hedef[i] = '';

}

 

Örnek 6.2.6: Bir metin içerisinde bir metin parçasın bulma (konumunu belirleme).

 

Girdi : . aranacak metin parçası  (String) , aramanın  yapılacağı metin (String)

Çıktı : aranan bilgi var ise başlangıç konumu (Integer) =-1 ise yok demektir

main()

{

  char *a="12345";

  char *b="34";

  printf("%s   %sn",a, b);

  printf("%dn",kon(a, b));

}

int  kon(char *s1, char *s2)

{

int i = 0, j, konum = -1;

while (i < strlen(s1) - strlen(s2))

{

konum = i;

for (j = 0; j < strlen(s2); j++)

if (s1[i + j] != s2[j])

konum = -1;

if (konum >= 0)

break;

else i = i + 1;

}

return konum;

 

C dilinde benzer bir işlevi sağlayan deyim

char *strstr(const char *dizgi1, const char *dizgi2)

 

dizgi1 içerisinde dizgi2 yi arar. Var ise işlev dizgi1 içerisinde dizgi2 nin başladığı konumdan sonraki dizgiyi işaret eder. Yok ise işlevin değeri NULL dır.

 

NULL : işaretçinin herhangi bir yeri göstermemesi. Değerinin boş olması.

Örnek 6.2.7:  Bir dizgi içerisindeki bir karakterin bulunması.  i harfini İ ile değiştiren program.

 

#include <string.h>

#include <stdio.h>

int main()

{

char *s1, *s2, *s3;

int i;

clrscr();

s1="ali zil çaldi";

strcpy(s2, s1);

for (i=0; i<strlen(s1); i++)

if (s1[i] == 'i')

s1[i] = 'İ';

printf("%sn",s1);

char *strchr(char *s, char c) :  s dizgisi içerisinde c karakterinin konumunu gösteren dizgiyi gönderir.

while (strchr(s2, 'i') !=NULL) {

s3 = strchr(s2, 'i');

s3[0] = 'İ';

}

printf("%sn",s2);

}

 

Örnek 6.2.8: Bir cümledeki tüm küçük harfleri büyüye çeviren program.

 

(int tolower(int c) , int toupper(int c)  )           (ctype.h)

 

#include <string.h>

#include <stdio.h>

void buyuk(char *);

int main()

{

char *s1, *s2, *s3;

int i;

clrscr();

s1="ali zil çaldi";

strcpy(s2, s1);

for (i=0; i<strlen(s1); i++)

printf("%c",toupper(s1[i]));

buyuk(s2);

printf("n%s",s2);

getch();

}

void buyuk(char *s)

{

int i;

for (i=0; i<strlen(s); i++)

s[i] = toupper(s[i]);

}

 

Örnek 6.2.9: Girilen metindeki harflerin sıklığını (frekansını) hesaplar.

 

#include <strinh.h>

main()

{

          char *s;

  char *harfler = “abcdefghijklmnopqrstuvwxyz”;

  char c;

  int fr[26] = {0,};

  int i;

  clrscr();

   gets(s);

  for (i = 0 ; i <strlen(s); i++) {

     c = tolower(s[i]);

     if (strchr(harfler, c) != NULL)

         fr[c - ‘a’]++;

  }

  for (i = 0; i < 26; i++)

      printf(“%c   -  %dtt”, ‘a’+i, fr[i]);

}

 

 
 
  Bugün 129 ziyaretçi (198 klik) www.bilisim-egitim.tr.gg  
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol