Yazan : Şadi Evren ŞEKER
Soru 0) Programın çalıştığı dizinde, “deneme.txt” isimli bir dosya açarak, bu dosyanın içerisine, birden yüze kadar olan sayıları bastıran bir kod yazınız. (10 puan) (sadece bu soru için program tam olmalı (include, return satırları gibi) ve yazım hatası bulundurmamalıdır ve kodunuz compile edildiğinde hata vermemelidir. )
#include <stdio.h>
int main(){
FILE *fp ;
fp = fopen(“deneme.txt”,”w”);
for(int i = 0;i<100;i++) { // veya for(int i=1 ;i<=100;i++){
fprintf(fp,”%d”,i);
}
fclose(fp);
}
Soru 1) Derste anlatılan filtreleme fonksiyonunu iki boyutlu matrisler için kodlayınız. Buna göre fonksiyonunuz iki boyutlu bir matris ve bir fonksiyon göstericisi alacak, matrisi RAM’deki aynı adreste filtreleyerek yeni matrisin boyutunu döndürecektir. Bu soruda hafızada silinen adreslerin kalması ve matrisin kare yapısının bozulması gibi konuları göz ardı edebilirsiniz. (35 puan)
Aşağıdaki örnek matrisi ele alalım:
0 1 2 3
7 6 5 4
8 9 10 11
15 14 13 12
Çift sayıları filtreleyen bir fonksiyon için dönüş matrisiniz aşağıdaki şekilde olmalıdır:
0 2 6 X
4 8 10 X
14 12 X X
X X X X
Yukarıda, X ile gösterilen değerler önemsizdir. Yukarıdaki matrisin yeni boyutu 3’tür.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int cift(int x){
return x%2 == 0;
}
int sqrt(int s){
int i ;
for(i = 0;i<s;i++){
if(i*i>s)
break;
}
return i;
}
int filtre (int (*fp)(int),int *a,int boyut){
int yeniboyut= boyut;
for(int i = 0;i<yeniboyut;i++){
if(!fp(a[i])){
for(int j = i;j<yeniboyut;j++){
a[j]= a[j+1];
}
yeniboyut–;
i–;
}
}
return yeniboyut;
}
int boyutlandir(int a[][4],int (*fp)(int),int boyut){
int *b = (int * ) malloc(sizeof(int) * boyut*boyut);
for(int i = 0;i<boyut*boyut;i++){
b[i] = a[i/boyut][i%boyut];
}
int yb = filtre(fp,b,boyut*boyut);
int yeniboyut = sqrt(yb);
for(int i = 0;i<yeniboyut;i++){
for(int j = 0;j<yeniboyut;j++){
a[i][j]=b[i*yeniboyut+j];
}
}
return yeniboyut;
}
int main(){
int x[4][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
int yeniboyut = boyutlandir( x,cift,4);
for(int i = 0;i<yeniboyut;i++){
for(int j = 0;j<yeniboyut;j++){
printf(“%d “, x[i][j]);
}
printf(“n”);
}
getch();
}
Soru 2) Kullanıcıdan bir sayı okuyarak ekrana verilen boyutta bir kare matris içerisinde à (içi boş eşkenar dörtgen) çizdiren kodu yazınız. (20 puan)
5 sayısı için örnek çıktı
..*..
.*.*.
*…*
.*.*.
..*..
- Fonksiyonu iteratif olarak kodlayınız (döngü ile)
- Fonksiyonu recursive olarak kodlayınız (özyineli)
a)
#include <stdio.h>
#include <conio.h>
int main(){
printf(“bir sayi giriniz”);
int n;
scanf(“%d”,&n);
for(int i= 0;i<n;i++){
for(int j = 0;j<n;j++){
if(i+j == n/2 || i+j == 3*n/2-1 || i-j == n/2 || j-i == n/2
)
printf(“*”);
else
printf(” “);
}
printf(“n”);
}
getch();
}
b)
#include <stdio.h>
#include <conio.h>
int f(int n,int i,int j){
if(j==n)
return 0;
if(i+j == n/2 || i+j == 3*n/2-1 || i-j == n/2 || j-i == n/2)
printf(“*”);
else
printf(” “);
f(n,i,j+1);
}
int g(int n,int i){
if(i==n)
return 0;
f(n,i,0);
printf(“n”);
g(n,i+1);
}
int main(){
printf(“bir sayi giriniz”);
int n;
scanf(“%d”,&n);
g(n,0);
getch();
}
Soru 3) Bir dizginin içerisinde en uzun tekrarlı harfi bulunuz. (35 puan)
Örneğin “aabbbcccccaaaaadddxxxxbbb” dizgisi için, “ccccc” veya “aaaaa” sonuçlarından birisini yada ikisini de döndüren kodu yazınız. Eşit uzunluk durumunda herhangi birisini veya hepsini döndürmeniz doğru kabul edilecektir.
- Dizi (array) kullanarak kodlayınız
- Gösterici aritmetiği (pointer arithmetic) kullanarak kodlayınız. Bu şıkkın cevabında, dizi operatörü olan [] sembollerini hiç kullanmadan soruyu cevaplayınız.
a)
#include <stdio.h>
#include <conio.h>
int main(){
printf(“bir dizgi giriniz:”);
char giris[100];
scanf(“%s”,giris);
int boy1=0; //en uzun kelimenin boyu
int say1=0; // en uzun kelimenin ilk harfi
int say2=0; // en son kelimenin ilk harfi
int enuzun = 0;
for(int i = 0;giris[i]!=’