Tuesday, January 12, 2016

(C Language) (ENG/TR) Correct Mistakes In The Code 1 (Koddaki hataları düzeltiniz 1)

void main()
{
  int x,y;
  char *secim;
  float sonuc;
  printf("iki Sayi Giriniz=");
  scanf("%d %d",&x,&y);
  printf("Seciminiz=");
  scanf("%s",&secim);
  switch (secim)
  {
    case '+':sonuc=x+y;break;
    case '-':sonuc=x-y;break;
    case '/':sonuc=x/y;break;
    case '*':sonuc=x*y;break;
    default :
      printf("Yanlis islem");break;
  }
printf("Sonuc = %f\n",sonuc);
getch();
}

Resource/Kaynak: http://www.frmtr.com/c-ve-c-/6767426-c-ve-c-da-char-sorunu.html#post61080352

Question Owner/Soru Sahibi: hemdehtml

ENGLISH

When you try to create string of characters (like char *secim), this string -if you don't initialize with values- it's last element
-which is our only element- will be null.

"char *secim;" actually means "char *secim = {'\0'}". When you try to assign new value in this pointer, you are trying to resize it which can not be possiblw. Because we should always have null value at the end of string.

You can improve your code by initializing x and y as floats. Because if our result is float, then we lost data because of int initialization. Because at the end if our result is 10/7 = 1,..., the result will be 1 because inputs are integer.

The full code is below.

TÜRKÇE

Bir karakter dizisi yaratmaya çalıştığınızda (char *secim gibi), bu dizi -initialize durumunda bir değer atamazsanız şayet- son elemanını (yani bizim var olan tek yerimizi) "null" karakteriyle dolduruyor. Somutlaştırırsak:

"char *secim;" demek aslında "char *secim = {'\0'};" demekle aynı şeydir. Ve siz yaptığınız işlemde bu "null" karakterinin yerine başka bir karakter atamaya çalışıyorsunuz. Yani "secim[1]" i "secim[2]" yapmaya çalışıyorsunuz. Çünkü bildiğimiz üzere her dizinin son elemanı "null" yani '\0' olmak zorundadır.

Sorununuzu "char secim[2];" yazarak basitçe çözebilirsiniz.

siz bir pointer tanımladınız. pointerlar yanına yıldız koymazsanız adresi tanımlarlar. O yüzden switch içerisindeki "secim" in solunda yıldız olmalı. ve sadece "secim" yazarsak bir adresi belirteceği için, scanf fonksiyonunun içinde "secim" in yanına "address-of" operatörünü koymamalıyız.

kodunuzu iyileştirmek için integer olarak tanımladığınız x ve y 'yi float olarak tanımlayabilirsiniz. Çünkü int karakterlerle işlem yaparken küsürlü bir sonuç elde ederseniz, bu sonucun sadece tam kısmı tutulur. Dolayısıyla bu kısmı float'a aktarırken veri kaybı yaşarsınız. Örnek olarak 10/7=1,... olması gerekirken, int olarak tanımlamanızdan dolayı sonucu 1 olarak çıktıda görürsünüz.

Kodun tamamını aşağıda bulabilirsiniz.

CODE/KOD


void main()
{
  float x, y;
  char secim[2];
  float sonuc;
  printf("iki Sayi Giriniz=");
  scanf("%d %d", &x, &y);
  printf("Seciminiz=");
  scanf("%s", secim);
  switch (*secim)
  {
    case '+':sonuc = x + y; break;
    case '-':sonuc = x - y; break;
    case '/':sonuc = x / y; break;
    case '*':sonuc = x*y; break;
    default:
      printf("Yanlis islem"); break;
  }
printf("Sonuc = %f\n", sonuc);
getchar();
}

No comments:

Post a Comment