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

Εντολή για επιστροφή στη C?


jhanidis

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

Δημοσ.

Έστω ότι έχω μια loop πχ do.. while και μέσα έχω συνθήκες if. Και θέλω αν ισχύει η μια if να ξαναρχίζει τη loop από την αρχή, πώς το κάνω??

Δηλαδή,

 

do {

if (....) {

....... }

if (...) {

epistrofi stin arxi tis loop }

if (...) {

}

key=....

.....

while .....

Δημοσ.

Άπλώς βάλε μια goto στην πρώτη εντολή εντός της do...

Ή παρέκαμψε/αγνόησε τα εκατέρωθεν if ώστε η ροή να φτάσει στο πέρας του βρόγχου και να επιστρέψει στην αρχή...

 

-

Δημοσ.
Πώς μπορώ να αγνοήσω τα εκατέρωθεν if??

 

Με βάση το υπόδειγμα που έχεις δώσει (κατά περίπτωση) δοκίμασε με την continue.

 

Για παράδειγμα:

>
#include <stdio.h>

int main(void)
{
int C = 1;

do{
	/* Skip C if 5 */
	if(C == 5)
		continue; /* Skip immediatly to while */
	/* Print C on stdout */
	printf("%d\n", C);
}while(++C <= 10);/* Count to 10 */

/* End of program. */
printf("Press Enter to exit..");
getchar();

return 0;
}

 

Η continue μεταφέρει την εκτέλεση του loop (σαν το "C == 5") απευθείας στην "while" παρακάμπτοντας οτιδήποτε έπεται αυτής (πχ. "printf("%d\n", C);").

Δημοσ.

Μια continue μεσα στο if που σε ενδιαφέρει πιστεύω θα έλυνε το πρόβλημα.

Δημοσ.

Eξαρτάται από το τι κάνει το πρόγραμμα.

Πρόσθεσε σε κάθε εκατέρωθεν if την συνθήκη της επιστροφής με το not :

do {

 

if (...and not synthiki_peistrofhs) {

}

key=....

.....

while .....

 

κλπ

Έτσι όταν ισχύει η συνθήκη επιστροφής δεν θα εκτελούνται και η ροή θα φτάνει στο τέλος του βρόγχου και μετά θα ξαναξεκινά.

Εν προκειμένω όμως, η απλούστερη λύση είναι μια goto παρόλο που κάποιοι πορωμένοι στρουκτουραλιστές δεν θα συμφωνήσουν.

Στην fortran υπάρχει η cycle που λύνει το πρόβλημα κομψά (επιστροφή στην αρχή του βρόγχου και συνέχεια), στην C όχι.

 

Η continue έχει το μειονέκτημα ότι προξενεί έξοδο μόνον από το τρέχον block του προγράμματος.

Π.χ. αν έχεις δυο ή περισσότερες φωλιασμένες if, θα σε βγάλει μόνον από την πρώτη και άρα το πρόβλημα παραμένει...

 

-

Δημοσ.

Η goto σε προγράμματα C καλό είναι να αποφεύγεται - έχει υπερβολικά κακή φήμη. Η μόνη περίπτωση που οι ακαδημαϊκοί (διότι μάλλον πρόκειται για ερώτημα άσκησης) ανέχονται την goto σε C/C++ κώδικα είναι για έξοδο από nested-loops αν και εκεί ορισμένοι (πωρωμένοι) προτιμούν την χρήση κάποιου abort-flag κτλ. Γενικά σε κώδικα που πάει για αξιολόγηση ΑΕΙ/ΤΕΙ, goto δεν παίζει. Σε προσωπικό κώδικα, μπορεί να φανεί πολύ χρήσιμη (ο Knuth την αποδέχεται, ο Dijkstra την απορρίπτει - εγώ.. θέλω να υπάρχει διαθέσιμη σε κάθε γλώσσα). Στον κώδικα (template) που παραθέτει (διότι αυτά πάνε κατά περίπτωση με βάση το loop & flow-control) η continue είναι η καλύτερη λύση.

Δημοσ.

Ναι αλλά αν έχεις π.χ δύο βρόχους εμφωλευμένους και θες να κάνεις continue στον τοπ βρόχο μπορείς να θέσεις κάποια μεταβλητή ίση με 1 μετά να κάνεις break και όταν βγεις από τον πρώτο βρόχο να έχεις ένα if στην αρχή του τοπ βρόχου όπου θα λες if(flag==1) continue;. Έτσι πιστεύω θα δουλέψει.

Edit:Το ίδιο με το παιδί από πάνω είπα.

Δημοσ.

Οk, δεν επιμένω.

(Μήπως είσαι κι' εσύ φανατικός στρουκτουραλιστής ; :mrgreen:)

 

Εγώ χρησιμοποιώ ότι κάνει ένα πρόγραμμα πιο σαφές και κομψό και δεν περιορίζομαι σε δόγματα.

Για ασκήσεις βέβαια αλλάζει το πράγμα διότι οι απαιτήσεις είναι συγκεκριμένες...

 

Ναι αλλά αν έχεις π.χ δύο βρόχους εμφωλευμένους και θες να κάνεις continue στον τοπ βρόχο

μπορείς να θέσεις κάποια μεταβλητή ίση με 1 μετά να κάνεις break και όταν βγεις από τον πρώτο βρόχο να έχεις ένα if στην αρχή του

τοπ βρόχου όπου θα λες if(flag==1) continue;

 

Εγώ θα χρησιμοποιούσα goto.

Πιο απλά, γρήγορα, σαφέστερα και κομψά.

 

Kαι παρόλο που δεν την αποφεύγω δογματικά όπου εξυπηρετεί, τα προγράμματά μου είναι μια χαρά δομημένα και ευανάγνωστα...

 

εγώ.. θέλω να υπάρχει διαθέσιμη σε κάθε γλώσσα.

 

Σοφή ρήση.

Συμφωνώ. Κι εγώ το ίδιο...

 

-

Δημοσ.

δηλαδή στο προγραμμά μου αν βάλω continue στη μεσαία if θα βγει κατ ευθείαν από την if και θα πάει στην επόμενη if ή θα πάει στο while?

 

do {

if (....) {

....... }

if (...) {

continue }

if (...) {

}

key=....

.....

while .....

Δημοσ.

Aν θυμάμαι καλά, η παράκαμψη αφορά το τρέχον block στο οποίο ανήκει η if.

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

 

-

Δημοσ.

Χρησιμοποίησε την εντολή Continue μέσα στον βρόχο της if. Αυτό θα έχει σαν αποτέλεσμα να διακόψει όποια άλλη λειτουργία-εντολή υπάρχει μέσα στην LOOP μέχρι να συναντήσει την συνθήκη τερματισμού. Πρόσεξε όμως το που θα τοποθετήσεις τις υπόλοιπες εντολές σου. Όπως πχ. το τελεστή αύξησης για την LOOP.

 

Σου αναθέτω δύο παραδείγματα:

Αυτό για παράδειγμα θα εκτυπώνει το a συνέχεια (ατέρμων βρόχος), γιατί η εντολή continue θα προσπελάσει ότι εντολή υπάρχει μέχρι να συναντήσει την συνθήκη while. Επομένως και την εντολή αύξησης.

 

>#include<stdio.h>

void main(){
       int a=3, b=1, i=0;
       do{
     if (a>i) {
	printf("a\n");
[color="Red"]	continue;[/color]
     }
     if (b>i) {
	printf("b\n");
     }
[color="DarkGreen"]i++;[/color]
}while(i<2)
}

 

 

 

Σε σύκριση με αυτο στο οποίο η τιμή του i δεν επιρεάζετε απο την εντολή continue.

 

 

>#include<stdio.h>

void main(){
int a=3,b=1, i=0;
do{
	[color="DarkGreen"]i++;[/color]
	if (a>i) {
		printf("a\n");
		[color="Red"]continue;[/color]
	}
	if (b>i) {
		printf("b\n");
	}
}while(i<2);
}

 

Υ.Γ. Συγνώμη για την προχειρότητα των τιμών στους κώδικες.:-)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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