Süheyla Yıldız
Femtopat
- Katılım
- 8 Mayıs 2024
- Mesajlar
- 10
Daha fazla
- Cinsiyet
- Kadın
int main(){
int dizi[5];
int i;
printf("%s%15s","Element","Value");
i=0;
while(dizi[i])
{
dizi[i]=2+2*i;
printf("%3d%17d",i+1,dizi[i]);
i++;
}
printf("jhfjg");
return 0;
}
element valueNe yapmaya çalışıyorsunuz? Bu döngünün bir anlamı yok. O yüzden sonsuz döngü dönüyor. Bir de böyle bir şey için for döngüsü öneririm.
#include <stdio.h>
int main(){
int dizi[5];
int i;
int value=2;
printf("Element Value\n");
for(i=1;i<6;i++){
printf("%d %d\n",i,value);
value+=2;
}
}
#include <stdio.h>
#define N 5
int main(void) {
int dizi[N];
printf("element value\n");
int i = 0;
for(int i = 1; i <= N; i++) {
dizi[i - 1] = i * 2;
printf("%3d %7d\n", i, dizi[i - 1]);
}
return 0;
}
int dizi[5];
while (dizi[i]) {
// ...
}
while(dizi[i])
, while(dizi[i] != 0)
'a denktir (int
için). Elemanlarının değerlerinin ne olduğunu bilmediğimiz bir dizi için böyle bir koşula güvenmemeliyiz. Ayrıca i >= 5
olduğunda dizinin aralığı dışında kalan bir elemana erişmeye çalışırız, sağlıklı değil.while(i < 5) {
...
}
while
yerine for
döngüsü daha anlaşılır olacaktır çünkü i
ne olursa olsun artıyor:for(int i = 0; i < 5; i++) {
// ...
}
int i;
'nin döngünün içinde yazılmasını desteklemiyordu, tam hakim değilim o konuya. Sizinki destekliyordur muhtemelen.printf
'lerde yeni satıra geçmeleri unutmuşsunuz, şöyle yaparsanız çıktı istediğiniz gibi gözükecektir:printf("%s%15s\n", "Element", "Value");
printf("%3d%17d\n", i + 1, dizi[i]);
#define
kullanabilirsiniz veya const int N = 5;
falan da diyebilirsiniz.GCC 5+'den beri, GCC 5 öncesinde de C11 ve C99 ile destekliyor. Aşağıdaki GCC 4.9.2 flagsiz derleme sonucu;Bazı -eski- derleyicilerint i;
'nin döngünün içinde yazılmasını desteklemiyordu, tam hakim değilim o konuya. Sizinki destekliyordur muhtemelen.
Doğru. Uninitialized olduğu için rastgele geliyor.Bu tanımlamayı bir fonksiyonun içinde yaptığınız sürece, dizinin içindeki elemanların değerlerinin rastgele olacağını düşünebilirsiniz. Bu, derleyiciden derleyiciye değişen bir durum olabilir. Detaylarını çok bilmiyorum.
int dizi[N] = {};
dediğinde hepsini boş başlatacak. GCC, Clang ve MSVC'de denedim. Hepsinde de derledi.For döngüsü de denedim, aynı şekilde döngüyü es geçti.
dizi[0] == 0
olduğu zaman döngünüzün şartı hemen bozuluyor.Uninitialized olduğu için rastgele geliyor.
gcc 13.2.0
mevcut, dizim 5 elemanlıyken dizinin elemanlarını bastırdığımda hep şu sonucu elde ediyorum: 0 0 36 0 0
. Arka planda neler döndüğünü bilmiyorum. : D Hep aynı ve üzerine yazılmayan bir adrese falan mı denk geliyor acaba?Mümkün. Stack allocation sırasında nereye denk gelirse oranın içindeki değeri veriyor. Genelde başka bir programın yada senin programının daha önceden bıraktığı bir şey olabiliyor. Undefined behavior.İlginç bir rastgelelik mevcut. Örneğin kendi bilgisayarımdagcc 13.2.0
mevcut, dizim 5 elemanlıyken dizinin elemanlarını bastırdığımda hep şu sonucu elde ediyorum:0 0 36 0 0
. Arka planda neler döndüğünü bilmiyorum. : D Hep aynı ve üzerine yazılmayan bir adrese falan mı denk geliyor acaba?
hata yazdığınız 3. maddeyi uygulayınca düzeldi teşekkür ederim
Bu tanımlamayı bir fonksiyonun içinde yaptığınız sürece, dizinin içindeki elemanların değerlerinin rastgele olacağını düşünebilirsiniz. Bu, derleyiciden derleyiciye değişen bir durum olabilir. Detaylarını çok bilmiyorum.C:int dizi[5];
C:while (dizi[i]) { // ... }
while(dizi[i])
,while(dizi[i] != 0)
'a denktir (int
için). Elemanlarının değerlerinin ne olduğunu bilmediğimiz bir dizi için böyle bir koşula güvenmemeliyiz. Ayrıcai >= 5
olduğunda dizinin aralığı dışında kalan bir elemana erişmeye çalışırız, sağlıklı değil.
- Bir dizinin elemanlarını gezmek istediğimizde dizinin eleman sayısına yani uzunluğuna dayalı bir döngü oluşturmak isteriz:
C:while(i < 5) { ... }
while
yerinefor
döngüsü daha anlaşılır olacaktır çünküi
ne olursa olsun artıyor:
Bazı -eski- derleyicilerC:for(int i = 0; i < 5; i++) { // ... }
int i;
'nin döngünün içinde yazılmasını desteklemiyordu, tam hakim değilim o konuya. Sizinki destekliyordur muhtemelen.
printf
'lerde yeni satıra geçmeleri unutmuşsunuz, şöyle yaparsanız çıktı istediğiniz gibi gözükecektir:
printf("%s%15s\n", "Element", "Value");
printf("%3d%17d\n", i + 1, dizi[i]);
- Dizinin boyutunu bir sabite atayıp kod boyunca bu sabiti kullanmak daha uygun olacaktır. Bunun getireceği kolaylık, dizinin eleman sayısını değiştirmek istediğimizde tek yerde değişiklik yapmamızın yetmesi olur. @TheAny'nin sunduğu koddaki gibi
#define
kullanabilirsiniz veyaconst int N = 5;
falan da diyebilirsiniz.