Asp.Net Mvc’de Excele Aktarma

Controllerımın içerisine ExportToExcel adında bir method oluşturuyorum.Bu method Employee Listesini excele aktaracak.

  public void ExportToExcel()
        {
            DataTable dtEmployees = new DataTable();
            dtEmployees.Columns.AddRange(new DataColumn[4] {
                        new DataColumn("EmployeeID"),
                        new DataColumn("EmployeeName"),
                        new DataColumn("Cinsiyet"),
                        new DataColumn("Doğum Tarihi"), 
            
            });

            var employees = new EmployeeBLL().TumunuGetir();

            foreach (var employee in employees)
            {
                dtEmployees.Rows.Add(employee.EmployeeID.ToString(), employee.Name, employee.Gender, employee.DateOfBirth.Value);
            }
          

            string filename = "employeeList";
            var grid = new GridView();
            grid.DataSource = dtEmployees;
            grid.DataBind();

            Response.ClearContent();
            Response.Charset = "utf-8";
            Response.AddHeader("content-disposition", "attachment; filename=" + filename + ".xls");

            Response.ContentType = "application/vnd.ms-excel";
            StringWriter sw = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);

            grid.RenderControl(htw);

            Response.Write(sw.ToString());
            Response.End();
        }

Index Viewimde aşağıdaki scriptleri yazarak Excele Aktarma İşlemini çağırmış olabileceğiz.

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<script type="text/javascript" src="~/Scripts/jquery-1.10.2.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $("#export").click(function () {
            Export();
        });
    });
    function Export()
    {
        var url = '@Url.Action("ExportToExcel")';
        window.open(url);
    }
</script>

<a href="#" id="export">Export to Excel</a>

#asp-net, #excel, #export, #mvc

ASP.NET MVC’ de Grid Mvc Kullanımı

Asp.Net MVC’de verilerimizi grid halinde ve sayfalı halde listelemek için Grid MVC’i kullanabiliriz.Grid Mvc’i kullanmak için Manage Nuget Packages kısmından GridMvc ve Bootstrap Css bileşenlerini yükleyelim.Bunları yüklediğimizde Content dizini altında gerekli css dosyaları ,Scripts dizini altında gerekli javascript dosyaları oluşacaktır.

Daha sonra web.config dosyamızda aşağıdaki kodlar yoksa web.config dosyasına yazalım:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

GridMvc’i kullanmadan önce Modelimizi oluşturalım.Adı EmployeeModels olsun.Bu modeli şu şekilde tanımlayalım:

public class EmployeeModels
    {
        public int EmployeeID { get; set; }

        public string Name { get; set; }

        public string Gender { get; set; }

        public string City { get; set; }

        public int DepartmentID { get; set; }

        public DateTime? DateOfBirth { get; set; }

        public List<SelectListItem> Departments { get; set; }
    }

Daha sonra EmployeeGrid adında controller oluşturuyorum ve Index actionunu şu şekilde yazıyorum:

 public ActionResult Index()
        {
            var employeeBll = new EmployeeBLL();
            List<SelectListItem> departments=new List<SelectListItem>();
            new DepartmentBLL().TumunuGetir().ForEach(s=>departments.Add(new SelectListItem
            {
                Text = s.Name,
                Value = s.ID.ToString()
            }));
            var employeeList = employeeBll.TumunuGetir().Select(s => new EmployeeModels
            {
                Name = s.Name,
                City = s.City,
                Gender = s.Gender,
                EmployeeID = s.EmployeeID,
                DateOfBirth = s.DateOfBirth.Value,
                DepartmentID = s.DepartmantID,
                Departments = departments
            });

            return View(employeeList);
        }

Index Viewini oluşturduktan sonra önce Modelimizi IEnumerable cinsinden çağırıyorum.Gerekli css ve js kütüphanelerini de çağırdıktan sonra Html.Grid helper methoduyla listeleme ve sayfalamayı yapıyorum:

@using GridMvc.Html
@model IEnumerable<Mvc4Application1.Models.EmployeeModels>
@{
    ViewBag.Title = "Index";
}

<link href="@Url.Content("~/Content/Gridmvc.css")" rel="stylesheet"/>

<link href="@Url.Content("~/Content/bootstrap.min.css")" rel="stylesheet" />

<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.10.2.min.js")"></script>

<script type="text/javascript" src="@Url.Content("~/Scripts/gridmvc.js")"></script>

<h2>Index</h2>

@Html.Grid(Model).Columns(columns =>
{
    columns.Add(m => m.EmployeeID, true);
    columns.Add(m => m.Name).Filterable(true).Titled("Adı ve Soyadı").Sortable(true);
    columns.Add(m => m.Gender);
    columns.Add(m => m.DateOfBirth).Format("{0:dd/MM/yyyy}");
    columns.Add(m => m.City);
    columns.Add(m => m.Departments.FirstOrDefault(s => s.Value == m.DepartmentID.ToString()).Text);
}).WithPaging(2)

columns.Add(m => m.EmployeeID, true); —–>İkinci paremetreyi true yapınca bu kolonu gizlemiş oluruz.

columns.Add(m => m.Name).Titled(“Adı ve Soyadı”).Filterable(true).Sortable(true); —–> Bu kolonu Filterable özelliği ile filtreleme işleminin uygulanabilir olduğunu belirttik.Titled özelliği ile Başlık Metnini belirledik.Sortable özelliği ile de sıralanabilir olduğunu belirttik.

columns.Add(m => m.DateOfBirth).Format(“{0:dd/MM/yyyy}”); —–>Tarih kolonunu formatlı halde gösterdik.

columns.Add(m => m.Departments.FirstOrDefault(s => s.Value == m.DepartmentID.ToString()).Text); Bu kolonda model ile gelen listeden gerekli departmant adını seçip gösteriyoruz.

WithPaging(2) ile her sayfada 2 item olacağını belirttik.

gridmvc

Eğer otomatik olarak sütunları belirtmeden listeleme yapmak istiyorsak AutoGenerateColumns() methodunu kullanmamız gerekecektir.

@Html.Grid(Model).AutoGenerateColumns().WithPaging(2)

#asp-net, #autogeneratecolumns, #bootstrap, #css, #datagrid, #filterable, #format, #gridmvc, #ienumerable, #jquery-2, #list, #manage, #mvc, #nuget, #package, #pager, #paging, #sortable, #withpaging

C Programlama Dilinde While,Do While,For Döngüleri,Break ve Continue Kavramları

Program yazarken kullanacağımız önemli konulardan biri de döngülerdir.Bir listenin veya dizinin elemanlarını kontrol ederken veya işlem yaparken döngülerden faydalanırız.

While Döngüsü

while( koşul ) {
	komut(lar)
}

Koşul sağlandığı sürece blok içerisindeki kod sürekli çalıştırılır.

Örneğin ,ekrana 10 kere “Hello World” yazalım:

#include<stdio.h>
int main( void )
{
	int i = 1;
	while( i <= 10 ) {
		printf("%d: Hello World\n",i);
                i++;
	}
	return 0;
}

Yukarıdaki kodda i’e ilk değerini verdik.Eğer ilk değeri vermeyip artırmaya çalışırsak hata alırız.Çünkü program hangi sayıyı artıracağını bilmez.Yazdığımız i++ işlemi i’yi bir artırır.Yukarıdaki kodu şu şekilde değiştirsek de sonuç aynı olacaktır.

#include<stdio.h>
int main( void )
{	
	int i = 0;
	while( i++ < 10 ) {		
		printf("%d: Hello World\n",i);
	}
	return 0;
}

Örneğin ,1’den kullanıcının gireceği sayı değerine kadar olan sayıların toplamını bulalım:

#include<stdio.h>
int main( void )
{
	int sayi;
	scanf("%d",&sayi);
	printf("Girdiginiz sayi :%d\n",sayi);
	int toplamDeger=0;
	int counter=1;
	
	while(counter<=sayi)
	{
		toplamDeger+=counter;
		counter++;		
	}
	
	printf("1'den %d'e kadar olan sayilarin toplami :%d",sayi,toplamDeger);
	
}

do while Döngüsü

Göreceğimiz ikinci döngü çeşidi, do while döngüsüdür. Yaptığı iş, while ile hemen hemen aynıdır; verilen işi, döngü koşulu bozulana kadar sürdürür. Ancak while’a göre önemli bir farkı vardır.

while döngülerinde, döngü içersindeki işlem yapılmadan önce, sunulan koşul kontrol edilir. Şayet koşul sağlanmıyorsa, o while döngüsünün hiç çalışmama ihtimali de bulunmaktadır. do while döngülerindeyse, durum böyle değildir. İlk çalışmada koşul kontrolü yapılmaz. Dolayısıyla, her ne şartta olursa olsun, döngünüz -en azından bir kere- çalışacaktır.

do {
	komut(lar)
} while( koşul );
#include<stdio.h>
int main( void )
{
	int i = 0;
	do {
		//Önce i'nin değeri arttırılıyor
		//sonra ekrana Merhaba Dünya yazdırılıyor.
		printf("%d: Hello World\n",++i);
	} while( i < 10 );
	return 0;
}
#include<stdio.h>
int main( void )
{
	int sayi;
	scanf("%d",&sayi);
	printf("Girdiginiz sayi :%d\n",sayi);
	int toplamDeger=0;
	int counter=1;
	
	do
	{
		toplamDeger+=counter;
		counter++;		
	}
	while(counter<=sayi);
	printf("1'den %d'e kadar olan sayilarin toplami :%d",sayi,toplamDeger);
	
}

for Döngüsü

For yapısı, yenilemeli-tekrarlamalı (İngilizce iterative) yapılarda kullanıma daha uygundur.

for( ilk_deger_atama; koşul; arttırma/azaltma ){
	komut(lar)
}
#include<stdio.h>
int main( void )
{
	int i;
	for( i = 0 ; i < 10; i++ ) {
		printf("%d: Hello World\n",(i+1));
	}
	return 0;
}

Gördüğünüz gibi çok daha sade ve açık gözükür bir kod oldu. for altında tek satır komut olduğundan, küme parantezleri koymamız opsiyoneldi ama ne yaptığınızı karıştırmamak için, her zaman koymanızı öneririm.

for döngüleriyle ilgili bazı özel durumlarda vardır. for döngüsü içersine yazdığınız ilk değer atama, kontrol ve arttırma işlemlerini tanımlama esnasında yapmanız gerekmez. Aşağıda verilen kod, yukardakiyle tamamen aynı işi yapar. Farkı, i’nin daha önce tanımlanmış olması ve arttırma/azaltma işinin döngü içinde yapılmasıdır.

#include<stdio.h>
int main( void )
{
	int i;
	i = 0;
	for( ; i < 10; ) {
		printf("%d: Hello World\n",(i+1));
		i = i + 1;
	}
	return 0;
}

Break Komutu

Döngüleri aniden sonlandırmak için kullanılır:

/*
0 ile 99 arasında tesadüfi sayılar üreten 
bir programın, kaçıncı seferde 61 sayısını
bulacağını yazan program aşağıdadır.
*/
#include<stdio.h>
int main( void )
{
	int i,tesadufi_sayi;
	int deneme_sayisi = 0;
	//while içinde 1 olduğundan sonsuza kadar döngü çalışır.
	while( 1 ){
		//tesadufi_sayi değişkenine, 0 ile 99 arasında 
		//her seferinde farklı bir sayı atanır.
		//rand( ) fonksiyonu tesadüfi sayı atamaya yarar.
		//mod 100 işlemiyse, atanacak sayının 0 ile 99
		//arasında olmasını garantiler.
		tesadufi_sayi = rand() % 100;
		//Döngünün kaç defa çalıştığını deneme_sayisi
		//değişkeniyle buluruz.
		deneme_sayisi++;
		//Eğer tesadufi sayı 61'e eşit olursa, 
		//döngü kırılıp, sonlandırılır.
		if( tesadufi_sayi == 61 ) break;
	}
	printf("Toplam deneme sayısı: %d\n",deneme_sayisi);
	return 0;
}	

Continue Komutu

Bunun dışında işlem yapmadan döngüyü devam ettirmek gibi durumlara da ihtiyacımız vardır. Bunun içinde continue ( Türkçe: devam ) komutunu kullanırız.

/*
Sadece tek sayıları yazdıran bir
program
*/
#include<stdio.h>
int main( void )
{
	int i;
	for( i = 0; i < 10; i++ ) {
		//i değişkeninin 2'ye göre modu
		//0 sonucunu veriyorsa, bu onun 
		//bir çift sayı olduğunu gösterir.
		//Bu durumda ekrana yazdırılmaması 
		//için döngü bir sonraki adıma geçer.
		if( i%2 == 0 ) continue;
		printf("%2d\n",i);
	}
	return 0;
}	

0 ile 10 arasındaki tek sayıları gösteren program örneğini yukarda görebilirsiniz. Elbette ki bu işi daha farklı ve daha iyi yapan bir program yazabilirdik. Ama şimdilik continue komutunun nasıl kullanıldığını inceleyelim.

Program bir for döngüsü çalıştırmaktadır. Her defasında i değişkenin 2’ye göre modu alınır. Eğer sonuç 0’sa, bu sayının çift olduğunu gösterir. Dolayısıyla, bunun ekrana yazdırılmaması gerekir. Bu yüzden, döngü içersindeki işlemleri sürdürmek yerine, altta kalan kodları atlarız. Burada continue komutu kullanılır ve kullanıldığı noktadan itibaren olan işlemler yapılmaz. Döngü başa döner, aynı işlemleri yapar. Bu sefer i tek sayı olacağından continue komutu çalışmaz ve sayıyı ekrana bastırırız.

#break, #continue, #do-while, #for, #while

C Programlama Dilinde Nested If,Switch Case,Increment-Decrement,Advanced Assignment,Conditional Operator Kullanımı


Nested If

Nested if’ler art arda gelen ifler anlamına gelmektedir.

#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lutfen bir sayi giriniz: ");
	scanf("%d",&sayi);
	if( sayi < 20 ) printf("Sayı 20'den kucuk'.\n"); if( sayi >= 20 && sayi <= 30 ) printf("Sayi 20 ile 30 arasindadir!\n"); if( sayi > 30  )
		printf("Sayi 30'dan buyuktur'!\n");
	return 0;
}

Art arda koşullar belirterek nested if kullandık.Yukarıdaki kodu daha efektif şekilde yazmak için if-else yapısını kullanırsak:

#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lutfen bir sayi giriniz: ");
	scanf("%d",&sayi);
	if( sayi < 20 ) printf("Sayı 20'den kucuk'.\n"); else { if( sayi >= 20 && sayi <= 30 ) printf("Sayi 20 ile 30 arasindadir!\n"); else if( sayi > 30  )
		        printf("Sayi 30'dan buyuktur'!\n");
	 }
	

	return 0;
}

if else if Yapısı

Yukarıda yazdığımız kodları if else if yapısıyla yazarsak eğer:

#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lutfen bir sayi giriniz: ");
	scanf("%d",&sayi);
	if( sayi < 20 ) printf("Sayi 20'den kucuk'.\n"); else if( sayi >= 20 && sayi <= 30 ) printf("Sayi 20 ile 30 arasindadir!\n"); else if( sayi > 30  )
		 printf("Sayi 30'dan buyuktur'!\n");
	return 0;
}

Görüldüğü üzere ilk if ‘den sonra istenilen koşulları else if yapısıyla karşıladık.

switch case yapısı

switch case ,if else if yapısının bir benzeridir.Yalnız switch case de,bir aralık değeri girilmez,ifadelerin eşit olup olmadığı kontrolü yapılmaz.Ve içerisinde case ifadelerinin her birini kontrol eder.


          switch( degisken ) {
                    case sabit1:komut(lar)
                                [break]
                    case sabit2:komut(lar)
                                [break]
                    .
                    .
                    .
                    case sabitN:komut(lar)
                    [break]
                    default:komut(lar);
                             }

Örneğin,Bir not değerlendirme sistemi olsun. 100 – 90 arası A, 89 – 80 arası B, 79 – 70 arası C, 69 – 60 arası D, 59 ve altıysa F olsun. Eğer 100’den büyük veya negatif bir sayı girilirse, o zaman program hatalı giriş uyarısı versin.

#include<stdio.h>
int main( void )
{
	int not;
	printf("Lutfen notunuzu giriniz! > ");
	scanf("%d",&not);
	switch( not / 10 ) {
		case 10: 
		case 9: printf("NOT: A\n"); break;
		case 8: printf("NOT: B\n"); break;
		case 7: printf("NOT: C\n"); break;
		case 6: printf("NOT: D\n"); break;
		case 5:
		case 4:
		case 3:
		case 2: 
		case 1:
		case 0: printf("NOT: F\n"); break;
		default:
			printf("HATA: Bilinmeyen bir deger girdiniz!\n");
	}
	
	return 0;
}

Algoritmaya bakalım: Önce sayıyı alıyor ve 10’a bölüyoruz. Yani girilen not, 57 ise 5.7 sonucunu elde ediyoruz. Ancak iki tam sayının sonucu bir virgüllü sayı veremez, tıpkı işleme giren değişkenler gibi tam sayı olarak döner. Dolayısıyla bilgisayarın elde edeceği sonuç, 5.7 değil, sadece 5’tir. switch case yapısında koşullar yukardan başlayarak kontrol ediliyor. case 5’e gelindiğinde eşitlik sağlanıyor. Ama break konmadığı için, switch case’ten çıkılmıyor. Ve altında kalan işlemlerde yapılıyor. Altında herhangi bir işlem veya break olmadığından case 0’a kadar bu böyle sürüyor. Ve case 0’da ekrana bir çıktı alıp switch case yapısı break ile sonlandırılmaktadır.

Arttırma (Increment) ve azaltma (decrement) işlemleri

aha önceki derslerimizde, aritmetik işlemlerden bahsetmiştik. Bunların dışında yapabileceğimiz başka şeylerde bulunmaktadır. Bunlardan biri de, arttırma ve azaltma işlemleridir.

Eğer i adında bir değişkenin değerini 1 arttırmak isterseniz, i = i + 1 olarak yazarsınız. Veya 1 azaltmak isterseniz, benzer şekilde i = i – 1 de yazabilirsiniz. Arttırma ve azaltma işlemleri bu olayı daha basit bir forma sokmaktadır. i = i + 1 yazmak yerine i++ veya i = i – 1 yazmak yerine i– yazabilirsiniz.

Arttırma ve azaltma işlemleri temelde iki çeşittir. Birinci yöntemde yukarda yazdığımız gibi, arttırma/azaltma sonradan yapılır. İkinci yöntemdeyse arttırma/azaltma ilk başta yapılır. Aşağıdaki örneklere bakalım.

#include<stdio.h>
int main( void )
{
	int i = 10, j = 60;
	printf("i = %d ve j = %d\n", ++i, --j);
	return 0;
}

Yukardaki programı yazar ve çalıştırısanız elde edeceğiniz çıktı şu şekilde görünecektir:

i = 11 ve j = 59

Çünkü arttırma ve azaltma işlemleri ekrana bastırmadan önce yapılmış ve i ile j’nin değerleri değiştirilmiştir. Şimdi programı değiştirip şöyle yazalım:

#include<stdio.h>
int main( void )
{
	int i = 10, j = 60;
	printf("i = %d ve j = %d\n", i++, j--);
	return 0;
}

Bu sefer program çıktısı şöyle olacaktır:

i = 10 ve j = 60

Farkettiğiniz üzere hiçbir değişiklik yapılmamış gibi duruyor. Aslında değişiklik yapıldı ve program sonlanmadan önce i 10 olurken, j’de 59 oldu. Ama arttırma ve azaltma işlemleri printf komutu çalıştırıldıktan sonra yapıldığı için, biz bir değişiklik göremedik.

Kısacası önce arttırma (pre-increment) veya önce azaltma (pre-decrement) kullandığınızda, ilgili komut satırında çalışacak ilk şey bu komutlar olur. Ancak sonra arttırma (post increment) veya sonra azaltma kullanırsanız, o zaman bu işlemlerin etkileri ilgili komut satırından sonra geçerli olacaktır. Aşağıdaki özel tabloya bakabilirsiniz:

Form Tip İsim Açıklama
i++ postfix post-increment İşlem sonrası arttırma
++i prefix pre-increment İşlem öncesi arttırma
i– postfix post-decrement İşlem sonrası azaltma
–i prefix pre-decrement İşlem öncesi azaltma

Gelişmiş atama (Advanced Assignment) yöntemleri

C’de yazım kolaylığı amacıyla sunulmuş bir başka konu da, gelişmiş aşama yöntemleridir. Biraz daha uzun yazacağınız kodu, kısaltmanıza yaramaktadır.

degisken_1 = degisken_1 (operator) degisken_2 şeklinde yazacağınız ifadeleri, daha kısa yazabilmeniz için, degisken_1 (operator) = degisken_2 şeklinde ifade edebilirsiniz. Gelişmiş atamalarda sunulan genel formlar şu şekildedir:

+= , -= , *= , /= , %=

Sanırım aşağıdaki örneklere bakarsanız, konuyu çok daha net anlayacaksınız:

1-) j = j * ( 3 + x )  ==> j *= ( 3 + x )
2-) a = a / ( 5 - z ) ==> a /= ( 5 - z )
3-) x = x - 5 ==> x -= 5

Conditional Operator ( ? )

Türkçe karşılık bulamadığım bir başka C kavramı da, Conditional Operator. Aslında mot a mot çeviri yaparsam, koşullu operatör anlamına geliyor. Ama şu ana kadar gördüğümüz birçok yapıyı da bu şekilde tanımlamak mümkünken, koşullu operatör ifadesini kullanmayı pek tercih etmiyorum. Neyse lafı uzatmayalım…

Conditional Operator, if-else ile tamamen aynı yapıdadır. Hiçbir farkı yoktur. Tek farkı koda bakıldığında anlaşılmasının biraz daha zor oluşudur. Bir de if – else gibi yazıyla ifade edilmez. Onun yerine soru işareti (?) ve iki nokta üst üste ( : ) kullanarak yazarız. Aşağıdaki tabloda if else yapısıyla karşılaştırılmalı olarak, Conditional Operator verilmiştir:

if-else Yapısı Conditional Operator ( ? ) Yapısı
if( koşul ) {
    if_komut(lar)
}
else {
    else_komut(lar)
}
koşul?if_komut(lar):else_komutlar
#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lütfen bir sayı giriniz> ");
	scanf("%d",&sayi);
	( sayi > 10 ) ? printf("Sayı 10'dan büyüktür\n"):
			printf("Sayı 10'dan küçüktür veya 10'a eşittir\n");
	return 0;
}

Kaynak:Çağatay Çebi

#assignment, #c, #conditional, #decrement, #if-else-if, #increment, #nested-if, #operator, #switch-case

C Programlama Dilinde Koşullu İfadeler,Casting,İlişkisel ve Birleşik Operatörler


Cast Operator

Casting programlama dilinde sıkça kullanılan bir yapıdır.Bir değişkeni farklı değer tipine dönüştürmektir aslında.

#include<stdio.h>
int main( void )
{
	int bolunen = 12, bolen = 8;
	float bolum;
	bolum = bolunen / bolen;
	printf("Sonuc: %f\n",bolum);
	return 0;
}

Yukarıda sonuç 0.000000 çıkacaktır.Ama bizim beklediğimiz 1.5 ‘du.bolunen ve bolen değişkenleri integer olarak tanımlanıp bölme işlemide integer değer vereceğinden sonuç 0.000000 çıkmıştır.Burada doğru sonucu bulmamız için casting yapmamız gerekecektir.

#include<stdio.h>
int main( void )
{
	int bolunen = 12, bolen = 8;
	float bolum;
	bolum = (float)bolunen / bolen;
	printf("Sonuc: %f\n",bolum);
	return 0;
}

Yukarıda görüldüğü gibi bölme işleminin başına (float) koyarak sonucun ondalıklı bir sayı olmasını istedik.Sonuç olarak 1.5 değerini bulmuş olacağız.

Aşağıdaki örneği inceleyelim:

#include<stdio.h>
int main( void )
{
	printf("Sonuc: %f\n", 1 / 5);
	return 0;
}

Yukarıdaki sonuç ifadesi de 0 olarak gözükecektir.Bizim istediğimiz 0.2 gözükmesi.Bunu yapmak için yine bir casting ifadesi kullanıyorum.Ayrıca printf içerisinde kullandığım formatın da “%f” olduğuna dikkat ediniz.Bu komut float değer alacağını gösterir.

#include<stdio.h>
int main( void )
{
	printf("Sonuc: %f\n",(float) 2 / 4);
	return 0;
}

Değişkenlerde yüksek tipli değişken daha aşağı seviyelerdeki değişken tipleri kapsar.Aşağıda düşükten yükseğe doğru değişken tiplerinin sıralaması verilmiştir.

(DÜŞÜK) char int long float double (YÜKSEK)

Koşullu (Conditional) İfadeler

Koşullu ifadeler istenilen şartların sağlanması için kullanılır.

If Komutu

if( koşul ) {
komut(lar)
}

ÖRNEK:

#include<stdio.h>
int main( void )
{
	int girilen_sayi;
	printf("Lütfen bir tam sayı giriniz> ");
	scanf("%d",&girilen_sayi);
	if( girilen_sayi > 100 )
		printf("Girilen sayı 100'den büyüktür\n");
	return 0;
}

If Else

Eğer bir şart sağlanıyorsa veya sağlanmıyorsa,bunun tam tersi durumunda yapılması istenilen komutlar “else” bloguna yazılır.

if( koşul ) {
komut(lar)
}
else {
komut(lar)
}

ÖRNEK:

#include<stdio.h>
int main( void )
{
	int sayi;
	printf("Lütfen bir sayı giriniz> ");
	scanf("%d",&sayi);
	if( sayi> 10)
		printf("Girilen sayı 100'den büyüktür\n");
	else
		printf("Girilen sayı 100'den küçüktür\n");
	return 0;
}

Yukarıdaki örnekte görüldüğü üzere önce kullanıcıdan sayı girilmesi bekleniyor.Daha sonra girilen sayı 10’dan büyükse if blogundaki komutlar,büyük değilse else blogundaki komutlar çalıştırılıyor.

if-then-else-flowchart-javablog

İlişkisel (Relational) Operatörler

Bu operatörler koşul ifadelerinde şartları kontrol ederken kullanılır.

< Küçüktür
> Büyüktür
== Eşittir
<= Küçük eşittir
>= Büyük eşittir
!= Eşit değildir

Birleşik (Compound) Operatörler

Bazen birden fazla koşulu kontrol etmek isteyebiliriz.Örneğin girilen sayının hem 10’dan büyük hem de 20’den küçük olmasını isteyebiliriz.Bunun için iki şartı da birbirine bağlamamız gerekir.

&& and ve
|| or veya
! not tersi

Yukarıda verilen operatörlerin logical tablosu da aşağıdaki gibidir:

p q p&&q p||q !p
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

#if, #if-else, #iliskisel, #kosul, #logical, #operator, #relational

C Programlama Dilinde Standart giriş/çıkış fonksiyonları, Değişkenler, Aritmetik Operatörler

Değişken nedir? Tanımı nasıl yapılır?

Değişkenler,girilen değerleri alan ve programın çalışmasıyla değer atanan veri saklayıcılarıdır.Atamamız gereken değer ,o değişkenin değer tipi ile uygun olmalıdır.Yani ,değişkenimiz tamsayı olarak tanımlanmışsa,bu değişkene atamamız gereken değer de tamsayı olmalıdır.

#include<stdio.h>
int main( void )
{
	int sayi;
	sayi = 100;
	printf("Number: %d",sayi);
	return 0;
}

Yukarıda sayi adındaki değişkenimiz int değer tipi ile tanımlanmıştır.int ingilizcede integer anlamına gelmektedir.Yani tamsayı.Bu sayıyı printf içerisinde ekrana basarken metin içerisinde özel bir karakter kullandık.”%d” ifadesi ile formatlı metnimizi printfe ilk parametre olarak verdik.İkinci parametrede ise sayı değerini yazdık.Burada kullandığımız %d ifadesi bu kısma tamsayı gelecek anlamı taşımaktadır.

Aşağıdaki örnekte iki sayı değeri ve bunların toplam değeri printf içerisinde yazılmıştır:

#include<stdio.h>
int main( void )
{
	int sayi1=100,sayi2=50,toplam;
	toplam=sayi1+sayi2;
	printf("Number1: %d , Number2:%d , Sum:%d" ,sayi1,sayi2,toplam);
	return 0;
}

Birden fazla farklı formattaki ifadeleri printf içerisinde kullanabiliriz.

Şimdi ise sayı değerlerini scanf yardımıyla kullanıcıdan alalaım ve toplayalım:

#include<stdio.h>
int main( void )
{
	int sayi1,sayi2,toplam;
	printf("Sayi1:");
	scanf("%d",&sayi1);
	printf("Sayi2:");
	scanf("%d",&sayi2);
	toplam=sayi1+sayi2;
	printf("Number1: %d , Number2:%d , Sum:%d" ,sayi1,sayi2,toplam);
	return 0;
}

Yukarıdaki kodda sayi1 ve sayi2 değerlerini scanf yardımıyla kullanıcıdan çektik,scanf ilk parametresinde çekilecek değerin formatı olarak ,tamsayı istediğimizden,”%d” kullandık.İkinci parametrede & işaretini değeri atayacağımız sayıdan önce kullandık.

Aşağıdaki tablodan hangi değişken tipinin nasıl deklare edileceğini, kaç byte yer kapladığını, maksimum/minimum alabileceği değerleri ve giriş/çıkış fonksiyonlarıyla nasıl kullanılabileceğini bulabilirsiniz. Tanımlamalar ve fonksiyon uygulamaları, degisken isimli bir değişken için yapılmıştır.

 TİP   DEKLARASYON   
printf(  );
 
scanf(  );
 
 Minimum 
 Maksimum   Byte 
 Karakter  char degisken;  printf(“%c”,degisken);   scanf(“%c”,&degisken);  -128 127 1
 Kısa Tam Sayı  short degisken;  printf(“%d”,degisken);   scanf(“%d”,&degisken);  -32768 32767 2
 Tamsayı  int degisken;  printf(“%d”,degisken);   scanf(“%d”,&degisken);  -32768 32767 2
Uzun Tamsayı long int degisken; printf(“%ld”,degisken); scanf(“%ld”,&degisken); -2147483648 2147483647 4
İşaretsiz Tamsayı unsigned int degisken; printf(“%u”,degisken); scanf(“%u”,&degisken); 0 65535 2
İşaretsiz Uzun Tamsayı long unsigned degisken; printf(“%lu”,degisken); scanf(“%lu”,&degisken); 0 4294967295 4
Virgüllü Sayı float degisken; printf(“%f”,degisken); scanf(“%f”,&degisken); 1,17549e-38 3,40282e+38 4
Uzun Virgüllü Sayı double degisken; printf(“%lf”,degisken); scanf(“%lf”,&degisken); 2,22504e-308 1,79769e+308 8

Yukarıda verilen bu değerler; işletim sisteminden, işletim sistemine, farklılık gösterebilir. En doğru değerleri almak için sizeof( ), fonksiyonunu kullanmak gerekir. Aşağıda yazmış olduğum bir program bulacaksınız. Kendi bilgisayarınızda derleyip, çalıştırırsanız, size değişkenlerin boyutunu ve alabileceği maksimum-minimum değerleri verecektir:

Yukarıda printf içerisinde birden fazla farklı tipdeki değişkenleri yazabileceğimizi söylemiştik.Aynı durum scanf için de geçerlidir.

scanf("%d%f%c",&a,&b,&c);

“%d”=>sayı(integer),”%f”=>Ondalık sayı(float),”%c”=>karakter(character)

printf("%d %f %c",a,b,c);

Aritmetik Operatör ve İfadeleri

Başlıca aritmetik operatörler aşağıdaki gibidir.

( + ) : Artı

( – ) : Eksi

( / ) : Bölme

( * ) : Çarpma

( % ) : Modül

#aritmetik, #c, #degiskenler, #float, #integer, #operator, #printf, #scanf

C Programlama Diline Giriş

C ile ilgili olarak ilk öğrenilen şey giriş-çıkış işlemleridir. C de klavyeden herhangi bir değeri alabilmek için scanf(); fonksiyonunu ,ekrana bir şey yazdırmak için de printf(); fonksiyonu kullanılır.Giriş-çıkış işlemleri için stdio.h kütüphanesini koda eklememiz gerekir.Bunu eklerken #include komutundan faydalanmamız gerekir.

#include<stdio.h>
int main( void )
{
	printf("Hello World");
}

Yukarıdaki kodu derleyip çalıştırdığımızda aşağıdaki görüntü ortaya çıkacaktır.

c1

main( ) methodu, bir programdaki temel fonksyiondur. Bir method ismi tanımlandıktan sonra isminin sonuna parantezler konur.Bu parantezler arasına alması gereken herhangi bir tipte parametreler de eklenebilir.Eğer herhangi bir parametre yoksa boş bırakılır ya da void sözcüğü konulabilir.main methodunun dönüş tipi (return type) int olarak girilmiş.Geriye dönecek değer tipi olarak integer tipi tanımlanmış.

main() methodunnun içeriği ise küme parantezleri arasına eklenmiş.İçerisinde yazılan kodda ,printf yazdığımız metini, ekrana bastırmaya yarayan, standart bir fonksiyonudur. Çift tırnak işaretleri içersine yazdığınız herşey printf sayesinde ekrana basılır.

Dikkat ettiyseniz, her satır sonuna noktalı virgül koyduk. Aslında her satır değil, her komuttan sonra noktalı virgül koyduğumuzu söylemek daha doğru olacak. Çünkü noktalı virgül C dilinde komut ayracı anlamına gelir.

Şimdi kodumuzu biraz daha değiştirelim:

#include<stdio.h>
int main( void )
{
	printf("Hello World\n");
	printf("Hi,Cmeng");
	return 0;
}

Yukarıda farklı olarak printf’de yazdığımız metin sonuna \n ekledik.\n komutu bir alt satıra geçeceğini gösterir.En altta “return 0;” adında yazılan kodda main() methodunun 0 değerini döndürmesini sağlar. Bunu eklemesek de, program yine çalışır; ancak uyarı verir. Çünkü main fonksiyonu, geriye bir tam sayının dönmesini beklemektedir. Yazmış olduğumuz return ifadesiyle bu uyarılardan kurtulabiliriz.

Yukarıdaki kodda yazdığımız \n komutunu şu şekilde de yazabiliriz:

#include<stdio.h>
int main( void )
{
	printf("Hello World");
	printf("\nHi,Cmeng");
	return 0;
}

İki kodunda birbirinden farklı bir çıktısı olmayacaktır.Yukarıda kullandığımız 2 adet printfle yaptığımız işlemi tek printf kullanarak da yapabiliriz.

#include<stdio.h>
int main( void )
{
	printf("Hello World\nHi,Cmeng");
	return 0;
}

Peki printf içerisine çift tırnaklı bir metni nasıl yazabiliriz?Metin içerisinde kullanacağımız çift tırnaktan önce “\” ifadesi konulmalıdır:

#include<stdio.h>
int main( void )
{
	printf("Cmeng said: \"Hello World\"");
	return 0;
}

c2

#c, #language, #main, #printf, #programming, #return, #scanf