Tam Sürümünü Görmek İçin : function ve asal sayı
zeynepyaprak
04/04/2007, 21:18
merhaba,
asal sayılarla ilgili bir ödev yapmam gerekiyor ve ben her zamanki gibi yine bir yerde takıldım.
Aşağıdaki program bir sayının asal mı değil mi olduğunu söylüyor.
-------------------------------------------------
#include <iostream>
using namespace std;
bool isprime( int n );
int main()
{
bool prime;
int n;
cout << "Input a positive integer: " << flush;
cin >> n;
prime = isprime( n );
if( prime )
cout << n << " is prime " << endl;
else
cout << n << " is not prime " << endl;
system("pause");
return 0;
}
bool isprime( int n )
{
int d = 2; // potential divisor of n
bool prime = true; // we assume that n is prime unless we have good reason to state the contrary
if( n == 1 )
prime = false; // 1 is not prime
while( d < n )
{
if( !( n % d ) ) // same as ( n %d == 0 )
prime = false;
d++;
}
return prime;
}
-------------------------------------------
benim yapmam gereken program ise bundan biraz farklı. girilen bir integerı inceleyecek, asalsa onu ekrana yazacak, değilse ondan bir sonraki asal sayıyı ekrana yazıcak.
mesela 2 girdiniz, 2 yazacak
mesela 15 girdiniz ekrana 17 yazacak.
Ancak hoca
int main()
bölünden önce bir function ile bunu yazmamızı istiyor. Son lecture lara girmediğimden bu function konusunu pek anlıyamadım. Bu konuda neler söyliyebilirsiniz ? şimdiden teşekkür ederim.
#include <iostream>
using namespace std;
// use the function isPrime introduced during the lectures
//********************************************//
// Write the prototype of isPrime here //
//********************************************//
int main()
{
int n;
cout << "Enter an integer: " << flush;
cin >> n;
// **************************************** //
// Write your code below //
// Do not modify the rest of the file //
CompEngineer
04/04/2007, 22:21
dur tahmin edeyim itu den sin
sana yardimci olurdum ama burada full odev cozumu vermek yasak
biraz cik kendin ugras takildigin yeri sor malesef forum da full odev cozumu vermek yasak
ayrica biraz karmasik aciklamissin odevin tamamini kod seklinde gomup verirsen sevinirim
acehreli
04/04/2007, 23:28
Prototype, islevin bildirimi oluyor. C turevi dillerde bir ismi kullanmadan once onun ne oldugunu bildirmen gerekir. Onun icin, isprime'in ne oldugunu su satirla bildiriyorsun (bu zaten verdigin ilk ornekte de var):
bool isprime( int n );
Yani senin dusundugun gibi main'den once bir islevle yazmaya gerek yok.
Elinde zaten isprime islevi olduguna gore; yapman gereken aslinda cok kolay: sana verilen sayidan itibaren birer birer arttirarak isprime bulana kadar denemek. (Bu aslinda sorunun metninden de anlasiliyor.)
Ali
Not: Dogrudan odev cozumleri konusunda eskisinden daha duyarli olmamizin nedenlerinden birisi, bu forumlari ogretmenlerin de okuyor olmasi. Yani olayin ahlaki, sosyal, ekonomik, vs. gibi etkileri yaninda can yakici etkileri de var :D
mesela 2 girdiniz, 2 yazacak
Aslinda 2 bir asal sayidir. Yani 2 girdinizmi 3 yazmasi lazim:)
acehreli
05/04/2007, 04:43
Girilen asalsa onu yazmasini istiyorlar; asal degilse sonraki asal isteniyor. Soyle soylenebilirmis: "Girilen sayiya esit veya ondan buyuk en kucuk asal sayi."
Ali
zeynepyaprak
05/04/2007, 06:51
CompEngineer --> tahmin edemedin itü de değilim, daha önce Boğaziçindeydim şu anda yurt dışındayım.
acehreli --> hocaların bu formu takip etmesi konusunda endişe etmeyin, bizim hocalar Türkçe bilmiyor :) Şaka bir yana aciklamalarin cok faydali oldu, birazdan dediklerini yapmaya calisacagim.
Sabahi --> 2 yazinca 2 yazmasi gerekiyor.
gorusmek uzere.
Sabahi --> 2 yazinca 2 yazmasi gerekiyor.
Gozlugumu takmadan okumusum belli:)
zeynepyaprak
06/04/2007, 08:22
Dün ödevimin son teslim günüydü, sizlerin tavsiyelerine uymaya çalıştım ancak while döngüsü ile bir türlü programı yazamadım.
Hazırlamak zorunda olduğum bu program haftalık bir alıştırma ve toplam nota etkisi %1. o yüzden hoca öğrencilerin gönderdiği cpp dosyasını otomatik olarak çalıştırıyor ve rastgele girilen inputların outputları doğru ise tam puan veriyor. Bende biraz uyanıklık yaptım ve aşağıdaki saçma sapan programı yazdım. Program saçma ama 7-8 basamaklı sayılara kadar doğru asal sayıyı veriyor :) sonuçta hoca programın içine bakmayacak ve output lar doğru çıkacağı için ben tam puan alıcam.
Şimdi gelelim esas konumuza. Bu döngüyü while ile ya da başka bir döngü ile nasıl yapabilirim ? Bu konudan notu aldım sayılır ama konuyu tam öğrenemdim.
#include <iostream>
using namespace std;
bool isprime( int n );
int main()
{
int n;
cout << "Enter an integer: " << flush;
cin >> n;
if ( isprime (n) )
cout << n << endl;
else if ( isprime (n+1) )
cout << n+1 << endl;
else if ( isprime (n+2) )
cout << n+2 << endl;
else if ( isprime (n+3) )
cout << n+3 << endl;
else if ( isprime (n+4) )
cout << n+4 << endl;
else if ( isprime (n+5) )
cout << n+5 << endl;
else if ( isprime (n+7) )
cout << n+7 << endl;
else if ( isprime (n+8) )
cout << n+8 << endl;
else if ( isprime (n+9) )
cout << n+9 << endl;
else if ( isprime (n+10) )
cout << n+10 << endl;
else if ( isprime (n+11) )
cout << n+11 << endl;
else if ( isprime (n+12) )
cout << n+12 << endl;
else if ( isprime (n+13) )
cout << n+13 << endl;
else if ( isprime (n+14) )
cout << n+14 << endl;
else if ( isprime (n+15) )
cout << n+15 << endl;
else if ( isprime (n+16) )
cout << n+16 << endl;
else if ( isprime (n+17) )
cout << n+17 << endl;
else if ( isprime (n+18) )
cout << n+18 << endl;
else if ( isprime (n+19) )
cout << n+19 << endl;
else if ( isprime (n+20) )
cout << n+20 << endl;
else if ( isprime (n+21) )
cout << n+21 << endl;
else if ( isprime (n+22) )
cout << n+22 << endl;
else if ( isprime (n+23) )
cout << n+23 << endl;
else if ( isprime (n+24) )
cout << n+24 << endl;
else if ( isprime (n+25) )
cout << n+25 << endl;
else if ( isprime (n+26) )
cout << n+26 << endl;
else if ( isprime (n+27) )
cout << n+27 << endl;
else if ( isprime (n+28) )
cout << n+28 << endl;
else if ( isprime (n+29) )
cout << n+29 << endl;
else if ( isprime (n+30) )
cout << n+30 << endl;
system("pause");
return 0;
}
bool isprime( int n )
{
int d = 2; // potential divisor of n
bool prime = true; // we assume that n is prime unless we have good reason to state the contrary
if( n == 1 )
prime = false; // 1 is not prime
while( d < n )
{
if( !( n % d ) ) // same as ( n %d == 0 )
prime = false;
d++;
}
return prime;
}
myavuzselim
06/04/2007, 13:46
while(! isprime(n)) n++;
Bir ipucu vereyim. Dongu sona erdiginde dongudeki sartin tam tersi gecerlidir. Yani yukaridaki dongu sona erdiginde isprime(n) gecerli olacaktir.
acehreli
06/04/2007, 19:42
zeynepyaprak, bu senin icin cok guzel bir ogrenme deneyimi oldu... Dongulerin degerini guzel bir deneyimle anlamis oldun. :)
Bu arada, her sayinin kendisinden 30 sonrasina kadar bir asal sayi oldugu kesin mi? ;)
Ali
zeynepyaprak
07/04/2007, 16:03
valla 30 a kadar 7-8 basamaklı sayıların asal sayılarını buluyordu. ancak hoca 9-10 basamaklı bir sayı girerse 30 yetmez :) kader artık, sonucu yine buraya yazacağım... bir kaç gün içinde belli olur...
acehreli
08/04/2007, 04:37
Simdi biraz baktim ve tam bu konuya deginen bir sayfa buldum:
http://primes.utm.edu/notes/gaps.html#table
Sandigim kadar fazla aralik yokmus. Senin programinin dogru calismayacagi bir deger, 1328. Program 1358'e kadar deneyip vazgececek. Halbuki 2 sayi daha denese... :)
Ali
zeynepyaprak
09/04/2007, 18:17
Sonuç aşagida, 19610 da program calismamis gozukuyor. ben denedigimde 19661 diye hemen sonucu verdi ama asagida neden boyle olmus anlamadim... neyse 0 almaktan iyidir, dimi ama :)
----------------------------------------------------------------
Automarking of practical task: prime.cpp
Program compiled: 2 marks out of 2
************************************************** *******************
Note: The format of the output is slightly different from the examples given on the web
since the values are not entered manually from the keyboard but come from a file.
Your output is compared to the correct output generated in the same way
So if your output was conform to the examples given on the web, you will get full marks
************************************************** ***************
---------------------------------------------------
Test 1
INPUT
2
Perfect match: 3 marks out of 3
---------------------------------------------------
Test 2
INPUT
17
Perfect match: 3 marks out of 3
---------------------------------------------------
Test 3
INPUT
63
Perfect match: 3 marks out of 3
---------------------------------------------------
Test 4
INPUT
114
Perfect match: 3 marks out of 3
---------------------------------------------------
Test 5
INPUT
4233
Perfect match: 3 marks out of 3
---------------------------------------------------
Test 6
INPUT
19610
What was expected
Enter an integer: 19661
Here is the output of your program
Enter an integer:
Output does not match: 0 mark out of 3
************************************************** **************
Automarking: your total score is 17 out of 20
************************************************** ************
acehreli
09/04/2007, 22:15
Yukarida konusmustuk ya... Senin program verilen sayinin 30 sonrasina kadar bakiyor. Halbuki 19661'e 19610'dan baslayarak varmasi icin 51 kere arttirmasi gerekirdi. :)
myavuzselim'in gosterdigi guzel cozumu uygulayinca bak main islev ne kadar hos ve "dogru" oluyor:
int main()
{
int n;
// [Ali] Burada flush'a gerek yok. cout, cin'e std::tie ile "baglanmistir". cin
// kullanilmaya baslaninca cout zaten flush edilir.
cout << "Enter an integer: " << flush;
cin >> n;
while (!isprime(n)) ++n;
cout << n << endl;
return 0;
}
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.