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

Εμφάνιση αριθμών από πίνακα στην C


johnykim

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

Δημοσ.

Γεια σας παιδιά.:-)

 

Έχω φτιάξει τον εξής κώδικα :

 

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

main()
{
     
int a,n,i=0;
int s=0;
int pinakasa[0];

     
printf("Dwse timh gia ton vathmo N\n");
scanf("%d",&n); 
    

printf("\nDwse times syntelestwn, mexri i = %d\n",n);
while (i<=n && s<=n)
{
     scanf("%d",&pinakasa[s]);
     printf("\n A%d = %d\n",i,pinakasa[s]);
     i++;
     s++;
}
   

printf("\nAsynolo = %d\n",pinakasa);

system("PAUSE");	
 return 0;
}

 

Το πρόβλημά μου είναι ότι στο τέλος δεν μου εμφανίζει τους αριθμούς που έβαζα στον πίνακα με τη σειρά.Δηλαδή αν πληκτρολογούσα 1,2,3,4,5 , η τελευταία print να μου εμφάνιζε " Asynolo = 12345.Που κάνω βρε παιδιά το λάθος; :o

Δημοσ.

 

Γεια σας παιδιά.:-)

 

Έχω φτιάξει τον εξής κώδικα :

 

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

main()
{
     
int a,n,i=0;
int s=0;
int pinakasa[0];

     
printf("Dwse timh gia ton vathmo N\n");
scanf("%d",&n); 
    

printf("\nDwse times syntelestwn, mexri i = %d\n",n);
while (i<=n && s<=n)
{
     scanf("%d",&pinakasa[s]);
     printf("\n A%d = %d\n",i,pinakasa[s]);
     i++;
     s++;
}
   

printf("\nAsynolo = %d\n",pinakasa);

system("PAUSE");	
 return 0;
}

 

Το πρόβλημά μου είναι ότι στο τέλος δεν μου εμφανίζει τους αριθμούς που έβαζα στον πίνακα με τη σειρά.Δηλαδή αν πληκτρολογούσα 1,2,3,4,5 , η τελευταία print να μου εμφάνιζε " Asynolo = 12345.Που κάνω βρε παιδιά το λάθος; :o

 

 

αντί για

printf("\nAsynolo = %d\n",pinakasa);

 

 

βάλε

 

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

printf("Asynolo = %d",pinakasa);

 

---------- Προσθήκη στις 19:58 ---------- Προηγούμενο μήνυμα στις 19:54 ----------

 

Και αν θές όλους τους αριθμούς μαζί

 

printf("\nAsynolo =");

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

printf("%d",pinakasa);

 

---------- Προσθήκη στις 20:00 ---------- Προηγούμενο μήνυμα στις 19:58 ----------

 

Επίσης πρέπει να δώσεις ένα μέγιστο πλήθος στοιχείων όταν ορίζεις τον πίνακα

Και το διάβασμα του πίνακα μπορείς να το βάλεις μέσα σε μια for...

Δημοσ.

Ευχαριστώ! :-)

 

Απλά δεν καταλαβαίνω..ένα παρόμοιο πρόγραμμα με πίνακες χαρακτήρων, στο τέλος για εμφάνιση έβαζα το όνομα το πίνακα χωρίς όρισμα και επανάληψη , και μου εμφάνιζε κανονικά όποιες τιμές είχε πάρει.

 

Τον όρισα τον πίνακα.Πειράζει αν έχω μεγαλύτερη τιμή στην δήλωση , και χρησιμοποιήσω λιγότερες θέσεις; Απ' ότι βλέπω δεν επηρεάζεται το πρόγραμμα, οπότε στην χειρότερη να καταλαμβάνει περισσότερη μνήμη..σωστά;

 

edit:

Ξέρετε επίσης πως βάζω σε μια μεταβλητή ,το σύνολο των τιμών του πίνακα; Δοκίμασα μέσα στην for "x=x+pinakasa;" ,αλλά μου έκανε άθροισμα των τιμών(λογικό να πω την αλήθεια).Θυμάμαι στην Visual Basic ,βάζαμε αντί για "+" , "&", και έβαζε τις τιμές τη μία διπλά στην άλλη..

Δημοσ.
Γεια σας παιδιά.:-)

 

Έχω φτιάξει τον εξής κώδικα :

 

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

main()
{
     
int a,n,i=0;
int s=0;
1)[b]int pinakasa[0];[/b]

     
printf("Dwse timh gia ton vathmo N\n");
scanf("%d",&n); 
    

printf("\nDwse times syntelestwn, mexri i = %d\n",n);
while (i<=n && s<=n)
{
     scanf("%d",&pinakasa[s]);
     printf("\n A%d = %d\n",i,pinakasa[s]);
     i++;
     s++;
}
   

[b]printf("\nAsynolo = %d\n",pinakasa);[/b]

system("PAUSE");	
 return 0;
}

 

Το πρόβλημά μου είναι ότι στο τέλος δεν μου εμφανίζει τους αριθμούς που έβαζα στον πίνακα με τη σειρά.Δηλαδή αν πληκτρολογούσα 1,2,3,4,5 , η τελευταία print να μου εμφάνιζε " Asynolo = 12345.Που κάνω βρε παιδιά το λάθος; :o

 

Γιατί ορίζεις τον πίνακα με μέγεθος 0 και μετά προσπαθείς να αποθηκεύσεις Ν αριθμούς ?

Επίσης, δεν θα μπορούσες να χρησιμοποιήσεις μόνο i αντί για i,s ?

 

Ευχαριστώ! :-)

 

Απλά δεν καταλαβαίνω..ένα παρόμοιο πρόγραμμα με πίνακες χαρακτήρων, στο τέλος για εμφάνιση έβαζα το όνομα το πίνακα χωρίς όρισμα και επανάληψη , και μου εμφάνιζε κανονικά όποιες τιμές είχε πάρει.

 

Τον όρισα τον πίνακα.Πειράζει αν έχω μεγαλύτερη τιμή στην δήλωση , και χρησιμοποιήσω λιγότερες θέσεις; Απ' ότι βλέπω δεν επηρεάζεται το πρόγραμμα, οπότε στην χειρότερη να καταλαμβάνει περισσότερη μνήμη..σωστά;

 

Ένα πίνακα χαρακτήρων μπορείς να τον εμφανίσεις εύκολα ως string με την %s.

Σε πίνακα ακεραίων όμως χρησιμοποίησε for όπως είπε ο clevercitizen.

 

edit:

Ξέρετε επίσης πως βάζω σε μια μεταβλητή ,το σύνολο των τιμών του πίνακα; Δοκίμασα μέσα στην for "x=x+pinakasa;" ,αλλά μου έκανε άθροισμα των τιμών(λογικό να πω την αλήθεια).Θυμάμαι στην Visual Basic ,βάζαμε αντί για "+" , "&", και έβαζε τις τιμές τη μία διπλά στην άλλη..

 

Θες μια μεταβλητή να έχει τις τιμές την μία δίπλα στην άλλη ? Αν ναι τότε μπορείς

να χρησιμοποιείς την snprintf.

Δημοσ.

1)Γιατί ορίζεις τον πίνακα με μέγεθος 0 και μετά προσπαθείς να αποθηκεύσεις Ν αριθμούς ?

2)Επίσης, δεν θα μπορούσες να χρησιμοποιήσεις μόνο i αντί για i,s ?

 

 

 

Ένα πίνακα χαρακτήρων μπορείς να τον εμφανίσεις εύκολα ως string με την %s.

Σε πίνακα ακεραίων όμως χρησιμοποίησε for όπως είπε ο clevercitizen.

 

 

 

3)Θες μια μεταβλητή να έχει τις τιμές την μία δίπλα στην άλλη ? Αν ναι τότε μπορείς

να χρησιμοποιείς την snprintf.

 

1)Έκανα δοκιμές, και έμεινε με 0..:-D

 

2) βάζω i και s, γιατί κάνω διαφορετικό μέτρημα για το καθένα.

 

3) Θέλω να κάνω μια πράξη με όλο το σύνολο των τιμών του πίνακα.Δηλαδή αν το σύνολο είναι 12345, να κάνω με αυτό το νούμερο μια πράξη.Να είναι δηλαδή ποια ένας αριθμός, και όχι πολλά μονοψήφια μαζί.:-)

Δημοσ.
1)Έκανα δοκιμές, και έμεινε με 0..:-D

 

2) βάζω i και s, γιατί κάνω διαφορετικό μέτρημα για το καθένα.

 

3) Θέλω να κάνω μια πράξη με όλο το σύνολο των τιμών του πίνακα.Δηλαδή αν το σύνολο είναι 12345, να κάνω με αυτό το νούμερο μια πράξη.Να είναι δηλαδή ποια ένας αριθμός, και όχι πολλά μονοψήφια μαζί.:-)

 

2) Από ό,τι πρόσεξα το ίδιο κάνει και το i και το s, εκτός αν το τελικό σου πρόγραμμα

είναι διαφορετικό από αυτό που βλέπουμε.

 

3) Μπορείς να το κάνεις πχ με ένα for από το τέλος ως την αρχή.

5+4*10+3*100+2*1000+1*10000 και να βγει 12345 σαν αριθμός.

 

Αν και είναι άσχετο με την ερώτηση σου, αντί για την scanf μπορείς να

χρησιμοποιήσεις fgets+atoi. Η scanf είναι δύστροπη και δημιουργεί προβλήματα

(πχ σκέψου στην ερώτηση του δώσε Ν να δώσει κάποιος ένα γράμμα αντί για αριθμό).

Δημοσ.

Δεν αντέχω άλλο..βγήκα off για σήμερα.:-(

 

>printf("\nAsynolo = ");
for(s=0;s<=n;s++)
{              
printf("%d",pinakasa[s]);
}

 

Έτσι εμφανίζω τις τιμές του πίνακα.Θέλω να κάνω όμως την πράξη Α0Α1Α2Α3Α4Α5 / 100(αν δίνω 6 για n).Δηλαδή αν δίνω 6 n και δίνω μετά στον πίνακα τις τιμές 1,2,3,4,5,6,7 , θα μου βγάλει Asynolo = 1234567.Πως θα κάνω όμως 1234567 / 100 ;

 

Δοκίμασα :

>x=pinakasa[s] / 100;
printf("\n%f",x);

 

Όπου x ,να είναι μια float, αλλά τίποτα.

Λογικά πρέπει μέσα στην for να έχω μια μεταβλητή όπου σε κάθε βήμα θα δίνει και από ένα ψηφίο.Ετσι μόλις τελειωσει η επανάληψη θα έχω μια μεταβλητή που θα ισούται με όλες τις τιμές του πίνακα.Αυτή την μεταβλητή θα μπορώ στην συνέχεια να την χρησιμοποιήσω όπου θέλω άνετα για τις πράξεις.Αυτή την μεταβλητή ψάχνω πως θα την χρησιμοποιήσω.

Δημοσ.
Δεν αντέχω άλλο..βγήκα off για σήμερα.:-(

 

>printf("\nAsynolo = ");
for(s=0;s<=n;s++)
{              
printf("%d",pinakasa[s]);
}

 

Έτσι εμφανίζω τις τιμές του πίνακα.Θέλω να κάνω όμως την πράξη Α0Α1Α2Α3Α4Α5 / 100(αν δίνω 6 για n).Δηλαδή αν δίνω 6 n και δίνω μετά στον πίνακα τις τιμές 1,2,3,4,5,6,7 , θα μου βγάλει Asynolo = 1234567.Πως θα κάνω όμως 1234567 / 100 ;

 

Δοκίμασα :

>x=pinakasa[s] / 100;
printf("\n%f",x);

 

Όπου x ,να είναι μια float, αλλά τίποτα.

Λογικά πρέπει μέσα στην for να έχω μια μεταβλητή όπου σε κάθε βήμα θα δίνει και από ένα ψηφίο.Ετσι μόλις τελειωσει η επανάληψη θα έχω μια μεταβλητή που θα ισούται με όλες τις τιμές του πίνακα.Αυτή την μεταβλητή θα μπορώ στην συνέχεια να την χρησιμοποιήσω όπου θέλω άνετα για τις πράξεις.Αυτή την μεταβλητή ψάχνω πως θα την χρησιμοποιήσω.

 

 

Για να πάρεις όλα τα στοιχεία του πίνακα σαν έναν αριθμό, θα κάνεις αυτό που είπε ο φίλος παραπάνω.

 

 

αφού έχεις διαβάσει τον πίνακα:

>float tel_arithmos;
int arithmos=0;
for(i=0;i<n;i++)
arithmos= pinakas[i]= pow(10,n-i+1) + arithmos;

tel_arithmos=(float)arithmos/100;

 

 

 

αν δε βάλεις το (float) στην τελευταία γραμμή τότε στη μεταβλητή tel_aritmhmos θα αποθηκευτεί το αποτέλεσμα της ακέραιας διαίρεσης του arithmos με το 100

Επίσης, να τονίσω και κάτι άλλο που ίσως και να το ξέρεις ήδη

 

 

όταν ορίζουμε έναν πίνακα με 100 στοιχεία δηλ, int pinakas[100], για να προσπελάσουμε να στοιχεία του πίνακα ξεκινάμε από το στοιχείο 0. Δηλ το pinakaw[0] είναι το πρώτο στοιχείο του πίνακα ενώ το pinakas[99] το τελευταίο, στοιχείο pinakas[100] δεν υπάρχει. Γι αυτό να είμαστε προσεκτικοί με την for, αν θα βάλουμε <=n ή <n

Δημοσ.

Θέλω να κάνω όμως την πράξη Α0Α1Α2Α3Α4Α5 / 100(αν δίνω 6 για n).Δηλαδή αν δίνω 6 n και δίνω μετά στον πίνακα τις τιμές 1,2,3,4,5,6,7 , θα μου βγάλει Asynolo = 1234567.

Πως θα κάνω όμως 1234567 / 100 ;

 

Λογικά πρέπει μέσα στην for να έχω μια μεταβλητή όπου σε κάθε βήμα θα δίνει και από ένα ψηφίο.Ετσι μόλις τελειωσει η επανάληψη θα έχω μια μεταβλητή που θα ισούται με όλες τις τιμές του πίνακα.

Αυτή την μεταβλητή θα μπορώ στην συνέχεια να την χρησιμοποιήσω όπου θέλω άνετα για τις πράξεις.Αυτή την μεταβλητή ψάχνω πως θα την χρησιμοποιήσω.

 

Kαταρχήν, ο πίνακας χαρακτήρων απαιτεί διαφορετικό χειρισμό από αυτόν για αριθμούς.

Όταν επιχειρείς να τυπώσεις έναν πίνακα χαρακτήρων (char*) , αρκεί η printf ή η cout να λάβουν την αρχή του και αυτόματα τυπώνουν διαδοχικά τα στοιχεία του μέχρι

να συναντήσουν τον χαρακτήρα \0 που είναι ένδειξη ότι το string τελειώνει εκεί.

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

 

Το "θα έχω μια μεταβλητή που θα ισούται με όλες τις τιμές του πίνακα" είναι λάθος έκφραση.

Αν θέλεις τα ψηφία που δίνεις να συντίθενται σε μία τιμή σύμφωνα με την θέση τους, τότε κοίτα τι σου είπε ο imitheos.

Αλλά μάλλον δεν θέλεις αυτό.

 

Με το Α0Α1Α2Α3Α4Α5 / 100 εννοείς ότι θέλεις να διαιρούνται ΟΛΑ τα στοιχεία του πίνακα με το 100 ;

Δηλ. εννοείς ότι 1234567 / 100 θέλεις να κάνει 1/100, 2/100,..,7/100, δηλ. να χειρίζεται όλο τον πίνακα ταυτόχρονα ;

 

Aν ναι, τότε έχασες !!

Μπορεί να γίνει βέβαια αλλά...

Μεγάλο μειονέκτημα της C/C++ είναι ότι δεν υποστηρίζει εγγενώς πίνακες αναγκάζοντας τον προγραμματιστή να καταφεύγει σε τρίτες λύσεις, άβολες και ελλιπείς.

Η Fortran είναι πολύ βολικότερη σ' αυτά διότι χειρίζεται τους πίνακες όπως και τις κοινές μεταβλητές. Πχ. αν Α είναι πίνακας, εκεί θα έγραφες A/100 και έγινε.

Επιπλέον, στη Fortran οι περισσότερες συναρτήσεις είναι στοιχειακές, δηλ. δρουν πάνω στα στοιχεία ενός πίνακα χωρίς καμιά μέριμνα από τον προγραμματιστή.

Δηλ. μπορείς να γράψεις πχ. Β=cos©*abs(A) όπου τα Α, Β, C είναι πίνακες κλπ.

 

Και γενικά αν ο προσανατολισμός σου είναι καταρχήν στα μαθηματικά (όπως διαφαίνεται και από άλλα πράγματα που έχεις κάνει) απολύτως φιλικά σου λέω ότι είσαι σε λάθος δρόμο.

Δημοσ.

@clevercitizen ,έτσι δηλαδή;

 

>for(i=0;i<=n;i++)
{
arithm= pinakasa[i]= pow(10,n-i+1) + arithm;
}
apotelesma =(float)arithm/100;

printf("\n%f\n",apotelesma);

 

Η τελευταία printf μου εμφανίζει λάθος νούμερο.

 

@V.I.Smirnov.Μάλλον δεν έχασα..:P .Θέλω η πράξη 12345 ,των τιμών του πίνακα, να βγάζει αποτέλεσμα 12345/100=123.45

 

Και γενικά αν ο προσανατολισμός σου είναι καταρχήν στα μαθηματικά (όπως διαφαίνεται και από άλλα πράγματα που έχεις κάνει) απολύτως φιλικά σου λέω ότι είσαι σε λάθος δρόμο.

 

Τι ακριβώς εννοείς; Ο προσανατολισμός μου δεν είναι στα μαθηματικά.Τα μαθηματικά τα χρησιμοποιώ σαν εργαλείο,όπως τώρα στον προγραμματισμό.:-)

Δημοσ.
@clevercitizen ,έτσι δηλαδή;

 

>
arithm= pinakasa[i]= pow(10,n-i+1) + arithm;

Μήπως ήθελες * αντί για την δεύτερη ανάθεση ?

>
arithm = pinakasa[i] * pow(10,n-i+1) + arithm;

Δημοσ.

Λοιπόν, ας κάνω ορισμένες διορθώσεις/προσθήκες μιας και πριν απαντούσα χωρίς να το τρέχω.

 

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

int main()
{
float tel_arithmos,arithmos=0;

int n,i;
int pinakasa[100];


printf("Dwse timh gia ton vathmo N(1-100)\n");
scanf("%d",&n);


printf("\nDwse times syntelestwn, mexri i = %d\n",n);

for(i=0;i<n;i++)
{
     scanf("%d",&pinakasa[i]);
     printf("\n A%d = %d\n",i,pinakasa[i]);
}

//mporeis na to kaneis mesa stin panw for alla gia na to katanoiseis kalutera to grafw xwrista

for(i=0;i<n;i++)
arithmos= pinakasa[i]*pow(10,n-i-1) + arithmos;

/*to arithmos prepei na einai float giati i pow epistrefei float, oxi int
episis i pow vrisketai sti vivliothiki math.h
otan mesa sti for ekteleitai mono 1 entoli, de xreiazontai oi agules {}*/

tel_arithmos=arithmos/100;

printf("\napotelesma diairesis %.2f\n",tel_arithmos);
//to %.2f emfanizei ton arithmo mas me 2 dekadika psifia

system("PAUSE");
return 0;
}

Δημοσ.
@clevercitizen ,έτσι δηλαδή;

 

>for(i=0;i<=n;i++)
{
arithm= pinakasa[i]= pow(10,n-i+1) + arithm;
}
apotelesma =(float)arithm/100;

printf("\n%f\n",apotelesma);

 

Η τελευταία printf μου εμφανίζει λάθος νούμερο.

 

@V.I.Smirnov.Μάλλον δεν έχασα..:P .Θέλω η πράξη 12345 ,των τιμών του πίνακα, να βγάζει αποτέλεσμα 12345/100=123.45

 

 

 

Τι ακριβώς εννοείς; Ο προσανατολισμός μου δεν είναι στα μαθηματικά.Τα μαθηματικά τα χρησιμοποιώ σαν εργαλείο,όπως τώρα στον προγραμματισμό.:-)

 

1) Θέλεις δηλ. οι τιμές που δίνεις να συνθέτουν μία.

Τότε ναι, κάπως έτσι. Δηλ. τις μετατρέπεις σε έναν αριθμό του δεκαδικού συστήματος με βάση την τάξη τους.

Είναι όμως πιο απλό να εισάγεις τις επιμέρους τιμές ως μεμονωμένους χαρακτήρες ενός string και μετά να

μετατρέψεις το string κατευθείαν σε αριθμό με την atof.

 

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

 

2) Το βασικό εργαλείο για να προγραμματίζεις μαθηματικά πράγματα (επίλυση εξισώσεων, συστημάτων, ολοκληρώματα,

παρεμβολή, ειδικές συναρτήσεις κ.α. ) είναι η χρήση πινάκων.

Και δυστυχώς η C/C++ μας ταλαιπωρεί διότι δεν υποστηρίζει εγγενώς πίνακες.

Επίσης, θα έχεις προβλήματα αν επιχειρήσεις να χρησιμοποιήσεις μιγαδικούς αριθμούς.

Η fortran σ' αυτά είναι ασύγκριτα βολικότερη.

Δημοσ.

Παιδιά ευχαριστώ.Θα κοιτάξω αυτά που είπατε πάλι το Σαββατοκύριακο ,γιατί δεν προλαβαίνω αυτές τις μέρες, και θα σας πω :-)

Δημοσ.

Μόλις μου ήρθε μια ιδέα που δεν έχω δοκιμάσει... από το να παλεύεις να κάνεις τον πίνακα νούμερο, γιατί δεν το κάνεις string με ένα \0 στο τέλος και μετά atoi ;; (απλά πρέπει να δηλώσεις πίνακα A[n+1])

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

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

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