Anteprima
Vedrai una selezione di 3 pagine su 10
Prova d'esame Informatica A svolta Pag. 1 Prova d'esame Informatica A svolta Pag. 2
Anteprima di 3 pagg. su 10.
Scarica il documento per vederlo tutto.
Prova d'esame Informatica A svolta Pag. 6
1 su 10
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

Classificazione dei numeri

N S, il numero stesso (perché un qualunque numero è sì un divisore di se stesso, ma improprio). Chiamiamo difettivo un numero intero tale che la somma dei suoi divisori è minore del numero stesso (per esempio: N=10 S=1+2+5=8). Chiamiamo perfetto un numero intero uguale alla somma dei suoi divisori (per esempio: N=6 perché S=1+2+3=6). Chiamiamo abbondante un numero intero tale che la somma dei suoi divisori è maggiore del numero stesso (per esempio: N=42 S=1+2+3+6+7+14+21=54).

(a) Si codifichino le funzioni eC ...somma_divisori(...) ...classifica_numero(...), ciascuna delle quali riceve come parametro un numero intero positivo e mentre la prima funzione restituisce la somma dei divisori del valore del suo parametro (escluso il numero stesso), la seconda funzione restituisce se il valore del suo parametro è difettivo, restituisce se è perfetto, oppure -1.

0restituisce se è abbondante. [4 punti]+1
Nota: sia responsabilità del programma chiamante garantire che il valore passato come parametro sia
positivo (quindi né negativo, né nullo).

Soluzione
<unsigned somma_divisori(unsigned N) {
    unsigned d = 1, S = 0;
    while (d < N) {
        if (N % d == 0) {
            S = S + d;
        }
        d = d + 1;
    }
    return S;
}

int classifica_numero(unsigned N) {
    unsigned S = somma_divisori(N);
    if (S < N) return -1;
    if (S == N) return 0;
    return +1;
}>

Se si continua sul retro di qualche foglio, indicare quale

Informatica A – a.a. 2016/2017 – 3o Appello – 31/08/2017 Esercizio n. 3 -- foglio 5 di 10

(b) Si codifichi in un programma principale, che acquisisca dallo standard input una sequenza di
C main(),
numeri interi (di lunghezza arbitraria) terminata dal valore e che riporti sullo standard output il
0conteggio delle coppie di numeri consecutivi entrambi difettivi, oppure entrambi perfetti oppure
entrambi abbondandi. [5 punti]

Nota: quando appropriato, si

#include <stdio.h>
#define SENTINELLA 0

unsigned somma_divisori(unsigned N);
int classifica_numero(unsigned N);

int main () {
    int corr, prec = -1, cl_corr, cl_prec = 0;
    unsigned contaD = 0, contaP = 0, contaA = 0;
    
    do { 
        scanf("%d", &corr);
        
        if (prec > 0 && cor > 0) {
            cl_corr = classifica_numero((unsigned)corr);
            
            if (cl_prec == cl_corr) {
                if (cl_corr < 0) contaD++;
                else if (cl_corr == 0) contaP++;
                else contaA++;
            }
        }
        
        prec = corr;
        cl_prec = cl_corr;
    } while (corr != SENTINELLA);
    
    printf("\n Conteggi delle coppie di numeri consecutivi. \n");
    printf("\n difettivi: %u", contaD);
    printf("\n perfetti: %u", contaP);
    printf("\n abbondanti: %u", contaA);
    printf("\n");
    
    return 0;
}

// Qui và riportato il codice dei due sottoprogrammi
// ...somma_divisori(...) e ...classifica_numero(...)


qualeInformatica A – a.a. 2016/2017 – 3o Appello – 31/08/2017

Esercizio n. 3 -- foglio 6 di 10(c)

Si considerino le seguenti dichiarazioni di tipo di dato:

#define M 30
typedef struct value {
    unsigned v;
    int vclass;
} value_t;
typedef struct vnode {
    value_t info;
    struct vnode* next;
} vnode_t;
typedef vnode_t* vList;

Si codifichi in una funzione che preso come parametro un intero C generaLista(int k) se tale numero è positivo, alloca e restituisce una lista dinamica tale che:

  • nel primo nodo sia memorizzato il valore k (nell’attributo v del campo info) e la sua classificazione in difettivo, perfetto, o abbondante (nell’attributo vclass del campo info);
  • in ogni nodo successivo al primo sia memorizzata la somma dei divisori del numero nel nodo precedente e la classificazione di questa somma.

La lista generata deve avere al più lunghezza pari a M. È possibile che la lista generata ammetta un numero di nodi minore (o uguale) di M.

l'ultimo nodo aggiunto contiene il valore numericoM 1.® ® ®Per esempio: (ha divisori:1,2,5) (ha divisori:1,2,4) (ha divisore:1)10 8 7®(non ha divisori minori di sè stesso)1 0

Nota: quando appropriato, si suggerisce il riutilizzo dei sottoprogrammi definiti al punto 3(a). [5 punti]

SoluzionevList generaLista(int k) {vList testa = NULL;vnode_t *puntCoda = NULL, *puntNuovo;unsigned S = (unsigned)k, counter = 0;while (S > 0 && counter <= M) {puntNuovo = (vnode_t*)malloc(sizeof(vnode_t));puntNuovo->info.v = S;puntNuovo->info.vclass = classifica_numero(S);puntNuovo->next = NULL;if (testa == NULL) {testa = puntCoda = puntNuovo;}else { puntCoda->next = puntNuovo;puntCoda = puntCoda->next;}S = somma_divisori(S);counter += 1;}return testa;}

Se si continua sul retro di qualche foglio, indicare qualeInformatica A – a.a. 2016/2017 – 3o Appello – 31/08/2017 Esercizio n. 3 -- foglio 7 di 10

Soluzione AlternativavList

InsInFondo(vList testa, value_t elem) {
    vList punt, cur = testa;
    punt = (vList) malloc(sizeof(vnode_t));
    punt->next= NULL;
    punt->info = elem;
    if (testa == NULL)
        return punt;
    while (cur->next != NULL) {
        cur = cur->next;
        cur->next = punt;
    }
    return testa;
}

vList generaLista(int k) {
    vList testa = NULL;
    value_t elem;
    unsigned S = (unsigned)k, counter = 0;
    while (S > 0 && counter < M) {
        elem.v = S;
        elem.vclass = classifica_numero(S);
        testa = InsInFondo(testa, elem);
        S = somma_divisori(S);
        counter += 1;
    }
    return testa;
}
Se si continua sul retro di qualche foglio, indicare quale Informatica A – a.a. 2016/2017 – 3o Appello – 31/08/2017 Esercizio n. 3 -- foglio 8 di 10
Dettagli
Publisher
A.A. 2019-2020
10 pagine
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher osokriky di informazioni apprese con la frequenza delle lezioni di fondamenti di informatica e programmazione e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Politecnico di Milano o del prof Daniel Florian.