Tam Sürümünü Görmek İçin : interview questions #2 with microsoft
Volkan Uzun
10/08/2005, 18:35
selamlar,
dun microsoftla yaptigim interview gorusmesinin sorulari asagida, ben yanitlari ms e gonderdigim icin ve bana sorulari kimseye soyleme gibi bisi demedikleri icin yaziyorum:
-------
1.
#define x 100
const int y=100
int a = x;
int b = y;
bu ikisi arasindaki fark nedir
------------
2. asagidakilerde hatalari bulun,
a) if ( 0 < a < 5 ) c;
b) int g ( )
{
char *p = NULL;
char *s;
p = foo( ) ;
printf( “foo( ) returns %s \n” , p );
}
c)
class S
{
char *p;
int n;
public:
S( int k = 0 )
{
n = k;
if( n ) p = new char[n];
}
~S() { delete[] p; }
};
int main()
{
S s;
return 0;
}
d) switch ( a )
{
int var = 1;
case A:
case B:
}
e)
#include <stdio.h>
int process( char *filename )
{
FILE *f;
int count = 0;
if( filename )
{
if( f = fopen(filename, "r") )
{
while( fgetc( f ) != EOF )
count++;
}
fclose( f );
}
return count;
}
------------------
f)
#include <stdio.h>
#define LEAST(x,y) ((x) < (y) ? (x) : (y))
char *puzzle = "A real puzzle";
int main()
{
int least=10000;
char *p = puzzle;
while( *p )
{
least = LEAST( least, *p++ );
}
printf( "The least char is '%c'\n", least );
return 0;
}
yukardaki kodda, output olarak e yaziyor, oysaki bu yanlis sonuc, neden ?
-----------------------------
#include <iostream.h>
class Animal
{ public:
virtual char *speak(int) { return "silence"; }
};
class Cat : public Animal
{ public: char *speak(int) { return "meow"; } };
class Dog : public Animal
{ public: char *speak(short) { return "bow-wow"; } };
int main()
{ Animal *p = new Dog; cout << p->speak(0); return 0; }
bu muhtesem bir soru, farkedene dek her tarafimdan ter akti :) ama cok basitmis
program ekrana silence yaziyor bow-wow yerine neden ?
-----------------------
h) What could go wrong?
class Complex
{
public:
double real, imag;
Complex();
};
Complex& operator+( Complex& a, Complex& b)
{
Complex *p = new Complex;
p->real = a.real + b.real;
p->imag = a.imag + b.imag;
return *p;
}
bu kodda ne gibi bir sorun olabilir ?
-----------------------------------
ms windows programming ile sorulari
1. thread senkronizasyonu icin 3 yontem soyleyin
2. uygulamanin birden fazla kopyasinin calismasini istemiyorsan ne yapman gerekir ?
3. com objesini initialize etmek icin kullanuilan api nin adi
4. 5 tane dosya islemleri ile ilgili api sayin
5. windowstaki hesap makinesini programini calistiran, buraya bazi input degerleri giren, sonucta bisiler hesaplatan, sonucu kontrol eden bir uygulama yazabilirmisiniz, hangi apiler kullanilmalidir ?
6. bir string i ters ceviren fonksiyon yazsaniz, hangi kosullari test edersiniz ozlelikle ?
g-) de override değil overload yapılmış :)
eiffel OO bir dil ve overload ı yasaklamış,
neyseki C# da override sözcüğü var , bu gibi karışıklıkları engelliyor..
h-) a + b + c neden olmasın ?
ve memory leaks..
f-)
least = LEAST( least, *p++ ) ==(least < *p++ ? least : *p++)
p kaç kere arttırıldı ?
p[1] için kıyas geçerli ise p[2] için işlem yapıyoruz..
c-) ~S() { delete[] p; }
S *s = new S();
delete s; // p nedir ?
kimbilir neyi silmeye çalışacak...
Volkan Uzun
10/08/2005, 22:03
cok iyi valla cevaplar :)
hadi bir soru daha,
S *s = new S(1) diye yazildiginda,
new char[1]
ve delete[] olacak
new char
delete yerine
burdaki trade off nedir ?
@sanalprogramci ,
son sorunu anlayamadım.
bu arada o son 5 soru var ya, windows programming ,
tam olarak 0(sıfır) çektim :2:
***** aşağıdaki yorum hatalıdır. Euclides alıntı yaptığı için silmiyorum*****
int process( char *filename )
{
FILE *f;
int count = 0;
if( filename )
{
if( f = fopen(filename, "r") )
{
while( fgetc( f ) != EOF )
count++;
}
fclose( f );
}
return count;
}
C tarzı dosya işlemlerinde pek anlamam ama
dosya adı geçerli değil ise
fclose( f ); belirsiz bir bellek bölgesini ( buffer zannederek ) serbest bırakmaya çalışacak.. ( öyle mi ? )
Volkan Uzun
10/08/2005, 22:55
son sorumu bende anlamadim :)
S s = new S(1) denildiginde, new char[1] ve delete[] cagiralacak.
oysaki sanirim new char, ve delete yapmak daha karli.
bu sebeple orada constructor a gecirilecek parametre 1 mi diye kontrol etmek dahami mantikli ?
evetse neden hayirsa neden tarzi bisiydi
ama sacma soru oldu :)
neyse.. :))
Euclides
10/08/2005, 23:40
C tarzı dosya işlemlerinde pek anlamam ama
dosya adı geçerli değil ise
fclose( f ); belirsiz bir bellek bölgesini ( buffer zannederek ) serbest bırakmaya çalışacak.. ( öyle mi ? )
burada başka bir problem daha var aslında biz zaten filename'in geçerliliğini kontrol etmiyoruz.
0'mı değil mi ona bakıyoruz. Oyda IsBadReadPtr gibi bir api'ile doğruluğunu kontrol etmeliydik. yada try,finally falan yapmalıydık.
f)
#include <stdio.h>
#define LEAST(x,y) ((x) < (y) ? (x) : (y))
char *puzzle = "A real puzzle";
int main()
{
int least=10000;
char *p = puzzle;
int s = 0;
while( *p )
{
s = (int) *p++;
least = LEAST( least, s);
}
printf( "The least char is '%c'\n", least );
return 0;
}
Bu sekilde duzelir sanirim.
h) e gelince bunun derleyeceginden bile supheliyim. Constructor in tanimi yok .
Geriye kalan sorularin ustunde bile durmayagerek yok galiba, ozellikle kotu yazilmislar sanki.
S *s = new S();
delete s; // p nedir ?
kimbilir neyi silmeye çalışacak...
S s; seklinde default value kullanildiginda p nin nereye isaret ettigini bilmiyoruz. Bu konuda haklisiniz fakat aslinda delete[] p; dogru bir kullanim. Asil sorun p nin initialize edilmeden kullanilmasi. Eger constructor icerisinde p=NULL; gibi bir statement olsaydi ve NULL pointer icin delete kullanilmasini onlemek icin de destructor icerisinde if(p != NULL) gibi bir kontrolden sonra delete[] p; denilseydi sorun kalmazdi.
myavuzselim
12/08/2005, 03:28
son sorumu bende anlamadim :)
S s = new S(1) denildiginde, new char[1] ve delete[] cagiralacak.
oysaki sanirim new char, ve delete yapmak daha karli.
bu sebeple orada constructor a gecirilecek parametre 1 mi diye kontrol etmek dahami mantikli ?
evetse neden hayirsa neden tarzi bisiydi
ama sacma soru oldu :)
neyse.. :))
Bence hayir, cunku:
1) Her S(n) icin cagirilacak olan if/else'lerden kaybettigin performans mi daha onemli, yoksa sadece S(1) icin kazanacagin performans mi? new/delete ile new[1]/delete[] arasindaki performans farkini bilmiyorum ama buyuk ihtimalle degmez. Zaten bunu yapmak performansa etki etseydi bile new[]/delete[] operatorleri bunu kendi test ederdi.
2) kod gereksiz yere dallanir budaklanir
Bu arada kandiliniz mubarek olsun.
Euclides
12/08/2005, 10:10
Bence hayir, cunku:
1) Her S(n) icin cagirilacak olan if/else'lerden kaybettigin performans mi daha onemli, yoksa sadece S(1) icin kazanacagin performans mi? new/delete ile new[1]/delete[] arasindaki performans farkini bilmiyorum ama buyuk ihtimalle degmez. Zaten bunu yapmak performansa etki etseydi bile new[]/delete[] operatorleri bunu kendi test ederdi.
saçmalama... eğer if/else'lerin 1 clockluk kaybına bakıyorsan dinamik olan hiçbir şeyi kullanma... hatta C++'a hiç girme. her taraf performance trap.
2...
zaten kendi test etmezdi. Onlar her zaman en kötü performans en yüksek uyumluluk içindir. O yüzden hepsi Pentium 133'unlerin opcode map'ini kullanıyor. Meslea aynı şekilde de rand() bu mantıkla en iyi rasgele sayıları üretmesi gerekirdi. Fakat aslında rasgelelikten çoooook uzaktır.
myavuzselim
12/08/2005, 13:39
Iltifatlarin icin tesekkurler :)
Cumleme aslinda bence diye baslamistim. Cok heyecanlaniyorsun, beni ise almazsin olur biter ;)
myavuzselim
12/08/2005, 14:23
Bu arada bir test yaptim:
#include <ctime>
#include <iostream>
class S {
char *p;
int n;
public:
S (int k = 0) : p(0){
n = k;
if (n) p = new char[n];
}
~S() { delete[] p; }
};
class S2 {
char *p;
int n;
public:
S2 (int k = 0) : p(0){
n = k;
if (n == 1) p = new char;
else p = new char[n];
}
~S2() {
if (n==1) delete p;
else delete[] p;
}
};
int main(){
clock_t t = clock();
for(int i=0; i<10000000; i++){
//S s(1); // 1950000
//S s(2); // 1950000
//S2 s(1); // 1700000
S2 s(2); // 1980000
}
t = clock() - t;
std::cout << t << std::endl;
}
Teste gore new/delete ile new[1]/delete[] arasinda bayagi bir performans farki var.
Fakat 9-10 defa 1'den farkli bir sayiyla S cagirildiginda bu tam tersi etki yapiyor. Tabi test ne kadar guvenilir onu bilmiyorum. Bu benim makineme ozel bir durum da olabilir, baska platformlarda bu fark cok daha onemli olabilir, ...
Kisacasi ben dedigim dedik, caldigim duduk demeye calismiyorum, sadece mantigimin sacma olmadigini belirtmek istiyorum.
Euclides
12/08/2005, 15:06
Iltifatlarin icin tesekkurler :)
Cumleme aslinda bence diye baslamistim. Cok heyecanlaniyorsun, beni ise almazsin olur biter ;)
Ay ay çok heycanladım böyle "panik" "panik" oldum...
Hiç merak etme senin gibi c&p programcılarını kimse işe almaz...
Kisacasi ben dedigim dedik, caldigim duduk demeye calismiyorum, sadece mantigimin sacma olmadigini belirtmek istiyorum.
önce seni bir "ölçüm" nasıl yapılır onu bi öğrende sonra deney yaparsın...
myavuzselim
12/08/2005, 19:31
Tabi test ne kadar guvenilir onu bilmiyorum.
önce seni bir "ölçüm" nasıl yapılır onu bi öğrende sonra deney yaparsın...
Yine ayni yikici elestiriler... Zaten basinda ben hatali olabilecegimi kabul ediyorum ama nerede hataliyim, elestiri yaparken lutfen yapici olun. Yoksa ne anladik bu isten?
Volkan Uzun
12/08/2005, 21:14
arkadaslar lutfen benim konumun disinda tartismayin, acehreli bolum yoneticisi ama bende bu tip sorulari buraya kopyalamayi birakmak durumunda kalmiyim
ozel mesajdan haberlesin kisisel seylerinizi.
fikri olan , cevabi olan, sorusu olan bu sorularla ilgili buyursun yazsin.
geri kalan herseyi silicem acehreli kabalik saymazsa bundan sonra.
devam :hmmm:
1.
#define x 100
const int y=100
int a = x;
int b = y;
bu ikisi arasindaki fark nedir
a derleme zamanında belirleniyor. b çalışma zamanında..
------------
2. asagidakilerde hatalari bulun,
a) if ( 0 < a < 5 ) c;
if ( 0<a && a < 5 ) ...
b) int g ( )
{
char *p = NULL;
char *s;
p = foo( ) ;
printf( "foo( ) returns %s \n" , p );
}
foo() nun döndürdüğü char[] , null-terminated değilse ne olacak ?
d) switch ( a )
{
int var = 1;
case A:
case B:
}
int var ın tanımlandığı yer yanlış..
ms windows programming ile sorulari
1. thread senkronizasyonu icin 3 yontem soyleyin
semephor , randevous, .. ?
6. bir string i ters ceviren fonksiyon yazsaniz, hangi kosullari test edersiniz ozlelikle ?
boş mu değil mi, unicode mi (2 bayt )?
hatalı isem tel: 0 535 xxx xxx xx :D
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.