• Bağış
  • C ile programlamaya giriş final sınavı çözümleri

    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]!=’\0′;i++){

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

    printf(“boy1: %d boy2: %d say1: %d say2: %d\n”,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!= ‘\0′){

    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();

    }

     

    Benzer Yazılar:

    Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'C ile programlamaya giriş final sınavı çözümleri' isimli yazı 23 Jan 2010 tarihinde, saat: 09:47 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 981 defa okunmuştur.

    Benzer yazıları Uncategorized kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.


    Category: Uncategorized

    Leave a Reply