Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
4171
Cevap
168300
Tıklama
3
Öne Çıkarma
Cevap: C/C++/C# Sorularınız Buraya. . .(GÜNCEL) (66. sayfa)
V
12 yıl
Yüzbaşı

quote:

Orijinalden alıntı: elektro_gadget

quote:

Orijinalden alıntı: vitex

Aşağıda verdiğim kodlar normalde bir programın parçası. Ancak bu bölüm programı çok yavaşlatınca, ayırıp tek program yapıp sorunu anlamaya çalışıyorum. Ancak programı bu kadar yavaşlatan şeyin ne olduğunu bir türlü bulamadım. Program 200000 den daha uzun bir karakter dizisinde c ve g karakterlerini arıyor bulduğunda bunların yerini yerler değişkenine atıyor, c ve g karakterlerini de büyük yapıyor. Aslında son derece basit bir kod ama bana kafayı yedirecek. Eğer dizi değişkeni ile ilgili farklı bir işlem yaparsam (yazdırmak gibi) çalışma süresi değişiyor. Bazen 1 sn daha az sürede tamamlarken basit bir değişiklik ile 4-5 sn civarına çıkıyor. Bu konuda bir fikri olan varsa duymak isterim.


Normal o kadar çıkması. Ama süreyi kısaltacak birkaç ipucu verebilirim.

Dizi boyutu 1-2 mb ı geçmediği sürece yerel olarak ayırmak. Bu, malloc ile alınmış olandan biraz daha hızlı çalışır. Yani;
dizi=(char *)malloc(300000); yerine
char dizi[300000];

Dosyayı açtıktan sonra büyükçe bir tampon bellek vermek.
FILE *gr = fopen(...);
char buffer[32 * 1024];
setvbuf(gr, buffer, _IOFBF, 32 * 1024);

Dosyayı byte byte okumak yerine tek seferde alıp diziye atmak.
fread((void *) dizi, 1, 300000, gr);

c ve g karakterlerini ayrı ayrı kontrol etmek yerine tek sefere indirmek. Yani if(*(dizi+i)=='c' && *(dizi+i+1)=='g') yerine
const short cg = 25447; // Bu sayının ilk byte ı 'c', ikinci byte ı 'g'.

if(*((short *) dizi + i) == cg)
...

Aklıma gelenler bunlar. Şimdi bunlar içinde süre alacak olan sadece cg kontrolü. Ortalama 150000 karşılaştırma yapıyor. Eğer diziyi dosya yapısını bozmadan sıralayacak bir yöntem bulunursa ikili arama ile bu son tıkanıklıkta giderilebilir.

Cevap için teşekkürler. Dizi gb'lara yaklaşabiliyor bazen, o yüzden mümkün değil. Normalde dosyadan satır satır okunuyor (ve öyle olması gerekiyor), onda sıkıntı yok. Asıl sorun kodların kararsız olması. Aynı işlem bazen 1 sn'de bazen 5 sn'de oluyor. Örnek olarak fprintf(ds,"\n\n%s\n\n",dizi); koduyla diziyi yazdırırsam (bu yazdırma kısmı hariç) 4-5 sn olurken o kodu iptal ettiğimde bazen 1 sn'de tamamlıyor. Yada aynı boyutta bellek ayrılmış 2. bir diziye *(dizi2+i)='C';*(dizi2+i+1)='G' şeklinde yaparsam veya oradaki *(dizi+i)='C';*(dizi+i+1)='G' kodunu tamamen iptal edersem yine 1 sn de tamamlıyor. Mantıklı bir açıklama getiremedim yani. Aynı işlem için 4-5 kat fark olması ? (Tabi bu sürelere dosyadan okuma, dosyaya yazma süreleri dahil değil, onlar ciddi bir zaman almıyorlar.) Sanki başka birşeyler programın çalışmasını etkiliyor gibime geliyor ya çözemedim işte!


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

quote:

Orijinalden alıntı: vitex

Cevap için teşekkürler. Dizi gb'lara yaklaşabiliyor bazen, o yüzden mümkün değil. Normalde dosyadan satır satır okunuyor (ve öyle olması gerekiyor), onda sıkıntı yok. Asıl sorun kodların kararsız olması. Aynı işlem bazen 1 sn'de bazen 5 sn'de oluyor. Örnek olarak fprintf(ds,"\n\n%s\n\n",dizi); koduyla diziyi yazdırırsam (bu yazdırma kısmı hariç) 4-5 sn olurken o kodu iptal ettiğimde bazen 1 sn'de tamamlıyor. Yada aynı boyutta bellek ayrılmış 2. bir diziye *(dizi2+i)='C';*(dizi2+i+1)='G' şeklinde yaparsam veya oradaki *(dizi+i)='C';*(dizi+i+1)='G' kodunu tamamen iptal edersem yine 1 sn de tamamlıyor. Mantıklı bir açıklama getiremedim yani. Aynı işlem için 4-5 kat fark olması ? (Tabi bu sürelere dosyadan okuma, dosyaya yazma süreleri dahil değil, onlar ciddi bir zaman almıyorlar.) Sanki başka birşeyler programın çalışmasını etkiliyor gibime geliyor ya çözemedim işte!


Kodu küçük fonksiyonlara ayırıp -pg opsiyonu ile derlersen gprof aracı hangi fonksiyonun ne kadar oyalandığını gösterebilir. Tabi bunlar derleyici gcc ise geçerli.
Böylece programın tamamında iz sürmek yerine sadece şüpheli fonksiyonları takibe alabilirsin.
http://www.network-theory.co.uk/docs/gccintro/gccintro_80.html

Birde programın çalışma zamanını ölçmek için arka arkaya birkaç kez çalıştır ve ortalamasını al. Bir süre geçtikten sonra ilk çalıştırmayı buna dahil etme o yanıltıcı olur. Mesela işletim sistemi harddisk i uykuya aldıysa ilk erişim oldukça uzun sürer. Veya işlemciyi güç koruma moduna geçirdiyse normal frekansına geçene kadar yavaş çalışır.





< Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 1 Mart 2013; 22:13:15 >
Bu mesaja 1 cevap geldi.
V
12 yıl
Yüzbaşı

quote:

Orijinalden alıntı: elektro_gadget

Kodu küçük fonksiyonlara ayırıp -pg opsiyonu ile derlersen gprof aracı hangi fonksiyonun ne kadar oyalandığını gösterebilir. Tabi bunlar derleyici gcc ise geçerli.
Böylece programın tamamında iz sürmek yerine sadece şüpheli fonksiyonları takibe alabilirsin.
http://www.network-theory.co.uk/docs/gccintro/gccintro_80.html

Birde programın çalışma zamanını ölçmek için arka arkaya birkaç kez çalıştır ve ortalamasını al. Bir süre geçtikten sonra ilk çalıştırmayı buna dahil etme o yanıltıcı olur. Mesela işletim sistemi harddisk i uykuya aldıysa ilk erişim oldukça uzun sürer. Veya işlemciyi güç koruma moduna geçirdiyse normal frekansına geçene kadar yavaş çalışır.

Olmazsa bir de gcc ile denerim, normalde Visual Studio kullanıyorum. Zaten kodlarda zaman ölçümü yapıyorum ve asıl zamanı diziyi tarattığım o iki satır alıyor. Durmadan deneme yaptığım için de uyku modu söz konusu değil, saatlerce farklı şeyler deneyince uyumasına fırsat kalmıyor. Aklımda farklı derleyiciyle deneyip sonucu görmek vardı, en kolay gcc ile denerim herhalde.


Bu mesaja 1 cevap geldi.
M
12 yıl
Teğmen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void *ADDint(void *dataptr1,void *dataptr2){
void *sum=(int*)malloc(sizeof(int));
*sum=*(int*)dataptr1+*(int*)dataptr2;
return sum;
}
void *ADDstr(void *dataptr1,void *dataptr2){
char *str=(char*)malloc(sizeof(char)*33);
int i=0;
int j=0;
while (((char*)dataptr1)!='\0'){
str=((char*)dataptr1);
i++;
}
while(((char*)dataptr2)[j]!='\0'){
str[j]=((char*)dataptr2)[j];
i++;
j++;
}
str[i+1]='\0';
return (int*)i;
}
void* sumOp(void* dataptr1,void* dataptr2,void * (*ptrToAddFun)(void*, void*)){
return (*ptrToAddFun)(dataptr1, dataptr2);
}

int main(void)
{
char str1[99] = "kurtarin";
char str2[99] = "beniii";
char *string = NULL;
int sum = 0;
int i=33;
int y=35;
sum=*(int *)sumOp((void*)i, (void*)y,ADDint);
string=(char*)sumOp(str1, str2,ADDstr);

printf("Sum: %d\nString: %s\n",sum, string);

return 0;
}
hatayı bulamadım yardımm lutfen ustalar..


Bu mesaja 1 cevap geldi.
G
12 yıl
Teğmen

Arkadaşlar lisede turbopascal, c, c++, c# görmüştüm şuan visual studio 2008 i yüklüyorum size bir sorum olacak bu program ile tekrar eden bir makro programı yapabilirmiyim örneğin 10 saniyede 1 klavyeden 1 tuşuna basacak vb.


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

Notepad ile .cs dosyasını oluşturuyorum, sonra cmd ile açıyorum fakat .exe dosyasını oluşturmuyor, vista kullanıyorum, daha en baştan böyle saçma sapan birşey yüzünden soğumuş durumdayım.


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

quote:

Orijinalden alıntı: Halleluja

Notepad ile .cs dosyasını oluşturuyorum, sonra cmd ile açıyorum fakat .exe dosyasını oluşturmuyor, vista kullanıyorum, daha en baştan böyle saçma sapan birşey yüzünden soğumuş durumdayım.

compiler kullanmanız lazım. önerin code:blocks gibi bir ide kullanmanız



S
12 yıl
Er

Öncelikle merabalar ben if else yapısını bi türlü kavrayamadımda acaba bu yapıyı kavrayabileceğim bir link veya bir yazı vb. birşey atabilirmisiniz teşekkür ederim saygılarımla:)

Birde aklıma gelmişken kütüphane konusunuyla ilgili bilgileriniz var ise paylaşmanızı isterim:).Ben dev c++ kullanıyorum ve hangi tür kütüphanelerin oldugunu hiç bilmiyorum daha yeni başladım anlmışsınızdır zaten:)





< Bu mesaj bu kişi tarafından değiştirildi s.engineer -- 4 Mart 2013; 16:22:56 >

A
12 yıl
Yüzbaşı

X
12 yıl
Yüzbaşı

Merhaba arkadaşlar c#'ta girilen metinle ilgili bilgileri ekrana yazdırdım ama girilen metnin içindeki sesli harfleri çıkarıp yeni metni ekrana nasıl yazdırabilirim,onu yapamadım

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
string a;
int i = 0, j = 1, sessiz = 0;
Console.Write("Cümleyi Girin:");
a = Console.ReadLine();
int c = a.Length;
foreach (char b in a)
{
if (b == 'a' || b == 'e' || b == 'ı' || b == 'i' || b == 'o' || b == 'ö' || b == 'u' || b == 'ü')
i++;
else if (b != ' ')
sessiz++;
if (b == ' ')
j++;

}
Console.WriteLine("Girdiğiniz Cümlede/kelimede {0} Adet Sesli Harf Vardır.", i);
Console.WriteLine("Girdiğiniz Cümlede/kelimede {0} Adet Sessiz Harf Vardır.", sessiz);
Console.WriteLine("Girdiğiniz Cümle {0} Kelimeden Oluşmaktadır", j);
Console.WriteLine("Girdiğiniz Cümle {0} Harften Oluşmaktadır", c);
Console.WriteLine("Girdiğiniz Cümle/Kelime {0} dır.", a);
Console.ReadKey();
}
}
}




E
12 yıl
Çavuş

C de önceden boyutu bilmeden(kullanııcı belirleyecek) nasıl boyutunu tanımlarız.
 
#include<stdio.h>
#include<conio.h>
void ortalama(int sayilar[][])
{
int i, j, toplam;
float ort;
for(i=0; i<n; i++){
for(j=0; j<m; j++){
toplam=toplam+sayilar[i][j];
}
}
ort=(float)toplam/(float)(m*n);
printf("Ortalama=%.2f", ort);
}
main()
{
int sayilar[][];
printf("Dizi boyutlari:");
scanf("%d%d", &n, &m);
ortalama(sayilar);
getch();
}



Bu mesaja 2 cevap geldi.
B
12 yıl
Yüzbaşı

hangi işlemde hata yapıyorum sonuç yanlış çıkıyor çözemedim yarım saattir?
 

#include <stdio.h>
#include <iostream.h>

int sayilar()
{
int a,b;
cout<<"lutfen 1. sayiyi giriniz:";
cin>>a;
cout<<"lutfen 2.sayiyi giriniz:";
cin>>b;
return a,b;
}
int ebob(int k,int l)
{
int ek,i,obeb;
if(k<l)
{ek=k; }
else
{ek=l; }
for(i=2;i<=ek;i++)
{
if(k%i==0&&l%i==0) {obeb=i;}
}
return obeb;
}
void yazdirma(int obeb)
{
cout<<"Obeb="<<obeb<<endl;
}
int main()
{
int obeb,f[1],c;
f[1]=sayilar();
c=ebob(f[0],f[1]);
yazdirma(c);

system("PAUSE");
}





< Bu mesaj bu kişi tarafından değiştirildi bersis576 -- 5 Mart 2013; 21:19:28 >
Bu mesaja 2 cevap geldi.
S
12 yıl
Teğmen

arkadaşlar proğram c ile yazılması lazım ve -2,-1,0,1,2 yani -2 ve 2 aralığının dışında girilen her sayı için tekrar deneyiz diye hata vermesi lazım kodu yazabilecek var mı? yardım lütfen


Bu mesaja 1 cevap geldi.
H
12 yıl
Binbaşı

Bir proje ödevim var 2 adet isim soy isim girilebilecek 2 adet cep telefon kaydı yapılabilecek 2 adet faks numarası eklenecek bu veriler veritabanında saklanabilecek istendiginde sonradan ekleme çıkarma düzeltme silme gibi işlemlere olanak tanıyacak şekilde c# veya .net ile fihrist yapmam gerekiyor ağ üzerine okudum hiç bişi bilmiyorum nasıl bir yol izlemeliyim ne yapmalıyım yardımcı olabilicek yol göstericek biri varsa ögrenmeye hazirim teşekkürler.



G
12 yıl
Yüzbaşı

quote:

Orijinalden alıntı: ebubekir.s

C de önceden boyutu bilmeden(kullanııcı belirleyecek) nasıl boyutunu tanımlarız.
 
#include<stdio.h>
#include<conio.h>
void ortalama(int sayilar[][])
{
int i, j, toplam;
float ort;
for(i=0; i<n; i++){
for(j=0; j<m; j++){
toplam=toplam+sayilar[i][j];
}
}
ort=(float)toplam/(float)(m*n);
printf("Ortalama=%.2f", ort);
}
main()
{
int sayilar[][];
printf("Dizi boyutlari:");
scanf("%d%d", &n, &m);
ortalama(sayilar);
getch();
}




C dedigin icin malloc/free ama pek onerilmez. new/delete C++ kutuphanesinde bulunur ve daha cok tercih edilir.

malloc/free :http://www.cplusplus.com/reference/cstdlib/malloc/
new/delete :http://www.cplusplus.com/reference/new/operator%20new[]/



G
12 yıl
Yüzbaşı

quote:

Orijinalden alıntı: bersis576

hangi işlemde hata yapıyorum sonuç yanlış çıkıyor çözemedim yarım saattir?
 

#include <stdio.h>
#include <iostream.h>

int sayilar()
{
int a,b;
cout<<"lutfen 1. sayiyi giriniz:";
cin>>a;
cout<<"lutfen 2.sayiyi giriniz:";
cin>>b;
return a,b;
}
int ebob(int k,int l)
{
int ek,i,obeb;
if(k<l)
{ek=k; }
else
{ek=l; }
for(i=2;i<=ek;i++)
{
if(k%i==0&&l%i==0) {obeb=i;}
}
return obeb;
}
void yazdirma(int obeb)
{
cout<<"Obeb="<<obeb<<endl;
}
int main()
{
int obeb,f[1],c;
f[1]=sayilar();
c=ebob(f[0],f[1]);
yazdirma(c);

system("PAUSE");
}



Bir cok yerde yanlis var. Nerden baslasak nasil anlatsak durumu. Oncelikle array nedir bir daha bakmani oneririm. sonra bir fonksiyon oyle sak diye return a,b; donmez. reference pointer pair tuple struct tarzinda yontemler ile coklu donus yapabilirsin.
En basitinden pointer ornegi koydum, uzunluga bakmiyor ve tehlikeli :)

 
#include <iostream>

using namespace std;

int *sayilar()
{
int *x = new int[2];
x[0]=15;
x[1]=20;
return x;
}
int ebob(int k,int l)
{
int ek,i,obeb;
if(k<l)
{ek=k; }
else
{ek=l; }
for(i=2;i<=ek;i++)
{
if(k%i==0&&l%i==0) {obeb=i;}
}
return obeb;
}
void yazdirma(int obeb)
{
cout<<"Obeb="<<obeb<<endl;
}
int main()
{
int obeb,c;
int *f=sayilar();
cout << f[0] << " " << f[1] << endl;
c=ebob(f[0],f[1]);
yazdirma(c);

system("PAUSE");
return 0;
}



referans tarzi:

void sayilar(&a,&b) { ... }

int main()
{
int x,y; sayilar(x,y);
return 0;
}

pointer tarzi :

void sayilar(*a,*b) { ... }
int main()
{
int x,y; sayilar(&x,&y);
return 0;
}

vs ...


Bu mesaja 2 cevap geldi.
A
12 yıl
Er

Arkadaşlar ben C dilinde yeniyim bir kodda randomize() kullanırken tanımlanmamıs hatası alıyorum acaba yeni bir kütüphane mi eklemem gerekiyor? kod aşağıdaki gibi ama n(i) ler dizi önizlemede orda köşeli parentezler çıkmıyor..

Yardımlarınız için teşekkürler...

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

main()
{
int n[10],i;
randomize();
for(i=0;i<=9;i++){
n(i) =rand();
printf("%d\n"), n(i);

}
getch();
}



G
12 yıl
Yüzbaşı

quote:

Orijinalden alıntı: arayanbilge

Arkadaşlar ben daha yeniyim C dilinde randomize() kullandığımda tanımlanmamış hatası alıyorum acaba ayrı bir kütüphane eklememiz gerekiyormu ?
Yardımlarınız için teşekkürler

randomize() ???

http://www.cplusplus.com/reference/cstdlib/rand/?kw=rand


Bu mesaja 1 cevap geldi.
A
12 yıl
Er

quote:

Orijinalden alıntı: garui

quote:

Orijinalden alıntı: arayanbilge

Arkadaşlar ben daha yeniyim C dilinde randomize() kullandığımda tanımlanmamış hatası alıyorum acaba ayrı bir kütüphane eklememiz gerekiyormu ?
Yardımlarınız için teşekkürler

randomize() ???

http://www.cplusplus.com/reference/cstdlib/rand/?kw=rand


Usta sağolasın da bunun iki türlü kullanımı var benim koddaki gibi geçerli olmamasının sebebini biliyomusun ?


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

quote:

Orijinalden alıntı: garui

quote:

Orijinalden alıntı: bersis576

hangi işlemde hata yapıyorum sonuç yanlış çıkıyor çözemedim yarım saattir?
 

#include <stdio.h>
#include <iostream.h>

int sayilar()
{
int a,b;
cout<<"lutfen 1. sayiyi giriniz:";
cin>>a;
cout<<"lutfen 2.sayiyi giriniz:";
cin>>b;
return a,b;
}
int ebob(int k,int l)
{
int ek,i,obeb;
if(k<l)
{ek=k; }
else
{ek=l; }
for(i=2;i<=ek;i++)
{
if(k%i==0&&l%i==0) {obeb=i;}
}
return obeb;
}
void yazdirma(int obeb)
{
cout<<"Obeb="<<obeb<<endl;
}
int main()
{
int obeb,f[1],c;
f[1]=sayilar();
c=ebob(f[0],f[1]);
yazdirma(c);

system("PAUSE");
}



Bir cok yerde yanlis var. Nerden baslasak nasil anlatsak durumu. Oncelikle array nedir bir daha bakmani oneririm. sonra bir fonksiyon oyle sak diye return a,b; donmez. reference pointer pair tuple struct tarzinda yontemler ile coklu donus yapabilirsin.
En basitinden pointer ornegi koydum, uzunluga bakmiyor ve tehlikeli :)

 
#include <iostream>

using namespace std;

int *sayilar()
{
int *x = new int[2];
x[0]=15;
x[1]=20;
return x;
}
int ebob(int k,int l)
{
int ek,i,obeb;
if(k<l)
{ek=k; }
else
{ek=l; }
for(i=2;i<=ek;i++)
{
if(k%i==0&&l%i==0) {obeb=i;}
}
return obeb;
}
void yazdirma(int obeb)
{
cout<<"Obeb="<<obeb<<endl;
}
int main()
{
int obeb,c;
int *f=sayilar();
cout << f[0] << " " << f[1] << endl;
c=ebob(f[0],f[1]);
yazdirma(c);

system("PAUSE");
return 0;
}



referans tarzi:

void sayilar(&a,&b) { ... }

int main()
{
int x,y; sayilar(x,y);
return 0;
}

pointer tarzi :

void sayilar(*a,*b) { ... }
int main()
{
int x,y; sayilar(&x,&y);
return 0;
}

vs ...


kardeş önceden belirlediğim 2 sayinin ebobunu alabiliyorum bende önemli olan dışardan sayılari istemek,ben hocanın bana gösterdiği şekilde yazdım hocanın yazdığı zaten çalışmıyoduda en son benimkini şekline getirebildim,bir çok yanlış var demişsin bana onları yazman mümkünmüdür çözümlerini söylemesende olur biraz uğraşmak istiyorum nereler hatalı yada ne kullanımı,bi yerde ebob yazıp obeb çağırmışım yazım hataları var ama diğer hataları göremiyorum cevabın içinde ayrıca teşekkür ederim.


Bu mesaja 1 cevap geldi.