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

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

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

Γεια σας. Είμαι καινούρια στο forum και χρειάζομαι τη βοήθειά σας για ένα πρόβλημα στη fortran. Δεν γράφω εδώ για να μου το λύσετε, παρά μόνο για να με βοηθήσετε καθώς έχω κολλήσει κάπου και θέλω να ξεμπλοκάρω. Δεν ξέρω αν έχω τη λογική του προβλήματος ή γενικά την προγραμματιστική σκέψη, απλά το προσπαθώ καθώς θέλω να την μάθω, τη χρειάζομαι και για την σχολή μου!

 

Λοιπόν. Το πρόγραμμα μου ζητάει να τυπώνω ζεύγη διαφορετικών αριθμών προς αλλήλους (αυτοί που διαιρούνται ταυτόχρονα με τη μονάδα) από το 2 μέχρι το 20 και αν το πρόγραμμα δίνει το ζεύγος (n,m), να μην εκτυπώνει και το ζεύγος (m,n).

 

^το τελευταίο οφείλω να ομολογήσω πως δεν κατάλαβα τι ακριβώς πρέπει να κάνω για να μην μου τυπώνει 2 φορές το ίδιο ζεύγος με άλλη σειρά, σκέφτηκα κάτι όμως και το έγραψα. (το πιο πιθανόν να είναι εντελώς λάθος).

 

      program ex6
      implicit none
      integer i, j, k, l, counter, c
      
      do i=2,20 ! ksekina o metritis tou 1ou zeugous
         do j=2,20 ! ksekina o metritis tou 2ou zeugous
            counter=0
            do k=2,i-1          ! ksekina o metritis tou i gia to mod mexri 19
               c=0
               do l=2,j-1        ! ksekina o metritis tou j gia to mod mexri 19
                 if (mod(i,k).eq.0) counter=counter+1
                 if (mod(j,l).eq.0) c=c+1                      ! auksisi 2ou metriti gia to 2o zeugos
               end do            ! kleisimo metriti k
            end do               ! kleisimo metriti l

         if ((counter.eq.0).and.(c.eq.0)) write(*,*)'(',i,',',j,')' ! an paramenoun k oi 2 metrites 0 tote einai 1oi

         if (mod(j,i).eq.0) stop
         end do                 ! kleisimo tou metriti j
       end do                  ! kleisimo tou metriti i
       end

 

^το έκανα επεξεργασία γιατί είχα αρκετά λάθη και ακόμη δεν εξαλείφθηκαν!
           
 

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

1o λάθος : Απέφυγε την χρήση της goto . Μπορεί να σου κόψει μονάδες  ο καθηγητής
2ο λάθος : Απέφυγε τα τόσα πολλά σχόλια. Μπορεί να σου κόψει μονάδες  ο καθηγητής και δεν θα καταλάβει την λύση σου
3ο λάθος : το do k=2,i-1 δεν εκτελείται    επειδή το i-1  θα πάρει την τιμή 1 που είναι μικρότερη του 1. Άρα ο κώδικας θα τρέξει την εντολή if (mod(j,i).eq.0) go to 10 .

 H πράξη (mod(j,i).eq.0) είναι αληθής και γιαυτό το πρόγραμμα πάει στο label 10 και τερματίζει
4ο: Δεν είμαι μαθηματικός αλλά η εκφώνηση είναι λίγο περίεργη . Όλοι οι αριθμοί δεν δαιρούνται με το ένα ;
Άρα θέλεις όλους τους δυνατούς συνδυασμούς των αριθμών χωρίς να εμφανίζονται με ανάποδη σειρά .

 

Δεν χρειάζεσαι παραπάνω από 2 do εαν θέλεις να δοκιμάσεις ποια ζεύγη διαφορετικών διαιρούνται ταυτόχρονα με τον ίδιο αριθμό

  • Moderators
Δημοσ.

2ο λάθος : Απέφυγε τα τόσα πολλά σχόλια. Μπορεί να σου κόψει μονάδες  ο καθηγητής και δεν θα καταλάβει την λύση σου

 

Αυτό. Τα σχόλια δεν είναι για να εξηγείς πώς δουλεύει η γλώσσα αλλά πώς δουλεύει ο κώδικάς σου. Όλοι μπορούμε να καταλάβουμε ότι το counter = 0 εκχωρεί την τιμή 0 στη μεταβλητή counter. Το να το γράφεις ως σχόλιο είναι όχι μόνο περιττό, αλλά κάνει τον κώδικά σου δυσανάγνωστο και δείχνει έλλειψη σιγουριάς όταν γράφεις. Επίσης, θα συμφωνήσω για το θέμα με την εκφώνηση. Δεν κατάλαβα τι ακριβώς σου ζητείται. Να γράφεις όλα τα ζευγάρια αριθμών από το 1 μέχρι το 20;

Δημοσ.

Καταρχάς ευχαριστώ που απάντησες! Γράφω πολλά σχόλια για να καταλαβαίνετε τι κάνω και γιατί ο ίδιος ο καθηγητής μας είπε πως τα θέλει για να καταλαβαίνει την λογική μας και να μην χάνεται, αλλά όντως, εκεί που δεν χρειάζεται θα τα μειώσω! Σ'ευχαριστώ! Για το goto ο ίδιος και πάλι μας έδειξε αρκετά παραδείγματα που το χρησιμοποιούσε, ωστόσο αντί για goto θα βάλω stop μάλλον!

Είχα ακριβώς την ίδια απορία. Θα βάλω ακριβώς την εκφώνηση. Ίσως εννοεί να τυπώνω τους πρώτους αριθμούς, όμως να θέλει να τους τυπώνω σε ζεύγη.. Διαφωτίστε με αν μπορείτε.

"Γράψτε ένα πρόγραμμα το οποίο βρίσκει όλα τα ζεύγη από διαφορετικούς
θετικούς ακέραιους αριθμούς στο διάστημα 2 έως 20 που είναι “πρώτοι προς
αλλήλους” (έτσι ονομάζονται κάποιοι αριθμοί όταν ο μόνος αριθμός που
τους διαιρεί ταυτόχρονα είναι η μονάδα). Αν το πρόγραμμα δίνει το ζεύγος
(n,m), δεν θα πρέπει να δίνει και το ζεύγος (m,n)."

 

Θα το ξαναπροσπαθήσω! Το i-1 στην επαναληπτική δομή νομίζω πως χρειάζεται γιατί όταν κάνει την διαίρεση π.χ 13/13 θα ισχύει αυτόματα και το counter ποτέ δεν θα είναι 0, oπότε δεν θα μου τυπώνει το 13 ως πρώτο αριθμό και αυτό είναι λάθος.. Οπότε πρέπει πάντα να τον διαιρεί με i-1 για να μην διαρείται με τον εαυτό του! Έκανα το ίδιο πρόβλημα να μου τυπώνει τους πρώτους αρθμούς μέχρι το 100 και τρέχει κανονικά!

Δημοσ.

Σ'ευχαριστώ!

Δηλαδή ασπούμαι θέλει να τυπώνω (2,3), (3,5), (5,7), (7,11) κτλ? που έχουν κοινό διαιρέτη το 1 και είναι πρώτοι?

(για να σιγουρευτώ!) :P

  • Moderators
Δημοσ.

Δε θέλει να του τυπώνεις τους πρώτους αριθμούς, θέλει τους "πρώτους προς αλλήλους". Δηλαδή τα ζευγάρια (2,3), (3,5) και (3,7) πρέπει να εκτυπωθούν, ενώ τα (2,4), (3,6), (4,16) όχι. Τώρα, για να εκτυπώνονται τα ζευγάρια μόνο μία φορά, μπορείς να έχεις ένα πίνακα με το γινόμενο των 2 αριθμών. Στην περίπτωση του 5 και του 3, μπορείς να βάλεις το 15 στον πίνακα. Έτσι, όταν έρθει το 3 και το 5, θα δει ότι το γινόμενο υπάρχει ήδη στον πίνακα και έτσι δε θα εκτυπωθεί δεύτερη φορά.

 

Edit γιατί γράφω βλακείες...

Δημοσ.

Στα ζευγάρια που πρέπει να τυπώσεις δεν ειναι απαραίτητο ότι οι αριθμοι θα ειναι πρώτοι, πρέπει να ειναι πρώτοι μεταξύ τους. π.χ. στο ζευγάρι (4,7) οι αριθμοί είναι πρώτοι μεταξύ τους (οπότε πρέπει να τους τυπώσεις) αλλα δεν είναι και οι δύο πρώτοι.
Για να μην βγάλεις και το ζευγάρι (7,4) αρκεί ο εσωτερικός βρόγχος να ξεκινάει από τον μετρητή του εξωτερικού βρόχου + 1

do i = 2, 20
   do j = i+1, 20
...

108 συνδυασμοί βγαίνουν ;


Αν μπορεί να πάρει και την τιμή 20 ναι, αν πηγαίνει μέχρι και 19 είναι 101...

Δημοσ.

 

Στα ζευγάρια που πρέπει να τυπώσεις δεν ειναι απαραίτητο ότι οι αριθμοι θα ειναι πρώτοι, πρέπει να ειναι πρώτοι μεταξύ τους. π.χ. στο ζευγάρι (4,7) οι αριθμοί είναι πρώτοι μεταξύ τους (οπότε πρέπει να τους τυπώσεις) αλλα δεν είναι και οι δύο πρώτοι.

Για να μην βγάλεις και το ζευγάρι (7,4) αρκεί ο εσωτερικός βρόγχος να ξεκινάει από τον μετρητή του εξωτερικού βρόχου + 1

do i = 2, 20
   do j = i+1, 20
...

 

Σωστά. Μιλάμε για σχετικά πρώτους αριθμούς.

 

Επίσης ο τρόπος αρχικοποίησης του δείκτη στο εσωτερικό loop όπως σου έδειξε ο bird, παραλείπει τους περιττούς συνδυασμούς:

i\j|   2     3     4     5     6     7     8  . . .
---+---------------------------------------------
2  |   x   (2,3) (2,4) (2,5) (2,6) (2,7) (2,8)
3  |   x     x   (3,4) (3,5) (3,6) (3,7) (3,8)
4  |   x     x     x   (4,5) (4,6) (4,7) (4,8)
5  |   x     x     x     x   (5,6) (5,7) (5,8)
6  |   x     x     x     x     x   (6,7) (6,8)
7  |   x     x     x     x     x     x   (7,8)
8  |   x     x     x     x     x     x     x
.
.
.
Δημοσ.

Σας ευχαριστώ! Με τα σχόλια σας κατάλαβα τι ακριβώς ζητάει η άσκηση! Δοκίμασα αυτό, και δεν μου τρέχει σωστά...

Ξέρετε τι πάει λάθος με το πρόγραμμα;

 

program ex6

implicit none

integer i,j,counter

 

do i = 2, 20

counter=0

do j = 1+1, 19

if ((mod(i,j).ne.0).and.(i/j.eq.0).or.(i/j.eq.1)) then

counter=counter+1

end if

if (counter.ne.0) then

write(*,*)'(,',i,',',j,')

end if

end do

end do

end

Δημοσ.

Μου φαίνεται ότι δυσκολεύεσαι χωρίς λόγο .Θες αυτό :

counter=0

Για i από 2 εως και 20 με βήμα 1

    Για j από i+1 εως και 20 με βήμα 1

       Αν Μ.Κ.Δ(i,j) είναι 1

            counter=counter+1

             Εμφάνισε i,j

 

 

 

Και Source.png Πηγή: εδώ θα βρεις υλοποιήσεις του Μ.Κ.Δ

Δημοσ.

Ναι! do j = i+1,19 το έχω γραμμένο, απλά μου ξέφυγε!

Παρατηρείς κάτι άλλο;


Έβαλα μέχρι 19 γιατί όταν το i παίρνει την τιμή 20, το j θα πάρει την τιμή 21 και θα τυπώνει μέχρι 21 και θα ξεφεύγω από τα όρια που θέλω... (από 2-20)

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...