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.0mevcut, 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 (intiçin). Elemanlarının değerlerinin ne olduğunu bilmediğimiz bir dizi için böyle bir koşula güvenmemeliyiz. Ayrıcai >= 5olduğ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) { ... }
whileyerinefordöngüsü daha anlaşılır olacaktır çünküine 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
#definekullanabilirsiniz veyaconst int N = 5;falan da diyebilirsiniz.