ALpMontana
КЯaL´da TaNıMaM КuяaL´da
rogram komut satirindan calismakta ve 3 parametre almakta.
1. Parametre programın adı,
2. Parametre girdi dosyasının adı,
3. Parametre ise çıktı dosyasının adı.
#include<stdio.h>
#include<stdlib.h>
int limit;//Bu degisken ortak kup boyutunu tutmakta.
int m,n,p,q;//Bu degiskenler girdi dosyasinin ilk satirindan okunan sayilar.
void finding_common_cub(char*,char*,int,int,int);
int row_control(char*,char*,int,int,int);
int main(int argc,char * argv[]){
FILE *reader;
FILE *writer;
int ch,i,k,letter;
char *array1,*array2;
if(argc != 3){
printf("ERROR:Missing Argument");
return 0;
}//if
if((reader = fopen(argv[1],"r")) == NULL){
printf("ERROR in input file:yazi2.gir can't be opened.");
return 0;
}//if
else if((writer = fopen(argv[2],"w")) == NULL){
printf("ERROR in output file:yazi2.cik can't be opened.");
return 0;
}//else if
else{
fscanf(reader,"%d%d%d%d\n",&m,&n,&p,&q);//Dortgenlerin boyutlari ilk satirdan okunuyor.
array1 = (char*)malloc(((m*n)+m)*(sizeof(char)));//Dortgen boyutlara gore dinamik bellek alanlari ayriliyor.Yeni satir karakterleri '\n' icin de yer ayrilmistir.
array2 = (char*)malloc(((p*q)+p)*(sizeof(char)));//Dortgen boyutlara gore dinamik bellek alanlari ayriliyor.Yeni satir karakterleri '\n' icin de yer ayrilmistir.
ch = fgetc(reader);
i=0;
//Bu donguyle girdi dosyasindaki tum karakterler dosya sonuna kadar teker teker okunup dizilere atiliyor.
while(ch != EOF){
if(i < (m*n)+m){//ilk (m*n)+m karakter birinci diziye ait,yani ilk harf grubunu olusturuyor.
*(array1+i) = ch;
}//if
else{
*(array2+i-((m*n)+m)) = ch;//ilk (m*n)+m karakterden sonraki tum karakterler ikinci grubunu olusturuyor.
}//else
i++;
ch = fgetc(reader);
}//while
i=0;
k=0;
limit = 0;//Ortak kupun boyutlari sifirlandi.Henuz ortak olan bisey yok
//Bu while dongusunde dinamik dizilerin her ikisi de bastan sona taranarak ortak herhangi bir karakter araniyor.
while(i <= ((m*n)+m)){
while(k <= ((p*q)+p)){
if((*(array1+i) == *(array2+k)) && (*(array1+i) != '\n') && (*(array2+k) != '\n')){//array1 ve array2 dizilerinde ortak bir karakter varsa ve bu yeni satir karakteri degilse kosul dogrulanir.
letter = 0;//Ortak karakter miktari tutuluyor.
finding_common_cub(array1,array2,i,k,letter);//Cagrilan fonksyon,ortak karakterin ardindaki kac karakterin daha ayni oldugunu kontrol ediyor.Ayrica alt satirlari da kontrol eden baska bir fonksyonu kendi icinde cagiriyor.
}//if
k++;
}//while
if(k == ((p*q)+p+1)) k=0;
i++;
}//while
fprintf(writer,"%d\n",limit);//Sonuc cikti dosyasina yaziliyor.
}//else
free(array1);//Tutulan bellek alanlari bosaltiliyor.
free(array2);//Tutulan bellek alanlari bosaltiliyor.
fclose(reader);//Dosya kapatiliyor.
fclose(writer);//Dosya kapatiliyor.
return 0;
}//main
//Bu fonksyon, iki dortgenin herhangi birer satirinda kac karakterin ortak oldugunu bulmak icin tanimlandi.Ayrica alt satirlari kontrol eden baska bir fonksyonu cagiriyor.Karakter dizilerinde ortak bir karakter yakalandiktan sonra bu fonksyon cagrilir.
void finding_common_cub(char * array1,char * array2,int i,int k,int letter){
int a=0;
int control;//Alt satirdaki ortak karakterlerin bir kup olup olmadigi bu degiskenle kontrol ediliyor.Eger kup olusturursa 1,olusturmazsa degeri 0 oluyor.
//Bu while dongusu en fazla ilgili satirin sonuna kadar tekrarlaniyor.
while(*(array1+i+a) != '\n' && *(array2+k+a) != '\n'){
if(*(array1+i+a) == *(array2+k+a)){//Eger siradaki karakterde ayniysa kosul dogrulaniyor.
letter++;//Ortak karakter sayisi artiriliyor.
}//if
else{
break;
}//else
a++;
}//while
control = row_control(array1,array2,i,k,letter);//Alt satirlardaki karakterlerin kontrol edilmesi icin bu fonksyon cagiriliyor.
//Bulunan ortak karakter kümesinin uzunlugunun,(eger varsa) daha önce bulunmus olan karakter kümesinin uzunlugundan fazla olup olmadigi kontrol ediliyor.Eger bu,bulunan ilk karakter kümesi ise (limit == 0 ise),diziye dogrudan ataniyor.
if(letter > limit && control == 1){
limit = letter;//Bulunan karakter kumesinin buyuklugu global tanimlanan limit degiskenine ataniyor.
}//if
}//end of function
//Bu fonksyon alt satir kontrolu yaparak ortak karakterlerin bir kup olusturup olusturmadigini kontol ediyor.
int row_control(char * array1,char * array2,int i,int k,int letter){
int y=1,h=0;
int control = 1;//Eger degeri 1 ise,ortak karakterlerin kup olusturdugunu belirtir.
int copy_letter = letter;
//Bu while dongusu,letter -1 kadar (ilk satirdaki ortak karakter sayisi - 1) asagi dogru alt satirlari kontrol ediyor.
while(y < copy_letter && control == 1){
//Bu while dongusu,alt satirlari,ilk satirdaki karakter sayisi kadar saga dogru kontrol ediyor.
while(h < copy_letter){
if(*(array1+i+y*(n+1)+h) == *(array2+k+y*(q+1)+h)){//Eger ortak karakter varsa,kosul dogrulaniyor.
letter++;//Ortak karakter sayisi artirilir.
}//if
else{
control = 0;//Ortak karakterlerin kup olusturmadigini gosteriyor.
}//else
h++;
}//while
h=0;
y++;
}//while
return control;
}//end of function
1. Parametre programın adı,
2. Parametre girdi dosyasının adı,
3. Parametre ise çıktı dosyasının adı.
#include<stdio.h>
#include<stdlib.h>
int limit;//Bu degisken ortak kup boyutunu tutmakta.
int m,n,p,q;//Bu degiskenler girdi dosyasinin ilk satirindan okunan sayilar.
void finding_common_cub(char*,char*,int,int,int);
int row_control(char*,char*,int,int,int);
int main(int argc,char * argv[]){
FILE *reader;
FILE *writer;
int ch,i,k,letter;
char *array1,*array2;
if(argc != 3){
printf("ERROR:Missing Argument");
return 0;
}//if
if((reader = fopen(argv[1],"r")) == NULL){
printf("ERROR in input file:yazi2.gir can't be opened.");
return 0;
}//if
else if((writer = fopen(argv[2],"w")) == NULL){
printf("ERROR in output file:yazi2.cik can't be opened.");
return 0;
}//else if
else{
fscanf(reader,"%d%d%d%d\n",&m,&n,&p,&q);//Dortgenlerin boyutlari ilk satirdan okunuyor.
array1 = (char*)malloc(((m*n)+m)*(sizeof(char)));//Dortgen boyutlara gore dinamik bellek alanlari ayriliyor.Yeni satir karakterleri '\n' icin de yer ayrilmistir.
array2 = (char*)malloc(((p*q)+p)*(sizeof(char)));//Dortgen boyutlara gore dinamik bellek alanlari ayriliyor.Yeni satir karakterleri '\n' icin de yer ayrilmistir.
ch = fgetc(reader);
i=0;
//Bu donguyle girdi dosyasindaki tum karakterler dosya sonuna kadar teker teker okunup dizilere atiliyor.
while(ch != EOF){
if(i < (m*n)+m){//ilk (m*n)+m karakter birinci diziye ait,yani ilk harf grubunu olusturuyor.
*(array1+i) = ch;
}//if
else{
*(array2+i-((m*n)+m)) = ch;//ilk (m*n)+m karakterden sonraki tum karakterler ikinci grubunu olusturuyor.
}//else
i++;
ch = fgetc(reader);
}//while
i=0;
k=0;
limit = 0;//Ortak kupun boyutlari sifirlandi.Henuz ortak olan bisey yok
//Bu while dongusunde dinamik dizilerin her ikisi de bastan sona taranarak ortak herhangi bir karakter araniyor.
while(i <= ((m*n)+m)){
while(k <= ((p*q)+p)){
if((*(array1+i) == *(array2+k)) && (*(array1+i) != '\n') && (*(array2+k) != '\n')){//array1 ve array2 dizilerinde ortak bir karakter varsa ve bu yeni satir karakteri degilse kosul dogrulanir.
letter = 0;//Ortak karakter miktari tutuluyor.
finding_common_cub(array1,array2,i,k,letter);//Cagrilan fonksyon,ortak karakterin ardindaki kac karakterin daha ayni oldugunu kontrol ediyor.Ayrica alt satirlari da kontrol eden baska bir fonksyonu kendi icinde cagiriyor.
}//if
k++;
}//while
if(k == ((p*q)+p+1)) k=0;
i++;
}//while
fprintf(writer,"%d\n",limit);//Sonuc cikti dosyasina yaziliyor.
}//else
free(array1);//Tutulan bellek alanlari bosaltiliyor.
free(array2);//Tutulan bellek alanlari bosaltiliyor.
fclose(reader);//Dosya kapatiliyor.
fclose(writer);//Dosya kapatiliyor.
return 0;
}//main
//Bu fonksyon, iki dortgenin herhangi birer satirinda kac karakterin ortak oldugunu bulmak icin tanimlandi.Ayrica alt satirlari kontrol eden baska bir fonksyonu cagiriyor.Karakter dizilerinde ortak bir karakter yakalandiktan sonra bu fonksyon cagrilir.
void finding_common_cub(char * array1,char * array2,int i,int k,int letter){
int a=0;
int control;//Alt satirdaki ortak karakterlerin bir kup olup olmadigi bu degiskenle kontrol ediliyor.Eger kup olusturursa 1,olusturmazsa degeri 0 oluyor.
//Bu while dongusu en fazla ilgili satirin sonuna kadar tekrarlaniyor.
while(*(array1+i+a) != '\n' && *(array2+k+a) != '\n'){
if(*(array1+i+a) == *(array2+k+a)){//Eger siradaki karakterde ayniysa kosul dogrulaniyor.
letter++;//Ortak karakter sayisi artiriliyor.
}//if
else{
break;
}//else
a++;
}//while
control = row_control(array1,array2,i,k,letter);//Alt satirlardaki karakterlerin kontrol edilmesi icin bu fonksyon cagiriliyor.
//Bulunan ortak karakter kümesinin uzunlugunun,(eger varsa) daha önce bulunmus olan karakter kümesinin uzunlugundan fazla olup olmadigi kontrol ediliyor.Eger bu,bulunan ilk karakter kümesi ise (limit == 0 ise),diziye dogrudan ataniyor.
if(letter > limit && control == 1){
limit = letter;//Bulunan karakter kumesinin buyuklugu global tanimlanan limit degiskenine ataniyor.
}//if
}//end of function
//Bu fonksyon alt satir kontrolu yaparak ortak karakterlerin bir kup olusturup olusturmadigini kontol ediyor.
int row_control(char * array1,char * array2,int i,int k,int letter){
int y=1,h=0;
int control = 1;//Eger degeri 1 ise,ortak karakterlerin kup olusturdugunu belirtir.
int copy_letter = letter;
//Bu while dongusu,letter -1 kadar (ilk satirdaki ortak karakter sayisi - 1) asagi dogru alt satirlari kontrol ediyor.
while(y < copy_letter && control == 1){
//Bu while dongusu,alt satirlari,ilk satirdaki karakter sayisi kadar saga dogru kontrol ediyor.
while(h < copy_letter){
if(*(array1+i+y*(n+1)+h) == *(array2+k+y*(q+1)+h)){//Eger ortak karakter varsa,kosul dogrulaniyor.
letter++;//Ortak karakter sayisi artirilir.
}//if
else{
control = 0;//Ortak karakterlerin kup olusturmadigini gosteriyor.
}//else
h++;
}//while
h=0;
y++;
}//while
return control;
}//end of function