Çözüldü C"dili hk

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

calem2

Üye
24 Haz 2010
103
0
Adam asmaca oyunu yapıyorum fakat hata alıyorum.
1.Hata:2 defa bu kodu printf("%s\n",x); çalıştırıyor.
Ben bu hata çözümü için system("cls"); kullandım.
2.Hata:adam fonksiyonunun çalışması için gereken değişken j = 0 olarak kalıyor.
normalde j nin artması m ye bağlı fakat olmuyor.
Programı açıklama satırlarıyla birlikte yazdım.
Yardımlarınız için şimdiden teşekkürler..

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

v0id adam(int p){ //Asılan adamı çizen fonksiyon
if(p==1){ //P değeri 1 olduğunda ekran çıktısı (kafa)
printf("*****\n");
printf("* *\n");
printf("* *\n");
printf("*****\n");
}
if(p==2){ //P değeri 2 olduğunda ekran çıktısı (boyun)
printf("*****\n");
printf("* *\n");
printf("* *\n");
printf("*****\n");
printf(" |\n");
printf(" |\n");
}
}
int main(){
char sehirler[10][30]={"antalya","edirne","izmir","istanbul","bursa","trabzon","erzurum","samsun","mersin","bitlis"}; //Şehir isimlerini içeren sehirler dizisi
srand(time(NULL)); //zaman'a bağlı rasgele sayı üreten fonksiyonun çalışması için gerekli olan kod
int a,j=0,m; //a değişkeni rasgele sayı için oluşturuldu. //j değişkeni çizim fonksiyonun içine girecek olan değişken //m aşağodaki döngüde j değerinin artıp artmamasına karar verilmesini sağlayan değişken
a = rand()%10; //a değişkenine 0 ile 9 arasında rasgele bir sayı atandı.[0,9] //0 ve 9 dahil
int i; //for döngüleri için kullanılacak sayaç değişkeni
char x[strlen(sehirler[a])]; //rasgele gelen şehrin uzunluğu boyutunda char tipinde bir x değişkeni oluşturuluyor.
for(i=0;i<strlen(sehirler[a]);i++) //oluşturulan x değişkeninin tüm indislerine * işareti atanıyor ve bu işlem rasgele gelen şehrin uzunluğu boyunca yapılıyor.
x='*';
char harf; //kullanıcıdan alınacak harf için değişken tanımlanıyor.
while(strcmp(x,sehirler[a])!=0){ //strcmp fonksiyonuyla x'i ve rasgele gelen şehrin indislerini karşılaştırıyor hepsi aynı ise 0 değerini döndürüyor koşulumuzda 0 dan farklı olduğu sürece çalış.
m=0; //j değişkeninin artıp artmayacağına karar verilmesi için öncelikle m değişkenine 0 değeri atanıyor.
adam(j); //çizim fonksiyonu çağırılıyor j'nin ilk değeri 0 yani başlangıta hiçbir şey olmayacak.
printf("%s\n",x); //ekrana x karakter dizisini bas ve alt satıra geç.
scanf("%c",&harf); //kullanıcıdan harf değişkenine değer al.
for(i=0;i<strlen(sehirler[a]);i++){ //kullanıcının girdiği harfi rasgele gelen şehir karakter dizisinde ara döngüsü
if(sehirler[a]==harf){ //girilen karakter rasgele gelen şehir karakter dizisinin i.indisi ile eşleşiyor ise bu harfi x'in i.indisine ata.
x=harf; //harf'i x'in i.indisine ata.
m=1; //harf ataması gerçekleşirse m=1 yap.
}
}
if(m=0) //eğer m=0 ise j değişkenin değerini arttır. (j'nin ilk değeri 0)
j++;
system("cls"); //ekranı temizleme kodu //bu kodu printf 2 kere çalıştığı için yazmak zorunda kaldım kaldırın ve sıkıntıyı görün.
}
printf("%s\nTebrikler..",x); //döngü sonlandığında ekrana şehrin adını yaz ve tebrik et :)
}
 
Moderatör tarafında düzenlendi:

David Caine

Katılımcı Üye
6 Haz 2016
397
0
cs_Assault
öncelikle çok güzel program olmuş bence eline sağlık, çok şey öğrendim incelerken.

herşeyden önce j nin 0 olarak kalmasının sebebi if(m=0) yazmış olman, m==0 olmalıydı

asıl problem diğeri:

ben c++ da yaptığım programlarda hep iostream kütüphanesini kullanırım, sen stdio.h ı kullanmışsın bu yüzden hatayı bulmaya çalışırken zorlandım, uzun sürdü :D

daha kolay olsun diye birkaç kodu çıkardım ve denemeler testler yaptım; stdio.h ı çok kullanmadığımdan çok fazla emin değilim ama bence:
scanf kısmında problem var, bu yüzden sen bir veri girince döngü iki kere dönüyor ama neden böyle hiçbir fikrim yok dediğim gibi stdio.h ı kullanmam (belkide sorun scanf te de değildir ama bence kesin orda)

sonra emin olmak için aynı kodları iostream kütüphanesini kullanarak yazdım (yani kodda sadece printf 'ler cout, scanf 'ler cin e dönüştü) ve çalıştırdım; sorunsuz çalıştı, bu yüzden sorunun scanfte olduğunu düşünüyorum

kodu aşağıya attım
( ben while(1) yani sonsuz döngü kullanmaya alışığım, döngüden çıkaracak kodu içeri yazarım genelde, o yüzden ;
if(strcmp(x,sehirler[a])==0)
break;
yazarak halletim döngüden çıkış işini.
aynı zamanda 1 2 özellik daha ekledim: 3 kere bilememe hakkı var

[bunu fonksiyonu boola çevirerek yaptım yani eğer j=3 olursa yani adamın tamamı çizilirse fonksiyon 1 değerini döndürcek ve fonksiyon 1 olursa da döngüden çıkılacak]

ve her adam çizildiğinde bu hakları gösteriyor ve en sonunda doğru kelimeyi yazıyor. ve adamı değiştirdim azcık insana benzettim :D )

Kod:
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<string.h>
using namespace std;
bool adam(int j)
{ 
	int a;
	if(j==1)
	{
			cout<<"\n                         (0 > 0)     kalan hak: 2";
			a=0;
	}
	if(j==2)
	{ 
		cout<<"\n                         (0 > 0)     kalan hak: 1";
		cout<<"\n                         /|   |\\    ";
		a=0;
	}
	if(j==3)
	{
                system("color c");
		cout<<"\n                         (0 >0)     kalan hak: 0";
		cout<<"\n                         /|   |\\    ";
		cout<<"\n                          *****      ";
		cout<<"\n                          /   \\      ";
		a=1;
	}
	return a;
}
int main()
{
        system("color a");
	int sayac=0;
	char sehirler[10][30]={"antalya","edirne","izmir","istanbul","bursa","t rabzon","erzurum","samsun","mersin","bitlis"}; 
	srand(time(NULL)); 
	int a,j=0,m; 
	a = rand()%10;
	int i; 
	char x[strlen(sehirler[a])]; 
	for(i=0;i<strlen(sehirler[a]);i++) 
		x[i]='*';
	char harf;
	int s=0;
	int f=strlen(sehirler[a]);
	while(1)
	{ 
		m=0; 
		cout<<"\n"<<x<<"\n";				
		cin>>harf; 
		for(i=0; i<f ;i++)
		{ 
			if(sehirler[a][i]==harf)
			{ 
				x[i]=harf;
				m=1; 
			}
		}
		if(strcmp(x,sehirler[a])==0)
		break;
		
		if(m==0)
		j++;
		if(adam(j)==1)
		{
			s=1;
			break;
		} 
	}
	if(s!=1)
	cout<<"\n"<<x<<"\nTebrikler..";
	else
	cout<<"dogru cevap: "<<sehirler[a];
}

çıktı:
 
Son düzenleme:

calem2

Üye
24 Haz 2010
103
0
Kardeşim çok teşekkür ederim dedeiğin gibi scanfte bir sıkıntı var galiba başka programlardada karşıma gelmişti bu problem :)
 
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.