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

Πίνακες C


vraxoulis

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

Δημοσ.
εστω οτι θελω να βαλω εναν αριθμο στοιχειων σε ενα πινακα και ζηταω απο το χρηστη να μου δωσει ολα τα στοιχεια μαζι εχοντας μεταξυ τουσ κενο..πως θα τα διαχωρισω μετα για να τα βαλω στον πινακα?

Δηλαδή κάπως έτσι;

>Δώσε στοιχεία πίνακα:...
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().

 

Δεν ξέρω αν σε βοηθάει κάτι τέτοιο... :rolleyes:

Δημοσ.
πως θα τα διαχωρισω μετα για να τα βαλω στον πινακα?

 

strtok στη βιβλιοθήκη string.h

 

Παραδείγματα χρήσης μπορείς να βρεις πάμπολλα και εδώ στην ενότητα Προγραμματισμού του Insomnia, χρησιμοποιώντας την Αναζήτηση του forum για μηνύματα που περιέχουν τη λέξη "strtok".

Δημοσ.
ναι αυτο θελω.

να λεει πχ το προγραμμα΅:

"δωσε τα στοιχεια που θελεις να αποθηκευσης σε ενα πινακα:"

εμεις του δινουμε 1 45 600 25 και τα λοιπα

και το προγραμμα παιρνει αυτους τουσ αριθμους και τους βαζει σε ενα πινακα οσων θεσεων ειναι τα στοιχεια που του εδωσα...

 

Άρα, πριν από το tokenization του input string, χρειάζεσαι έναν επιπλέον βρόχο επανάληψης που θα μετράει τον αριθμό των κενών στο input string (άρα, θα γνωρίζεις και τον αριθμό των στοιχείων που εισήγαγε ο χρήστης: κενά + 1), ώστε να κάνεις malloc του πίνακα με το σωστό μέγεθος. Συμφωνούμε μέχρι εδώ; Αν ναι, έχεις κάτι στο μυαλό σου για το πώς μπορεί να γίνει αυτό;

Δημοσ.

Χωρις να ειμαι 100% σιγουρος αλλα μπορεις να παιξεισ και με string διαβαζοντας το με scanf("%s",..........);

 

αν κανω λαθος διορθοστε με.

Δημοσ.

Ο χειρότερος αλγοριθμός είναι να διαβάζεις ένα ένα τα στοιχεία και να μεγαλώνεις τον δυναμικό πίνακα κατά ένα στοιχείο κάθε φορά. Μία καλύτερη λύση θα είναι ο πίνακας να μεγαλώνει με βάση κάποιο αλγόριθμο που θα δίνει το καινούργιο μέγεθος (πχ αρχικό μέγεθος 100 στοιχεία και +50 στοιχεία κάθε φορά που γεμίζει, η 128 στοιχεία και διπλάσια κάθε φορά που γεμίζει, κλπ). Μια ακόμα καλύτερη λύση θα ήταν να χρησιμοποιήσεις μια λίστα (που ύστερα μπορείς να μετατρέψεις σε πίνακα).

 

Οι συναρτήσεις για δυναμικούς πίνακες στην C είναι οι εξής: malloc, realloc, calloc, free.

Δημοσ.
αυτο που εκανα παραπανω ειναι λαθος??

ως προς την λειτουργια του...

 

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;
}



Δημοσ.

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]

}

 

δοκίμασε το και αν δεν τα καταφέρεις δες την απάντηση

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

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

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