Herkese iyi çalışmalar, satranc yapmaya çalışıyorum ve kodun başlarında bi sorunlar karşılaştım umarım yardımcı olabilirsiniz. İnitialize deyip *board[8]'ı fonksiyona soktuğumda fonksiyon işlevini yerine getiriyor fakat fonksiyon biter bitmez gönderme hatası alıyorm ve program kapanıyor. Codeblocks'da ve devc++ da denedim aynı sonucu aldım. Kodda bi yanlışlık var mı bi göz atabilirseniz sevinirim. #include <stdio.h> #include <stdlib.h> #include <string.h> void initialize(char *[]); void showmoves (char []); int main() { char move[5]; char initialize1[11]; char showmoves1[10]; char firstlocation[3]; char lastlocation[3]; char x1[24]={'R','1',' ','N','1',' ','B','1',' ','Q','U',' ','K','I',' ','B','2',' ','N','2',' ','R','2','\0'}; char x2[24]={'P','1',' ','P','2',' ','P','3',' ','P','4',' ','P','5',' ','P','6',' ','P','7',' ','P','8','\0'}; char x3[24]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'}; char x4[24]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'}; char x5[24]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'}; char x6[24]={' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'}; char x7[24]={'p','1',' ','p','2',' ','p','3',' ','p','4',' ','p','5',' ','p','6',' ','p','7',' ','p','8','\0'}; char x8[24]={'r','1',' ','n','1',' ','b','1',' ','q','u',' ','k','i',' ','b','2',' ','n','2',' ','r','2','\0'}; char *board[8]={x1,x2,x3,x4,x5,x6,x7,x8}; scanf("%s",initialize1); if(strcmp("initialize",initialize1)==0) initialize(board); else printf("Failed!\n"); scanf("%s%s",showmoves1,firstlocation); if(strcmp("showmoves",showmoves1)==0) showmoves(firstlocation); else printf("Failed!\n"); return 0; } void initialize(char *a[]){ int i; for(i=0; i<9; i++) printf("%s\n",*(a+i)); } void showmoves(char a[]){ if (strcmp("a2",a)==0) printf("\na3"); } |
Arraysiz veya pointersiz bu soruyu C de cozmek imkansiz. Cunku C de string denilen bir kavram yok. Pointerli cozum:
|
recursive fonksiyon ile
|
postfix ifadesinin klavyeden girileceğini ve her sayı ve işlem arasında en az 1 boşluk karakteri olacağını varsayınız. Yazacağınız program son-takı ifadesinin hesaplanabilmesi için yığın veri modelini kullanmalı ve 500 karakter’e kadar girilen ifadeleri doğru bir şeklide hesaplayabilmelidir. Eğer girilen ifadede hata varsa, uygun hata mesajını ekranda gösterebilmelidir. Örneğin, aşağıdaki postfix ifadesi 12 2 * 4 + 3 / ((12 * 2) + 4) / 3 şeklinde hesaplanmalıdır. Bu amaçla alınan her sayı yığına eklenmeli, bir işlem görüldüğünde yığından ilk 2 sayı alınıp, işlem hesaplanıp, sonuç tekrar yığına eklenmelidir. Eğer ekleme ve alma işlemlerinde hata olursa, uygun hata mesajları ekranda gösterilmelidir. 12 2 4 + * – şeklinde verilen bir son-takı ifadesi (12 * (2 + 4)) – şeklinde hesaplanacağından – işleminde gerekli olan ikinci sayı verilmediğinden hata mesajı verilmelidir. Yığın yapısı için dizi ya da bağlı liste kullanılabilir. Bu soruda kodu yazmaya çalıştım fakat pek başarılı olamadım.Yardımcı olursanız c kodu hakkında seviniirim. |
Mantik guzelde, ben genede bir satiri okumak icin fgets kullanmayi tercih ederim. |
recursive ile olan fonksiyonu netten bulmuştum yaptım fakat mantığını tam olarak bilmiyorum onuda yazar mısın ? |
fonksiyon kendini bosluk karakterini bulana kadar tekrar cagırıyor boylece harf harf karakterleri almıs oluyor(bufferdan) daha sonra icten dışa doğru yazdırıyor |
kullanıcı pozitif tamsayı girecek, program bu sayının bütün asal çarpanlarını bulup, diziye atayacak SORUMA YARDIMCI OLABİLİR MİSİNİZ? :(( |
Merhaba, Yapamadığınız kısım neresi, orayı yazarsanız o şekilde yardımcı olalım. Yoksa direkt bizim yapıp size kod vermemiz size bi'şey kazandırmaz. |
Kardeşim burada senin sorunun python ile gerçeklemesi var. Fikir edinmek için bakabilirsin.
|
integera atadığımız sayıyı geçersiz kılıp tekrar scanf ile değer almak için ne önerirsiniz ? bir menü yazıyorum c ile 0 1 2 3 4 den birini girecek kullanıcı switch case kullanıyorum. default içine goto ile döndürme yapıyorum ama sürekli yazıyor çünkü en başta girilen değeri silmeden o satıra geliyor ne önerirsiniz? |
Oncelikle goto kullanmayin, 1970 yilindan once kullanilan birsey o. Onun yerine while kullan. Atiyorum char girdi; while(1) { girdi = getchar(); //Switch burda if (girdi == CIKIS) { break;} } CIKIS ile bahsettigim cikis yapilcak girdi yani atiyorum 0 ile cikis yapiyorsan '0' yazmalisin. |
fflush() ile yaptim orayi ama su anda vaska bir sorunum var case icinde case yazarak yes or no y/n ile cikis veya devam etme yapmam lazim yes dersem cikacak no dersem goto ile donecek, goto yerine naparim burda case icinde case surekli hata veriyor mobilim yarin detaylica sorucam sagolun |
Ilk mesajimda yazdigim gibi, goto yerine while loop kullanabilirsin. case icinde case yazilmaz. Switch kullaniyorsan caseler sade birsey olmali. Eger sade degilse, if else vs kullanmalisin. |
goto hala kullanılıyor, ve kullanılması gereken yerde sırf kulaktan doğma "goto kullanmayın" dendiği için kullanmamak saçma. Tamam mümkün olduğunca kullanmamak gerekir ama "goto kullanmayin, 1970 lerden önce kullanılan birşey" demek de yanlış. for (;;) for (;;) for(;;) if (....) break; // Bütün döngülerden çıkmak istiyorum. Bir sürü flag mi tutacağım? if (p1 = malloc...) { ... if (p2 = malloc...) goto BIR; if (p3 = malloc...) goto IKI; if (p4 = malloc...) goto UC; . . . //en son yer tahsisi başarısız olursa öncekileri free etmek gerekir. Tipik go to nun kullanıldığı durumlardan bir başkası. UC: free p3; IKI: free p2; BIR: free p1; |
Yardim edebilcek yol gosterebilicek kimse yok mu arkadaslar ? |
goto hala kullanılıyor olabilir ama bu hatalı olduğu gerçeğini değiştirmez. Çok ilkel kodlarda kullanılmış ve günümüze kadar gelmiş ama şu anda tam bir acemi işi goto. O içiçe for örneğinde o kısmın ayrı bir işlem olduğu ve başka bir fonksiyona taşınması gerektiği anlaşılıyor. Yani çıkma işini return ile yapacaksın. Bellek tahsisi olayında da eminim daha iyi yöntemler bulunur. Tabi isteyen kullansın ama ben her zaman alternatif yöntemlerden yanayım. |
goto kullanmanın hata olduğunu düşünmüyorum. Yeni yazılan kodlarda da gördüm eskilerde de. Başka örnekler verilebilir ama yazdığım örneklere cevap verdiğiniz için bana da söz hakkı doğdu ![]() Döngülerde ayrı bir işlem olsa bile döngü çıkışında başka işlemler yapılabilir, ayrı fonksiyona taşınmayabilir... gibi gibi Tekrar söylemek gerekir örneklerden de anlaşılacağı gibi kullanımı kısıtlı ama kullanılmasının tavsiye edildiği ya da okunabilirlik açısından yanlış kabul edilmediği yerler de var. Kullanmamak gerekir ama kullanılmasının gerektiği yerlerde de kullanmamak bana göre yanlış. |
for (;;) Hayir, hatta bazi kod style larinda break bile yasak olabilir. Ben her zaman sunu yaparim: for (i=0;i<5;i++) gordugun gibi flaga falan gerek yok, e kodun geri kalaninin calismasini istemiyorum dersen ardina bir tane else koyarsin olur biter. Ikinci ornegini tam anlamadim, if in icindeki malloc hata donerse, geriden mi free ederiz mantigi var? Eger durum boyleyse bunlari en basitinden bir arrayde tutup en son eklenenden geriye free ederiz(aklima ilk gelen bu) |
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesajda bahsedilenler: @4kalan