Dosya İçerisindeki Sayılardan En Çok Tekrar Edenleri Bulma (Dosya İşlemi)
Dosya içerisinde bulunan ve formatı belli sayılar arasında en çok tekrar edenleri bulup ekrana yazdıran c program kodu.
Dosya ile verilmiş sayılar arasında her satırın sonundaki sayılarda en çok tekrar edenleri ekrana yazdıran c kodu.
Sorunun orjinali için tıklayınız…
NOT: Her satır bitiminde sayede sayı olması gerekli. Boşluk ile bitemez. Ayrıca program kodunun yanında dosya.txt bulunması gerekli!
C Program Kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ //Dosyadan veriler okunur FILE *file = fopen("dosya.txt", "r"); // Dosyayı okuma modunda açar!!! (r = read) char dizi[100]; //Dosyadaki verileri almak için char kaydet[50][100]; //Alınan verileri saklamak için int x=0, indis=0; //Toplam satır sayısı int sayilar[50][1]; //Dosyadan alınan verilerin her satırdaki son sayılar bu diziye atılacak! while(!feof(file)){ fgets(dizi, 100, (FILE*)file); //Dosyadan Satır satır verileri alır ve dizi'ye kaydeder strcpy(kaydet[x], dizi); //dizideki elemanı kaydet isimli dizinin x'inci indisine kaydeder. (0 dan toplam satıra kadar) x++; // indis 1 artar } for(int i=0; i<x; i++){ // her satırdaki son sayıları alma işlemi int veri = 0; //indis için kullanılacak // Satırda kaç karakter olduğunu bulur! while(kaydet[i][veri] != '\n' && (kaydet[i][veri] <= 57 && kaydet[i][veri] >= 48 || kaydet[i][veri] == ' ')){ veri++; } int sayi=0, basamak=1; int j=veri-1; while(kaydet[i][j] != ' ' && veri != 0 ){ if(kaydet[i][j] <= 57 && kaydet[i][j] >= 48){ sayi += basamak * (kaydet[i][j] - '0'); basamak *= 10; j--; } } // Dosyadaki her satırın son basamağı sayilar dizisine kayıt edilir if(veri != 0 && 1==1){ sayilar[indis][1] = sayi; indis++; // kaç tane kayıt edildiği bu değişken ile tutuluyor } } int sayac; // her sayıdan kaç tane olduğunu sayac ile bulunur int tekrarAdet = 1; // Maksimum tekrar bu değişkene atanılır // En fazla tekrar eden sayı adeti bulunur for(int i=0; i<indis; i++){ sayac = 0; for(int j=i; j<indis; j++){ if(sayilar[i][1] == sayilar[j][1]) sayac++; } if(sayac > tekrarAdet) tekrarAdet = sayac; } //Sayı adeti bulunmuştur.... //En fazla tekrar eden sayı adetine sahip tüm sayılar ekrana yazdırılır for(int i=0; i<indis; i++){ sayac = 0; for(int j=i; j<indis; j++){ if(sayilar[i][1] == sayilar[j][1]) sayac++; } if(sayac == tekrarAdet) printf("%d adet %d\n", tekrarAdet, sayilar[i][1]); } fclose(file); // Dosya kapatılır printf("\n"); system("pause"); return 0; } |
dosya.txt içeriği:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
0 37 0 0 0 55 1 3 1 61 2 5 1 67 3 5 1 90 3 5 2 45 0 5 2 75 2 7 3 01 1 5 3 12 3 10 4 15 0 0 4 21 0 1 5 17 2 7 |
Yorumlar ( 5 )
Çok teşekkür ederim. Emeginize sağlık.
Bu kod struct yapısına da uyarlanabilir mi? yani dosya içerisinden alacağım birtakım sayının kullanımı için struct ve dizi yapısı kullansam sorun olur mu? Structure olayına uyarlamaya çalışınca kafam karıştı da . Aynı verileri dizi şeklinde olmayan başka bir yapı için de kullanmam gerekiyor
Struct kullanırkende dizi kullanmak şart. Dizi dışında pointerlar ile yapılabilir. Bağlı liste ile kullanabilirsiniz.
Dizi şeklinde deneyince oldu evet teşekkür ederim. Ben de çok soruyorum kusura bakmayın lütfen.Sondaki her sayının başka bir dosyada bir isme karşılık geldiğini düşünürsek yazdırma işlemini elimdeki bu kod ile yapabilmem mümkün mü peki ? burada en çok tekrar eden sayıyı bulmuştuk. başka bir aşama olarak da tekrar edilen sayıların tekrar etme sayılarına göre sıralayabilmem gerekiyor. Bu konular için de en azından fikir şeklinde yardımcı olursanız sevinirim. Teşekkürler.
Sondaki sayı başka bir dosyayı ifade ediyorsa onun için ayrı bir fonksiyon yazmak lazım. Önceki sondaki sayıyı alalım mesela. 3 olsun. 3.txt yi ekrana yazdıracağız. değişkene .txt eklemesi yaparak (dizide) bu değişkeni ekrana yaz fonksiyonuna göndererek o dosyayı okutabilirsin.
Tekrar etme sayılarını ise elindeki sayı ve tekrar sayısını çift boyutlu bir diziye atabilirsin. Daha sonra tekrar sırasına göre ekrana yazdırabilirsin. Bu yazdırma işlemi iç içe 2 for ile olacak. Daha sonra en büyük tekrar sayısını bulup o sayıdaki elemanları ekrana yazdırabilirsin. Daha sonra yazdırdığın eleman sayılarını -1 yaparak sıra ile yazdırma işlemi yapabilirsin.