Kocaeli Üniversitesi Bilgisayar Mühendisliği Programlama 2 Dersi Final Sınavı A Grubu Ad Soyad: 11.06.2012 Numara: İmza: 1.) Aşağıdaki pointer bildiriminin anlamı hangisidir? int(*(*ptr1)())[2]; A.) ptr nin fonksiyon işaretçisi olduğu B.) ptr nin fonksiyonu işaret eden bir dizi olduğu C.) ptr nin geri dönüş türü bir dizi işaretçisi olan bir fonksiyon işaretçisi olduğu D.) ptr nin fonksiyonu işaret eden bir dizi olduğunu Cevap C dir. En baştaki int değerinden fonksiyona ait bir geri dönüş değeri olduğu ve bu geri dönüş değerinin dizi işaretçisi olduğu anlaşılmaktadır. 2.) Aşağıdaki C kodu derlenip çalıştırıldığında ekran çıktısı aşağıdakilerden hangisidir? int a[2][4]=3,6,9,12,15,18,21,24}; printf("%d %d %d",*(a[1]+2),*(*(a+1)+2),2[1[a]]); A.) 15 18 21 B.) 21 21 21 C.) 24 24 24 D.) Hiçbiri E.) Derleyici hatası Cevap :B dir. İki boyutlu bir dizi tanımlanıp değerleri atanmıştır. printf() içinde üç tane değerin ekrana bastırılacağı görünmektedir. a[1][4]=3,6,9,12,15} 0. Satırdaki değerler a[1][4]=15,18,21,24} 1. Satırdaki değerler printf() içinde bastırılacak ilk değer, a dizinin 1. satırında olan 2. indisli değerdir.(21) 2. Bastırılan değer ise dizilerin pointer gösteriminden yararlanılıp yine aynı yerdeki sayının bastırılması sağlanmıştır. 3. Bastırılacak ifadede yer alan 2[1[a]] aynı zamanda a[1][2] gösterimi ile eşdeğerdir. Bu yüzden yine 21 değeri bastırılır. 3.) Aşağıdaki C kodu derlenip çalıştırıldığında ekran çıktısı aşağıdakilerden hangisidir? int num,a=5; num=-a--; printf("%d %d",num,a);} A.) 5 4 B.) -4 4 C.) -4 5 E.) -5 4 Cevap : E dir. Decrement(azaltma) operatörü değişkenden sonra kullanıldığı için ilk önce değişkenin değeri diğer değişkene aktarılır, sonra değişkenin değeri bir azaltılır. Böylece a değişkenin değeri 5 iken num değikeninine -5 atanır(num=-a--;) daha sonra a nın değeri 1 azaltılır. Printf() ile ekrana -5 4 bastırılır. 4.) Aşağıdaki C kodunun çıktısı hangisidir? #define max printf("%d",max); A.) 0 B.) Null C.) -1 Cevap : D dir. Define tanımlamasındaki max değişkenine değer ataması yapılmadığı için derleyici hata verecektir. Örnek olarak: #define max 10 şeklinde bir tanımlama yapılsaydı, ekrana 10 değeri yazdırılacaktı. Ama şuan ki durumda derleyici hata verecektir. 5.) Aşağıdaki C kodunun çıktısı hangisidir? for(printf("1");!printf("0"); printf("2")) printf ("Sachin"); A.) 10sachin2 B.) 10sachin C.) 10sachin210sachin2 D.) 10 E.) Derleyici hatası Cevap D dir. For döngüsünün 3 tane parametresi bulunmaktadır. Bunlar başlangıç, koşul ve artış parametreleridir. İlk parametre olan printf("1") kod sonucunda ekrana 1 değeri basılır ve koşul kontrol edilir koşul kontrolü yapılırken printf("0") kodu çalıştırlır ve ekrana 0 değeride basılıor ve daha önce ekrana basılan başlangıç değeri sıfır değerinden farklı olduğu için döngüden çıkılır. Böylece akranda 10 değeri görüntülenir.
6.) Aşağıdaki C kodunun çıktısı hangisidir? int main() struct employee unsigned id: 8; unsigned sex:1; unsigned age:7; }; struct employee emp1=203,1,23}; clrscr(); printf("%d\t%d\t%d",emp1.id,emp1.sex,emp 1.age); getch(); } A.) 203 3 23 B.) 1 203 23 C.) 203 1 23 D.) 23 203 1 E.) 203 203 203 Cevap : C dir. Bir yapı tanımlanıp ilk değerleri atanmıştır ve değerleri ekrana bastırılmıştır. 7.) Aşağıdaki C kodu çalıştırıldığında çıktısı hangisi int check=2; switch(check) case 1: printf("d.w.steyn"); case 2: printf(" M.G.Johnson"); case 3: printf(" Mohammad Asif"); default: printf(" M.Muralidaran"); } A.) M.G.Johnson B.) M.Muralidaran C.) M.G.Johnson Mohammad Asif M.Muralidaran Cevap : C dir. Switch içinde check değişkeni kontrol edilmiştir. Bu değişken 2 ye setlendiği için case:2 kodundan itibaren de hiç break komutu kullanılmadığından C deki çıktıyı üretir. 8.) Aşağıdaki C kodu çalıştırıldığında çıktısı hangisi int a=100; if(a>10) printf("m.s. Dhoni"); else if(a>20) printf("m.e.k Hussey"); else if(a>30) printf("a.b. de villiers"); A.B. de Villiers (Birden fazla doğru durum vardır.) Cevap : A dır. İlk if yapısı sağlandığı için diğer yapılara girmeden A şıkkındaki çıktıyı üretir. 9.) Aşağıda verilen bilgilerden hangisi yanlıştır? A.) Dizi elemanlarının tamamı aynı tiplerden oluşurken, yapı(structure) elemanlarının tamamı aynı tipli de farklı tipli de olabilir. B.) Bir yapı değişkeni normal bir değişken gibi fonksiyona argüman olarak verilemez. C.) malloc() fonksiyonundan geriye dönen değere atanan işaretçi(pointer) bellekte tutulacak verinin yerini gösterir. D.) İki boyutlu bir dizinin her bir sütunu yine iki boyutlu bir dizi gibi düşünülebilir. E.) String tanımlaması yapılırken dizi notasyonu kullanılırsa(char [] gibi) bellekte aynı miktarda yer işgal eder. Pointer notasyonu(char * gibi) kullanılırsa bellekte farklı miktarda yer işgal eder. Cevap B dir. A-Yapıların elemanları farklı türlerden olabilirken, diziler aynı türlü olmalıdır. Mesela struct isci int tc; char cinsiyet; string isim; float maas }; gibi int dizi[10] tanımlamasında ise dizinin tüm elemanları int türündendir. B-yapı değişkeni fonksiyonlara arguman olarak verilebilir. Mesela son quizlerde hurdaya çıkacak arabların yaşını fonksiyonla buldurmuştuk. C-malloc() fonksiyonundan geriye dönen değer verinin bellekte tutulacağı yeri işaret eder. D- mesela a[2][4]=3,6,9,12,15,18,21,24} tanımlamasındaki her bir sutün da 3,15}6,18}9,21}12,24} kendi iiçinde iki boyutlu ([1][2]) bir dizidir. E- Stringi char dizi[10] şeklinde tanımlarsak 10 karakterlik bir string tanımlamış oluruz. char *dizi şeklinde ise değişken uzunlukta olmuş olur. 10.) Makroyu hangisi tanımlar? A.) printf() fonksiyonunu simüle eden #define ön işlemci komutudur. B.) Geriye değer dönebilen #define ön işlemci komutudur. C.) scanf() fonksiyonunu simüle eden #define ön işlemci komutudur. D.) Hiçbiri E.) Fonksiyon gibi davranan #define ön işlemci komutudur. Cevap : E dir. Son quizlerde de 3 tane saıyı makro kullanarak küçükten büyüğe doğru sıralamanızı istemiştik. Yani makrolar fonksiyon gibi davranan #define ön işlemci komutudur; ama printf() veya scanf() gibi standart giriş/çıkış işlemlerini sümüle etmezler. Fonksiyon gibi davranmalarına rağmen geriye değer döndürmezler. A.) M.S. Dhoni B.) A.B. de villiers C.) M.S Dhoni M.E.K Hussey
11.) Aşağıdaki C kodu parçasında x in son değeri ne #define z x #define y x #define x y int x = 1; int y = 2; x = y + z; } } Cevap C dir. int x = 1 işlemi ile x, y ve z değişkenlerine de 1 değeri atanır. Daha sonra int y = 2 işlemi ile de y ve x değişkenlerine 2 değeri atanmış olur yani : y=2,x=2 ve z=1 değerlerini gösterir. Son olarak x = y + z işlemi ile x=2+1 =3 sonucu döndürülür ve böylece x değişkeni 3 değerini gösterir. A.) 1 B.) 2 C.) 3 D.) 4 E.) 5 12.) Aşağıdaki a ve b için hangi scanf kullanılır? float a; double b; A.) scanf("%f %f", &a, &b); B.) scanf("%lf %Lf", &a, &b); C.) scanf("%f %Lf", &a, &b); D.) scanf("%f %lf", &a, &b); E.) scanf("%f %f", a, b); Cevap D dir. Scanf ile değişkenlerin kullanımına ait tablo aşağıda gösterilmiştir.
Kocaeli Üniversitesi Bilgisayar Mühendisliği Programlama 2 Dersi Final Sınavı 2. Eğitim A Grubu Ad Soyad: 11.06.2012 Numara: İmza: 1. Aşağıdaki C kodunun ekran çıktısı hangisidir? int *p1,**p2; double *q1,**q2; printf("%d %d ",sizeof(p1),sizeof(p2)); printf("%d %d",sizeof(q1),sizeof(q2)); getch(); float avg(float,float,float); float p=1, q=2, r=-2, a; a=avg(p,(q=4, r=-12, q), r); printf("%f",a); getch(); } float avg(float x,float y,float z) return (x+y+z)/3; } A.) 1 2 4 8 B.) 2 4 4 8 C.) 2 4 2 4 D.) 4 4 4 4 E.) 2 2 4 4 Cevap : D dir. Sistemin mimari ve derleyiciye bağlı olarak değişmektedir. İnteger ile double nellekte aynı miktarda yer işgal ederler. Sistemin 16-bitlik olduğunu kabul edersek cevap 2 2 2 2 olmalı, 32-bitlik kabul edersek 4 4 4 4 olmalıydı. 2. Aşağıdaki C kodu derlenip çalıştırıldığında ekran çıktısı aşağıdakilerden hangisidir? char arr[]="c Question Bank"; char *p; p+=3; p=arr; p+=3; *p=100; printf("%s",arr); A.) C Question Bank B.) C Quesdion Bank C.) C Qdestion Bank D.) C Q100estion Bank E.) Derleyici hatası Cevap :C dir. p işaretçisi arr dizisini işaret etmektedir. Daha sonra işaretçinin işaret ettiği yer 3 karakter ileri yer değiştilip oraya decimal olarak 100 değeri ekleniyorki bu da hexal 64 de karşılık gelmektedir(d karakteridir). En son olarak stringin son hali yazdırılıyor. 3. Aşağıdaki C kodunun çıktısı hangisidir? A.) 0.111111 B.) 1.000000 C.) -0.777777 D.) -1.000000 E.) Derleyici Hatası Cevap B dir. Avg fonksiyonu sadece bir kez çalıştırılır. İçerideki parentez integer bir değer olmadığı için derleyici parantez içerisindeki en son değer olan 4 değerini işleme alır yani fonksiyon avg(1,4,-2) değerleri ile çalıştırılır ve 1.000000 değeri elde edilir. Derleyicinin q değeri olarak 4 değerini almasının sebebi de parantez içerisinde q=4 atamasının yapılmış olmasıdır. 4. Aşağıdaki C kodu çalıştırıldığında çıktısı hangisi int i; for(i=0;i<5;i++) int i=10; printf(" %d",i); i++; } A.) 10 11 12 13 14 B.) 10 10 10 10 10 C.) 0 1 2 3 4 Cevap : B dir. for döngüsü içinde i değişkeni her seferinde yeniden 10 a atandığından yan yana 5 tane 10 yazdırılır. 5. Aşağıda verilen string fonksiyonlarından hangisinin açıklaması yanlıştır? A.) strcmp( str1,str2 ): str1 ve str2 yi karşlaştırır B.) strcpy( str1,str2 ): str2 yi str1 e kopyalar
C.) strncpy(s1,s2,n): s2 içinde buluna ilk n karakteri s1 e kopyalar D.) strcat( str1,str2 ): str1 i str2 ye ekler E.) strrev( str ): str yi ters çevirir Cevap : D dir. strcat str2 yi str1 e ekler. 6. Aşağıdaki C kodu çalıştırıldığında çıktısı hangisi int main() struct field int a; char b; }bit; struct field bit1=5,'a'}; struct field *p=&bit1; p->a=45; printf("\n%d",bit1.a); A.) 5A B.) 4A C.) 45 D.) A4 E.) 5A45 Cevap : c dir. field isimli bir struct an bit1 isimli bir değişken tanımlanıyor. Sonra bu değişkeni işaret eden bir pointer tanımlanıp yapının a elemanına 45 değeri atanıyor. Bu değer de printf() ile ekrana bastırılıyor. 7. Aşağıdaki C kodu çalıştırıldığında çıktısı hangisi #include <string.h> #define L 10 main() int money=10; switch(money*5) case L: printf("willian"); break; case L*2:printf("Warren"); break; case L*3:printf("Carlos"); break; default: printf("lawrence"); case L*4:printf("Inqvar"); break; } A.) Willian B.) Warren C.) LawrenceInqvar (default kullanımı yanlış) Cevap : C dir. switch içindeki değer money*5=50 olduğundan default anahtar kelimesine kadar hiçbir case e uymaz. Default olarak Lawrence ekrana bastırılır; fakat sonunda break komutu olmadığından alt case ifadesi de işleme sokulur ve Inqvar da yazdırılır. 8. Aşağıdaki C kodu çalıştırıldığında çıktısı hangisi int a=5,b=10; if(++a ++b) printf("%d %d",a,b); else printf("john Terry"); A.) 5 10 B.) 6 10 John Terry C.) 6 10 D.) 5 11 E.) John Terry Cevap : C dir. if içerinde veya lı bir koşul vardır. Veya lı koşullarda koşulun soldan sağa doğru işlenmesi söz konusudur. İlkin ++a koşuluna bakılır bu da 6 değeri yanı sıfırdan farklı bir değer olduğundan 1 e karşılık gelir. Bu yüzden ++b ifadesinin işlenmesine gerek kalmaz. Ekrana 6 ve 10 değerleri yazdırılır. 9. Aşağıdaki programa hangi ifade(statement) eklenirse doğru bir şekilde çalışır? void main() 1. 2 int j, *ptrj; 3. 4 *ptrj=3; 5. } A.) 3. Satıra *ptrj=&j; eklenmelidir. B.) 3. Satıra * ptrj=&&j; eklenmelidir. C.) 3. Satıra ptrj=**j; eklenmelidir. D.) 3. Satıra *ptrj=j; eklenmelidir. E.) 3. Satıra ptrj=++j; eklenmelidir. Cevap. Bu şekliyle de çalışır; ama burada önemli olan bir pointer ın bir integer değişkeni nasıl işaret ettiği sorulmaktadır. ptrj=&j; olmalıdır. Şıklarda yanlışlıkla A şıkkında * işareti konulduğu için bu soru İPTAL edilmiştir. D şıkkında ise pointerın hangi değişkeni işaret ettiği belli olmadığından bu şık da kabul edilmemiştir. 10. Aşağıdaki program parçacığındaki 3 sayıları arasındaki fark nedir? int num[3]; num[3] =5; A.) İlki dizinin belirli bir elemanı, ikincisi tiptir. B.) İlki dizinin boyutu, ikincisi dizinin belirli bir elemanıdır. C.) İlki dizinin belirli bir elemanı, ikincisi dizinin büyüklüğüdür. D.) Her ikisi de dizinin belirli bir elemanını gösterir. Cevap: B dır. ilk satırdaki 3 sayısı dizinin boyutu/eleman sayısını ifade ederken, ikinci satırdaki 3 num dizisinin 3.indisli elemanını(belirli bir elemanını) göstermektedir. 11. Aşağıdaki C kodu parçasında x in değeri ne int a = 10; int *b = &a, c = *&a; int x = c+a/*b;
A.) 10 B.) 11 C.) 12 D.) 13 E.) Syntax error Cevap E dir. Derleyici int x = c+a/*b; bildiriminde /*b satırını açıklama satırı olarak algılayacaktır. /* ifadesi açıklama satırının başladığını gösterir. Doğru ifade int x = c+a/ *b şeklinde olmalıydı. Yani / simgesi ile *b pointer ı arasında bir boşluk olmalıydı. 12. Aşağıdaki C kodu çalıştırıldığında çıktısı hangisi void main () int i = 0, a[3] ; a[i] = i++; printf ( %d",a[i]) ;} A.) 1 B.) 2 C.) 3 D.) 4 Cevap E dir. a dizisine ilk olarak i değeri atanır ve daha sonra i değişkenin değeri arttırılır. Yani adizisinin sıfırıncı elemanına 0 değeri atanır ve daha sonra i değişkeninin değeri bir olur. Ekrana a[0] değeri yazdırıldığında 0 değeri ekran çıktısı olarak görüntülenir. Not: Sınav süresi 50 dakikadır. Cevap anahtarına grubunuzu işaretlemeyi unutmayınız. Başarılar. Doç Dr. Nevcihan DURU