← Torna al progetto

Sqrt

Newton-Raphson's method C Step 1 di 5

Project setup

Per iniziare andiamo a stabilire lo scheletro applicativo utile. In questo caso la scelta è quella di sviluppare una libreria, e non un programma. Vogliamo una libreria perché vogliamo offrire ad altri programmi l'abilità di utilizzare il nostro square root.

Possiamo quindi impostare la seguente struttura al progetto

Makefile         // per compilare
src/sqrt.h       // contiene i prototipi
src/sqrt.c       // contiene le funzioni, senza main()
src/main.c       // il programma con il main()

Prime funzioni

Per iniziare andiamo ad implementare nella nostra libreria tre funzioni matematiche elementari che saranno poi necessarie per l'algoritmo finale. Queste funzioni sono le seguenti:

  • absolute value

    Dato un numero \(x\) la funzione \(\texttt{absolute}(x)\) ritorna sempre il valore positivo, a prescindere dal segno iniziale.

\[\texttt{absolute}(x) = \begin{cases} x & x \geq 0 \\ -x & x < 0 \\ \end{cases}\]
  • square

    Dato un numero \(x\) la funzione \(\texttt{square}(x)\) ritorna il quadrato del numero.

\[\texttt{square}(x) = x \cdot x\]
  • average

    Dati due numeri \(x, y\) la funzione \(\texttt{average(x, y)}\) ritorna la media tra i due numeri.

\[\texttt{average}(x, y) = \frac{x + y}{2}\]

L'obiettivo sarà implementare queste funzioni. Nel file sqrt.h mettiamo i prototipi, mentre nel file sqrt.c mettiamo le implementazioni. Possiamo utilizzare il tipo double per lavorare con i numeri con la virgola.

Nello specifico abbiamo i seguenti prototipi da rispettare

double absolute(double x);
double square(double x);
double average(double x, double y);

Un primo main

Per iniziare implementiamo in main.c una semplice logica che legge un numero e lo ristampa nel terminale. A tale fine possiamo utilizzare la funzione scanf per leggere, e printf per stampare. Nello specifico è necessario utilizzare queste format strings

scanf("%lf", &x);          // per leggere
printf("%.6f\n", x);       // per scrivere

È di particolare importanza la sintassi %.6f in quanto viene utilizzata per fissare la precisione con cui lavoriamo: 6 cifre decimali. Questo vale per tutto il progetto e sarà il formato utilizzato durante i test.

Makefile

L'obiettivo del Makefile sarà produrre il binario finale. Nello specifico il make deve supportare i seguenti target:

  • all

    deve compilare src/sqrt.c e src/main.c e produrre il programma ./sqrt.

  • clean

    elimina il binario prodotto dalla compilazione. Deve funzionare anche quando il binario non è presente.

Da notare che la compilazione deve rispettare i seguenti flags

-Wall -Wextra -Werror -pedantic -std=c99

Risultato

Alla fine dobbiamo ottenere la seguente situazione

$ make
gcc -Wall -Wextra -Werror -pedantic -std=c99 -ggdb src/sqrt.c src/main.c -o sqrt
$ echo 2 | ./sqrt
2.000000

Inizia il progetto per avere un repository e poter consegnare gli step. Quello che leggi qui sopra è la versione per C: il linguaggio si sceglie iniziando il progetto.

Congratulazioni, hai completato il progetto Sqrt

Tutti i 5 step sono superati.