[Çözüldü] Bir Dizi İçerisindeki Elemanlarından Kaç Öğrenmek

Başlatan oguyes, 31 Aralık 2015 - 20:19:53

« önceki - sonraki »

0 Üyeler ve 3 Ziyaretçi konuyu incelemekte.

oguyes

Merhaba,

Daha önceden programda belirlenmiş bir dizinin içindeki elemanlarından kaç tane olduğunu öğrenmeyi sağlayan C programını yazmaya çalışıyorum. Kaç tane olduklarını öğrenmeyi başardım ancak program çıktısında bir sayıdan kaç tane olduğuna dair bilgiyi birden fazla kez görüyorum. Bu sorunu nasıl çözerim.

Program Çıktısı :


Kod :

#include<stdio.h>
#include<conio.h>

int main()
{
int i, j, x;
int a[8] = { 5,8,10,3,8,5,10,3 };
printf("dizi =\t");
for (i = 0; i <= 7; i++)
{
printf("%d\t", a[i]);
}
int h = 0; //Hafıza değişkeni ata.
for (i = 0; i <= 7; i++) { //Adet kontrol döngüsü
for (j = 0; j <= 7; j++) {
if (a[i] == a[j]) //İki dizi elemanı eşit mi?
{
h++; //Eşitse hafızayı 1 arttır.
}
if (j == 7) { //Dizi kontorlü tamamlandı mı?
printf("\n%d 'den %d tane var.", a[i], h); //Tamamlanmışsa adeti yazdır ve hafızayı sıfırlama.
h = 0;
}
}
}
_getch();
}

Sh4oTT

1. for daki donguyu 4 defa dondererek 2. defa aynı rakamları kontrol etmezsen 2 defa yazdırmaz soyle

#include<stdio.h>


int main()
{
int i, j, x;
int a[8] = { 5,8,10,3,8,5,10,3 };
printf("dizi =\t");
for (i = 0; i <= 7; i++)
{
printf("%d\t", a[i]);
}
int h = 0; //Hafıza değişkeni ata.
for (i = 0; i <= 3; i++) { //Adet kontrol döngüsü
for (j = 0; j <= 7; j++) {
if (a[i] == a[j]) //İki dizi elemanı eşit mi?
{
h++; //Eşitse hafızayı 1 arttır.
}
if (j == 7) { //Dizi kontorlü tamamlandı mı?
printf("\n%d 'den %d tane var.", a[i], h); //Tamamlanmışsa adeti yazdır ve hafızayı sıfırlama.
h = 0;
}
}
}

}

oguyes

@ShaoDownLiNuP ancak dizi değiştirildiği zaman sıkıntı çıkabiliyor. Örneğin bir sayı 3 kez yazıldığı zaman program yanlış çalışıyor.

Sh4oTT

#3
Haklısın bende onu dusunuyordum bende soyle bırsey yaptım bende de tekrar tekrar yazıyor :) :)

#include <stdio.h>




int main () {


int dizi[]={14,15,16,2,4,2,15,21,24,3,2,41,5,23,12,31,2,3,4,21,23,1,2,42,1,32,12,12,3,32,43,34,3,12,23,33};
int sayac[1024];
int i=0;


for ( i=0; i<36; i++) {

sayac[dizi[i]]++;

}

for ( i=0; i<36; i++) {


   
         
               
    printf("%d den %d kadar var\n", dizi[i], sayac[dizi[i]]);
           

         




}

}


tlg

Bir boş dizi daha oluşturup, kontrol edilenleri oraya ekleyebilirsin. Diyelim sırayla başladın kaç tane olduğunu kontrol etmeye, ikinci "10" elemanına geldiği zaman az önce oluşturduğumuz diziye bakıp birinci "10" elemanını görüp pas geçecek. Kısaca ikinci bir kontrol mekanizması.

oguyes

@tlg biraz uğraştım ama yapamadım. tam olarak nasıl yapacağım.

tlg

#include<stdio.h>
#include<conio.h>

int main()
{
int i, j, k;
int a[8] = { 5,8,10,3,8,5,10,3 };
int control_list[8];

printf("dizi =\t");

for (i = 0; i <= 7; i++)
{
printf("%d\t", a[i]);
}

int h = 0; //Hafıza değişkeni ata.
for (i = 0; i <= 7; i++) { //Adet kontrol döngüsü
for (k = 0; k <= 7; k++) // Aynı sayıdan varsa döngüden çık
{
if (a[i] == control_list[k])
{
break;
}
}
for (j = 0; j <= 7; j++) {
if (a[i] == a[j]) //İki dizi elemanı eşit mi?
{
h++; //Eşitse hafızayı 1 arttır.
}
if (j == 7) //Dizi kontrolü tamamlandı mı?
{
printf("\n%d 'den %d tane var.", a[i], h); //Tamamlanmışsa adeti yazdır ve hafızayı sıfırlama.
control_list[i] = a[i];
h = 0;
}


Şöyle bir şey ama oradaki "break" üstteki for döngüsünü de kırıyorsa işe yarar. C++ ile ilgili bir bilgim yok ama sana biraz fikir verir umarım.

Sh4oTT

#7
Ben boyle cozdum sen de yazdırdıgın yerı 0 layıp 0 a esıt olmayanları yazdırırsan aynılarını yazdırmaz:

#include <stdio.h>




int main () {


int dizi[]={14,15,16,2,4,2,15,21,24,3,2,41,5,23,12,31,2,3,4,21,23,1,2,42,1,32,12,12,3,32,43,34,3,12,23,33};
int sayac[1024];
int i=0;


for ( i=0; i<36; i++) {

sayac[dizi[i]]++;

}

for ( i=0; i<36; i++) {


   
       if ( sayac[dizi[i]]!=0 ) { 
               
    printf("%d den %d tane var\n", dizi[i], sayac[dizi[i]]);
   
    sayac[dizi[i]]=0;
   
   
    }
         




}

}



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 01 Ocak 2016 - 13:11:53

Soyle yapabılırsın:

#include<stdio.h>


int main()
{
    int i, j, x;
    int a[8] = { 5,8,10,3,8,5,10,3 };
    printf("dizi =\t");
    for (i = 0; i <= 7; i++)
        {
            printf("%d\t", a[i]);
        }
    int h = 0; //Hafıza değişkeni ata.
    for (i = 0; i <= 7; i++) { //Adet kontrol döngüsü
        for (j = 0; j <= 7; j++) {
                if (a[i] == a[j]) //İki dizi elemanı eşit mi?
                {
                    h++; //Eşitse hafızayı 1 arttır.
                   
                        if ( h!=1 ) a[i]=-1;
                }
                if (j == 7) { //Dizi kontorlü tamamlandı mı?               
                    if ( a[i]!=-1) {
                   
                    printf("\n%d 'den %d tane var.", a[i], h); //Tamamlanmışsa adeti yazdır ve hafızayı sıfırlama.
                   
                    }
                    h = 0;
                   
                   
                }
        }
    }

}



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 01 Ocak 2016 - 13:21:02

Yukarda ki kodda yanlıslık yapmısım soyle yaparsak tam dogru sonuc verecektır:


#include<stdio.h>


int main()
{
    int i, j, x;
    int a[8] = { 5,8,10,3,8,5,10,3 };
    printf("dizi =\t");
    for (i = 0; i <= 7; i++)
        {
            printf("%d\t", a[i]);
        }
    int h = 0; //Hafıza değişkeni ata.
    for (i = 0; i <= 7; i++) { //Adet kontrol döngüsü
        for (j = 0; j <= 7; j++) {
                if (a[i] == a[j]) //İki dizi elemanı eşit mi?
                {
                    h++; //Eşitse hafızayı 1 arttır.
                    
                        if ( h > 1 ) a[j]=-1;
                }
                if (j == 7) { //Dizi kontorlü tamamlandı mı?                
                    if ( a[i]!=-1) {
                    
                    printf("\n%d 'den %d tane var.", a[i], h); //Tamamlanmışsa adeti yazdır ve hafızayı sıfırlama.
                
                    }
                    
                    h = 0;
                    
                }
                
        }
    }

}

ShangriLa

ShaoDownLiNuP fena degil.

Ben soyle yaptim biraz daha okunabilir:


#include <stdio.h>

int main(int argc, char *argv[]) {

    int i, j, goster, adet;
    const int dizi[] =  { 6, 1, 5, 6, 7, 4, 1, 1, 5, 6 };
    const int len = sizeof(dizi) / sizeof(dizi[0]);

    for (i = 0; i < len; ++i) {
       
        goster = 1;

        // daha once var olan elemani gosterdiysek
        // bir daha hesaplayip gostermeye gerek yok
        for (j = 0; j < i; ++j) {
            if (dizi[i] == dizi[j]) {
                goster = 0;
                break;
            }
        }

        if (!goster)
            continue;

        adet = 1;
        /* dizi[i] elemanindan kac tane oldugunu bul */
        for (j = i + 1; j < len; ++j)
            if (dizi[i] == dizi[j])
                ++adet;

        printf("%d elemani %d tane var\n", dizi[i], adet);
    }

    return 0;
}
Ubuntu Mate Trusty

oguyes

Çok teşekkür ederim. @ShangriLa ve @ShaoDownLiNuP yazdığınız programlar çalıştı. Ancak okulda öğretilen seviyeye göre @ShaoDownLiNuP'un yazdığı programı kullanmam benim için daha iyi olacaktır.

Saygılarımla,

tlg