Çözüldü En büyük elemana sahip indis nasıl bulunur?

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

KOUsoftware

Hectopat
Katılım
1 Nisan 2020
Mesajlar
157
Yer
İstanbul
Daha fazla  
Cinsiyet
Erkek
Meslek
Öğrenci
C programlama için bir sayı dizisini sıralama algoritmasına atmadan (indislerdeki değer değişmeyecek) en büyük elemanın kaçıncı indiste olduğu nasıl bulunur?
 
Çözüm
O kullanım fenelde kafa karıştırıyor. Bu şekilde yapmanızı tavsiye ederim. Daha önce görmeme rağmen ben bile başta afalladım.

typedef şeklide tanımlanıp altında isim verilince tip olarak belirtmek için struct kelimesi kullanımı gerekmiyor.

Struct içi olduğu için array şeklinde veremezsiniz, modifiye etmeniz gerekir.
Şu tarz bir şeyler. Aklıma başka alternatif başta gelmedi, müsait olunca tekrar bakarım.

Kod:
#include <stdio.h>

#define N 5

typedef struct Liste {
    int uzunluk;
    char ad[15];
} Liste;

int findMax(int* arr, int size) {
    int max = 0; // INT_MIN
    int index = 0;
    
    for (int i = 0; i < size; ++i) {
        if (arr[i] > max) {
            max = arr[i];
            index = i;
        }
    }
    
    return index;
}

int findMaxListe(Liste* arr, int size) {
    int max = 0; // INT_MIN
    int index = 0;
    
    for (int i = 0; i < size; ++i) {
        if (arr[i].uzunluk > max) {
            max = arr[i].uzunluk;
            index = i;
        }
    }
    
    return index;
}

Liste k[N];

int main()
{
    k[0].uzunluk = 17;
    k[1].uzunluk = 20;
    k[2].uzunluk = 5;
    
    printf("%d", findMaxListe(k, N));

    return 0;
}

Karşılaştırma işi her türlü size kalıyor. Bu tarz, genel bir karşılaştırma yapabilirsiniz ancak. Bunun için de karşılaştırma fonksiyonu gerekir.
Ama bunda bile temel, minimum değer gerekir. Ayrı yapması çok daha rahat.

Bilmeyen için karışık olacağı için kod içinde de yorum kullandım. Yine de anlamadığınız kısımları sorabilirsiniz.
size_t aslında unsigned integer, boyut belirtme için kullanılır.
Kıyaslama fonksiyonu uzunluklarını kıyaslıyor. Eşit ise sıfır, ilki büyük ise sıfırdan büyük, ilki küçük ise sıfırdan küçük değer döndürüyor. Bu hali kalıp, isterseniz birkaç if ile daha uzun şekilde yazılabilir. O durumda sıfırdan büyük küçük için -1 ve 1 kullanılıyor. Ama çağıran fonksiyonlar sıfırdan büyük mü küçük mü eşit mi olduğuna bakar.

Kod:
#include <stdio.h>

#define N 5
#define M 15

typedef struct {
    int length;
    char name[M];
} List;

int compList(const void* elem1, const void* elem2) {
    return (((const List*)elem1)->length > ((const List*)elem2)->length) -
           (((const List*)elem1)->length < ((const List*)elem2)->length);
}

/**
 * @param arr the array
 * @param num size of the array
 * @param size size of each element of the array
 * @param comp comparison function
 */
size_t findMax(void* arr, size_t num, size_t size, int (*comp)(const void *, const void*)) {
    if (num <= 0) {
        return -1;
    }
    else if (num == 1) {
        return 0;
    }
    
    size_t index = 0;
    void* max = arr;
    void* curr = arr + size;
    
    for (size_t i = 1; i < num - 1; ++i, curr += size) {
        if (comp(curr, max) > 0) {
            max = curr;
            index = i;
        }
        
        //curr += size;
    }
    
    return index;
}

int main() {
    List arr[N] = {
        {17, "fghhh"},
        {20, "fdsf"},
        {5, "asds"},
        {1, "armut"},
        {6, "elma"},
    };
    
    //size_t %ld
    printf("%ld", findMax(arr, N, sizeof(List), compList));

    return 0;
}
Geze geze bakarsın. Amaç sadece maksimum indexi bulmak ve tek sefer yapmak ise sıralamak anlamsız.

Kod:
#include <stdio.h>

#define N 10

int findMax(int* arr, int size) {
    int max = 0; // INT_MIN
    int index = 0;
    
    for (int i = 0; i < size; ++i) {
        if (arr[i] > max) {
            max = arr[i];
            index = i;
        }
    }
    
    return index;
}

int main() {
    int arr[N] = {5, 10, 1, 2, 153, 2, -1, 5, 6, 9};
    printf("%d", findMax(arr, N));

    return 0;
}
 
Peki main'de göndereceğimiz dizi struct içindeki int değerleri tutuyorsa örnek:
C:
struct liste {


    int uzunluk;
    char ad[15];

    }k[5];

k[0].uzunluk dan k[4]. uzunluk a kadarki değerleri nasıl gönderebilirim?
 
O kullanım fenelde kafa karıştırıyor. Bu şekilde yapmanızı tavsiye ederim. Daha önce görmeme rağmen ben bile başta afalladım.

typedef şeklide tanımlanıp altında isim verilince tip olarak belirtmek için struct kelimesi kullanımı gerekmiyor.

Struct içi olduğu için array şeklinde veremezsiniz, modifiye etmeniz gerekir.
Şu tarz bir şeyler. Aklıma başka alternatif başta gelmedi, müsait olunca tekrar bakarım.

Kod:
#include <stdio.h>

#define N 5

typedef struct Liste {
    int uzunluk;
    char ad[15];
} Liste;

int findMax(int* arr, int size) {
    int max = 0; // INT_MIN
    int index = 0;
    
    for (int i = 0; i < size; ++i) {
        if (arr[i] > max) {
            max = arr[i];
            index = i;
        }
    }
    
    return index;
}

int findMaxListe(Liste* arr, int size) {
    int max = 0; // INT_MIN
    int index = 0;
    
    for (int i = 0; i < size; ++i) {
        if (arr[i].uzunluk > max) {
            max = arr[i].uzunluk;
            index = i;
        }
    }
    
    return index;
}

Liste k[N];

int main()
{
    k[0].uzunluk = 17;
    k[1].uzunluk = 20;
    k[2].uzunluk = 5;
    
    printf("%d", findMaxListe(k, N));

    return 0;
}

Karşılaştırma işi her türlü size kalıyor. Bu tarz, genel bir karşılaştırma yapabilirsiniz ancak. Bunun için de karşılaştırma fonksiyonu gerekir.
Ama bunda bile temel, minimum değer gerekir. Ayrı yapması çok daha rahat.

Bilmeyen için karışık olacağı için kod içinde de yorum kullandım. Yine de anlamadığınız kısımları sorabilirsiniz.
size_t aslında unsigned integer, boyut belirtme için kullanılır.
Kıyaslama fonksiyonu uzunluklarını kıyaslıyor. Eşit ise sıfır, ilki büyük ise sıfırdan büyük, ilki küçük ise sıfırdan küçük değer döndürüyor. Bu hali kalıp, isterseniz birkaç if ile daha uzun şekilde yazılabilir. O durumda sıfırdan büyük küçük için -1 ve 1 kullanılıyor. Ama çağıran fonksiyonlar sıfırdan büyük mü küçük mü eşit mi olduğuna bakar.

Kod:
#include <stdio.h>

#define N 5
#define M 15

typedef struct {
    int length;
    char name[M];
} List;

int compList(const void* elem1, const void* elem2) {
    return (((const List*)elem1)->length > ((const List*)elem2)->length) -
           (((const List*)elem1)->length < ((const List*)elem2)->length);
}

/**
 * @param arr the array
 * @param num size of the array
 * @param size size of each element of the array
 * @param comp comparison function
 */
size_t findMax(void* arr, size_t num, size_t size, int (*comp)(const void *, const void*)) {
    if (num <= 0) {
        return -1;
    }
    else if (num == 1) {
        return 0;
    }
    
    size_t index = 0;
    void* max = arr;
    void* curr = arr + size;
    
    for (size_t i = 1; i < num - 1; ++i, curr += size) {
        if (comp(curr, max) > 0) {
            max = curr;
            index = i;
        }
        
        //curr += size;
    }
    
    return index;
}

int main() {
    List arr[N] = {
        {17, "fghhh"},
        {20, "fdsf"},
        {5, "asds"},
        {1, "armut"},
        {6, "elma"},
    };
    
    //size_t %ld
    printf("%ld", findMax(arr, N, sizeof(List), compList));

    return 0;
}
 
Son düzenleme:
Çözüm

Yeni konular

Geri
Yukarı