Μετάβαση στο περιεχόμενο
Ψηφοφορία
Υπάρχει ανοιχτή ψηφοφορία για να δωθούν μόνιμα δικαιώματα επιστάτη εδώ. Σας καλούμε να πείτε τη γνώμη σας και να ψηφίσετε.
Ζητούνται
Ζητούνται υπεύθυνοι για κάποια τμήματα. Περισσότερες πληροφορίες επικοινονήστε στο συμβούλιο (Βικιβήμα).

Τμήμα:C/Μάθημα 4ο

Από Βικιεπιστήμιο
Προηγούμενη
Ενότητα
Περιεχόμενα Επόμενη
Ενότητα


Στο μάθημα αυτό θα κάνουμε μάθουμε εντολές λήψης αποφάσεων.

Δομή ελέγχου if

[επεξεργασία]

Η δομή if είναι ένας τρόπος επικοινωνίας με το πρόγραμμα. Στην ουσία είναι μια "ερώτηση" που κάνουμε και πράττουμε ανάλογα με την απάντηση. Η ερώτηση είναι υπό την μορφή μιας συνθήκης και η if ελέγχει την ορθότητα της. Αν η συνθήκη είναι αληθής τότε εκτελείται η αμέσως επόμενη εντολή, αλλιώς το πρόγραμμα προσπερνάει μια εντολή και συνεχίζει με την επόμενη.

Σύνταξη
if (συνθήκη)
        εντολή_Α;
Παράδειγμα
if (x < 0)
        x *= -1;

Στο παράδειγμα ελέγχουμε την τιμή του x. Αν το x είναι ένας αρνητικός αριθμός (x < 0) τότε η συνθήκη ισχύει και εκτελείται η εντολή που υπάρχει αμέσως μετά. Αν το x είναι ένας θετικός αριθμός, τότε η εντολή αυτή θα προσπεραστεί και δεν θα εκτελεστεί ποτέ. Σε μια if μπορούμε να εντάξουμε και παραπάνω από μια εντολές χρησιμοποιώντας τις αγκύλες (braces), αλλά και να κάνουμε μια πιο "σύνθετη ερώτηση" συνδυάζοντας λογικούς και σχεσιακούς τελεστές.

Σύνταξη
if (λογική_έκφραση){
        εντολή_Α;
        εντολή_Β;
        εντολή_Γ;
}
Παράδειγμα (x=5)
if ((x > 10)||(x == 5)){
        scanf("%d",&x);
        printf("x = %d \n",x);
        x++;
}

Επιλογή else

[επεξεργασία]

Εάν θέλουμε το πρόγραμμα να διακλαδωθεί, δηλαδή ανάλογα με την συνθήκη να εκτελεστεί διαφορετικό τμήμα κώδικα, τότε χρησιμοποιούμε στην if την επιλογή else. Η λογική είναι ότι αν ισχύει η συνθήκη τότε θα εκτελεστεί το πρώτο block κώδικα, διαφορετικά θα εκτελεστεί το δεύτερο.

Σύνταξη
if (συνθήκη)
     εντολή_Α;
else
     εντολή_Β;
Παράδειγμα
if (x)
     printf("condition is TRUE");
else
     printf("condition is FALSE");

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

Τώρα ας δούμε ένα παράδειγμα χρήσης του if με else. Προσέξτε πως συντάσσεται μια δομή if μέσα σε μια άλλη δομή if.

#include<stdio.h>
int main()
{
	int fav_num;
	scanf("%d",&fav_num);
	if (fav_num > 0)
		printf("Your favorite number is positive.\n");
	else if (fav_num < 0)
		printf("Your favorite number is negative.\n");
	else
                printf("Your favorite number is 0.\n");
	return 0;
}
Έχουμε την δυνατότητα πολλαπλής διακλάδωσης της ροής του προγράμματος, χρησιμοποιώντας πολλές if την μια μέσα στην άλλη. Παρόλα αυτά, δεν συνιστούμε την χρήση παραπάνω από τριών επιπέδων if καθώς θα μπερδευόταν πολύ ο κώδικας. Για πολλαπλές επιλογές καταλληλότερη είναι η δομή switch που θα αναλύσουμε παρακάτω.


Ο σχεσιακός τελεστής ?:

[επεξεργασία]

Είναι ο μόνος τριαδικός τελεστής στην C, δηλαδή χρειάζεται 3 τελεσταίους για να λειτουργήσει. Η σύνταξή του είναι η ακόλουθη

(expression1) ? (expression2) : (expression3);

Αν το expression1 είναι αληθές τότε θα ενεργοποιηθεί το expression2, αλλιώς θα θα ενεργοποιηθεί το expression3.
Ουσιαστικά είναι μια σύντμηση της if, αλλά εφόσον είναι και ο ίδιος expression έχουμε την δυνατότητα να τον χρησιμοποιήσουμε με ακόμη περισσότερη ευχέρεια.

Παράδειγμα

#include<stdio.h>
int main()
{
	int x=5,y=10,max;
	max = (x > y)? x : y; // στην μεταβλητή max θα εκχωρηθεί το y αφού είναι μεγαλύτερο του x
	printf("The maximum number is %d.\n",max); 
}

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


Δομή επιλογής switch

[επεξεργασία]

Όπως η if έτσι και η switch μας επιτρέπει την διακλάδωση του προγράμματος σε διαφορετικά block κώδικα ανάλογα με την περίπτωση που ισχύει. Επειδή όμως οι περιπτώσεις της switch είναι σταθερές και όχι λογικές εκφράσεις, μπορεί να ισχύει μόνο μια περίπτωση, και άρα να εκτελεστεί μόνο ένα τμήμα κώδικα. Η switch συντάσσεται ως εξής:

Σύνταξη
switch (μεταβλητή){
	case σταθερά1:  εντολή_Α;
			break;
	case σταθερά2:  εντολή_Β;
			break;
	case σταθερά3:  εντολή_Γ;
			break;
	default: 	εντολή_Δ;
}
Παράδειγμα
switch (x){
	case 1: x++;
		break;
	case 2: x--;
		break;
	case 3: x+=x;
		break;
	default:printf("%d",x);
}

Όπως φαίνεται και στο παράδειγμα, αν το x έχει π.χ. την τιμή 2 τότε εκτελείται η εντολή x--; και επειδή μετά βάλαμε την δεσμευμένη λέξη break; η ροή του προγράμματος διακόπτεται και συνεχίζει μετά το τέλος της switch. Αν η break δεν υπήρχε τότε ο κώδικας θα εκτελούσε την εντολή και μετά όλες τις παρακάτω, δηλαδή αν αντιστοιχούσε στην 2, τότε θα εκτελούνταν και η 3 και η default. Σημειώστε ότι η default εκτελείται αν δεν προκύψει εγκυρότητα κάποιας άλλης περίπτωσης.

Εφαρμογές

[επεξεργασία]

Για καλύτερη κατανόηση της switch μελετήστε τα παρακάτω προγράμματα.

#include<stdio.h>
int main()
{
	int day;
	printf("Give me a number from 1 to 7: ");
	scanf("%d",&day);
	switch(day){
		case 1: printf("The first day of a week is Monday.\n");    break;
		case 2: printf("The second day of a week is Tuesday.\n");  break;
		case 3:	printf("The third day of a week is Wednesday.\n"); break;
		case 4:	printf("The fourth day of a week is Thursday.\n"); break;
		case 5:	printf("The fifth day of a week is Friday.\n");    break;
		case 6:	printf("The sixth day of a week is Saturday.\n");  break;
		case 7:	printf("The seventh day of a week is Sunday.\n");  break;
		default: printf("You gave a wrong number.\n");
	}
	return 0;
}

Προσέξτε την στοίχιση που κάναμε στις εντολές break. Κάνουν τον κώδικά μας πιο κατανοητό, και καλό είναι να χρησιμοποιείται για πολλές επαναλαμβανόμενες εντολές.


#include<stdio.h>
int main()
{
	char choice;
	int n1,n2;
	printf("Enter the first number:");
	scanf("%d",&n1);
	printf("\nEnter the second number:");
	scanf("%d",&n2);
	printf("\nEnter the operation you wish to make (+,-,*,/):");
	scanf(" %c",&choice); /*Προσοχή. Αφήστε ένα κενό πριν το %c αλλιώς το πρόγραμμα θα εισάγει τα πιθανά κενά που βρίσκονται πίσω από την scanf και δεν θα αφήσει τον χρήστη να εισάγει κάποιον χαρακτήρα.*/
	switch(choice){
		case '+': printf("%d + %d = %d",n1,n2,n1+n2); /*Πρόσθεση*/
			  break;
		case '-': printf("%d - %d = %d",n1,n2,n1-n2); /*Αφαίρεση*/
			  break;
		case '*': printf("%d * %d = %d",n1,n2,n1*n2); /*Πολλαπλασιασμός*/
			  break;
		case '/': 
			  if(n2!=0)
			  	printf("%d / %d = %d",n1,n2,n1/n2); /*Διαίρεση*/
			  else
				printf("Can't divide from zero. Learn mathematics."); /*Προσοχή σε τέτοια λάθη*/
			  break;
		default: printf("No such an operation available.\n");
	}
	return 0;
}


Ασκήσεις

[επεξεργασία]

Μεταγλωττίστε και εκτελέστε τις παραπάνω εφαρμογές.

Προηγούμενη
Ενότητα
Περιεχόμενα Επόμενη
Ενότητα