Çö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:
İ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);
}
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);
}
 
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
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı