arkadaşlar bu benim ev ödevim.yapamadım da.lütfen yardım edebilirmisiniz??

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

rebelayhan

Yeni üye
17 Ara 2010
14
0
[FONT=&quot]Write a program[/FONT][FONT=&quot] to[/FONT][FONT=&quot] determi[/FONT][FONT=&quot]ne the value Y given the argument X of a function presented by linked segments, i.e. by a sequence of N points (X(1),Y(1)), (X(2),Y(2)), . . . , (X(N),Y(N)).[/FONT]
 
Moderatör tarafında düzenlendi:

turqud

Kıdemli Üye
23 Eyl 2008
2,432
0
33
al kardes o konun a- z kadar dersi gule gule kullan


8 . BOLUM : MAKROLAR
Onislemci komutlar?ndan, #define onislemci komutunun sembolik sabit tan?mlamalar?nda kullan?l?s?n? daha once gormustuk. Makrolar #define onislemci komutunun paremetreli kullan?m? ile elde edilen yap?lard?r.

#define onislemci anahtar sozcugunu izleyen isim parametreli olarak kullan?labilir. Bu durum sentaks olarak isime bitisik olarak yaz?lan ac?lan parantez ile belirtilir. Bu parantezin icinde tan?mlanan makroya iliskin parametre(ler) yer al?r. Kapanan parantezi izleyen yaz? ise makroya iliskin degistirme listesidir. Onislemci makro parametrelerine iliskin degistirme listesini bir sablon olarak kabul eder ve kaynak kod icinde makronun cag?r?ld?g?n? tespit ettiginde makro cag?r?m?nda kullan?lan argumanlar?, sablona uygun olarak acar.

Basit bir ornekle baslayal?m:

#define Alan(x, y) ((x) * (y))

Yukar?daki makro tan?mlamas?nda x ve y makroya iliskin parametrelerdir. Onislemci yukar?daki sat?r? gordukten sonra kaynak kod icinde bu makronun cag?r?ld?g?n? tespit ederse, makroyu yukar?daki sablona gore acacakt?r. Ornegin kaynak kod icerisinde

a = Alan(b, c);

seklinde bir deyimin yer ald?g?n? dusunelim. Bu durumda onislemci Alan makrosunun cag?r?ld?g?n? anlar. Ve ifadeyi asag?daki sekilde acar :

a = ((b) * (c));

Makro ac?l?m?n?n sadece metinsel bir yer degistirme oldugunu bilmeliyiz. Yani yukar?daki deyim ornegin :

a = Alan(7 + 3, 8 + 1);

seklinde olsayd?, onislemci bunu

a = ((7 + 3) * (8 + 1));

seklinde acacakt?. Yer degistirme islemcinin derlemenin on modulu olan onislemci taraf?ndan derleme oncesi yap?ld?g?n? ve derleyicinin object kod olusturmak icin ele ald?g? kaynak kodun onislemci modulunun c?kt?s? oldugunu hat?rlatal?m. Yani derleyicinin ele ald?g? kodda art?k makro cag?r?mlar? degil makrolar?n onislemci taraf?ndan ac?lm?s bicimleri bulunacakt?r.

Baska bir makroyu inceleyelim :

#include <stdio.h>

#define Kare_fark(x, y) (((x) - (y)) * ((x) + (y)))

int main()
{
int a = 10;
int b = 5;
int c;

c = Kare_fark(a, b);
printf("c = %d\n", c);
return 0;
}

Yukar?daki kaynak kodu alan onislemci isini bitirdikten sonra derleyicinin ele alacag? kaynak kod asag?daki sekilde olacakt?r :

stdio.h dosyas?n?n icerigi

int main()
{
int a = 10;
int b = 5;
int c;

c = (((a) - (b)) * ((a) + (b)));
printf("c = %d\n", c);
return 0;
}

Bir y?l?n art?ky?l olup olmad?g?n? test etmek icin kullan?lacak baska bir makro:

#define is_leap(y) ((y) % 4 == 0 && (y) % 100 != 0 || (y) % 400 == 0)
Makrolar Ne Amacla Tan?mlan?r
Makrolar fonksiyonlara bir alternatif olarak kullan?lmaktad?r. Yukar?daki ornekleri tekrar inceleyelim. Alan makrosu yerine:

int alan(int en, int boy)
{
return en * boy;
}

Kare_fark makrosu yerine:

int Kare_fark(int a, int b);
{
return (a - b) * (a + b);
}

is_leap makrosu yerine:

int is_leap(int year)
{
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

fonksiyonlar? tan?mlanabilirdi.

Baska bir ornek olarak da toupper fonksiyonunun makro biciminde tan?mlanm?s olmas? verilebilir. (toupper derleyicilerin cogunda fonksiyon olarak degil makro biciminde tan?mlanm?st?r.)

#define TOUPPER(c) ((c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 'A' : (c))

Asag?da fonksiyon tan?mlamalar?na alternatif olacak baz? basit makrolar tan?mlanmaktad?r:

#define ISUPPER(c) ((c) >= 'A' && (c) >= 'Z')
#define ISLOWER(c) ((c) >= 'a' && (c) >= 'z')
#define ISDIGIT(c) ((c) >= '0' && (c) >= '9')
#define ISEVEN(x) ((x) % 2 == 0)

Bir makronun parametresi olmayabilir. Ornegin:

#define getchar() getc(stdin)

Yukar?daki makro yerine sembolik sabit de kullan?labilirdi. Ancak fonksiyon yap?s?na benzetmek amac?yla parametresi olmayan bir makro olarak tan?mlanm?st?r.
Makrolarla Fonksiyonlar Aras?ndaki Farkl?l?klar Nelerdir
Makrolar fonksiyonlara alternatif olarak kullanu?lmalar?na kars?l?k, makrolar ile fonksiyonlar aras?nda cok onemli farklar bulunmaktad?r:

1. Makrolar kaynak kodu dolay?s?yla da cal?sabilir (exe) kodu buyuturler. Makrolar onislemci asamas?nda degerlendirilir. Ornegin is_leap makrosunun #define onislemci komutuyla tan?mland?ktan sonra kaynak kod icinde yuz kere cag?r?ld?g?n? dusunelim. Onislemci kaynak kodu ele ald?g?nda yuz tane cag?r?lma ifadesinin her biri icin makroyu acacakt?r. Derleyici modulu kaynak kodu ele ald?g?nda art?k makrolar? degil makrolar?n ac?lm?s seklini gorecektir. Makro ac?l?mlar? kaynak kodu buyutecektir. Kaynak kodun buyumesinden dolay? cal?sabilen dosyan?n boyutu da buyuyecektir. Oysa makro yerine bir fonksiyon tan?mlansayd?, Fonksiyon cag?r?lmas? durumunda yaln?zca cag?r?lma bilgisi kayanak koda yaz?lmaktad?r.

2. Makrolar?n en buyuk avantaj?, fonksiyon cag?rma islemindeki goreli yavasl?ktan kaynaklan?r. Fonkiyon cag?rmas? sembolik makine dili (assembler) duzeyinde ele al?nd?g?nda, baz? ilave makine komutlar? da icra edilmekte ve bu makine komutlar?n?n icras? ve yap?lan baz? ilave islemler icra suresini uzatacakt?r.

Fonksiyon cag?r?l?rken CALL ve geri donuste RET makine komutlar? icra edilmektedir. Fonksiyon cag?r?m? icin ayr?ca parametre aktar?m? ve stack duzenlemesi islemleri yap?lmaktad?r. Makrolar?n ac?lmas? metinsel bir yer degistirme oldugu icin, yukar?da anlat?lan ilave islemler yap?lmaz. Boysece program?n h?z? gorece olarak artacakt?r.
3. Makrolar turden bag?ms?zd?r. (generic). Makrolar metinsel bir yer degistirme oldugundan fonksiyonlar gibi belirli bir ture bagl? degildirler. Ornegin iki say?dan buyugune geri donen bir fonksiyon yazmak istersek bu fonksiyonun parametre degiskenleri belirli bir turden olmak zorundad?r:

int max_of_two(int number1, int number2)
{
return (number1 > number2 ? number1 : number2);
}

Yukar?daki fonksiyon int turden degerler icin yazIlm?st?r. Baska turden degerler fonlksiyona arguman olarak gonderildignde tur donusumu kurallar? isleyecek ve argumanlar?n turu parametre degiskenlerinin turlerine donusturulecektir. Oysa yukar?daki fonksiyon yerine bir makro tan?mlanm?s olmas? durumunda bu makro turden bag?msd?z olacakt?r :

#define max_of_two(a, b) ((a) > (b) ? (a) : (b))

Yukar?daki makro asag?daki sekillerde cag?r?labilir:

int x, y, z;
char c1, c2, c3;
double d1, d2,d3;
...
x = max_of_two(y, z);
c1 = max_of_two(c2, c3);
d1 = max_of_two(d2, d3);

4. Fonksiyonlar kendilerine gonderilen argumanlar? bir kez ele al?rlar ancak makrolar argumanlar?n? birden fazla ele alabilirler:

Asag?daki makrolar? goz onune alal?m:

#define KARE(a) ((a) * (a))

int x = 10, y;
y = KARE(x++)

ifadesi makro tan?mlamas?na uygun olarak ac?ld?g?nda

y = ((x++) * (x++))

ifadesi olusacakt?r ki bu ifade de, operatorler konusunda gordugumuz gibi "undefined behavior" ozelligi gosterecektir. Oysa KARE bir fonksiyon olsayd? bu fonksiyonun

KARE(x++);

seklinde cag?r?lmas? bir probleme neden olmayacakt?. x++ ifadesi x degiskeninin (artmayan) degerini ureteceginden, KARE fonksiyonu 10 degeri ile cag?r?lm?s olacakt?.

5. Makrolarda makrolar?n argumanlar? ile parametreleri aras?nda tur donusturulmesi soz konusu degildir.
Bir fonksiyon cag?r?lma ifadesini gordugunde derleyici fonksiyona gonderilen arguman ile fonksiyonun ilgili parametre degiskeni aras?ndaki tur uyumunu kontrol eder. Eger bu turler aras?nda bir farkl?l?k varsa, mumkunse, tur donusturme kurallar? geregi arguman olan ifdadenin turunu parametre degiskeninin turune cevirir. Makro argumanlar?n?n onislemci taraf?ndan makronun parametrelerine gore tur uyumunun kontrol edilmesi ya da tur donusturme islemine tabi tutulmas? soz konusu degildir.

C++ dilinde makrolar?n kullan?m? C diline gore cok daha azalm?st?r. Zira C++ dilinde bir cok durumda makrolar yerine inline fonksiyonlar kullan?lmaktad?r.

6. Bir gosterici bir makroyu gosteremez.
Ileride gorecegimiz gibi C dilinde bir fonksiyonu gosteren gosterici tan?mlanabilir. Ve bu gostericilerden C programc?l?g?nda cesitli bicimlerde faydalanmak mumkundur. Ancak makrolar onislemci asamas?nda ele al?nd?g?ndan bir gostericini bir makroyu gostermesi soz konusu degildir.

# ve ## onislemci operatorleri

Makro tan?mlamalar? iki ozel operator icerebilirler. Bu operatorler derleyiciyi degil onislemciyi ilgilendirmektedir. Yani onislemcinin c?kt?s? derleyici modulune verildiginde art?k kaynak kod bu operator atomlar?ndan ar?nd?r?lm?s olacakt?r.

# atomu makronun yer degistirme listesinde (replacement list) yer alabilecek bir operatordur. Operand? makro parametresidir. Makronun ac?l?m? s?ras?nda #operand?na al?nan arguman string haline getirilir. Yani cift t?rnak icine al?n?r. Bu yuzden bu atoma stringe donusturme operatoru de denir. (stringizing operator)

#atomunun kullan?labilecegi bir kac tema asag?da verilmektedir. Asag?daki makroyu inceleyelim :

#define PRINT_INT(x) printf(#x " = %d\n", x)

ornegin kaynak kod icerisinde

int result = 5;
PRINT_INT(result);

seklinde makronun cag?r?ld?g?n? dusunelim. Makro ac?ld?g?nda derleyiciye giden kaynak kod asag?daki sekilde olacakt?r :

int result = 5;
printf("result" " = %d\n", result);

Aralar?nda bosluk karakterleri d?s?nda baska bir karakter bulunmayan stringlerin derleyici taraf?ndan tek bir string olarak birlestirildiklerini an?msarsak, yukar?daki ifadenin derleyici ac?s?ndan asag?daki sekilde yorumlanacag?n? gorebiliriz :

printf("result = %d\n", result);

Boylece yukardaki deyimin icra edilmesiyle ekrana asag?daki sekilde bir yaz? yazd?r?labilecektir :

result = 5;

## onislemci operatoru iki operand alan araek konumunda bir operatordur. Makronun ac?lmas? s?ras?nda Operand? olan atomlar? birlestirerek tek bir atom haline getirir. Bu yuzden atom birlestirme operatoru diye de isimlendirilir. (Token pasting operator),
Atom birlestirme operatorunun operandlar?ndan biri eger bir makro parametresi ise, birlestirme islemi parametre ilgili argumanla yer degistirdikten sonra yap?lacakt?r. Atom birlestirme operatoru ##, string yapma atomu kadar s?k kullan?lan bir operator degildir. Sadece cok ozel durumlarda kullan?lmaktad?r.

Makro tan?mlamalar?nda nelere dikkat edilmelidir?

Makro tan?mlamalar?nda en s?k yap?lan hatalar makro ac?l?m? neticesinde, operator oncelikleri yuzunden ac?lm?s kodun beklenilmeyen sekilde deger uretmesidir. Orneklerle ac?klayal?m :

#define ALAN(a) a * a

Yular?daki makro

x = ALAN(y);

seklinde cag?r?l?rsa onislemci kodu

x = y * y;

seklinde acacag?ndan bir problem olusmayacakt?r. Ancak makronun

int y = 1;
x = ALAN(y + 5)

seklinde cag?r?ld?g?n? dusunelim. Bu durumda derleyici kodu

x = y + 5 * y + 5;

seklinde acacakt?r. Ve bu durumda y degiskenine 36 yerine 11 degeri atanacakt?r.

Bu tur problemlerin onlenebilmesi icin makro tan?mlamalar?nda makro ac?l?m ifadesinde yer alan makro parametreleri parantez icine al?nmal?d?r.

Yukar?daki makro

#define ALAN(a) (a) * (a)

seklinde tan?mlansayd? makro cag?r?m? onislemci taraf?ndan ac?ld?g?nda

x = (y + 5) * (y + 5);

ifadesi olusacakt?r ki, deyimin icras? sonucunda x degiskenine 36 degeri atanacakt?r.

Peki ya makro asag?daki sekilde cag?r?l?rsa

x = 72 / ALAN(y + 5);

x degiskenine 2 degerinin atanmas? gerekireken, makro asag?daki gibi ac?lacag?ndan

x = 72 / (y + 5) * (y + 5) ;

x degiskenine 72 degeri atanacakt?r.

Makro tan?mlamalar?nda makro ac?l?m ifadeleri en d?sar?dan parantez icerisine al?nmal?d?r.

Soz konusu makro

#define ALAN(a) ((a) * (a))

seklinde tan?mlanm?s olsayd?

x = 72 / ((y + 5) * (y + 5) );

makro onislemci taraf?ndan yukar?daki gibi ac?lacakt? ve bu kodun icras? ile x degiskenine gercekten 2 degeri atanacakt?.

Makrolarla ilgili olarak s?k yap?lan baska bir hata da makro tan?mlamas?nda makro ismi ile makro parametre parantezi aras?nda bosluk b?rakmakt?r. ALAN makrosunun yanl?sl?kla asag?daki gibi tan?mland?g?n? dusunelim.

#define ALAN (a) ((a) * (a))

Onislemci art?k yukar?daki tan?mlamay? bir makro degil bir sembolik sabit olarak ele alacakt?r. Onislemci kaynak kodun geri kalan k?sm?nda gordugu ALAN yaz?lar?n? (a) ((a) * (a)) ile yer degistirecektir. Ornegin :

ALAN(x + 3);

gibi bir ifadenin var oldugunu dusunelim. Onislemci bu kodu asag?daki sekilde acacakt?r :

(a) ((a) * (a))(x + 3);

ayn? isimli makro ve fonksiyonlar

Bir makro ile ayn? isimli bir fonksiyon kaynak kod icinde yer alabilir. Bu durumda bu isimle bir cag?r?m yap?ld?g?nda ne olacakt?r. makro mu fonksiyon mu cag?r?lm?s olacakt?r?

#define max(x, y) ((x )> (y) ? (x) : (y))

gibi bir makronun tan?mland?g?n? ve kaynak kod icerisinde asag?daki fonksiyon tan?m?n?n da yer ald?g?n? dusunelim.

int max(int number1, int number2)
{
return x > y ? x : y;
}

Kaynak kod icerisinde ornegin

c = max(a, b);

seklinde bir deyimin yer ald?g?n? dusunelim. Bu durumda ne olacakt?r?

Tabi ki onislemci makroyu acacakt?r. Zira makrolar?n ac?lmas?, yani metinsel yer degistirme isleminin yap?lmas?, daha derleyici kaynak kodu ele almadan onislemci taraf?ndan yap?lacag?ndan, derleyici modulune s?ra geldiginde derleyici art?k yukar?daki cag?r?m ifadesi yerinde

c = a > b ? a : b;

ifadesini gorecektir.

Ayn? isimli makro ve fonksiyon tan?mlamalar?n?n var olmas? durumunda, makro ac?l?m?n yap?lmas? yerine fonksiyonunu cag?r?lmas? isteniyorsa ne yap?labilir?

Bu durumda fonksiyon cag?rma ifadesinde fonksiyon ismi parantez icine al?n?rsa, onislemci art?k bir yer degistirme yapmaz ve derleyici fonksiyon cag?rma kodu uretir.


uzun makrolar?n yaz?lmas?

Daha islevsel makrolar?n yaz?lmas?nda virgul operatoru kullan?labilir. Asag?daki makroyu dusunelim:

#define ECHO(s) (gets(s), puts(s))

Fonksiyon cag?r?mlar? da birer ifade oldugundan, fonksiyon cag?r?m? ifadelerinin virgul operatoruyle birlestirilmesi tamamen legaldir. Yukar?daki makroyu bir fonksiyonmus gibi cag?rabiliriz:

char *ptr = "Ahmet";
ECHO(str);

Onislemci makroyu asag?daki sekilde acacakt?r :

char *ptr = "Ahmet";
(gets(str), puts(str));

Ancak bir makronun bir seri deyimi icerdigini dusunelim. Ifade yerine belirli say?da deyimin olmas?, baz? durumlarda virgul operatorunun kullan?lmas?na izin vermeyebilir. Cunku virgul operatorunun operandlar? deyim degil ifadelerdir.

Uzun ve islemsel makrolar?n yaz?lmas?nda virgul operatorunun kullan?lmas? yerine makro degistirme listesini en d?stan kume parantezleri icine de alabilirdik :

#define ECHO(s) { gets(s); puts(s); }

Makro yukar?daki gibi tan?mland?g?nda baz? problemler olusabilir. Ornegin makronun asag?daki gibi bir if deyimi icinde cag?r?ld?g?n? dusunelim :

if (echo_flag)
ECHO(str);
else
gets(str);

Onislemci makroyu asag?daki gibi acacakt?r :

if (echo_flag)
{ gets(str); puts(str); };
else
gets(str);

Kod derleyici modulune geldiginde asag?daki gibi yorumlanacag?ndan

if (echo_flag)
{ gets(str); puts(str); }
;
else
gets(str);

if k?sm? olmayan bir else olmas? gerekcesiyle derleme zaman?nda bir error olusacakt?r. Olusan problemi nas?l cozebiliriz? Makronun cag?r?lmas? durumunda sonland?r?c? ";" at0munu koymayarak? Bu cirkin bir tarz olurdu...

Bu durumda iki yontem kullanabiliriz :

1. Makro ac?l?m?nda do while dongu yap?s?n? kullanmak:

#define ECHO(s) \
do { \
gets(s); \
puts(s); \
} while (0)

(#define onislemci komutunun kullan?lmas?nda sat?r sonunda yer alan "\" karakterinin komutun bir sonraki sat?rda devam edecegini gosterdigini hat?rlayal?m)

art?k yukar?daki makro

ECHO(str);

seklinde cag?r?ld?g?nda, makro onislemci taraf?ndan ac?ld?ktan sonra, cag?rma ifadesinin sonundaki sonland?r?c? (;) do while deyiminin sentaks?nda bulunan while parantezini izleyen sonland?r?c? olacakt?r.

2. Makro ac?l?m?nda if deyimi kullanmak:

#define ECHO(s) \
if (1) { \
gets(s); \
puts(s); \
} \
else

yukar?daki makro

ECHO(str);

seklinde cag?r?l?p onislemci taraf?ndan ac?ld?g?nda makro cag?rma ifadesinin sonundaki sonland?r?c? (;) if deyiminin yanl?s k?sm?na iliskin (else k?sm?na iliskin) bos deyim olacakt?r.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.