Εργαστήριο Τεχνολογίας Λογισμικού
0 votes
262 views

Καλησπέρα,

Επανέρχομαι με ένα άλλη μια ερώτηση σχετικά με άσκηση του βιβλίου. Η άσκηση ζητάει πρόγραμμα το οποίο ζητάει 10 ονόματα (50 λέει η άσκηση, το έκανα 10) σε πίνακα αντικειμένων string και το οποίο ωστόσο δεν επιτρέπει την καταχώριση του ίδιου ονόματος δεύτερη φορά. Ο κώδικάς μου είναι ο παρακάτω. Ωστόσο ο κώδικας με την εκκίνησή του μου ζητάει το πρώτο όνομα και μόλις το δίνω χτυπάει μη δεχόμενος το found που επιστρέφει η συνάρτηση ως false αλλά πάντα ως true. Καμία ιδέα;
Ευχαριστώ εκ των προτέρων!

 ...........
    bool find_it(string p[], int n, string str) {
    bool found;
    int i, j;
    found = false;
    for (i = 0; i <= n; i++) {
        for (j=0; j<i-1; j++){
            if (p[j] == str) {
                found = true;
                break;
            }
        }
    }
    return found;
    }

int main() {
    int i;
    bool found;
    string frasi[10];
    for (i = 0; i < 10; i++) {
            cout << "Dwse frasi: " << endl;
            getline(cin, frasi[i]);
            find_it(frasi, 10, frasi[i]);
            if (find_it(frasi, 10, frasi[i]) == true) {
                cout << "oxi! Ksanadwse frasi : " << endl;
            }
            else continue;   
    }
    return 0;
}
in progintro by (820 points) | 262 views

1 Answer

0 votes
Best answer

Έχεις κάμποσα προβληματάκια.

  • Το κυριότερο είναι ότι το find_it(frasi, 10, frasi[i]) θα είναι
    πάντα αληθές (αν έχεις υλοποιήσει σωστά το find_it), αφού πάντα
    μέσα σε έναν πίνακα υπάρχει το i-στο στοιχείο του. (Ίσως να χρησιμοποιούσες κάποιο προσωρινό string πριν κάνεις την αναζήτηση και ύστερα να το περνάς στον πίνακα).

  • Το loop που έχεις στη main δεν βάζει 10 στοιχεία στον πίνακα, αλλά το πολύ 10.

  • Η find_it δεν χρειάζεται δύο loop.


Edit:
Και μερικά εξτραδάκια που δεν επηρεάζουν πολύ τη λειτουργικότητα αλλά θα ήταν Καλό Πράγμα™ να παραλειφθούν:

  • Το πρώτο find_it είναι περιττό (και μάλλον το έχεις αφήσει εκ παραδρομής).
  • Μπορείς να παραλείψεις το else continue; και θα έχεις ακριβώς την ίδια λειτουργικότητα.
  • To if ( something == true) μπορεί πάντα να αντικατασταθεί από το if (something) και είναι και πιο καθαρό κατά τη γνώμη μου.
by (1.1k points)
selected by
0

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

Σχετικά με το loop find_it, το j το έβαλα ώστε να προσπαθήσω να ελέγχω απο 0 ως i-1 για το αν υπάρχει όνομα ίδιο με το frasi[i]. Αυτό αλλιώς πως θα μπορούσα να το κάνω;

Για τα εξτραδάκια, το πρώτο find_it το έβαλα ωστε να μπορεί να ψάξει και το δεύτερο ώστε να πάρει η συνθήκη την τιμή της συνάρτησης και να τη χρησιμοποιήσει. Οπότε σε μια τέτοια περίπτωση να μη χρησιμοποιώ τη συνάρτηση αλλά κατευθείαν να τη βάζω μέσα στη συνθήκη;

Επίσης, το if (something) το ξέρω αλλά η αλήθεια είναι ότι μπερδεύτηκα γιατί ήθελα να βεβαιωθώ ότι η συνθήκη θα έπαιρνε το true που θα έβγαζε η συνάρτηση και όχι το false αν στις περιπτώσεις που θα έβγαζε false.

0

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

Αυτήν τη στιγμή ο κώδικάς σου βάζει αυτό που διαβάζει μέσα στον πίνακα (getline(cin, frasi[i]);) και μετά ελέγχει αν αυτό που διαβάστηκε υπάρχει μέσα στον πίνακα (find_it(frasi, 10, frasi[i])).
Αυτό που προτείνω είναι να μη διαβάζεις κατευθείαν μέσα στον πίνακα, αλλά σε μια άλλη μεταβλητή (πχ getline(cin,temp)) και μετά να ψάχνεις αν η τιμή αυτής τη μεταβλητής υπάρχει στον πίνακα ( find_it(frasi,10,temp)) και στη συνέχεια, αν δεν υπάρχει, να το βάζεις στον πίνακα (frasi[i]=temp;).

Σχετικά με το loop find_it, το j το έβαλα ώστε να προσπαθήσω να ελέγχω απο 0 ως i-1 για το αν υπάρχει όνομα ίδιο με το frasi[i]. Αυτό αλλιώς πως θα μπορούσα να το κάνω;

Το i όμως που λές πηγαίνει από 0 έως n, οπότε το j θα πάρει τιμές: 0, 0 ως 1, 0 ως 2, 0 ως 3, ...... , 0 ως n-1. Δεν είναι το i της main.

το πρώτο find_it το έβαλα ωστε να μπορεί να ψάξει και το δεύτερο ώστε να πάρει η συνθήκη την τιμή της συνάρτησης και να τη χρησιμοποιήσει.

Η συνάρτηση δεν ξέρει αν βρίσκεται σε συνθήκη. Σε όποιο σημείο και να την καλέσεις αυτή ενδιαφέρεται μόνο για τα ορίσματα που τις δίνεις και θα επιστρέψει μια τιμή. Εσύ με το πρώτο find_it ψάχνεις να δεις αν υπάρχει μια λέξη στον πίνακά σου και αγνοείς το αποτέλεσμα και στο δεύτερο πάλι ψάχνεις να δεις αν υπάρχει η ίδια λέξη μέσα στον πίνακα, αλλά αυτή την φορά χρησιμοποιείς στη συνθήκη το αποτέλεσμα που σου γυρίζει η συνάρτηση για το if.

0

Τέλειο! Με το που έκανα αυτό με το temp δούλεψε ρολόϊ ο κώδικας. Ευχαριστώ πολύ!

301 questions

289 answers

288 comments

769 users