mrb umarım doğru yer ekonuyu açmışımdır foruma yabancıyımda.
c de soru
Bu problemi bir dizi(array) yardımı ile cozebilirsiniz.Ornegin ilgili txt dosyası icerisinde su sekil olsun,
*
*
*
* * *
7 uzunlugundaki bir char dizisi tanımlayarak bu text dosyası icerisindeki karakterler oncelikle tek tek okunacaktır.Daha sonra dizinin son iki elemanından itibaren yeni bir text dosyası icerisinde yukarıdan asagıya dogru yazılmaya baslayacaktır.Ancak buradaki dikkat edilmesi gereken husus,yatayda kalan kac adet eleman var ise,bu eleman sayısı kadar bosluk basılarak dusey elemanların yazdırılması geregidir.Yukarıdaki sekil icin dizinin son 2 elemanı yazdırıltan sonra,dosya basına atlayarak kalan elemanlar tek tek yazdırılacaktır.Beklenen şekil asagıdaki gibi dusunulebilir.
*
*
* * * *
Başarılar
Oncelikle metin dosyasında bulunan L seklindeki bir kare matris dusunursek asagıdaki gibi bir kayıt elde edebiliriz.
* . . . .
* . . . .
* . . . .
* . . . .
* * * * *
Kayıttaki bu matris ters L seklini alabilmesi icin,yani 90 derece donebilmesi icin,ilk sutunun elemanları,kare matrisin uzunlugu kadar(indisin 0'dan baslaması durumunda uzunluk-1)yan sutuna gecmesi yeterlidir.Yani yukarıdaki gibi 5-5 bir kare matrisin 0.sutunundaki elemanlar,matrisin 90 derece donmesiyle 4.sutununda konumlanacaklardır.
Yukarıda anlatılan algoritmanın C dilindeki karsılıgını yayımlıyorum.
#include <stdio.h>
#define boy 5
main() {
FILE *dosya;
dosya=fopen("a.txt","r");
char dizi[boy][boy];
int i=0,j=0;
while(!feof(dosya)) {
fscanf(dosya,"%s",&dizi[j++]);
if(j==boy) {
i++;j=0;}
}
for(j=0;j<boy-1;j++) {
char temp=dizi[j][0];
dizi[j][0]=dizi[j][boy-1];
dizi[j][boy-1]=temp;
}
fclose(dosya);
dosya=fopen("b.txt","w");
for(i=0;i<boy;i++) {
for(j=0;j<boy;j++)
fprintf(dosya,"%c ",dizi[j]);
fprintf(dosya,"\n");
}
fclose(dosya);
return 0;
}
Başarılar
#include <stdio.h>
#define boy 10
#define yatayBar 3
#define duseyBar 1
int dizi[boy][boy];
void ilerle(int x,int y,int *sayim,int yon) {
while(dizi[x][y]==1) {
if(yon==0) // yon sag ise
y++;
else if(yon==1) // yon sol ise
y--;
else // yon asagi ise
x++;
(*sayim)++;
}
}
void dondur(int i,int j,int sag1,int asagi1,int sag2,int asagi2,int sol2) {
if(sag1==yatayBar-1 && asagi2==duseyBar) {
dizi[j]=0;dizi[j+1]=0;
dizi[i+2][j+sag1]=1;dizi[i+2][j+sag1-1]=1;
}
else if(asagi1==yatayBar-1 && sag2==duseyBar) {
dizi[j]=0;dizi[i+2][j+1]=0;
dizi[i+1][j+1]=1;dizi[i+1][j+2]=1;
}
else if(asagi1==duseyBar && sol2==yatayBar-1) {
dizi[i+1][j-2]=0;dizi[i+1][j-1]=0;
dizi[i-1][j]=1;dizi[i+1][j+1]=1;
}
else if(asagi1==yatayBar-1 && sol2==duseyBar) {
dizi[j]=0;dizi[i+2][j-1]=0;
dizi[i+2][j+1]=1;dizi[i+2][j+2]=1;
}
else;
FILE *dosya=fopen("b.txt","w");
for(i=0;i<boy;i++) {
for(j=0;j<boy;j++)
fprintf(dosya,"%d ",dizi[j]);
fprintf(dosya,"\n");
}
}
int main() {
FILE *dosya;
dosya=fopen("a.txt","r");
int sagSayim=-1,asagiSayim=-1;
int sagSayim2=-1,solSayim2=-1,asagiSayim2=-1;
int i=0,j=0;
while(!feof(dosya)) {
fscanf(dosya,"%d",&dizi[j++]);
if(j==boy) {
i++;j=0;}
}
fclose(dosya);
int flag=0;
for(i=0;i<boy;i++) {
for(j=0;j<boy;j++)
if(dizi[j]==1) {
flag=1;
break;
}
if(flag)
break;
}
ilerle(i,j,&sagSayim,0); // sag
ilerle(i,j,&asagiSayim,2); // asagi
if(sagSayim!=0)
ilerle(i,j+sagSayim,&asagiSayim2,2); // asagi
if(asagiSayim!=0) {
ilerle(i+asagiSayim,j,&sagSayim2,0); // sag
ilerle(i+asagiSayim,j,&solSayim2,1); // sola
}
dondur(i,j,sagSayim,asagiSayim,sagSayim2,asagiSayim2,solSayim2);
return 0;
}
Daha önceden verilen cevap silinmiş olması sebebiyle program kodunu yeniden yayımlıyorum.
Başarılar