Giorgos3924 Δημοσ. 17 Μαρτίου 2010 Δημοσ. 17 Μαρτίου 2010 εστω οτι θελω να βαλω εναν αριθμο στοιχειων σε ενα πινακα και ζηταω απο το χρηστη να μου δωσει ολα τα στοιχεια μαζι εχοντας μεταξυ τουσ κενο..πως θα τα διαχωρισω μετα για να τα βαλω στον πινακα? Δηλαδή κάπως έτσι; >Δώσε στοιχεία πίνακα:... 1 2 3 4 5 6 7 8 9 0 [color="Blue"]<ENTER>[/color] Υπάρχει νομίζω μια εντολή εισόδου που διαβάζει το πληκτρολόγιο όταν πατηθεί κουμπί, χωρίς enter. Και νομίζω πως είναι η συνάρτηση getch() ή getche() Παράδειγμα. Να γραφεί πρόγραμμα σε C το οποίο διαβάζει έναν χαρακτήρα απο το πληκτρολόγιο και να το αποθηκεύει στη μεταβλητή ch. >#include <stdio.h> main() { char ch; ch=getch(); } Εκτέλεση: Είσοδος: 4(χωρίς enter) Έξοδος: (δεν εμφανίζει) Για να εμφανίζει και έξοδο χρησιμοποιούμε τη συνάρτηση getche(). Δεν ξέρω αν σε βοηθάει κάτι τέτοιο...
parsifal Δημοσ. 17 Μαρτίου 2010 Δημοσ. 17 Μαρτίου 2010 πως θα τα διαχωρισω μετα για να τα βαλω στον πινακα? strtok στη βιβλιοθήκη string.h Παραδείγματα χρήσης μπορείς να βρεις πάμπολλα και εδώ στην ενότητα Προγραμματισμού του Insomnia, χρησιμοποιώντας την Αναζήτηση του forum για μηνύματα που περιέχουν τη λέξη "strtok".
vraxoulis Δημοσ. 17 Μαρτίου 2010 Μέλος Δημοσ. 17 Μαρτίου 2010 .............................................
parsifal Δημοσ. 17 Μαρτίου 2010 Δημοσ. 17 Μαρτίου 2010 ναι αυτο θελω.να λεει πχ το προγραμμα΅: "δωσε τα στοιχεια που θελεις να αποθηκευσης σε ενα πινακα:" εμεις του δινουμε 1 45 600 25 και τα λοιπα και το προγραμμα παιρνει αυτους τουσ αριθμους και τους βαζει σε ενα πινακα οσων θεσεων ειναι τα στοιχεια που του εδωσα... Άρα, πριν από το tokenization του input string, χρειάζεσαι έναν επιπλέον βρόχο επανάληψης που θα μετράει τον αριθμό των κενών στο input string (άρα, θα γνωρίζεις και τον αριθμό των στοιχείων που εισήγαγε ο χρήστης: κενά + 1), ώστε να κάνεις malloc του πίνακα με το σωστό μέγεθος. Συμφωνούμε μέχρι εδώ; Αν ναι, έχεις κάτι στο μυαλό σου για το πώς μπορεί να γίνει αυτό;
nrkmaiden Δημοσ. 17 Μαρτίου 2010 Δημοσ. 17 Μαρτίου 2010 Χωρις να ειμαι 100% σιγουρος αλλα μπορεις να παιξεισ και με string διαβαζοντας το με scanf("%s",..........); αν κανω λαθος διορθοστε με.
C6WGMN Δημοσ. 17 Μαρτίου 2010 Δημοσ. 17 Μαρτίου 2010 Ο χειρότερος αλγοριθμός είναι να διαβάζεις ένα ένα τα στοιχεία και να μεγαλώνεις τον δυναμικό πίνακα κατά ένα στοιχείο κάθε φορά. Μία καλύτερη λύση θα είναι ο πίνακας να μεγαλώνει με βάση κάποιο αλγόριθμο που θα δίνει το καινούργιο μέγεθος (πχ αρχικό μέγεθος 100 στοιχεία και +50 στοιχεία κάθε φορά που γεμίζει, η 128 στοιχεία και διπλάσια κάθε φορά που γεμίζει, κλπ). Μια ακόμα καλύτερη λύση θα ήταν να χρησιμοποιήσεις μια λίστα (που ύστερα μπορείς να μετατρέψεις σε πίνακα). Οι συναρτήσεις για δυναμικούς πίνακες στην C είναι οι εξής: malloc, realloc, calloc, free.
vraxoulis Δημοσ. 17 Μαρτίου 2010 Μέλος Δημοσ. 17 Μαρτίου 2010 .............................................
virxen75 Δημοσ. 18 Μαρτίου 2010 Δημοσ. 18 Μαρτίου 2010 αυτο που εκανα παραπανω ειναι λαθος??ως προς την λειτουργια του... 1)-το 10 γιατί μπαίνει εδώ ακριβώς? -χρησιμοποιείς λάθος την malloc --->διορθωσε το > .............. A= (int *)malloc(sizeof(int[color="Red"][k][/color])); for (i=0; i<[color="Red"]10[/color]; i++) .............. 2) για να μετρήσεις τις θέσεις του πίνακα που απαιτείται διατρέχεις 2 φορές την είσοδο.1 για το μέγεθος και μία για το γέμισμα του πίνακα. κάνε το με μία μόνο επανάληψη 3) θεωρείς ότι το '-' διαχωρίζει την είσοδο,κάτι που είναι λάθος αφού υπάρχουν και αρνητικοί ακέραιοι. 4) εφόσον το αποτέλεσμα είναι μορφής χαρακτήρων πρέπει να μετατραπεί σε ακέραιο μία πιθανή υλοποίηση με βάση τον κώδικα σου θα ήταν ------------------------------------------------------------------------------ > #include <stdio.h> #include <string.h> #include <stdlib.h> char str[500]; char *pch=NULL; int main(){ int *A; A=(int *)malloc(sizeof(int)); int i; int k=0;//tha metraei tous arithmous printf("dwse ta stoixeia pou theleis na mpoune ston pinaka:"); fgets(str,500,stdin);//διαβάζει και τα κενά pch = strtok (str," ,."); while( pch != NULL ) { printf( "result is \"%s\"\n", pch ); A= (int *) realloc (A,(k+1)*sizeof(int)); A[k] =atoi(pch);//μετατροπή σε ακέραιο k++; pch = strtok( NULL," ,."); } //τύπωσε τον πίνακα for (i=0; i<k; i++) printf("\n A[%d]=%d",i,A[i]); free(A); getchar(); return 0; }
vraxoulis Δημοσ. 18 Μαρτίου 2010 Μέλος Δημοσ. 18 Μαρτίου 2010 .............................................
vraxoulis Δημοσ. 19 Μαρτίου 2010 Μέλος Δημοσ. 19 Μαρτίου 2010 .........................................
virxen75 Δημοσ. 20 Μαρτίου 2010 Δημοσ. 20 Μαρτίου 2010 tmp = (A + sum(A, index+1,k) +sum(A, index+2,k))3; μάλλον το ξέχασες. for(i = 0 ; i < k ; i+=3){ γιατί 0? free(A); getchar(); sum(A,index,k); το sum βάλε το πάνω από την free ---------- Προσθήκη στις 01:11 ---------- Προηγούμενο μήνυμα στις 00:30 ---------- το πρόγραμμα σου με κάποιες διορθώσεις γίνεται έτσι > #include <stdio.h> #include <string.h> #include <stdlib.h> int sum(int *, int , int ); char str[500]; char *pch=NULL; int main(){ int *A; int i,m; int k=0;//tha metraei tous arithmous printf("dwse ta stoixeia pou theleis na mpoune ston pinaka:"); fgets(str,500,stdin); pch = strtok (str," ,."); while( pch != NULL ) { A= (int *) realloc (A,(k+1)*sizeof(int)); A[k] =atoi(pch); k++; pch = strtok( NULL," ,."); } for (i=0; i<k; i++) printf("\n A[%d]=%d",i,A[i]); getchar(); printf("\nto elaxisto athroisma einai to %d",sum(A,k,0)); getchar();getchar(); free(A); return 0; } //anadromiki sunartisi [color="Red"]hints[/color] int sum(int *A, int index, int k){ [spoiler] static int min_sum; if (k==0) min_sum=-99999; if (index < k+3) return min_sum;[/spoiler] int tmp = A[k] + A[k+1]+A[k+2]; if(tmp < min_sum || k==0) min_sum=tmp; printf("\n start=%d , end=%d ,sum=%d ,minsum=%d",k,k+2,tmp,min_sum); [spoiler]return sum(A,index,(k+1));[/spoiler] } δοκίμασε το και αν δεν τα καταφέρεις δες την απάντηση
vraxoulis Δημοσ. 21 Μαρτίου 2010 Μέλος Δημοσ. 21 Μαρτίου 2010 ...............................................
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.