Tam Sürümünü Görmek İçin : [C] - Dizi Sorunu
okulda(yeditepe üni.) verilen bir soru:
ilk girdiğim sayı
6 olsun bu bundan sonra 6 sayı daha gireceğim demek
3
2
5
1
8
4
son sayı 4 , 6 hariç dizi içinde 4ten küçük kaç tane sayı varsa ekrana onu yazacak...
kodlarım
//Erhan Özden es112.01
#include <stdio.h>
main(){
int counter=0,number,array[];
printf("enter any\n");
scanf("%d",&number);
for (i=0; i < number; i++){
scanf("%d",&array[i]);
}
for(i=0; i < number-1; i++){
if( array[i] < array[number]){
counter++;
}
}
printf("times: %d\n",counter);
return 0;
}
devcpp ile derlemek istediğimde storage size of array isnt known diye hata veriyor.yukarıda array[i] mi yazmalıyım,nerede hata yapıyorum?
Teşekkürler..
c'de array'lerin ilk boyutları belirlenmeden array tanımlaması ne yazık ki yapılamaz. bunun için malloc tarzı fonksiyonlar olsa da bunların kullanımı mecbur kalınmadıkça tavsiye edilmez.
ilk satırda array tanımını array[50] şeklinde yaparsan (50 yeterli bir ebat olacaktır) program düzgün çalışacaktır.
acehreli
24/04/2008, 18:03
com90, o soyledigin eski C'de (1999 oncesi) ve C++'ta gecerlidir. Artik C'de calisma zamaninda bilinebilen bir degerle dizi tanimlanabiliyor:
#include <stdio.h>
void dizi_kullan(int uzunluk)
{
int dizi[uzunluk];
dizi[0] = 42;
printf("%d\n", dizi[0]);
}
int main()
{
int uzunluk = 0;
printf("Dizi uzunlugu: ");
scanf("%d", &uzunluk);
dizi_kullan(uzunluk);
}
Ali
darkalive
24/04/2008, 19:57
@acehreli;
acaba eski C dediğiniz ; -pedantic-errors ile derlediğimiz ISO 90 ( yanlış hatırlamıyorsam ) standartlarına sahip C mi oluyor?
com90, o soyledigin eski C'de (1999 oncesi) ve C++'ta gecerlidir. Artik C'de calisma zamaninda bilinebilen bir degerle dizi tanimlanabiliyor:
#include <stdio.h>
void dizi_kullan(int uzunluk)
{
int dizi[uzunluk];
dizi[0] = 42;
printf("%d\n", dizi[0]);
}
int main()
{
int uzunluk = 0;
printf("Dizi uzunlugu: ");
scanf("%d", &uzunluk);
dizi_kullan(uzunluk);
}
Ali
acehreli
24/04/2008, 21:20
1999'dan onceki C standardi 1989'daydi. gcc'nin -std komut satiri secenegi ile degisik davranislari deneyebilirsin. -pedantic-errors (veya -pedantic) hangi standardin kullanildigini secmez ama onu da kullanmakta yarar var.
Ali
darkalive
24/04/2008, 23:36
cevap için teşekkürler.
1999'dan onceki C standardi 1989'daydi. gcc'nin -std komut satiri secenegi ile degisik davranislari deneyebilirsin. -pedantic-errors (veya -pedantic) hangi standardin kullanildigini secmez ama onu da kullanmakta yarar var.
Ali
çalışan program
kod.cpp
//Erhan Özden es112.01
#include <stdio.h>
main(){
int counter=0,number,array[50];
printf("enter any\n");
scanf("%d",&number);
for (int i=0; i < number; i++){
scanf("%d",&array[i]);
}
for(int i=0; i < number-2; i++){
if( array[i] < array[number]){
counter++;
}
}
printf("times: %d\n",counter);
return 0;
}
acehreli
29/04/2008, 20:44
Kullanicilara 50'den buyuk sayi girmemelerini de soylemek gerek .;) Programinda iki tane de hata var:
1) array[number]'da senin koydugun bir sayi yok; rastgele bir deger var orada
2) O hatayi giderdikten sonra su girdiyle dener misin: 3 1 2 3 Senin program yalnizca 1 yaziyor. :(
Ayrica "times" yerine "count" (adet) herhalde daha dogru olur.
Ali
valla ne deseniz haklısınız .okulda ders olarak alıyorum.c hakkında fazla bi bilgim yok.
/* Compiler & Editor : Borland C++ 5.02 for Windows */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
int *dizi;
int uzunluk;
int i;
int say = 0;
printf("Dizi uzunlugu: ");
scanf("%d", &uzunluk);
dizi = (int*)calloc(uzunluk, sizeof(int));
for(i=0; i<uzunluk; i++)
{
printf("%d.Elemani Girin: ", i+1);
scanf("%d", &dizi[i]);
}
printf("\nSonuclar :\n");
for(i=0; i<uzunluk; i++)
{
//printf("\n%d vs %d\n", dizi[uzunluk-1], dizi[i]);
if(dizi[uzunluk-1] > dizi[i])
{
printf("%d\n", dizi[i]);
say++;
}
}
printf("\nToplam Adet :\n%d", say);
free(dizi);
getch();
return 0;
}
Merhaba, bende kendimce C++ öğrenmeye çalışıyorum. Sizin yazdığınız ödevi görünce bende kendimi denemek istedim ama sanırım soruyu yanlış anladım ben adet yerine girilen sayılar içinde son sayıdan küçük olanları ekrana yazdırdım ama şimdi adedide ekledim. Kodun genelini anlamış olmama rağmen birisi aşağıdaki satırı açıklarsa sevinirim.
dizi = (int*)calloc(uzunluk, sizeof(int));öncelikle şunu belirteyim bu satırın yaptığp iş dizi için bellekten alan ayırmak ve dizinin tüm değerlerini sıfır olarak işaretlemek, ama anlamadığım nokta şurası;
void * calloc ( size_t num, size_t size ); şekilde gördüğüm kadarı ile calloc fonksiyonunun dönüş tipi void* yani değer döndürmüyor. Ama yukarıdaki atamada (tabi bildiğim kadarıyla, yanlış olabilir) dönüş değerini int*'a çevirip diziye aktarıyoruz bu nasıl oluyor?
acehreli
30/04/2008, 18:56
Deger dOndUrmese 'void' olurdu. 'void*'in anlami, herhangi bir tUrU gosterebilen isaretcidir.
Calloc 'void*' dOndUrUyor, sonra biz (int*) ile int tUrUnu gosteren bir alan gibi kullaniyoruz.
Ali
Yani dönüş türü void* olan bir fonksiyonu tür dönüşümü yaparak istediğimiz bir türe çevirebilirmiyiz?
double dtest = (double*) calloc .....
int itest = (int*) calloc .....
char ctest = (char*) calloc .....
Yukarıdaki örnekler doğrumudur? Tüm tiplere çevrilebilen bir tip, bunu diğer dillerde kullanılan variant tipine benzetebilirmiyiz?
acehreli
01/05/2008, 10:58
Sol taraflarda hep isaretci olacak tabii:
double * dtest = (double*)calloc(...);
malloc ve calloc gibi hangi tUr icin kullanilacagi bilinmeyen alanlari istedigimiz tUr icin kullanabiliriz. Tabii ayrilan alanin o tUrU alacak kadar buyuk oldugunu varsayarak...
Ama aslinda 'void*' "istedigimiz tUre" cevirmek icin degildir. Onu eninde sonunda baslangic tUrUne cevirmekten baska bir sey yapamayiz.
Ornegin degisik turlerde nesneler tutan bir dizimiz olsa (herhalde "variant" dedigin), bu dizinin elemanlarini 'void*' yapmak zorundayizdir. (C++ olsa, diziyi ust tur dizisi olarak tanimlardik.)
Bu ornekte Hayvan yapisinin iki elemani var: hayvanin ne tUrden oldugunu gosteren 'tur', ve o hayvana ozel bilgileri tutan bir void*. tur elemanina bakarak void*'i dogru tUrde kullaniyoruz:
#include <stdio.h>
typedef enum { tur_kedi, tur_fil } HayvanTuru;
typedef enum { kirmizi, sari, mavi } Renk;
typedef struct
{
Renk renk;
} Kedi;
void kedi_goster(const Kedi * kedi)
{
printf("Kedi - renk: %d\n", kedi->renk);
}
typedef struct
{
Renk renk;
double hortum_uzunlugu;
} Fil;
void fil_goster(const Fil * fil)
{
printf("Fil - renk: %d hortum: %gm\n",
fil->renk, fil->hortum_uzunlugu);
}
typedef struct
{
HayvanTuru tur;
void * ozel; // <-- herhangi bir tUr olabilir
} Hayvan;
void hayvan_goster(const Hayvan * hayvan)
{
switch (hayvan->tur)
{
case tur_kedi:
/* void* otomatik olarak Kedi*'a dOnusuyor */
kedi_goster(hayvan->ozel);
break;
case tur_fil:
/* void* otomatik olarak Fil*'a dOnusuyor */
fil_goster(hayvan->ozel);
break;
default:
printf("bu hayvani bilmiyorum\n");
break;
}
}
int main()
{
Kedi kedi = { sari };
Fil fil = { mavi, 1.2 };
Hayvan hayvanlar[] =
{
{ tur_kedi, &kedi }, // <-- Kedi* void* yerine kullanildi
{ tur_fil, &fil }, // <-- ayni sekilde, void* yerine Fil*
};
hayvan_goster(&hayvanlar[0]);
hayvan_goster(&hayvanlar[1]);
}
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.