C++ Ödev Yardım Lazım
-
Ödevi tam yapamadım bi türlü. bukadarını yapa bildim ama düzgün çalışmıyor
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <stdio.h>
int krakteradet;//bu degisken benim istedeigim string adedini tutacak.
using namespace std;
int fnk(char *kdizi1,char *kdizi2)
{
int i,j;
for(int i=0;(strlen(kdizi1));i++) //1.krakter dizisinin 0. elemanindan kontrole basladm
for (int j=0;(strlen(kdizi2));j++)//2.krakter dizisinin 0. elemanindan kontrole basladm
if(kdizi1[i]!=kdizi2[j])//eger 1.stringin 0. elemani 2.stringin 0. elemanindan farkli ise
{
krakteradet++; //degiskenimi 1 artir böylece 1.dizide olan 2.dizice olmayan elemanlarin sayisini bulmus oluyorum.
}
return krakteradet;//degiskenimi gonder.
}
int main()
{
char kdizi1[0],kdizi2[0];
cout<<"1.Stringi Girin= ";
cin>>kdizi1;
cout<<"2.Stringi Girin = ";
cin>>kdizi2;
cout<<"\n\n1.Dizide olan 2.'de olmayan\nstring sayisinin degisken adresi= "<<krakteradet;//istedigim degeri tutan degiskenin adresini yazdiriyorum.
cin>>krakteradet;
system("PAUSE");
return EXIT_SUCCESS;
}------------------------------------------------
ÖDEV
İki karakter dizisini aşağıdaki şartlara göre karşılaştıran programı yazınız- kullanıcıdan istenen iki adet karakter dizisi karşılaştırılacaktır
-karşılaştırma işlemi bir fonksiyon ile gerçekleştirilecektir.
- fonksiyon argüman olarak karşılaştırılacak dizileri gösteren işaretçileri alacaktır
- fonksiyon 1. Dizide olup 2. Dizide olmayan karakterlerin adedini bulacak ve bulduğu sonucun tutulduğu değişkenin adresini geri döndürecektir
- fonksiyonun döndürdüğü işaretçinin içeriği (sonuç) ekrana yazdırılacaktır
-
// odev.cpp : main project file. #include "stdafx.h" #include <iostream> #include <cstring> #include <stdio.h> #include <conio.h> using namespace System; using namespace std; int adet=0; int fnk(char *dizi1, char *dizi2) { int i,k; for(i=0; i<sizeof(dizi1); i++) { for(k=0; k<sizeof(dizi2); k++) { if(*(dizi1 + i) == *(dizi2 + k)) adet++; } } adet = sizeof(dizi2) - adet - 1; return (int)&adet; } int main() { char kdizi1[3]; char kdizi2[3]; int adres; int *deger; cout << "1. karakteri girin: "; cin >> kdizi1[0]; cout << "2. karakteri girin: "; cin >> kdizi1[1]; cout << "3. karakteri girin: "; cin >> kdizi1[2]; cout << "İlk dizi tamamlandi. 2. dizi için 1. karakteri girin: "; cin >> kdizi2[0]; cout << "2. karakteri girin: "; cin >> kdizi2[1]; cout << "3. karakteri girin: "; cin >> kdizi2[2]; adres = fnk(kdizi1,kdizi2); deger = (int*)adres; cout << "Adres: " << adres << endl; cout << "1. dizide olup 2. dizide olmayan karakter adedi: " << *deger << endl; getch(); return 0; }
Nobel tarafından 14/Nis/13 21:56 tarihinde düzenlenmiştir -
hocam düzenledim
"- fonksiyonun döndürdüğü işaretçinin içeriği (sonuç) ekrana yazdırılacaktır"bunu görmemişim.
-
hocam öncelikle eline koluna sağlık
denedim kodları"#include <stdafx.h>
using namespace system;"buralarda hata veriyor
Webci58 tarafından 14/Nis/13 21:40 tarihinde düzenlenmiştir
Edit: silip çalıştırdığımda çalışıyor ama sonuç doğru değil gibi çünki çoğu denemede hep 2 çıktı ve adres aynı -
hocam bnede visual c++ var onda tanımlı ondandır. ne yazıyorsun karakterlere?
-
C (ve bu bağlamda C++'de) iki tür veri vardır: Skaler ve agregat.
İşlevden geri döndürdüğünüz int tipi skalerdir (değer tipidir). Oluşturduğunuz int tipi değişkenin ömrü o işlev içinde sınırlı olduğundan return ile kullandığınız her koşulda referans ya da işaretçi aracılığı yerine kopyalanarak geçecektir. Bir örnek:
int * fnc()
{
int i = 2132;
return &i;
}
örneğinde i'nin adresinin geri döndürüleceğini düşünürüz fakat i değişkeninin ömrü fnc işlevi'nin etki alanıyla sınırlıdır. fnc işlevinden çıkıldığında i değişkeni kalmaz. Kod yine çalışır fakat i'nin değeri kopyalanmıştır. Örneği şu şekilde değiştirirsek:
int * fnc()
{
int * i = (int*)malloc(sizeof(int)); //ya da int * i = new int(2132);
*i = 2132;
return i;
}
i, dinamik bellek yönetimi ile oluşturulduğundan (açıkça aksi belirtilene dek yaşamaya devam edecektir) i'yi işaretçi ile aktarabiliriz.
Bu bağlamda istenen şeyin bir sayı değil de karakterleri gösteren bir dizi olduğunu anlayabiliriz. Açıklamalarım doğrultusunda yazdığım örneği sizinle paylaşıyorum:
#include <cstdlib> #include <iostream> #include <cstring> using namespace std; bool HarfVarMi(const char * samanlik, char igne) { size_t uzunluk = 0; uzunluk = strlen(samanlik); for (int i = 0; i < uzunluk; ++i) { if ( *(samanlik + i) == igne) { return true; } } return false; } char * Farklar(const char * birinci, const char * ikinci) { size_t birinciuzunluk = 0; size_t ikinciuzunluk = 0; birinciuzunluk = strlen(birinci); ikinciuzunluk = strlen(ikinci); char * gecicifark = (char *)malloc(sizeof(char) * birinciuzunluk + 1); if(gecicifark == NULL) { cerr << "Bellek ayrilamadi!"; abort(); } int t = 0; char arabellek = 0; for (int i = 0; i < birinciuzunluk; ++i) { arabellek = *(birinci + i); if ( HarfVarMi(ikinci, arabellek) == false) { *(gecicifark + t) = arabellek; ++t; } } gecicifark = (char *) realloc(gecicifark, t + 1); if (gecicifark == NULL) { cerr << "Bellek yonetimi hatasi!"; abort(); } *(gecicifark + t) = 0; return gecicifark; } int main(int argc, char *argv[]) { cout << Farklar("abcdefg", "aecdg"); cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS; }
-
Nobel bunu yazdı
hocam bnede visual c++ var onda tanımlı ondandır. ne yazıyorsun karakterlere?
hocam bikaç deneme yaptım iki diziyede aynı karakterleri verince -1 çıkıyor, ikisinede hepsini farklı versem sonuç 2 çıkıyor.
-
YeniHarman bunu yazdı
C (ve bu bağlamda C++'de) iki tür veri vardır: Skaler ve agregat.
İşlevden geri döndürdüğünüz int tipi skalerdir (değer tipidir). Oluşturduğunuz int tipi değişkenin ömrü o işlev içinde sınırlı olduğundan return ile kullandığınız her koşulda referans ya da işaretçi aracılığı yerine kopyalanarak geçecektir. Bir örnek:
int * fnc()
{
int i = 2132;
return &i;
}
örneğinde i'nin adresinin geri döndürüleceğini düşünürüz fakat i değişkeninin ömrü fnc işlevi'nin etki alanıyla sınırlıdır. fnc işlevinden çıkıldığında i değişkeni kalmaz. Kod yine çalışır fakat i'nin değeri kopyalanmıştır. Örneği şu şekilde değiştirirsek:
int * fnc()
{
int * i = (int*)malloc(sizeof(int)); //ya da int * i = new int(2132);
*i = 2132;
return i;
}
hocam açıklamaların için sağol. bunuda bilgi edinmiş olduk.
-
Webci58 bunu yazdıNobel bunu yazdı
hocam bnede visual c++ var onda tanımlı ondandır. ne yazıyorsun karakterlere?
hocam bikaç deneme yaptım iki diziyede aynı karakterleri verince -1 çıkıyor, ikisinede hepsini farklı versem sonuç 2 çıkıyor.
yukardaki -1 i sil adet = kısmındaki. derleyiciden derleyiciye farklı oluyor demek ki, yine hatalı alacak büyük ihtimalle size ı sende 1 eksik alıyor bendekinden şöyle düzenle
for(i=0; i<sizeof(dizi1)+1; i++)
{
for(k=0; k<sizeof(dizi2)+1; k++)
{
if(*(dizi1 + i) == *(dizi2 + k))
adet++;
}
}@YeniHarman
Nobel tarafından 14/Nis/13 21:53 tarihinde düzenlenmiştir
hocam çok güzel yazmıssın kodları ama ödev diyor adam hocası yermi sence onun yaptığını bu kodları? -
tamamdır hocam çözüldü sorun, ama hocaya sordum ödev sayı değilde karakter yani 1. dizi ahmet 2. dizi ali şeklinde olacak ve harfleri karşılaştıracakmış
-
Webci58 bunu yazdı
tamamdır hocam çözüldü sorun, ama hocaya sordum ödev sayı değilde karakter yani 1. dizi ahmet 2. dizi ali şeklinde olacak ve harfleri karşılaştıracakmış
bir öyle bakayım o zaman harfte girsen çalısıyor o da tek girmek gerekiyor.