c de soru

unknownn
26-12-2010, 16:16   |  #1  
OP Taze Üye
Teşekkür Sayısı: 0
7 mesaj
Kayıt Tarihi:Kayıt: Ara 2010

mrb umarım doğru yer ekonuyu açmışımdır foruma yabancıyımda.

Son Düzenleme: unknownn ~ 31 Aralık 2010 15:35
muh34
26-12-2010, 21:34   |  #2  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

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

Son Düzenleme: muh34 ~ 26 Aralık 2010 21:35
unknownn
27-12-2010, 15:23   |  #3  
OP Taze Üye
Teşekkür Sayısı: 0
7 mesaj
Kayıt Tarihi:Kayıt: Ara 2010

bunu c kodu nasıl olur.

muh34
31-12-2010, 19:19   |  #4  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

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

muh34
18-02-2011, 18:42   |  #5  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

#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