[C] valore di ritorno errato

stagnomaur
io devo creare un file “main.c”. Devo innanzitutto realizzare in linguaggio C la funzione corrispondente alla seguente
dichiarazione:
extern char max_pot10 (unsigned int val);

La funzione riceve un valore intero non negativo val e ritorna l’esponente della massima potenza del dieci contenuta in val. Ad esempio se val=123, 10^0 è contenuto in val, 10^1 è contenuto in val, 10^2 è contenuto in val, 10^3 non è contenuto in val. Quindi la funzione deve ritornare 2 (in altre parole il numero è nell’ordine delle centinaia). Se il numero è 0, la funzione deve ritornare -1. Se ad esempio chiamassimo la funzione inizializzando val a 123456, questa dovrebbe ritornare 5. Però nel mio caso non mi restituisce il valore 5, qualcuno potrebbe riscrivere il pezzo di codice in cui sbaglio?
char max_pot10(unsigned int val) {
	if (val == 0) {
		return -1;
	}
	if (val == 1) {
		return 0;
	}
	if (val == 12) {
		return 1;
	}
	if (val == 123) {
		return 2;
	}
	if (val == 1234) {
		return 3;
	}
	if (val == 12345) {
		return 4;
	}
}




int main(void) {
	unsigned int val, z;
	val = 123456;

	z = max_pot10(val);
	return 0;
}

Risposte
vict85
Direi che la funzione è completamente sbagliata (tranne il controllo sul valore 0). Insomma invece di calcolare qualcosa, fornisci un risultato specifico per alcuni valori specifici. Mi stupisco che il compilatore non ti dia problemi dato che ci sono dei valori di input per cui non fornisci alcun valore di ritorno.

Il professore, o il libro, supponevano che tu risolvessi il problema con un qualche ciclo e ritornassi il massimo valore [inline]i[/inline] per cui [inline]val >= 10^i[/inline] Se il problema sono le potenze, come lo faresti se ti chiedessero di trovare il massimo multiplo di 10 inferiore o uguale a val?

Nota che potresti trovare quel valore anche con un algoritmo logaritmico, ma non vale la pena dato che aumenteresti la complessità del codice e il valore massimo di ritorno è inferiore a 15.

stagnomaur
Ho appena iniziato a studiare questa interessantissima materia, però per adesso sono molto 'impacciato' nel fare gli esercizi perchè mi trovo all'inizio. Infatti come mi hai fatto notare, ora mi accorgo del grande errore che ho fatto..
Ho riprovato a rifare il programma secondo il tuo consiglio(anche se non sono sicuro), però sperando che sia giusto vedo che mi appare l'errore sull'identificatore i non definito e dichiarato che si trova nella riga 8 e 9. Sono andato a riguardarmi il concetto di identificatore sul mio libro, ma sinceramente non riesco a capire che cosa sinceramente dovrei definire e in quale modo. Magari ti mando il codice, cosi capisci meglio
#include <stdlib.h>;
#include <stdio.h>;

char max_pot10(unsigned int val) {
	if (val == 0) {
		return -1;
	}
		if (val >= 10 ^ i) {
			return (i-1);
		}
}

int main(void) {
	unsigned int val, i;
	val = 10 ^ 6;
	i = max_pot10(val);
	return 0;
}

apatriarca
Il linguaggio C non dispone di un operatore per l'elevamento a potenza, L'operatore ^ ha tutt'altro significato. Inoltre non hai dichiarato la variabile i in max_pot10.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.