C++ NooB Help!

SmokematiC | Κυρ, 01/13/2008 - 23:27 | 5' | 8

Για σε όλους, είμαι αρχάριος και τώρα μαθαίνω C++ με βοήθεια διάφορα e-books και το ίντερνετ
έχω φτιάξει ένα πρόγραμμα έτσι ώστε να εξασκηθώ. Το θέμα είναι ότι όταν το τρέχω (μετά το compile) βλέπω ότι το πρόγραμμά μου δεν λειτουργεί κανονικά δηλαδή δεν λειτουργεί έτσι όπως θέλω. Θα ήθελα κάποιος να με βοηθήσει.


#include <iostream.h>
using namespace std;

int menu(int);
void ascent (int);

int n,i,j,maxpos,minpos,choice;
double temp,max,min,mo,sum=0;

main ()
{
int n,i,j,maxpos,minpos,choice;
double temp,max,min,mo,sum=0;
do
    {
    cout << 'Dwse plithos arithimwn : ';
    cin >> n;
    }    
while (n<0);
cout << ' ';
double x[n];
for (i=1; i<=n; i++)
do
    {
    cout << 'Dwse ' << i << 'o Aritmo : ';
    cin >> x;
    sum+=x>;
    }
while (x<0);
max=x[1];
min=x[1];
maxpos=1;
minpos=1;
for (i=1; i<=n; i++)
    {
    if (x>=max)
        {
        max=x;
        maxpos=i;
        }
    if (x<=min)
        {
        min=x;
        minpos=i;
        }
    }
cout << endl;
mo=sum/n;
cout << 'Oi arthimoi pou dwthikan : ';
for (i=1; i<=n; i++)
    cout << 'x[' << i << '] : ' << x <<endl;
cout << ' Sum : ' << sum << ' MO : ' << mo;
cout << ' Max : ' << 'x[' << maxpos << '] -> ' << max ;
cout << ' Min : ' << 'x[' << minpos << '] -> ' << min << endl;
choice=menu(n);
switch (choice)
{
case 1 :
    ascent(n);
break;
case 2 :
cout << 'Exoume kero akoma';
break;
case 3 :
    cout << 'Exiting';
break;
default: break;
}
}

int menu(int n)
{
cout << ' ------- ';
cout << 'MENOY : ';
cout << '--------------------------------- ';
cout << '(1) Ascenting Sorting of x[' << n << '] ';
cout << '--------------------------------- ';
cout << '(2) Desenting Sorting of x[' << n << '] ';
cout << '--------------------------------- ';
cout << '(3) Exit Program ';
cout << '-------------------- ';
cout << 'Press 1 or 2 or 3 : ';
cin >> choice;
cout << ' ';
return choice;
}

void ascent (int n)
{
double x[n];
for (i=2; i<=n; i++)
    for (j=n; j>=i; j--)
    if (x[j-1]>x[j])
        {
        temp=x[j-1];
        x[j-1]=x[j];
        x[j]=temp;
        }
for (i=1; i<=n; i++)
    cout << 'x[' << i << '] -> ' << *x << endl;
}



Το Desenting sorting δεν το έχω φτιάξει ακόμα, το πρόβλημά μου είναι νομίζω ότι δεν κάνω σωστά κάτι με το function ascent() επίσης έχω σίγουρα λάθη στις δήλωσής. Αν μπορεί κάποιος να κάνει έναν διορθωτικό έλεγχο θα του ήμουν ευγνώμον.

Υ.Γ: Μήπως θα ήταν καλύτερο να φτιάχνω ένα class για τον πίνακά και από εκεί να κάνω το ascenting κ.τ.λ
Υ.Γ2: Σας υπενθυμίζω ότι είμαι πολύ αρχάριος και αυτοδίδακτος στην C++ Μονό Pascal ξέρω και όχι τπτ το ιδιαίτερο, γιαυτό θα σας παρακαλούσα να μου πείτε οτιδήποτε βλέπετε λάθος. Ευχαριστώ 

Tags
Δώσε αστέρια!

MO: 5 (ψήφοι: 1)

Σχόλια

Διάβασε περισσότερο για πίνακες και δείκτες!!!!
η descent όπως βλέπεις λειτουργεί όπως η ascent .Τα maxpos κλπ προσπάθησε......
Να βάζεις σχόλια στα προγράμματα σου και ΚΥΡΙΩΣ να λές τι θέλεις να κάνεις....
Τρέξε το παρακάτω να το δείς.

#include <iostream>     // το <iostream.h> είναι παλαιός ορισμός δεν χρειάζεται αφού
using namespace std;    // χρησιμοποιείς το using namespace std

int menu(int);         // εμφάνιση επιλογών (μενού)
void ascent (double a[],int size);  // δείκτης σε πίνακα ή και void ascent (double* a) 
                     // το ίδιο είναι.Η παράμετρος του πίνακα πρέπει να είναι double αφού
                           //  τον πίνακα σου -x- τον έχεις ορίσει double

void descent(double* a, int size); //η προηγούμενη δήλωση με αναφορά σε δείκτη

// Οι παρακάτω public μεταβλητές δεν χρειάζονται αφού περνάμε τον πίνακα στην ascent
/*int n,i,j,maxpos,minpos,choice;
double temp,max,min,mo,sum=0;   */

int main ()    // η main πρέπει να έχει τιμή επιστροφής γιαυτό βάζουμε το int
linuxformat_
int n,i,choice;
double mo,sum=0;
do
    linuxformat_
    cout << "Δώσε πλήθος αριθμών : ";
    cin >> n;
       
while (n < 0);
cout << "
";
double x[n];          // το x είναι όνομα πίνακα και όχι μεταβλητή
for ( i = 0; i < n; i++)  // το πρώτο στοιχείο ενός πίνακα είναι το μηδεν ( x[0] )
//do
    linuxformat_
    cout << "Δώσε τον " << i+1 << "o αριθμό : ";
    //cin >> x;  ΛΑΘΟΣ, το x είναι όνομα πίνακα και όχι μεταβλητή
    cin >> x;  // έτσι τοποθετούμε τιμές σε ΣΤΟΙΧΕΙΟ ενός πίνακα
    // sum +=x;  // εδώ το κατάλαβες έτσι;
    sum += x;
   
//while (x<0); // 1. τα γνωστά για το x 2. εάν το χ ήταν μεταβλητή δεν θα έβγαινες ποτέ!
                // ΚΥΡΙΩΣ ΔΕΝ χρειάζεται ΚΑΙ άλλος ένας βρόγχος.Δεν σου φτάνει ο for ???
/*
max=x[1];
min=x[1];
maxpos=1;
minpos=1;
for (i=1; i<=n; i++)
    linuxformat_
    if (x>=max)
        linuxformat_
        max=x;
        maxpos=i;
       
    if (x<=min)
        linuxformat_
        min=x;
        minpos=i;
       
   
cout << endl; */

mo = sum/n;
cout << "Οι αριθμί που δόθηκαν :

";
for (i = 0; i < n; i++)
    cout << "x[" << i << "] : " << x <<endl;
    cout << "
Sum : " << sum << " MO : " << mo;

    /*cout << "
Max : " << "x[" << maxpos << "] -> " << max ;
    cout << " Min : " << "x[" << minpos << "] -> " << min << endl;*/

    choice=menu(n);
    switch (choice)
    linuxformat_
        case 1 :
        ascent(x,n); // κλήση της συναρτησης με αναφορά στο όνομα του πίνακα
        break;
        case 2 :
        descent(x,n);
        break;
        case 3 :
        cout << "Exiting"<< endl;
        break;
        default: break;
   

int menu(int n)
linuxformat_
    int choice;
    cout << "
-------
";
    cout << "MENOY :
";
    cout << "---------------------------------
";
    cout << "(1) Ascenting Sorting of x[" << n << "]
";
    cout << "---------------------------------
";
    cout << "(2) Desenting Sorting of x[" << n << "]
";
    cout << "---------------------------------
";
    cout << "(3) Exit Program
";
    cout << "--------------------
";
    cout << "Press 1 or 2 or 3 : ";
    cin >> choice;
    //cout << "
";
    return choice;

void ascent (double a[],int size)  // συνάρτηση ταξινόμησης πίνακα - αύξουσα
linuxformat_
for (int i = 1; i < size; i++) 
                                  
    for (int j = size-1; j >= i; j--)linuxformat_
        if (a[j-1] > a[j])
        linuxformat_
             double temp = a[j-1];
             a[j-1] = a[j];
             a[j] = temp;
       
   
for (int i = 0; i < size; i++)
    cout << "x[" << i << "] -> " << a << endl; // a αντι *x 

void descent(double* a, int size) // συνάρτηση ταξινόμησης πίνακα - φθίνουσα
linuxformat_
    for(int i = 1; i < size; i++)
       
        for(int j = size - 1;j >= i; j--)
             if(a[j-1] < a[j])
             linuxformat_
                 double temp = a[j-1];
                 a[j-1] = a[j];
                 a[j] = temp;
            

for (int i = 0; i < size; i++)
    cout << "x[" << i << "] -> " << a << endl;

Στην μεταφορά κόπηκαν οι δείκτες του πίνακα!!!!!!!
    //cin >> x;  ΛΑΘΟΣ, το x είναι όνομα πίνακα και όχι μεταβλητή
    cin >> x[i ];  // έτσι τοποθετούμε τιμές σε ΣΤΟΙΧΕΙΟ ενός πίνακα
    // sum +=x;  // εδώ το κατάλαβες έτσι;
    sum += x[ i];

George 1000 ευχαριστώ για τον χρόνο σου και για τη διόρθωσή σου.

1:

cout << "Δώσε τον " << i+1 << "o αριθμό : ";
    //cin >> x;  ΛΑΘΟΣ, το x είναι όνομα πίνακα και όχι μεταβλητή
    cin >> x;  // έτσι τοποθετούμε τιμές σε ΣΤΟΙΧΕΙΟ ενός πίνακα
    // sum +=x;  // εδώ το κατάλαβες έτσι;
    sum += x;

Κατάλαβα ακριβός τη θες να μου πεις.

2:

//while (x<0); // 1. τα γνωστά για το x 2. εάν το χ ήταν μεταβλητή δεν θα έβγαινες ποτέ!
                // ΚΥΡΙΩΣ ΔΕΝ χρειάζεται ΚΑΙ άλλος ένας βρόγχος.Δεν σου φτάνει ο for ???

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

3:

/*
max=x[1];
min=x[1];
maxpos=1;
minpos=1;
for (i=1; i<=n; i++)
    linuxformat_
    if (x>=max)
        linuxformat_
        max=x;
        maxpos=i;
       
    if (x<=min)
        linuxformat_
        min=x;
        minpos=i;
       
   
cout << endl; */

Γενικά το πρόγραμμα αυτό το έγραψα έτσι ώστε να δω τι μπορώ να κάνω και μέσω των λαθών μου να μάθω, έτσι ξεκίνησα με τα απλά δηλαδή min,max κ.τ.λ και μετά μου ήρθε η ιδέα με το μενού κ.τ.λ

Γενικά: Το πρόβλημα μου ήταν ότι δεν ήξερα πως να περάσω τον πίνακα στα functions, επίσης δεν ήξερα πως να δηλώσω σωστά ένα function.

Ερώτηση:

void ascent (double a[],int size);  // δείκτης σε πίνακα ή και void ascent (double* a)
                      // το ίδιο είναι.

Τι είναι προτιμότερο να το δηλώσω χωρίς pager και να περάσω όλον τον πίνακά όταν καλέσω την συνάρτηση δλδ double a[],int size
ή να το δηλώσω με pager δλδ double* a;;;;
¶μα το έχω θέση λάθος πες μου γιατί μάλλον κάτι δεν έχω μάθει καλά.

Υ.Γ:Χίλια ευχαριστώ και πάλι.
Υ.Γ2:Λογικά θα ακολουθήσουν και άλλα " κολλήματα "

Έτοιμο και πλήρως λειτουργικό:
.cpp

#include <test.h>
using namespace std;

int menu(int);
void ascent (double a[],int size);
void descent(double a[],int size);

int main ()
linuxformat_
int n,i,choice;
double mo,sum=0;
double minpos,maxpos,min,max;
do
    linuxformat_
    cout << "Δώσε πλήθος αριθμών : ";
    cin >> n;
   
while (n < 0);
cout << "
";
double x[n];
for ( i = 0; i < n; i++)
    linuxformat_
    cout << "Δώσε τον " << i+1 << "o αριθμό : ";
    cin >> x;
    sum += x;
   
min=x[0];    //Αυτά τα άφησα έτσι για να λέω πως ξέρω και κάτι :)
max=x[0];    //
maxpos=0;    // ¶ρχικές τιμές
minpos=0;    //
for (i=0; i<=n; i++)
    linuxformat_                //
    if (x>=max)        //Εύρεση του max
        linuxformat_            //
        max=x;        //
        maxpos=i;        //
                    //
    if (x<=min)        //Εύρεση του min
        linuxformat_            //
        min=x;        //
        minpos=i;        //
                    //
   
cout << endl;
mo = sum/n;
cout << "Οι αριθμί που δόθηκαν :

";
for (i = 0; i < n; i++)        //εμφάνηση αποτελεσμάτων
    cout << "x[" << i+1 << "] : " << x <<endl;
    cout << "
Sum : " << sum << " MO : " << mo;
    cout << "
Max : " << "x[" << maxpos+1 << "] -> " << max ;
    cout << " Min : " << "x[" << minpos+1 << "] -> " << min << endl;
choice=menu(n);        //κάλεσμα του μενου
    switch (choice)
    linuxformat_
    case 1 :
        ascent(x,n);    //καλεσμα της συνάρτησης
    break;
    case 2 :
        descent(x,n);    //καλεσμα της συνάρτησης
    break;
    case 3 :
        cout << "Exiting"<< endl;
        break;
    default: break;
   
    // TODO επανάληψη του μενου μέχρη να πατησουμε 3.

.h

#include <iostream>
using namespace std;
int menu(int n)    //το μενου με input το n
linuxformat_
    int choice;        //δηλωση της μεταβλητης
    cout << "
-------
";
    cout << "MENOY :
";
    cout << "---------------------------------
";
    cout << "(1) Ascenting Sorting of x[" << n << "]
";
    cout << "---------------------------------
";
    cout << "(2) Desenting Sorting of x[" << n << "]
";
    cout << "---------------------------------
";
    cout << "(3) Exit Program
";
    cout << "--------------------
";
    cout << "Press 1 or 2 or 3 : ";
    cin >> choice;
    return choice; //output της συνάρτησης η μεταβλητή choice που μετα μπαίνει στο switch

void ascent (double a[],int size) //η συνάρτηση ascent με input πίνακα a και μεταβλητή size
linuxformat_
for (int i = 1; i < size; i++)         //
    for (int j = size-1; j >= i; j--)linuxformat_    //
        if (a[j-1] > a[j])        //
        linuxformat_                //
              double temp = a[j-1];    //    ASCENTING THE NUMBERS
              a[j-1] = a[j];        //
              a[j] = temp;        //
                        //
   
for (int i = 0; i < size; i++)
    cout << "x[" << i+1 << "] -> " << a << endl;    // εμφάνηση του ascented πινακα

void descent(double a[], int size)    // ομοίως με ascent
linuxformat_
    for(int i = 1; i < size; i++)
        for(int j = size - 1;j >= i; j--)
              if(a[j-1] < a[j])
              linuxformat_
                  double temp = a[j-1];
                  a[j-1] = a[j];
                  a[j] = temp;
             

for (int i = 0; i < size; i++)
    cout << "x[" << i+1 << "] -> " << a << endl;

Y.Γ: Οι παρατήρησης είναι πάντα ευπρόσδεκτες
SmokematiC2007-11-17 10:59:25

George σε ευχαριστώ με το παράδειγμά σου κατάλαβα καλύτερά τι παίζει με τους δείκτες.
Όταν το έτρεξα δεν έβλεπα σωστά τις τιμές του πίνακα τις έβλεπα και αυτές σαν memory address και απλά πρόστεσα ένα [ i ] δίπλα στο χ και στο α αντίστοιχά πχ:

cout << "Η διεύθυνση του x [ " << i << " ] " << x + i << " και η τιμή του "<< x[ i ] <<endl;

Το μόνο που με έχει προβληματίσει είναι αυτό : x + i ή a + i δεν καταλαβαίνω εφόσον το x είναι πίνακας και με τη μορφή αυτή θα μου εμφάνισή address, το + i που προσθέτετε;; δλδ ουσιαστικά στην παραπάνω φράση το x + i είναι το address του πίνακα x συν την τιμή που έχει το i σωστά;;;

Σε ευχαριστώ για την βοήθεια σου
SmokematiC2007-11-18 8:13:12

Τρέξε το παρακάτω πρόγραμμα και θα δείς ότι &x[0] και x ,&x[1] και x + 1 κοκ είναι ισοδύναμα.Φυσικά μπορείς να χρησιμοποιήσεις βρόγχο for για να έχεις γρήγορα αποτελέσματα.

#include <iostream>
using namespace std;

int main()
linuxformat_
    int x[5]=linuxformat_1,2,3,4,5;
    cout << "
Εστω πίνακας πέντε στοιχείων τύπου int με τιμές 1,2,3,4,5" << endl;
    cout << "x[0]=1,x[1]=2,x[2]=3,x[3]=4,x[4]=5
" << endl;
    cout << "Η διεύθυνση ολόκληρου του πίνακα  x =  " << (long)x << endl;
    cout << "H διεύθυνση αναλυτικά των στοιχείου του πίνακα
" << endl;
    for (int i = 0; i < 5;i++)
    cout << "&x[ " << i << " ] = " << (long)&x << endl; // το (long) για να
                                 //εμφανιστούν στο δεκαδικό    
                                 // σύστημα.
    cout << endl;
    cout << "Η διεύθυνση αναλυτικά των στοιχείων του πίνακα
" << endl;
    cout << "x     = " << (long)x << endl;
    cout << "x + 1 = " << (long)(x + 1) << endl;
    cout << "x + 2 = " << (long)(x + 2) << endl;
    cout << "x + 3 = " << (long)(x + 3) << endl;
    cout << "x + 4 = " << (long)(x + 4) << endl;
    cout << endl;
    cout << "Επομένως x + 1 σημαίνει: πήγαινε στο επόμενο στοιχείο του πίνακα

    κινούμενος στις διευθύνσεις του,πρώτη διεύθυνση x,επόμενη διεύθυνση x+1 κοκ. "
    << endl;
    cout << "Κοίτα επίσης τις διαφορές στις τιμές των διευθύνσεων και κάνε σύγκριση

        με τον τύπο του πίνακα x " << endl;

Διατρέχουμε τις διευθύνσεις ενός πίνακα όταν τον περνάμε σαν παράμετρο,μαζί με την διάσταση του,σε μιά συνάρτηση.Συμπερασματικά &x[1] <------>    x + 1 = διεύθυνση του δεύτερου στοιχείο του
   x[1] <------> *(x+1) = τιμή που περιέχεται στην διεύθυνση του δεύτερου στοιχείου.Πιστεύω να σε βοήθησα λίγο -:)

I got it  Σε ευχαριστώ. Τώρα θα πρέπει να σκεφτώ τι πρόγραμμα να γράψω ώστε να δοκιμαστώ περισσότερο . Σκέφτομαι να μάθω και μια GUI γλώσσα (QT,GTK+ κ.τ.λ) η τουλάχιστον να μάθω πως να κολλήσω γραφικά στα προγράμματά μου, πάντα είναι ενδιαφέρον ένα ωραίο GUI.

KDevelop ,KDevelop-data,KDevelop-dev,KDevelop-doc
πρέπει να υπάρχουν στην διανομή σου,κατέβασε τα.-:)