Προς το περιεχόμενο

C++ Heeeeeeeelp


gherudos

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω να κάνω την εξής άσκηση:

Να δημιουργηθεί πρόγραμμα που να καταχωρεί σε μονοδιάστατο πίνακα 500 ακέραιους αριθμούς,από το 1 έως το 500.Το πρόγραμμα να εντοπίζει ποιοί από τους 500 αριθμούς είναι πρώτοι και να τους αντιγράφει σε ένα νέο μονοδιάστατο πίνακα.

Ως πρώτοι αριθμοί ορίζονται οι αριθμοί που διαιρούνται μόνο με το 1 και τον εαυτό τους,στην περίπτωση του 1 οι δύο αυτές ιδιότητες ταυτίζονται.

 

#include <iostream.h>

#include <stdlib.h>

main()

bool is_prime = true;

{

int A[500];

 

for(int i=1; i<=500; i++)

{

A[i-1]=i;

}

 

 

k=0;

for(int i=1; i<500; i++)

{

is_prime = true;

for(j=2; j<A; j++)

{

mod = A%j;

if(mod == 0)

{

is_prime = false;

break;

}

}

if(is_prime == true)

{

P[k]=A;

k++;

}

}

 

//elegxw an o pinakas enhmevthike me toys prwtous

//emfanizontas toys

cout<<"oi prwtoi poy vrethikan einai: "<<endl;

for(int i=0; i<k; i++)

{

cout<<P<<endl;

}

system("pause");

}

 

αν κάποιος γνωρίζει από πίνακες ας βοηθήσει διότι δεν μας τους εξήγησαν και πρέπει να παραδώσουμε την παραπάνω άσκηση και άλλες 3 μέχρι το σάββατο.

Ο κώδικας μου περιέχει αρκετά λάθη και δεν τρέχει.Βοηθήστε με να τον συμμαζέψω.

Δημοσ.

Προφανώς η άσκηση αυτή αφορά τους πρώτους αριθμούς. Πρέπει λοιπόν να αναζητήσεις το λήμμα: "Πρώτος αριθμός" στην ελληνική βικιπαίδεια:

[ http://el.wikipedia.org ].

Εκεί λοιπόν, μεταξύ άλλων θα διαβάσεις :

"Η εύρεση των πρώτων αριθμών απασχόλησε από την αρχαιότητα τους μαθηματικούς. Ένας από τους πιο απλούς αλλά και αργούς τρόπους για (μαζική) εύρεση πολλών πρώτων είναι το λεγόμενο κόσκινο του Ερατοσθένη: Στο σύνολο των φυσικών αριθμών - πρακτικά έως κάποιο μεγάλο αριθμό Ν - αρχίζουμε και αποκλείουμε πρώτα τα πολλαπλάσια του 2 μετά τα πολλαπλάσια του επόμενου μη διαγραμμένου αριθμού κ.ο.κ. έως το Ν. Παρατηρούμε ότι όλο και λιγότερους αριθμούς θα βρίσκουμε προς διαγραφή. Οι αριθμοί που θα απομείνουν είναι όλοι πρώτοι." ενώ δίπλα του θα τρέχει με πολλά χρώματα ένα παράδειγμα.

Από την εκφώνηση της η άσκηση αυτή "μυρίζει" κόσκινο του Ερατοσθένη. Ξεκίνα και λύνε αυτόν τον αλγόριθμο και εμείς εδώ είμαστε...

Δημοσ.

δεν νομιζω οτι επιτρεπεται αυτο που ζητας.

παντως απο την αρχη ο κωδικα σου εχει λάθη....προσεξε το λιγο παραπανω

Δημοσ.

Τελικά το έλυσα

 

#include <iostream.h>

#include <stdlib.h>

 

main()

{

int A[500];

int P[500];

int i,k,mod,j;

bool is_prime;

for( i=1; i<=500; i++)

{

A[i-1]=i;

}

 

 

k=0;

for( i=1; i<500; i++)

{

is_prime = true;

for(j=2; j<A; j++)

{

mod = A%j;

if(mod == 0)

{

is_prime = false;

break;

}

}

if(is_prime == true)

{

P[k]=A;

k++;

}

}

 

 

cout<<"The primary numbers that have been found are "<<endl;

for( i=0; i<k; i++)

{

cout<<P<<endl;

}

system("pause");

}

Δημοσ.

Ναι, αλλά διαιρείται και με το 2, άρα εξαρχής ξέρεις ότι δεν είναι πρώτος.

 

Αν το πάρεις λογικά, είναι δυνατόν μετά το sqrt(n) να υπάρχει αριθμός μετά από αυτό που να διαιρεί ακριβώς το n; Όχι, γιατί τότε εφόσον sqrt(n)^2 = n, n in N, θα υπήρχε αριθμός k τέτοιος ώστε (upper_bound(sqrt(n))+l)*k = n, με k<sqrt(n), τον οποίο έχεις ήδη ελέγξει.

 

ΥΓ δεν ξέρω πόσο μαθηματικά τεκμηριωμένο είναι, αλλά βγάζεις νόημα.

Δημοσ.

...μπορούμε να συζητήσουμε και με κώδικα. Επανέρχομαι στο πρόβλημα -χωρίς να το λύνω ΟΛΟ φυσικά- με τον ακόλουθο κώδικα:

 

>
#include <stdio.h>

int main(void) {
   int a[500], i, j;
   printf("Prime numbers with Eratosthenes Sieve:\n");
   for (i=0,j=2;i<500;)
       a[i++]=j++;
   for (i=0;i<500;i++)
       if (a[i]){
         printf(" %3d",a[i]);
         for (j=a[i]<<1;j<502;j+=a[i])
           a[j-2]=0;
       }
   printf("\nby Ch Iossif @ Dec 2006\n");
   return 0;
}

 

Εδώ εφαρμόζεται ο αλγόριθμος "κόσκινο του Ερατοσθένη: Στο σύνολο των φυσικών αριθμών - πρακτικά έως κάποιο μεγάλο αριθμό Ν - αρχίζουμε και αποκλείουμε πρώτα τα πολλαπλάσια του 2 μετά τα πολλαπλάσια του επόμενου μη διαγραμμένου αριθμού κ.ο.κ. έως το Ν. Παρατηρούμε ότι όλο και λιγότερους αριθμούς θα βρίσκουμε προς διαγραφή. Οι αριθμοί που θα απομείνουν είναι όλοι πρώτοι." και αυτόν ζητάει η άσκηση αυτή.

  • 3 εβδομάδες αργότερα...
Δημοσ.

ithela na rotiso kati pano se c++. kano compile sto dev C++ kai moy vgazei to eksis sfalma. 'string' does not name a type. pos orizetai to string stin c++; episis moy vgazei kai alla lathi stis grammes poy exo orisei mia metavliti string (missing ';' or ')' next name). opote kati me ton tipo ftaiei..

opoios mporei as voithisei.

eyxaristo.

Δημοσ.

Η κλάση string ζει στο namespace std.

Κάνε κάτι σαν το ακόλουθο:

>
#include <string>
using std::string

με το οποίο προσδιορόζεις οτι όπου χρησιμοποιηθεί μέσα στο αρχείο ο τύπος string αναφέρεται σε αυτόν της STL.

 

Namespaces in C++ - Introduction

 

A namespace is a scope. Namespaces are used to make logical groupings and to avoid potential naming conflicts within C++ applications. Use of namespaces incurs no overhead to application size or performance. To use the contents of a namespace, its contents or those parts of it that are required must be brought into current scope which can be achieved in a number of different ways:

 

eg. To bring an entire namespace into current scope, use the 'using' keyword, eg:

 

using namespace std;

 

This brings the whole of the standard template library (STL) into current scope. This is generally only used in examples; bringing the entire contents of such a namespace into current scope in this fashion defeats the purpose of namespaces. To bring a single namespace member into scope, the using keyword can be used to explicitly refer to that item, eg:

 

using std::string;

 

This brings the STL 'string' type into current scope. Alternatively you can simply declare your variable with full namespace syntax within code. eg:

 

std::string my_string;

 

This declares my_string as an object of the STL string type.

http://www.cprogramming.com/faq/cgi-bin/smartfaq.cgi?answer=1046398336&id=1043284351

Δημοσ.

σωστά τα λες, μόλις το άλλαξα και το όρισα απο την std και δουλεύει μια χαρά.

όμως μήπως ξέρεις τί σημαίνει το "[Linker error] undefined reference to 'WinMain@16' ld returned 1 exit status"

μάλλον είναι κάτι που οφείλεται στον τρόπο λειτουργίας του dev C++ , γιατί δεν αναφέρεται σε λάθος του κώδικα με διπλό κλικ

Δημοσ.
σωστά τα λες, μόλις το άλλαξα και το όρισα απο την std και δουλεύει μια χαρά.

όμως μήπως ξέρεις τί σημαίνει το "[Linker error] undefined reference to 'WinMain@16' ld returned 1 exit status"

μάλλον είναι κάτι που οφείλεται στον τρόπο λειτουργίας του dev C++ , γιατί δεν αναφέρεται σε λάθος του κώδικα με διπλό κλικ

 

OK, το βρήκα! Χρειαζόταν μία main.

 

Και τώρα κάτι καινούριο. Έχω ορίσει μία κλάση class1 και την υποκλάση της class2 ως εξής:

 

>class class2:public class1 {}

 

και παίρνω το εξής error:

expected class-name before '{' token

και ακόμη στο σημείο που ορίζω το δημιουργό "class2" με αυτόν τον τρόπο:

 

>class2::class2(string nm,int ab,int cd):
class1(nm),var1(ab),var2(cd)

 

παίρνω το παρακάτω λάθος:

 

In constructor `class2::class2(std::string, int, int)': class `class2' does not have any field named `class1'

 

Γι' αυτά τα σφάλματα τι φταίει; Δεν έχω κάνει σωστό ορισμό υποκλάσης; Μήπως δεν έχω ορίσει σωστά το δημιουργό;

Δημοσ.

Τελικά αναγκάστηκα να βάλω τις 2 κλάσεις σε ενα πηγαίο αρχείο , τις όρισα λοιπόν και τώρα δουλεύει.

Όταν όμως τις βάζω σε 2 ξεχωριστά αρχεία (δηλαδή την κύρια κλάση σε ένα και την υποκλάση σε άλλο) , γιατί δεν αναγνωρίζει την υποκλάση βγάζοντας το μύνημα "the contructor class2(........) does not have any field named 'class1' "; είναι κάτι που έχει να κάνει με τον τρόπο λειτουργίας του dev C++; πως μπορώ να ορίσω την υποκλάση σε ξεχωριστό πηγαίο αρχείο και να δουλεύει;

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...