Çözüldü C'de bir fonksiyonu kendini yenilecek formda yazmak

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Aykan5498

Hectopat
Katılım
6 Ocak 2019
Mesajlar
191
Merhaba, yazdığım bir kod var maalesef ki içinden çıkamadım programda ilk önce bir dizi sayı girilecek ardından en büyüğünü en arkaya atıcak, ardından bunu kendini yenileyerek büyükten küçüğe sıralayacak. Maalesef ki kendini yenilettiremedim. Her seferinde sayıları girer girmez sonlandı.

C:
#include <stdio.h>
#include <stdlib.h>
#define N 5.

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void selection_sort(int a[], int len);

int main(int argc, char *argv[])
{
int b[N], i;

printf(" ");
for(i = 0; i < N; i++)
{
scanf("%d", &b[I]);
}

selection_sort(b, N);

for(i = 0; i < N; i++)
{
printf("%d ", b[I]);
}

return 0;
}

void selection_sort(int a[], int len)
{
int i, j, sayitutucu;

sayitutucu = a[len - 1];

for(i = len - 1; i >= 0; i--)
{
if(sayitutucu == a[I])
continue;

if(a[I] > sayitutucu)
{
sayitutucu = a[I];
j = i;
}
}

a[j] = a[len - 1];
a[len - 1] = sayitutucu;

if(len == 0)
return;

selection_sort(a, len - 1);

}
 
Çözüm
Ben bu siteden C kodunu çalıştırıyorum ve site segmantation error veriyor.
Sorunu çözdüm. (Sadece "segmentation error". Doğru sonuç üretmiyor olabilir.)
j değeri for içerisindeki if'e düşene kadar tanımsız.
Bu yüzden a[j] çağrısında j tanımsızsa patlıyor.
C:
void selection_sort(int a[], int len){
    if(len == 0)
        return;
    int i, j = 0, sayitutucu;

    sayitutucu = a[len - 1];

    for(i = len - 1; i > 0; i--){
        if(sayitutucu == a[i])
            continue;
        if(a[i] > sayitutucu){
            sayitutucu = a[i];
            j = i;
        }
    }
    a[j] = a[len - 1];
    a[len - 1] = sayitutucu;

    selection_sort(a, len - 1);
}
İnsanlar acı çekmesin diye ben çektim.

Kod:
#include <stdio.h>
#include <stdlib.h>
#define N 5.

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void selection_sort(int a[], int len);

int main(int argc, char *argv[]){
    int b[N], i;

    printf(" ");
    for(i = 0; i < N; i++){
        scanf("%d", &b[i]);
    }

    selection_sort(b, N);

    for(i = 0; i < N; i++){
        printf("%d ", b[i]);
    }

    return 0;
}

void selection_sort(int a[], int len){
    int i, j, sayitutucu;

    sayitutucu = a[len - 1];

    for(i = len - 1; i >= 0; i--){
        if(sayitutucu == a[i])
            continue;

        if(a[i] > sayitutucu){
            sayitutucu = a[i];
            j = i;
        }
    }

    a[j] = a[len - 1];
    a[len - 1] = sayitutucu;

    if(len == 0)
        return;

    selection_sort(a, len - 1);
}
 
Son düzenleme:
Hocam tam da aklımdan geçiyordu hızır gibi yetiştiniz elinize sağlık
 
Yapmaya çalıştığın şey belli. Ama yapmaya çalıştığın yol çok cins geldi bana. Direkt sıfırdan yazmanın daha rahat olacağı düşündüğüm için öyle yapacağım.

Anlamadığın bir yer olursa sor.

Kod:
void selection_sort(int a[], int len){
    int max = 0;
    int temp = 0;
    
    for(int i = 1; i < len; ++i)
        if(a[max] < a[i])
            max = i;
    
    temp = a[max];
    a[max] = a[len - 1];
    a[len - 1] = temp;
    
    if(len == 1)
        return;
        
    selection_sort(a, len - 1);
}
 
Recursive olarak çağırmak için fazladan parametrelere ihtiyacın var. Her seferinde sıfırdan başladan kaldığı yerden devam etmesi için kaçıncı indexe kadar gibi bir ara değeri parametre olarak göndermen lazım.
Ayrıca Recursive bir yapı olduğu için Stop Condition belirlemen gerek.
 
Muhtemelen kısır döngüye giriyor.
Denedim ve öyle değilmiş. Sanırım şu. Bak şimdi, sen tekrar çağırırken len - 1 ile çağırıyorsun ya. Diyelim ki çağırırken len'in değeri 2. Çağırdın, sorun yok. Eksildi ve 1 oldu. Çağırırken sıfır yaptın. Sonra adım adım gidelim.

Değişken tanımladın, değer atadın falan.
Döngü geldi. Döngüde i'ye len - 1 değerini atadı. len neydi? Sıfırdı. Sıfır - 1 kaç? -1. -1 >= 0 diyorsun. Oradan patlıyor olabilir. Oradan patlamasa a dediğin yerde patlıyordur.

Ben bu siteden C kodunu çalıştırıyorum ve site segmantation error veriyor.
 
Ben bu siteden C kodunu çalıştırıyorum ve site segmantation error veriyor.
Sorunu çözdüm. (Sadece "segmentation error". Doğru sonuç üretmiyor olabilir.)
j değeri for içerisindeki if'e düşene kadar tanımsız.
Bu yüzden a[j] çağrısında j tanımsızsa patlıyor.
C:
void selection_sort(int a[], int len){
    if(len == 0)
        return;
    int i, j = 0, sayitutucu;

    sayitutucu = a[len - 1];

    for(i = len - 1; i > 0; i--){
        if(sayitutucu == a[i])
            continue;
        if(a[i] > sayitutucu){
            sayitutucu = a[i];
            j = i;
        }
    }
    a[j] = a[len - 1];
    a[len - 1] = sayitutucu;

    selection_sort(a, len - 1);
}
 
Çözüm
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…