Arama butonu
Bu konudaki kullanıcılar: 1 misafir
4171
Cevap
168712
Tıklama
3
Öne Çıkarma
Cevap: C/C++/C# Sorularınız Buraya. . .(GÜNCEL) (116. sayfa)
S
12 yıl
Teğmen

Merhabalar Bir Fatura Takip Programı Yapmaktayım. Takıldığım Yerler Var Onları Size Sormak İçin Rahatsız Ediyorum Sizi
Şimdi Program Üç Ana Öğeden Oluşuyor.
.Fatura Ekle(Tip Ve Kuruma Göre(Dinamik) Fatura Seçiyorum Abone Numarası,AdSoyad,Kayıt Tarihi Giriyorum Ve Faturayı KIaydediyorum.)
.Fatura Listele(Buı Kısımda Fatura Ekleden Gelen Bilgiler Doğrultusunda Faturayı Listeliyorum.Yalnız Listeleme Yaparken Şöyle Bir Kriterimiz Var Benim De Takıldığım Nokta Burası.Her Ay Ödenecek İşte Elektrik,Su,Telefon Faturaları Vardır Ya Ha Onlar Ben Hangi Ay Ve Yılı Seçersem Seçeyim Gelecek.Yani Ocak 2014'te Ocak'ta 5 Ayrı Fatura Girdim.Bu Faturalar Şubat,Mart,Nisan.. Hepsinde Listelenecek. Bir De Diyelim Şubat Ayı İçin Yeni Bir Doğalgaz Faturası Ekledim Bu Da Ocak'ta Gözükmeyecek Şubat,Mart,Nisan..Da Gözükecek. Ve Öde Dediğim Zaman Açılacan Form'a Fatura Numarasını Ve Tutarı Birde Ne Zaman Ödediğimi Girecem. Öde Kısnmından Glen Bu 3 Alan Ve Fatura Listeldeki Alanlardaki Verileri Gidip Fatura Hareket Tablosuna Yazacak. ) Ne Yaparsam Yapayım Bu İşi Yapamadım.
.Bu Aşamadada Faturaları Fatura Hareket Tablosunda Görüntüleyecek. Bi Kıstas Var Ay Ve Yıla Göre Mesela Ocak 2014 Te Ödenmen leri Ve Ödenmeyeleri Gösterecek Şubat,Mart,Nisan.. Diye.





< Bu mesaj bu kişi tarafından değiştirildi sametcafer61 -- 16 Kasım 2013; 21:47:21 >

L
12 yıl
Yüzbaşı

Yanlış anlamadıysam 10. sorunun cevabı:
#include <iostream> 
using namespace std;

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

int number,counter=0;

do
{
cout << "Enter a number: ";
cin >> number;

counter++;
}while(number!=0);

cout << "\n\nYou used "<< counter-1 <<" number(s).";

return 0;
}





< Bu mesaj bu kişi tarafından değiştirildi LoRd1N -- 16 Kasım 2013; 2:15:32 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @şerlok
B
12 yıl
Yarbay

Arkadaşlar C ile uğraşıyorum.Değişken tiplerini felan öğrendikten sonra printf ile ekrana farklı şekillerde yazma işlemleri yapıyorum.(Biliyorum çok basitçe yavaş yavaş ilerliyorum) Fakat aklıma birşey takıldı;

C'de char,int,long,double,float gibi değişken türü dışında bir değişken türü yok başlangıçta sanırsam?Cümleleri tutmak için c#'daki gibi bir string değişken türü yok mu acaba?Ya da ileri seviyelerde mi?


Bu mesaja 1 cevap geldi.
Ö
12 yıl
Yüzbaşı

quote:

Orijinalden alıntı: Bilgisayar Bağımlısı

Arkadaşlar C ile uğraşıyorum.Değişken tiplerini felan öğrendikten sonra printf ile ekrana farklı şekillerde yazma işlemleri yapıyorum.(Biliyorum çok basitçe yavaş yavaş ilerliyorum) Fakat aklıma birşey takıldı;

C'de char,int,long,double,float gibi değişken türü dışında bir değişken türü yok başlangıçta sanırsam?Cümleleri tutmak için c#'daki gibi bir string değişken türü yok mu acaba?Ya da ileri seviyelerde mi?

Hocam benimde çok detaylı C bilgim yok fakat C'de string tarzı ifadeler kullanmak için char dizisini oluşturuluyor sanırım bu şekilde;

char deneme[] = "Deneme birkiuc";



B
12 yıl
Yarbay

Dizi ile denemiştim ama ben parantezleri C#'daki gibi değişken türünün yanına koyunca hata vermişti.Sağolasın hocam





< Bu mesaj bu kişi tarafından değiştirildi Bilgisayar Bağımlısı -- 16 Kasım 2013; 21:27:54 >
Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @özgür beyin
Ö
12 yıl
Yüzbaşı

quote:

Orijinalden alıntı: Bilgisayar Bağımlısı

Dizi ile denemiştim ama ben parantezleri C#'daki gibi değişken türünün yanına koyunca hata vermişti.Sağolasın hocam

Rica ederim hocam, ne demek. Yardımcı olabilmiş isem ne mutlu bana.



G
12 yıl
Yarbay

quote:

Orijinalden alıntı: Bilgisayar Bağımlısı

Dizi ile denemiştim ama ben parantezleri C#'daki gibi değişken türünün yanına koyunca hata vermişti.Sağolasın hocam

Ama onu string türü olarak düşünme sakın. C' de string diye bir tür olmadığı için string tutan bir değişken de olmaz. Yani c' de "merhaba " + "dünya" = "merhaba dünya" değildir. Peki nedir dersen cevabı pointer konusunda saklı.



B
12 yıl
Yarbay

String olarak düşünmedim hocam zaten ama derleyicide string gibi ifadeler mevcut neden bu şekilde bir değişken yok anlam veremedim.O konuya gelince öğreneceğiz artık


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @elektro_gadget
4
12 yıl
Teğmen

Atom olarak iki tırnak ("//") arasındaki herşey stringtir ve tek bir atomdur.(derleyicide gördüğünüz budur kuvvetle muhtemel) Ama değişken olarak string C de yok. Diğer dillerde de zaten doğal tür değil.(int, double gibi) Standart string sınıfı yazılmış, ona göre implemente ediliyor.. İhtiyacım olmadığı hiç bakmadım ama C de de aynı şekilde string kütüphaneleri ve fonksiyonları yazılmıştır mutlaka.

C de char *cptr = "DonanimHaber"; // iki tırnak arasındaki donanimhaber stringtir.

yazıldığında derleyici belleğin uygun yerine "DonanimHaber" yazar, aslında olan
char [13] = "DonanimHaber";
Dikkat ederseniz dizinin ismi yok. Anonymous bir dizi yaratılır ve onun adresi cptr ye atanır.
Artık string read-only dir.(Neden read-only olduğu ayrı bir konu) Stringi değiştirmeye çalışmak undefined behaviour dur.




Bu mesajda bahsedilenler: @Bilgisayar Bağımlısı
B
12 yıl
Yarbay

C çalıştığım kitapta bahsettiğiniz şekilde örnek verilmiş fakat ben ekrana yazdıramadığım için pek üstünde durmadım.Fakat dediğiniz gibi saçma aslında neden değiştirilemiyor ki sonrasında.

Ayrıca printf ile belirttiğiniz şekilde bir karakter topluluğunu nasıl ekrana yazdırabiliriz?


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @4kalan
4
12 yıl
Teğmen

Sorularınızın hepsini tam anlamadım, neden değiştirmenin undefined behaviour olduğunu anlatayım.
Aynı string lerin aynı adrestemi tutulacağı yoksa farklı adreslerde mi tutulacağı derleyici yazanların seçeneğine bırakılmış.(unspecified behaviour) Yukardaki mesajımda stringin nasıl oluşturulduğunu anlatmıştım.
Aşağıdaki kodda 2 tane "DonanımHaber" stringinin adreslerini tutan değişkenlerin tuttukları adres aynı ya da farklı olabilir. (Genelde aynı olur)


char *cptr1 = "DonanimHaber";
char *cptr2 = "DonanimHaber";


Hatta

char *cptr3 = "Haber";

Buradaki "Haber" stringinin adresi (derleyiciden derleyiciye değişmekle birlikte) yukarıdaki cptr1 ve cptr2 nin içindeki "Haber" yazısının başlangıç adresidir.

Şimdi

cptr1[8] = 'X';

yapmak sadece birinci string de mi değişiklik yapacak yoksa 3 ünü birden mi değiştirecek?
Buradaki derleyicinin seçimine bırakılan işleme unspecified behaviour deniliyor. Yani unspecified behaviour, undefined behaviour ı doğurmuş oluyor.

Farklı bir örnek

char *cptr1 = "DonanimHaber";
cptr1[8] = 'X';
printf("DonanimHaber");

Stringler statik ömürlü ve daha main çağrılmadan hayata geldikleri için printf in ne yazdıracağını bilemezsiniz.(Zaten undefined behaviour dır)
Umarım anlatabilmişimdir.





< Bu mesaj bu kişi tarafından değiştirildi 4kalan -- 16 Kasım 2013; 23:03:29 >


Bu mesajda bahsedilenler: @Bilgisayar Bağımlısı
B
12 yıl
Yarbay

Anladım hocam.Peki C#'taki gibi String sınıfı ile işlemler yapabiliyor muyuz?

misal kullanıcının girdiği bir metini scanf ile ne türden bir değişkene nasıl atabiliriz? (Sadece char ile dizi oluşturarak mı mümkündür?)


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @4kalan
4
12 yıl
Teğmen

Evet. (Bu arada C# ın adı geçtiği için, söyleyeyim stringi değiştirmek bildiğim kadarıyla C++, Java ve C# ta da undefined behaviour)

char * ile yapmanız için dinamik bellek kullanmanız gerekir, orayı es geçiyorum.


char c[100];

1-) scanf("%s", c); ile alabilirsiniz, ama scanf in tamponlama mekanizması yüzünden boşluk bırakırsanız, boşluğa kadar olan kısmı alır. (Ya da white space karakterleri demek daha doğru)
2-) gets(c); ile alabilirsiniz ama 100 karakterlik diziye 120 karakter girebilirsiniz bu da run-time hatasını doğurur. Yani koruma mekanizması yok.
3-) fgets(c, 100, stdin); nihayet güvenli bir şekilde stringlerinizi alabilirsiniz.(99 karakter)

Not: Yamulmuyorsam C ve C++11 standartlarında gets i kaldırmışlar.




Bu mesajda bahsedilenler: @Bilgisayar Bağımlısı
F
12 yıl
Yüzbaşı

Konuyla alakasız olacak ancak cevaplarsanız sevinirim..

Şu an hazırlıktayım ve Ocakta bölüme başlama ihtimalim var ancak bu durumda Java ve C-C++ derslerini aynı anda görmek zorunda kalacağım..Yani hiç temel yokken hem 2. dönemin C-C++ derslerini hem ilk dönemin java derslerini alacağım zor olur mu?Java bilmeden C-C++ öğrenmek zor olur mu?Önceden çalışmaya gerek var mıdır?Önceden çalışmak için önerebileceğiniz kaynak var mıdır?


Bu mesaja 1 cevap geldi.
G
12 yıl
Yarbay

Ukalalık etmek istemem ama bildiğim kadarıyla yanlış olan şeyler yazmışsınız. C' de stringler read-only değildir. "DonanimHaber" gibi bir stringin değiştirilemez olmasının sebebi derleyicinin bellekten kazanmak için stringi program koduna gömmesi. Bu stringi değiştirmeye çalışmak program kodunu değiştirmeye çalışmak anlamına gelir ve seg-fault yersiniz.

Bir char dizisi tanımlarken;
char str[] = "DonanimHaber"; ifadesindeki stringi derleyici str nin gösterdiği yere yazar çünkü bilir ki str dizisi değişkendir ve içeriği değişebilmelidir.

Fakat;
const char str[] = ... ya da
const char *str = ... gibi bir bildirimde string code segmente yazılır çünkü değişmeyecek olan bir verinin bellekte yer kaplamasına gerek yoktur.

Bu arada c++ ta da stringler aynı mantıkla çalışır. const olmayanlar istenildiği gibi modifiye edilebilir.


Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @4kalan
4
12 yıl
Teğmen

Estağfurullah. Siz yanlış anladınız ya da ben eksik yazdım. Stringlerden kastımı biraz daraltıp anlattım, örneklerde görüldüğü gibi
char *cptr = "DonanimHaber"; gibi stringlerdi.

Doğrudan diziye atanan string ler tabiki değiştirilebilir.
char c[] = "DonanimHaber"; gibi.

Stringlerin program koduna gömüldüğünü de okumuştum ama yukarıdaki anlattığım undefined behaviour durumundan kesinlikle eminim. (Zaten kesin bilmediğim yerlerde özellikle belirtiyorum)

Sonuç olarak sizin yazdığınız
"char str[] = "DonanimHaber"; ifadesindeki stringi derleyici str nin gösterdiği yere yazar çünkü bilir ki str dizisi değişkendir ve içeriği değişebilmelidir." Buna zaten katılıyorum tersini de yazmadım.

Bahsettiğim,
char *str = "DonanimHaber"; in değiştirilmesinin undefined behaviour olduğuydu. (Hepsini yazayım da karışıklık kalmasın)
const char *str = "DonanimHaber"; bunu zaten değiştirmeye kalkmak compile-time hatası.
char str[] = "DonanimHaber"; istenilen şekilde değiştirilebilir.
const char str[] = "DonanimHaber"; değiştirilemez const keyword ünden dolayı.

Not: Belki gözünüzden kaçmıştır üstte birkaç mesaj daha var, onlara da bakabilirsiniz.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @elektro_gadget
G
12 yıl
Yarbay

Olsun tartışmak iyidir. Burada yazılanlar konuyla ilgili türkçe kaynaktır aynı zamanda.

Önemli birşeyi belirtmeyi unuttum.
char *str = "DonanimHaber"; komple hatalı bir ifade. Normalde bunun derlenmemesi lazım ama ne hikmetse gcc bunu warning bile vermeden derliyor. Yaptığı şey ise şu. Stringi program koduna yazıp adresini str ye atıyor. str const olmadığı için str[0] = 'A'; ataması da yasak değil. Ama sonuçta malum sebepten çakılıyor.

Kısacası bu bildirim şeklini kullanmayın. Zaten kimse tavsiye etmiyor.


Bu mesaja 2 cevap geldi.
4
12 yıl
Teğmen

Derlenmemesi için dilin kuralları açısından bir engel yok ki, mantıksal bir hata. Adresi ataması da tamam. str[0] = 'A'; ataması derleme zamanında hata değil, evet. Kullanılmaması gerekir, const belirteci yazılmalıdır başına okunabilirlik olarak. Ama verdiğim cevaplar dilin kuralları dahilinde olan cevaplardı, aynı şeyleri söylüyoruz. Sadece son mesajımı okuduğunuzdan şüpheleniyorum




Bu mesajda bahsedilenler: @elektro_gadget
G
12 yıl
Yarbay

Okudum. Size karşı yazılmış birşey değil zaten o. Sadece önceki mesajımda unuttuğum şeyi ek olarak yazdım. Uykum geldi ve biraz daha konuşursam saçmalamaya başlayacam.
İyi geceler.




Bu mesajda bahsedilenler: @4kalan
B
12 yıl
Yarbay

@4kalan Teşekkürler hocam.

Bu arada üslubune uygun bir şekilde tartışmak iyidir

@elektro_gadget yine sen iyisin hocam benim 10'dan sonra beyin off moduna geçiyor.

Bu arada C programlamayı CodeBlocks ile yapıyorum.String ifadeler içerisindeki türkçe karkaterleri göstermiyorİnternette türkçe bir kaç sitedeki denilenleri yaptım ama değişen birşey olmadı.





< Bu mesaj bu kişi tarafından değiştirildi Bilgisayar Bağımlısı -- 17 Kasım 2013; 8:29:59 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @elektro_gadget , @4kalan