freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

Πρόβλημα με πρόγραμμα σε c για συγχώνευση πινάκων


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [6 Μηνύματα]      Bookmarks Tags: cΠρόγραμμα Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
terminatorvasilis


Μέλος από: 22 Ιουν 2010
Μηνύματα: 13

View users profile
ΜήνυμαΣτις: 22 Ιουν 2010 15:19    Θέμα: Πρόβλημα με πρόγραμμα σε c για συγχώνευση πινάκων Απάντηση με παράθεση  Mark this post and the followings unread

Γειά σε όλους και σε όλες!Είμαι νέος στο φόρουμ και προσπαθώ να διαβάσω τα θέματα που έχει για τη c.Πριν καμιά δεκαριά μέρες άρχισα να μαθαίνω c.Τώρα είμαι στο κεφάλαιο των πινάκων και φυσικά προσπαθώ να μάθω καλύτερα τα περασμένα κεφάλαια.Προσπαθώ να συγχωνεύσω σε έναν νέο πίνακα τα στοιχεία 2 άλλων.Είχα υλοποιήσει τον αλγόριθμο σε χαρτί αλλά όταν τον περνάω σε c ενώ ο compiler δεν μου βγάζει λάθη,εντούτοις στο cmd όταν δίνω τους αριθμους στους 2 πινακες μετα μου εμφανιζει διαφορετικα πράγματα.

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

#include <stdio.h>
int main (void)
{
int i=1,j=1,k=1,A[5],B[5],C[10],x;

for(i=1; i<=5; ++i){
printf("give a number\n");
scanf("%i",&A[i]);
}
for(j=1; j<=5; ++j){

printf("give a number\n");

scanf("%i", &B[j]);
}
i=1;
j=1;

while(i<=5 && j<=5){

if(A[i]<=B[j])

C[k]=A[i];

i++;
k++;

if(B[j]<A[i])

C[k]=B[j];

j++;
k++;
}
if(i>5){

for(x=j; j<=5; ++j)

C[k]=B[x];
k++;
} else
for(x=i; x<=5; x++)

C[k]=A[x];
k++;

for(i=1; i<=10; i++)

printf("%i\n",C[i]);


return 0;
}
Erevis


Μέλος από: 12 Ιουν 2008
Μηνύματα: 56
Περιοχή: Χαλάνδρι
View users profile
ΜήνυμαΣτις: 22 Ιουν 2010 15:31    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Το κύριο πρόβλημα στον κώδικα σου είναι η πρόσβαση στα στοιχεία των πινάκων.

Στη C οι θέσεις των πινάκων ξεκινάνε από το 0 και τελειώνουν στο Ν-1, Ν το μέγεθος του πίνακα. Πχ. για το τον κώδικα σου ο πίνακας 5 θέσεων έχει θέσεις απο 0 εως 4.

Συγκεκριμένα το πρόβλημα σου είναι το λεγόμενο off-by-one, δηλαδή γράφεις στην επόμενη θέση μνήμης από το τέλος του πίνακα. Έτσι καμιά φορά το πρόγαμμα επιδέχεται αλλαγές στο περιεχόμενο αυτής της θέσης γιατί δεν χρησιμοποιείται από αλλού, άλλες φορές όμως βλέπεις άλλο περιεχόμενο γιατί κάποιο άλλο σημείο του προγράμματός σου (ή καμια φορά άλλου προγράμματος πράμα δύσκολο λόγω των address spaces) το άλλαξε μιας και δεν ανήκει στον πίνακα. Ελπίζω να έγινα κατανοητός.

_________________
If java had true garbage collection, programs would delete themselves upon execution.
dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 22 Ιουν 2010 17:17    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

To if στη C παίρνει μόνο μία εντολή στο κομμάτι του then και μία μόνο στο κομμάτι του else.
Αν θέλεις να βάλεις περισσότερες από μία εντολές μπορείς, αλλά θα πρέπει να τις βάλεις μέσα σε άγκιστρα. Θα έλεγα να το κάνεις ούτως ή άλλως είτε έχεις μία, είτε πολλές εντολές.
terminatorvasilis


Μέλος από: 22 Ιουν 2010
Μηνύματα: 13

View users profile
ΜήνυμαΣτις: 22 Ιουν 2010 19:21    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

παράθεση:
Το κύριο πρόβλημα στον κώδικα σου είναι η πρόσβαση στα στοιχεία των πινάκων.

Στη C οι θέσεις των πινάκων ξεκινάνε από το 0 και τελειώνουν στο Ν-1, Ν το μέγεθος του πίνακα. Πχ. για το τον κώδικα σου ο πίνακας 5 θέσεων έχει θέσεις απο 0 εως 4.

Συγκεκριμένα το πρόβλημα σου είναι το λεγόμενο off-by-one, δηλαδή γράφεις στην επόμενη θέση μνήμης από το τέλος του πίνακα. Έτσι καμιά φορά το πρόγαμμα επιδέχεται αλλαγές στο περιεχόμενο αυτής της θέσης γιατί δεν χρησιμοποιείται από αλλού, άλλες φορές όμως βλέπεις άλλο περιεχόμενο γιατί κάποιο άλλο σημείο του προγράμματός σου (ή καμια φορά άλλου προγράμματος πράμα δύσκολο λόγω των address spaces) το άλλαξε μιας και δεν ανήκει στον πίνακα. Ελπίζω να έγινα κατανοητός.


Δηλαδή όταν δίνω το τελευταίο νούμερο στον πίνακα εκείνο αποθηκεύεται σε θέση που ξεπερνάει τον αριθμό του πίνακα;
Επιπλέον,αν εκχωρήσω απο την αρχή στα i,j,k το 0 αντί του 1,πάλι σαν αποτέλεσμα μου βγάζει αποτελέσματα τα οποία δεν καταχωρησα.Δλδ αν καταχωρησω:2,4,5,4,3,2,2,4,5,6, κτλ όταν εμφανίζει τον πίνακα c μου εμφανίζει:23238293829839283 9 -322323 κτλ.

Συγγνώμη αν σας κουράζω,αλλά θα ήθελα πραγματικά να το υλοποιήσω αυτο το πρόγραμμα
Erevis


Μέλος από: 12 Ιουν 2008
Μηνύματα: 56
Περιοχή: Χαλάνδρι
View users profile
ΜήνυμαΣτις: 22 Ιουν 2010 19:37    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Ναι, γράφεις εκτός ορίων του πίνακα. Εκτός του ότι πρέπει να ξεκινάς από το μηδέν, στην συνθήκη του for θέλει <, όχι <=.
Για να προσπελάσεις πίνακα με μέγεθος Ν επαναληπτικά:

κώδικας:

for(i = 0; i < N; ++i)
{
  //code
}


Απ'όσο καταλαβαίνω από το ποστ του dva_dev, εφόσον δεν έχεις brackets σε if το οποίο περιλαμβάνει πάνω από μια εντολή τότε προκύπτει κι αλγοριθμικό πρόβλημα.

_________________
If java had true garbage collection, programs would delete themselves upon execution.
dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 22 Ιουν 2010 20:33    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Φίλε terminatorvasilis, για αρχή όταν κάνεις post κώδικα στο forum καλό είναι να το περικλείεις σε [ code ] ... [ /code ] (χωρίς τα κενά στις []), για να μην βγάζουμε τα ματάκια μας όταν προσπαθούμε να τον διαβάσουμε.
Εκτός αυτού είναι πολύ σημαντικό να μορφοποιείς τον κώδικα σου ώστε με μια απλή ματιά να μπορείς να βγάλεις άκρη τι εκτελείται μέσα σε άλλες εντολές και τι όχι.
Πέρα από αυτό θα έλεγα ότι ο προγραμματισμός είναι 25% γράψιμο κώδικα και 75% test και debugging. Το να μάθεις να χρησιμοποιείς κάποιον debugger είναι εκ των ουκ άνευ.
Αρκετά περιβάλλοντα προσφέρουν κάποιον debugger ενσωματωμένο (π.χ. visual studio, c++ builder), μάθε να τον χρησιμοποιείς όπως ξέρεις να αναπνέεις. Αν έχεις κάποια από τις visual studio express editions (που μπορείς να τις έχεις δωρεάν), κοίτα το μενού Debug | Step Into και Step Over, τι πλήκτρα είναι για να τρέχεις τον κώδικα σου μία μία εντολή και να τσεκάρεις από που περνάει και τι τιμές έχουν οι μεταβλητές σου. Οι άλλοι debuggers δεν ξέρω πως παίζουν.

Με λίγο φορμάρισμα ο κώδικας σου γίνεται ως εξής:
κώδικας:
#include <stdio.h>

int main(void)
{
   int i=1,j=1,k=1,A[5],B[5],C[10],x;

   for(i=1; i<=5; ++i)
   {
      printf("give a number\n");
      scanf("%i", &A[i]);
   }

   for (j=1; j<=5; ++j)
   {
      printf("give a number\n");
      scanf("%i", &B[j]);
   }

   i=1;
   j=1;

   while(i<=5 && j<=5)
   {
      if (A[i] <= B[j])
      {
         C[k] = A[i];
      }
      i++;
      k++;

      if(B[j] < A[i])
      {
         C[k] = B[j];
      }
      j++;
      k++;
   }

   if (i>5)
   {
      for(x=j; j<=5; ++j)
      {
         C[k] = B[x];
      }
      k++;
   }
   else
   {
      for(x=i; x<=5; x++)
      {
         C[k] = A[x];
      }
   }

   k++;

   for(i=1; i<=10; i++)
   {
      printf("%i\n", C[i]);
   }
   return 0;
}

Ελπίζω ότι τώρα θα σου είναι πιο εύκολο να διορθώσεις τα λάθη σου σύμφωνα και με τις προτάσεις του Erevis.
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [6 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++


Σχετικά θέματα
 Θέματα   Απ/σεις   Αποστολέας   Τελευταίο μήνυμα 
ενας κωδικας σε C που βγαζει μη αναμενομενο αποτεσμα 1 teresa92 13 Αυγ 2016 21:26
teresa92 Εμφάνιση τελευταίου μηνύματος
Bitwise operators in C 3 Kappa4 15 Δεκ 2014 20:38
mariosal Εμφάνιση τελευταίου μηνύματος
 
Τώρα είναι 04 Δεκ 2016 22:19 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos