Dubbio nell'uso di bool (true o false)

di il
2 risposte

Dubbio nell'uso di bool (true o false)

Date due liste devo restituire una terza lista formata da valori che sono presenti nella prima lista e non nella seconda. Quindi devo fare l1 - l2.
Questa è il programma:
#define _CRT_SECURE_NO_WARNINGS
#include<stdbool.h>
#include<stdint.h>
#include<stdio.h>
#include<stdlib.h>


typedef int element;

typedef struct list_element{
	element value;
	struct list_element *next;
}item;

typedef item* list;

//firme
list emptylist();
list cons(element e, list l);
bool empty(list l);
element head(list l);
list tail(list l);


element getElement();
element copy(element e);
void printElement(element);

void dealloc(list l);
void showlist(list l);
bool contain(list l, element e);
list intersect(list l1, list l2);
list difference(list l1, list l2);

//primitive
list emptylist() {
	return NULL;
}

list cons(element e, list l) {
	list t;
	t = (list)malloc(sizeof(item));
	t->value = copy(e);
	t->next = l;
	return t;
}

bool empty(list l) {
	return (l == NULL);
}

element head(list l) {
	if (empty(l))
		abort();
	else
		return l->value;
}

list tail(list l) {
	if (empty(l))
		abort();
	else
		return l->next;
}

element getElement(){
	element el;
	scanf("%d", &el);
	return el;
}

element copy(element e){
	element el;
	el = e;
	return el;
}

void printElement(element el){
	printf("%d", el);
}


// DEALLOCAZIONE
void dealloc(list l){
	list temp;
	while (!empty(l)) {
		temp = l;
		l = tail(l);
		free(temp);
	}
}
// Non primitive

void showlist(list l) {
	printf("[");
	while (!empty(l)) {
		printElement(head(l));
		l = tail(l);
		if (!empty(l))
			printf(", ");
	}
	printf("]\n");
}

list difference(list l1, list l2)
{
	list l3 = emptylist();
	while (!empty(l1))
	{
		element el = head(l1);
		list tmp = l2;
		bool find = false;
		while (!empty(tmp))
		{
			if (el == head(tmp)) {
				find = true;
				break;
			}
			tmp = tail(tmp);
		}
		if (!find)
		{
			l3 = cons(el, l3);
		}
		l1 = tail(l1);
	}
	return l3;
}


int main(){

	list l1 = emptylist();
	list l2 = emptylist();
	list l3 = emptylist();

	element el;

	do{
		printf("inserisco elementi lista l1:\t");
		el = getElement();
		if (el != 0){
			l1 = cons(el, l1);
		}

	} while (el != 0);

	showlist(l1);

	do{
		printf("inserisco elementi lista l2:\t");

		el = getElement();
		if (el != 0){
			l2 = cons(el, l2);
		}

	} while (el != 0);
	
	showlist(l2);

	l3 = difference(l1, l2);

	printf("\nElementi lista l3:");
	showlist(l3);

	dealloc(l1);
	dealloc(l2);
	dealloc(l3);

}
Ho solo un dubbio nell'interpretazione della funzione difference:
list difference(list l1, list l2)
{
	list l3 = emptylist();
	while (!empty(l1))
	{
		element el = head(l1);
		list tmp = l2;
		bool find = false;
		while (!empty(tmp))
		{
			if (el == head(tmp)) {
				find = true;
				break;
			}
			tmp = tail(tmp);
		}
		if (!find)
		{
			l3 = cons(el, l3);
		}
		l1 = tail(l1);
	}
	return l3;
}
In teoria viene preso l'elemento della prima lista, e si scorre la seconda lista. con il debug non capisco perchè questo
if (!find)
		{
			l3 = cons(el, l3);
		}
viene eseguito quando find è false, e non quando è true. In teoria essendo bool find inizialmente false, l' if si dovrebbe eseguire quando è il suo opposto, quindi quando è true, perchè invece viene fatto il contrario?

2 Risposte

  • Re: Dubbio nell'uso di bool (true o false)

    Matte ha scritto:


    In teoria essendo bool find inizialmente false, l' if si dovrebbe eseguire quando è il suo opposto, ...
    Non è detto! Calandosi nelle intenzioni di chi ha scritto il codice (perché ogni codice può essere scritto in diversi modi), se la variabile find è inizializzata come false significa che è volutamente impostata come valore di default. All'interno del ciclo successivo si trova la condizione che se soddisfatta pone find = true:
    if ( el == head(tmp) )
    {
    	find = true;
    	break;
    }
    per cui la condizione all'uscita dal ciclo:
    if ( !find )
    {
    	l3 = cons(el, l3);
    }
    va interpretata così: se find è ancora false, allora...
  • Re: Dubbio nell'uso di bool (true o false)

    Grazie mille, ora ho capito!
Devi accedere o registrarti per scrivere nel forum
2 risposte