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

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

Δημοσ. (επεξεργασμένο)

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

 

Ασκηση 1) Να γραφεί ενα πρόγραμμα το οποίο θα διαβάζει ακεραίους και θα τους αποθηκεύει σε έναν πίνακα 3Χ5 πίνακα.Στη συνεχεια, το προγραμμα θα εμφανιζει τις στήλες των οποίων τα στοιχεία εχουν διαφορετικές τιμές  μεταξύ τους .Πχ 

                                       1  -2  2  5  9

                                       3   0  2  5  1

                                       1   7  2 -3  0

το πρόγραμμα πρεπει να εμφανίζει τα στοιχεία της 2ης και της 5ης στήλης

 

η λογική της άσκησης είναι να πάμε ανα στήλη και να χρησιμοποιήσουμε κάποιο μετρητή όπου θα μετράει πόσες φορές εχει χρησιμοποιηθεί ο κάθε αριθμός ανα στήλη,σωστά?? υπάρχει κάποιος αλλος τρόπος ?ειναι λάθος η σκέψη μου?

 

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

 

Να διαβάζει 10 ακεραίους ,να τους αποθηκεύει σε ένα πίνακα και στη συνέχεια να εμφανίζεται το πλήθος κάθε αριθμού.

 

Παραθέτω τον κώδικα μου

#include <stdio.h>

#define size 10

int main()
{
	int i, num, arr[size], same[] = {0};
	
	for(i = 0; i < size; i++)
	{
		printf("Enter number:");
		scanf("%d", &arr[i]);
	}
	for(i = 0; i < size; i++)
	{
		num = arr[i];
		same[num]++;
	}
	printf("Number occurrences\n");
	for(i = 0; i < size; i++)
		printf("Number %d appears %d times\n", arr[i], same[i]);
	return 0;
}

Αρχικά έχω μπερδευτεί με την αρχικοποίησει του μετρητή-πίνακα same ,αν βαλω same και ο χρήστης εισάγει κάποιο αριθμό μεγαλύτερο του πίνακα same ,πχ  num = 25  η εντολή same[25]++ θα αλλάξει το περιεχόμενο μια θέσης πίνακα εκτός των επιτρεπτών ορίων του πίνακα.

 

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

Επεξ/σία από orestis1996
  • Απαντ. 32
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Με C έχω να ασχοληθώ κάτι αιώνες, οπότε δεν είμαι σίγουρος αν το same[] = {0} είναι σωστό. Αν καταλαβαίνω σωστά, δημιουργείς πίνακα με μόνο μια θέση.Κατά τα άλλα το αρχικό πρόβλημα λύνεται και χωρίς μετρητες. Απλώς δες αν κάποιο νούμερο επανεμφανίζεται
for(k = 0; k < stiles; k++)//για καθε στηλη

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

          for(j = i+1; j < grammes; j++)

               if array(i,k)=array(j,k)//αν υπάρχουν 2 ίδια νουμερα

                  exists(k)=1

endif endfor endfor endfor

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

     if exists(i)=0

       print i

Αν κατάλαβα τι θες

(προφανώς ο κώδικας θέλει φτιαξιμο για τη c)

Δημοσ.

Αρχικά για να βρεις αν μια στήλη περιέχει όμοια στοιχεία μπορείς:

 

-Είτε να ταξινομήσεις την κάθε στήλη.. και μετά,στην ταξινομημένη πλέον στήλη.. αν 2 συνεχόμενα στοιχεία είναι ίδια τότε δεν κάνει

 

-Είτε πιο απλά, να τσεκάρεις όλους τους συνδυασμούς αν υπάρχει ίδιο στοιχείο. Το 1ο με το 2ο... το 1ο με το 3ο.... το 4ο με το 5ο. Βάλε και ένα break αν βρει ίδιο για να είσαι και πιο γρήγορος. 

 

Αν μια στήλη είναι έγκυρη την τυπώνεις αμμέσοςαφού δεν σου ζητάει κάτι παραπάνω

  • Like 1
Δημοσ.

ευχαριστω για τις απαντησεις σας,

 

BeAfraid ,ωραιος ο τροπος της ταξινομισης δε το ειχα σκεφτει,το δευτερο τροπο τον ειχα σκεφτει αλλα δεν μου αρεσε

 

Shai-Hulud, το same[ ] = {0} ειναι ο μετρητης-πινακας που εχω φτιαξει κ εχω αρχικοποιησει ολα τα στοιχεια του με μηδεν ωστε οταν το χρησιμοποιησω να μην μου δινει τυχαιες τιμες,δεν δημιουργω πινακα για μια θεση θελω για τους 10 αριθμους απλος αμα γραψω 10 ή βαλω size και βαλω κάποιο αριθμό μεγαλύτερο του πίνακα same ,πχ  num = 25  η εντολή same[25]++ θα αλλάξει το περιεχόμενο μια θέσης πίνακα εκτός των επιτρεπτών ορίων του πίνακα ,ετσι θα γινει χαμος για αυτο το αφησα κενο ,με τη λογικη οτι παρει μεγεθος μονος του ο πινακας δεν ξερω αν ειναι σωστο.

 

οποιος γνωριζει για τους μετρητες κατι ας το γραψει γιατι εχω μπερδευτει

Δημοσ.

http://www.tutorialspoint.com/cprogramming/c_arrays.htm
 

Initializing Arrays

You can initialize array in C either one by one or using a single statement as follows:

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

The number of values between braces { } can not be larger than the number of elements that we declare for the array between square brackets [ ].

If you omit the size of the array, an array just big enough to hold the initialization is created. Therefore, if you write:

double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

You will create exactly the same array as you did in the previous example. 

δημιουργησες πίνακα με 1 κελί. Εκτός και αν μπορείς να το αλλάξεις μετά με pointers ή κάτι παρόμοιο. Όπως προείπα την C δεν τη θυμάμαι

  • Like 1
Δημοσ.

Oπως ειπες και μονος σου ο αρχικος κωδικας ειναι πιθανο να καταληξει σε Undefined Behavior.

 

Στον πινακα same εχεις παραλειψει το μηκος του πινακα.Εχεις ομως τον αρχικοποιητη δηλαδη την σταθερη εκφραση 0 που περικλειεται σε αγκυλες.Ο μεταγλωτιστης θα χρησιμοποιησει το μηκος του αρχικοποιητη για να υπολογισει ποσο μεγαλος ειναι ο πινακας σε στοιχεια αλλωστε δεν εχει και αλλο τροπο να το κανει οποτε το μεγεθος ειναι 1 στοιχειο.

 

Στην περιπτωση που ο αρχικοποιητης ειναι μικροτερος απο τον πινακα πχ αν εβαζες στον same μηκος 5 και το 1 στον αρχικοποιητη τοτε το πρωτο στοιχειο θα ηταν 1 και τα αλλα ολα 0.

  • Like 1
Δημοσ.

Oπως ειπες και μονος σου ο αρχικος κωδικας ειναι πιθανο να καταληξει σε Undefined Behavior.

 

Στον πινακα same εχεις παραλειψει το μηκος του πινακα.Εχεις ομως τον αρχικοποιητη δηλαδη την σταθερη εκφραση 0 που περικλειεται σε αγκυλες.Ο μεταγλωτιστης θα χρησιμοποιησει το μηκος του αρχικοποιητη για να υπολογισει ποσο μεγαλος ειναι ο πινακας σε στοιχεια αλλωστε δεν εχει και αλλο τροπο να το κανει οποτε το μεγεθος ειναι 1 στοιχειο.

Με το μετρητη τι μπορω να κανω εχω κολησει

Δημοσ.

Στην περιπτωση που ο αρχικοποιητης ειναι μικροτερος απο τον πινακα πχ αν εβαζες στον same μηκος 5 και το 1 στον αρχικοποιητη τοτε το πρωτο στοιχειο θα ηταν 1 και τα αλλα ολα 0.

Από που και ως που θα είναι 0 τα άλλα στοιχεία; Ορίζεται κάτι τέτοιο στο πρότυπο;

 

Από όσο θυμάμαι, μόνο 0 δεν είναι!!!

Δημοσ.

Από που και ως που θα είναι 0 τα άλλα στοιχεία; Ορίζεται κάτι τέτοιο στο πρότυπο;

 

Από όσο θυμάμαι, μόνο 0 δεν είναι!!!

οταν βαζεις εναν μετρητη δεν πρεπει να τον αρχικοποιησεις με 0,ωστε οταν τον χρησιμοποιησεις να μην εμφανισει τυχαιες τιμες

Ο τροπος της ταξινομισης για τη λυση της ασκησης ειναι λαθος καθως με αυξουσα σειρα γινεται

 

                                      1  -2  2  5  9                       1  -2  2  -3  0

                                      3   0  2  5  1           ->         1   0  2   5  1

                                      1   7  2 -3  0                       3   7  2   5  9

ελεγχοντας τις δυο συνεχομενες τιμες προκυπτει οτι οι στηλες με διαφορετικες τιμες ειναι η 2,4,5 

ενω κανονικα θα επρεπε να ειναι μονο η 2,5 στηλη,οποτε ακυρο η ταξινομιση

παντως ο κωδικας για την ταξινομιση στηλης ειναι σωστος?

για δειτε 

for(i = 0; i < rows; i++)
	{
		for(j = 0; j < cols; j++)
		{
			if(arr[i][j] > arr[i+1][j])
			{
				temp = arr[i][j];
				arr[i][j] = arr[i+1][j];
				arr[i+1][j] = temp;
			}
		}
	}

αρα πρεπει να βρω λυση με τον μετρητη

Δημοσ.

Από που και ως που θα είναι 0 τα άλλα στοιχεία; Ορίζεται κάτι τέτοιο στο πρότυπο;

 

Από όσο θυμάμαι, μόνο 0 δεν είναι!!!

Ναι η έκφραση {0} είναι κλασικός τρόπος για να κάνεις την αρχικοποίηση σε μηδέν.

 

21 If there are fewer initializers in a brace-enclosed list than there are elements or members

of an aggregate, or fewer characters in a string literal used to initialize an array of known

size than there are elements in the array, the remainder of the aggregate shall be

initialized implicitly the same as objects that have static storage duration.

22 If an array of unknown size is initialized, its size is determined by the largest indexed

element with an explicit initializer. At the end of its initializer list, the array no longer

has incomplete type.

Το 22 λέει αυτό που έκανε ο OP ότι δηλαδή αν έχεις "arr[] = {5, 2}" θα είναι το ίδιο σαν να είχες δηλώσει "arr[2] = {5, 2}" και το 21 λέει ότι αν έχεις ορίσει τιμές για λιγότερα στοιχεία, τότε τα υπόλοιπα αρχικοποιούνται "όπως τα αντικείμενα που έχουν static storage duration" δηλαδή αρχικοποιούνται σε 0.

 

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

 

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

 

Ξεκινάς για κάθε στήλη και ελέγχεις τον 1ο αριθμό με τον 2ο, μετά τον 1ο με τον 3ο, κτλ, τον 2ο, με τον 3ο, κτλ μέχρι να βρεις 2 αριθμούς που είναι ίδιοι. Αν τελειώσεις τις ανακυκλώσεις και δεν έχεις βρει αριθμούς ίδιους τότε τυπώνεις την στήλη.

  • Like 3
Δημοσ.

orestis1996 μην σκάς για την ταξινομηση , πάρε την qsort έτοιμη και χρησιμοποιησέ την.

 

Εκτος και αν θές να την κάνεις και αυτη μόνος σου οποτε κάτσε διάβασε τον αλγοριθμο bubble-sort ή τον quicksort και μετά κατσε να τον υλοποιήσεις.

Δημοσ.

orestis1996 μην σκάς για την ταξινομηση , πάρε την qsort έτοιμη και χρησιμοποιησέ την.

 

Εκτος και αν θές να την κάνεις και αυτη μόνος σου οποτε κάτσε διάβασε τον αλγοριθμο bubble-sort ή τον quicksort και μετά κατσε να τον υλοποιήσεις.

Η ταξινόμηση εκτός από περιττός κόπος στην παρούσα άσκηση δεν είναι λάθος κιόλας ? Αν ταξινομήσουμε τον πίνακα, τότε θα τυπωθούν μεν οι σωστές στήλες αλλά όχι με την μορφή που είχαν πριν. Αντί δηλαδή να εμφανιστεί το σωστό 9, 1, 0 θα εμφανιστεί 0, 1, 9.

Δημοσ.

η λογική της άσκησης είναι να πάμε ανα στήλη και να χρησιμοποιήσουμε κάποιο μετρητή όπου θα μετράει πόσες φορές εχει χρησιμοποιηθεί ο κάθε αριθμός ανα στήλη,σωστά?? υπάρχει κάποιος αλλος τρόπος ?ειναι λάθος η σκέψη μου?

 

Αφου έχεις μονο 3 αριθμούς να συγκρίνεις αρκεί ενα loop

for(j = 0; j < 5; j++)
{
  int a = arr[0][j], b = arr[1][j], c = arr[2][j];
  if(a != b && a != c && b != c)
     //print a,b,c
}

Δημοσ. (επεξεργασμένο)

 

Αφου έχεις μονο 3 αριθμούς να συγκρίνεις αρκεί ενα loop

for(j = 0; j < 5; j++)
{
  int a = arr[0][j], b = arr[1][j], c = arr[2][j];
  if(a != b && a != c && b != c)
     //print a,b,c
}

δεν ειναι κ πολυ ωραιο σα λυση ,αμα ειχα ενα μεγαλυτερο πινακα ,αμα ειχα ενα πινακα με 4 γραμμες κ 12 στηλες 4Χ12 θα εκανα 12 συγκρισεις τιμων?θα προσπαθησω να βρω καποιο αλλο τροπο ,ευχαριστω για τις απαντησεις σας

Η ταξινόμηση εκτός από περιττός κόπος στην παρούσα άσκηση δεν είναι λάθος κιόλας ? Αν ταξινομήσουμε τον πίνακα, τότε θα τυπωθούν μεν οι σωστές στήλες αλλά όχι με την μορφή που είχαν πριν. Αντί δηλαδή να εμφανιστεί το σωστό 9, 1, 0 θα εμφανιστεί 0, 1, 9.

κοιτα δεν με ενδιαφει να βρω τη στηλη που εχει διαφορετικες τιμες κ μετα να εμφανισω τη στηλη αυτη ετσι οπως ειναι με τους αριθμους στη σειρα ,με ενδιαφερει να βρω τη στηλη που εχει διαφορετικες τιμες κ να την εμφανισω ,στο παραδειγμα που εδωσα διαφορετικες οι στηλες ειναι η 2η κ η 5η

σαν σκεψη η ταξινομιση δεν ηταν εντελως λαθος 

printf("The column %d has different numbers",j+1);

θα εμφανιζει 

The column 2 has different numbers

The column 5 has different numbers

Επεξ/σία από orestis1996
Δημοσ.

θα εμφανιζει 

The column 2 has different numbers

The column 5 has different numbers

Α οκ τότε. Δεν το κατάλαβα καλά και νόμισα ότι θα εμφανίζεις τις τιμές των αριθμών στις στήλες που έχουν διαφορετικούς αριθμούς.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

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