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

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
terminatorvasilis
Δημοσιεύσεις: 13
Εγγραφή: 22 Ιουν 2010 01:22

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

Δημοσίευση από terminatorvasilis » 22 Ιουν 2010 16:19

Γειά σε όλους και σε όλες!Είμαι νέος στο φόρουμ και προσπαθώ να διαβάσω τα θέματα που έχει για τη 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);
}
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<=B[j])

C[k]=A;

i++;
k++;

if(B[j]<A)

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


return 0;
}

Erevis
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

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

Δημοσίευση από Erevis » 22 Ιουν 2010 16:31

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

Στη 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
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

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

Δημοσίευση από dva_dev » 22 Ιουν 2010 18:17

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

terminatorvasilis
Δημοσιεύσεις: 13
Εγγραφή: 22 Ιουν 2010 01:22

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

Δημοσίευση από terminatorvasilis » 22 Ιουν 2010 20:21

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

Στη 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
Δημοσιεύσεις: 56
Εγγραφή: 12 Ιουν 2008 16:31
Τοποθεσία: Χαλάνδρι

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

Δημοσίευση από Erevis » 22 Ιουν 2010 20:37

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

Κώδικας: Επιλογή όλων

for&#40;i = 0; i < N; ++i&#41;
&#123;
  //code
&#125;
Απ'όσο καταλαβαίνω από το ποστ του dva_dev, εφόσον δεν έχεις brackets σε if το οποίο περιλαμβάνει πάνω από μια εντολή τότε προκύπτει κι αλγοριθμικό πρόβλημα.
If java had true garbage collection, programs would delete themselves upon execution.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

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

Δημοσίευση από dva_dev » 22 Ιουν 2010 21:33

Φίλε 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&#40;void&#41;
&#123;
	int i=1,j=1,k=1,A&#91;5&#93;,B&#91;5&#93;,C&#91;10&#93;,x;

	for&#40;i=1; i<=5; ++i&#41;
	&#123;
		printf&#40;"give a number\n"&#41;;
		scanf&#40;"%i", &A&#91;i&#93;&#41;;
	&#125;

	for &#40;j=1; j<=5; ++j&#41;
	&#123;
		printf&#40;"give a number\n"&#41;;
		scanf&#40;"%i", &B&#91;j&#93;&#41;;
	&#125;

	i=1;
	j=1;

	while&#40;i<=5 && j<=5&#41;
	&#123;
		if &#40;A&#91;i&#93; <= B&#91;j&#93;&#41;
		&#123;
			C&#91;k&#93; = A&#91;i&#93;;
		&#125;
		i++;
		k++;

		if&#40;B&#91;j&#93; < A&#91;i&#93;&#41;
		&#123;
			C&#91;k&#93; = B&#91;j&#93;;
		&#125;
		j++;
		k++;
	&#125;

	if &#40;i>5&#41;
	&#123;
		for&#40;x=j; j<=5; ++j&#41;
		&#123;
			C&#91;k&#93; = B&#91;x&#93;;
		&#125;
		k++;
	&#125;
	else
	&#123;
		for&#40;x=i; x<=5; x++&#41;
		&#123;
			C&#91;k&#93; = A&#91;x&#93;;
		&#125;
	&#125;

	k++;

	for&#40;i=1; i<=10; i++&#41;
	&#123;
		printf&#40;"%i\n", C&#91;i&#93;&#41;;
	&#125;
	return 0;
&#125;
Ελπίζω ότι τώρα θα σου είναι πιο εύκολο να διορθώσεις τα λάθη σου σύμφωνα και με τις προτάσεις του Erevis.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης