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ı

..*..

.*.*.

*…*

.*.*.

..*..

  1. Fonksiyonu iteratif olarak kodlayınız (döngü ile)
  2. 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.

  1. Dizi (array) kullanarak kodlayınız
  2. 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]!=’’;i++){

if(giris[i]!=giris[i+1]){

printf(“boy1: %d boy2: %d say1: %d say2: %dn”,boy1,i-say2,say1,say2);

if(boy1<i-say2){

boy1=i-say2;

say1=say2;

}

say2=i;

}

}

for(int i = say1+1;i<say1+boy1+1;i++){

printf(“%c”,giris[i]);

}

getch();

}

 

b)

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

int main(){

printf(“bir dizgi giriniz:”);

char* giris=(char*)malloc(sizeof(char)*100);

scanf(“%s”,giris);

int boy1=0; //en uzun kelimenin boyu

char * say1=giris; //en uzun kelimenin basini gosterir

char * say2=giris; // en son kelimenin basini gosterir

char *p=giris; //dizgi ustunde yuzen pointer

while( *p!= ‘’){

if(*p!=*(p+1)){

if(boy1<p-say2){

boy1=p-say2;

say1=say2;

}

say2=p;

}

p++;

}

for(int i = 0;i<boy1;i++){

printf(“%c”,*(++say1));

}

getch();

}

Yorumlar

  1. ysf

    hocam c programlamada Y ve G harfleri yan yana gelecek şekilde nasıl yazılır hoca bunu ödev olarak verdi kodu yazabilirmisiniz yardımlardan dolayı şimdiden çok teşekkür ederim

  2. ysf

    hocam iyi günler..bilgisayar programlamadan c++ dersinden hocamız bir ödev verdi. c programlamadan if else komutunu kullanarak Y G harfleri aynı ekranda yan yana olacak şekilde yazın dedi bize.. bunun c deki komut karşılığı lazım. yardımcı olursanız çok sevinirim şimdiden çok teşekkür ederim.

  3. Şadi Evren ŞEKER Article Author

    Sorunuzu anlayamadım? Ekrana iki harf bastırmak için C dilinde:

    printf(“YG”);

    C++ dilinde

    cout << "YG" << endl; yazmanız yeterli. Acaba başka birşey mi kast ediyorsunuz?

  4. faysal

    yarı çapı dışardan girilen dairenin çevresini ve alanını hesaplayan kodu yazarmısınıs.şimdiden teşekütler.

  5. buse

    #include
    #include
    int main(){
    int r,cevre,alan;
    printf(“yarıcap giriniz: \n “);
    scanf(“%d”, &r);
    /*pi sayısını 3 kabul edersek */

    cevre=2*3*r;
    alan=3*r*r;
    printf(“cemberin alanı : %d \n”,alan);
    printf(“cemberin cevresi: %d \n”,cevre);

    getch();

    }

ysf için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir