Για σε όλους, είμαι αρχάριος και τώρα μαθαίνω 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 ξέρω και όχι τπτ το ιδιαίτερο, γιαυτό θα σας παρακαλούσα να μου πείτε οτιδήποτε βλέπετε λάθος. Ευχαριστώ
- Συνδεθείτε ή εγγραφείτε για να σχολιάσετε
Σχόλια
Διάβασε περισσότερο για πίνακες και δείκτες!!!!
η 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:
Κατάλαβα ακριβός τη θες να μου πεις.
2:
Δέν ξέρω πως μου ήρθε αλλά απ ότι θυμάμαι ήθελα να αποκλείσω της αρνητικές τιμές και να μην χάνετε η θέση i. Κατάλαβες τι θέλω να πω;; Έτσι οπως το βλέπω τώρα δεν μπορώ να καταλάβω για ποιόν λόγο το έκανα αυτό.
3:
Γενικά το πρόγραμμα αυτό το έγραψα έτσι ώστε να δω τι μπορώ να κάνω και μέσω των λαθών μου να μάθω, έτσι ξεκίνησα με τα απλά δηλαδή min,max κ.τ.λ και μετά μου ήρθε η ιδέα με το μενού κ.τ.λ
Γενικά: Το πρόβλημα μου ήταν ότι δεν ήξερα πως να περάσω τον πίνακα στα functions, επίσης δεν ήξερα πως να δηλώσω σωστά ένα function.
Ερώτηση:
Τι είναι προτιμότερο να το δηλώσω χωρίς pager και να περάσω όλον τον πίνακά όταν καλέσω την συνάρτηση δλδ double a[],int size
ή να το δηλώσω με pager δλδ double* a;;;;
¶μα το έχω θέση λάθος πες μου γιατί μάλλον κάτι δεν έχω μάθει καλά.
Υ.Γ:Χίλια ευχαριστώ και πάλι.
Υ.Γ2:Λογικά θα ακολουθήσουν και άλλα " κολλήματα "
Έτοιμο και πλήρως λειτουργικό:
.cpp
.h
Y.Γ: Οι παρατήρησης είναι πάντα ευπρόσδεκτες
SmokematiC2007-11-17 10:59:25
George σε ευχαριστώ με το παράδειγμά σου κατάλαβα καλύτερά τι παίζει με τους δείκτες.
Όταν το έτρεξα δεν έβλεπα σωστά τις τιμές του πίνακα τις έβλεπα και αυτές σαν memory address και απλά πρόστεσα ένα [ i ] δίπλα στο χ και στο α αντίστοιχά πχ:
Το μόνο που με έχει προβληματίσει είναι αυτό : 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
πρέπει να υπάρχουν στην διανομή σου,κατέβασε τα.-:)