/*Girilen sayıya kadar olan asalları listeleyen rekürsif bir algoritma yazınız.*/ #include <stdio.h> #include <conio.h> int asallik(int n, int i){ if (n==i) return 1; if (n%i==0) return 0; i++; return asallik(n,i); } void main(){ int m,k; printf("HANGI SAYIYA KADAR OLAN ASALLAR LISTELENSIN ? : \n"); scanf("%d",&m); for (int j=2;j<=m;j=j+1) { k=asallik(j,2); if (k==1) printf ("%d\n",j); } } /*Belirsiz sayıda girilen her tamsayı ikilisi için sırayla birinci sayının karesini, ikinci sayının karesini, birinci sayının kübünü, ikinci sayının kübünü, sayıların çarpımlarını ve büyük olanı ekrana yazdıran bir program yazınız. Bunları makro fonksiyonlar yardımıyla yapınız. */ #include <stdio.h> #include <conio.h> #define karesi(a) ((a)*(a)); #define kup(a) (a*a*a) #define carpma(a,b) (a*b); #define buyukolan(a,b) (a>b ? a:b); #define devam() (printf("devam etmek istiyor musunuz? e-h\n")); void main(){ int a,b,kare_a,kare_b,kup_a,kup_b,carpim,buyuk; char c; bas: printf ("Sayilari Giriniz:\n"); scanf ("%d %d", &a,&b); kare_a=karesi(a); kare_b=karesi(b); kup_a=kup(a); kup_b=kup(b); printf("Sayilarin Kareleri : %d , %d\n", kare_a,kare_b); printf("Sayilarin Kupleri : %d , %d\n", kup_a,kup_b); carpim=carpma(a,b); printf("Sayilarin Carpimi : %d \n",carpim); buyuk=buyukolan(a,b); printf("Buyuk olan sayi : %d\n", buyuk); devam(); c=getch(); if (c=='e') goto bas; } Aynı Fonksiyona Farklı Sayıda Veri Aktarımı Bir fonksiyona aktarılacak verilerin kaç tane olacağı fonksiyon tanımlanırken belirlenir. Ancak bir fonksiyona her çalıştırılışında farklı sayıda veri aktarmak olasıdır. Örneğin toplam adı ile tanımlanmış bir fonksiyonu tanımladıktan sonra bu fonksiyona bir çalıştırılışında 5 veriyi, bir başka çalıştırılışında ise 8 veriyi aktarıp işlem yaptırabiliriz. Bunun için stdarg.h başlık dosyası ile kullanacağımız 3 adet fonksiyona gereksinimimiz vardır ve bu tip bir fonksiyon aşağıdaki gibi tanımlanabilir. Fonksiyon tipi fonksiyon adı(tip isimli parametresi, ...) { ... va_list ai; ... va_start(ai,isimli parametresi); ... va_arg(ai,isimsiz parametreler tipi); ... va_end(ai); ... } Burada gelen parametrelerden birincisine bir isim verilip diğerleri için ... konulur. Bunun anlamı diğer parametrelerin isimsiz olduğunu belirtir. Verilerin hepsi bellekte peşpeşe bulunur ve arguman işaretçisi (ai) isimli parametreyi belirtir. Gerekli olan fonksiyonlar: va_start(): Genel kullanımı void va_start(va_list ai,isimli arguman); şeklindedir. Arguman işaretçisini (ai) gelen verilerden isimsiz olanların ilki üzerine konumlandırır. Önce bu fonksiyon kullanılmalıdır. va_arg() Genel kullanımı arguman tipi va_arg(valist ai, arguman tipi); şeklindedir. (ai) gelen verilerden ilki üzerine konumlanmış ise bu fonksiyon her çağırılışında belirtilen tipte bir sonraki veriyi gönderir. va_end() Genel kullanımı void va_end(va_list ai); şeklindedir. Fonksiyona gelen isimsiz veriler va_arg() fonksiyonu ile alınmışşa fonksiyondan çıkmadan önce bu fonksiyon kullanılmalıdır. ÖRNEK: Aynı fonksiyon hem 6 sayının ortalamasını bulmak için hem de 3 sayının ortalamasını bulmak için kullanılmıştır. #include<stdio.h> #include<stdarg.h> #include<conio.h> float ortalama(const int tane,...){ va_list veriler; int veri1,i,toplam=0; float ort1; va_start(veriler,tane); for (i=0;i<tane;i++){ veri1=va_arg(veriler,int); toplam+=veri1; } va_end(veriler); ort1=(float)toplam/tane; return ort1; } void main(){ float ort; ort=ortalama(6,23,31,24,30,48,62); printf("6 sayinin ortalamasi=%f\n",ort); ort=ortalama(3,10,20,30); printf("3 sayinin ortalamasi=%f\n",ort); getch(); }
© Copyright 2024 Paperzz