0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo...

65
1 0. Dato un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto #include <stdio.h> void main () { int numero; printf("Introduci un numero maggiore di 0\n"); scanf("%d", &numero); if (numero > 0) { int divisore, resto, quoziente, totale; Inizio N S=0 Div = N - 1 Div = 0 ? Q = N / Div R = N – Div * Q R = 0? S = S + Div Div = Div - 1 S=N? Si No Si No N è perfetto N non è perfetto Fine No Si

Transcript of 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo...

Page 1: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

1

0.DatounnumeronaturaleN>0,direseessoèugualeonoallasommadeisuoidivisori(direcioèseèunnumeroperfetto

#include <stdio.h> void main () { int numero; printf("Introduci un numero maggiore di 0\n"); scanf("%d", &numero); if (numero > 0) { int divisore, resto, quoziente, totale;

DatounnumeronaturaleN>0,direseessoèugualeonoallasommadeisuoidivisori.

Inizio

N

S=0

Div=N-1

Div=0?

Q=N/Div

R=N–Div*Q

R=0? S=S+Div

Div=Div-1

S=N?

Si

No

Si

No

Nèperfetto

Nnonèperfetto

Fine

No

Si

Page 2: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

2

totale = 0; for (divisore = numero - 1; divisore > 0; divisore--) { quoziente = numero / divisore; resto = numero - divisore * quoziente; if (resto == 0) totale += divisore; } if (totale == numero) printf("Il numero %d è perfetto\n", numero); else printf("Il numero %d non è perfetto\n", numero); } else printf("Errore: il numero %d non è maggiore di zero\n", numero); }

1.Scrivereunprogrammacheverificaseunaternadinumeriinterièpitagorica

AnalisidelproblemaINPUT(variabilietipo)?Trenumeriinterix,y,z:int OUTPUT?Si/No

MA... Capire il problema: cosa è una terna pitagorica? Il problema si trasforma nel capire se i tre numeri immessi corrispondono a cateti e ipotenusa di un triangolo rettangolo. Chiamiamo le variabili di input cat1,cat2,ip.

Programmazione

2. Scrivere un algoritmo che, data una sequenza di numeri interi positivi cheterminacon0(dilunghezzaaprioriillimitata),visualizzailnumeroditerne(anchesovrapposte)dinumericonsecutiviall’internodellasequenzacherappresentanounaternapitagorica.Setrenumeriinterix,yezverificanolarelazionex2+y2=z2,sidicecheformanounaternapitagorica.Adesempio,datalasequenza:1,6,8,10,24,26,5,0allorasonopresenti leseguentidueternepitagoriche:(6,8,10)e

Page 3: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

3

(10,24,26).Sipuòvederecheinquestoesempioledueternesisovrappongonopoichéhannoilvalore10incomune.

Inizio

Leggi n1

n1 = 0?

Leggi n2

n1*n1+n2*n2 = n3*n3?

n1 = n2n2 = n3

Leggi n3

quante

Fine

quante = quante+1

si

si

no

no

no

n2 = 0?

Leggi n3

n3 = 0?

quante = 0

si

si

no

Page 4: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

4

/* Soluzione di Manuel Sozzi <[email protected]> */ #include <stdio.h> int main () { int quante=0; /*indica il numero di terne pitagoriche*/

int n1, n2, n3; /*variabili usate per salvare i numeri inseriti*/

int i=4; //indice per la terza printf printf("Contatore di terne pitagoriche, realizzato da Sozzi Manuel\n"); printf("\n"); printf("Inserire una sequenza di valori crescenti, inserire 0 per terminare\n"); printf("inserisci numero 1 della sequenza\n"); scanf("%d",&n1); while (n1<0) { /*itera finché non viene inserito un valore positivo */ printf("il valore inserito deve essere positivo\n"); scanf("%d",&n1); } if (n1!=0) { /*se il numero inserito Ë diverso da 0 acquisisci il

secondo numero*/ printf("inserisci numero 2 della sequenza\n"); scanf("%d",&n2); while (n2<0) { /*itera finchË non viene inserito un valore positivo*/ printf("il valore inserito deve essere positivo\n"); scanf("%d",&n2); } if (n2!=0){ /*se il numero inserito é diverso da 0 acquisisci il

terzo numero*/ printf("inserisci numero 3 della sequenza\n"); scanf("%d",&n3); while (n3<0) { /*itera finché non viene inserito un valore positivo*/ printf("il valore inserito deve essere positivo\n"); scanf("%d",&n3); } while (n3!=0) { /*se il numero inserito Ë diverso da 0 acquisisci il

numero successivo*/ if (n1*n1+n2*n2==n3*n3) { /* verifica se gli

ultimi 3 numeri sono una terna pitagorica*/ quante=quante+1; printf("i numeri %d, %d, %d sono una terna pitagorica\n",n1,n2,n3); } else printf("i numeri %d, %d, %d NON sono una terna pitagorica\n",n1,n2,n3); n1=n2; n2=n3; printf("inserisci numero %d della sequenza\n",i); scanf("%d",&n3); while (n3<0) { /*itera finché non viene inserito un valore

positivo*/ printf("il valore inserito deve essere positivo\n"); scanf("%d",&n3); } i++;

Page 5: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

5

} } } printf("il numero di terne pitagoriche e: %d",quante); }

3.Scrivereunalgoritmoche,datiduenumeriAeB,troviilloroMCD.

Inizio

leggi n1

leggi n2

n1 < n2?

minimo = n2 minimo = n1

si

no

n1 divisibile per minimo ed n2

divisibile per minimo?

minimo = minimo -1 minimo Fine

no

si

Page 6: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

6

4.Scrivereunalgoritmoche,datounnumerointero,verifichiestampisesitrattadiunnumeroprimooppureno.

Inizio

Leggi n

n = 1?

divisore = 2esci = 0

no

primo = 1

esci = 1?

divisore = n?

n è divisibile per divisore?

divisore = divisore +1

esci = 1

esci = 1primo = 0

primo

Fine

no

no

no

no

si

si

si

si

Page 7: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

7

5.Definirelestrutturedatinecessarieadunprogrammaperlagestionedeitreni.

/* tipo_orario: ore, minuti, secondi */

typedef struct {

int ore, minuti;} tipo_orario;

tipo_orarioèunNUOVOTIPO!(comechar,int,ecc.)

/* tipo_mese per indicare un mese */

typedef enum { gennaio,

febbraio, marzo, aprile, maggio, giugno, luglio, agosto, settembre, ottobre, novembre, dicembre

} tipo_mese;

/* tipo_data: una struttura che indica una data composta da giorno, mese, anno */

typedef struct {

int giorno;

tipo_mese mese;

int anno;

} tipo_data;

typedef enum { falso,vero} tipo_booleano;

/* tipo_categoria: una categoria di treno */

typedef enum { eurostar, intercity, interregionale, regionale, omnibus} tipo_categoria;

/* tipo_treno: per ogni treno indico: ora e data di partenza, ora e data di arrivo, codice del treno (una stringa di caratteri), categoria del treno,

se e' a prenotazione obbligatoria o no */

/* Codice treno è codice alfanumerico di 6 caratteri quindi è necessaria una stringa di 7 caratteri per la memorizzazione dei 6 caratteri e del carattere ‘\0’!*/

Page 8: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

8

#define CODLEN 6+1

/*Le città verranno memorizzate con al più 30 caratteri */

#define CITTALEN 30+1

typedef struct {

tipo_orario ora_partenza;

tipo_data data_partenza;

tipo_orario ora_arrivo;

tipo_data data_arrivo;

char citta_partenza[CITTALEN];

char citta_arrivo [CITTALEN];

char codice[CODLEN];

tipo_categoria categoria;

tipo_booleano prenotazione_obbligatoria; } tipo_treno;

void main() {

/* Qualche esempio di dichiarazione */

tipo_treno treno1, treno2;

/* Array di treni */

tipo_treno treni[5];

/* E qualche esempio di assegnamenti */

treno1.ora_partenza.ore = 12; treno1.ora_partenza.minuti = 13; treno1.ora_partenza.secondi = 0;

treno1.categoria = eurostar;

treno1.ora_partenza.ore = 14;

treno2.ora_partenza = treno1.ora_partenza;

/* Stampo qualche variabile assegnata */

printf("Treno 1: ora partenza\n");printf("Ora: %d, Minuti: %d \n", treno1.ora_partenza.ore, treno1.ora_partenza.minuti);

printf("Treno 2: ora partenza\n");printf("Ora: %d, Minuti: %d \n", treno2.ora_partenza.ore, treno2.ora_partenza.minuti);

printf("Treno 1: categoria\n"); printf("Categoria: %d\n", treno1.categoria);

Page 9: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

9

}

6.CalcolarelaresistenzaequivalenteaR1inparalleloconR2.

1. AnalisidelproblemaINPUT(variabilietipo)?R1,R2:reali(float)OUTPUT?RP:float

Passo 1: risolvere il problema (nel mondo reale) R1=?R2=?Dall'esterno!RP=?L'equivalente di due resistenze in parallelo è dato dalla formula(R1*R2)/(R1+R2)

2.Programmazione

7. Generalizzare il programma precedente in modo che sia possibile calcolarel’equivalenteparallelodiNresistenze.

A differenza dell'esercizio con due resistenze in parallelo, non sappiamo a prioriquanteresistenzeavremo.Ènecessariomemorizzarleinunarray.

L'array deve avere dimensioni fissate a priori (usare una costante MAX definitatramite direttive).Serve un contatore per sapere quante delle celle di memoriariservateall'arrayconterrannoeffettivamenteilvalorediunaresistenza

Laresistenzaequivalentesarà1/(S1/Ri)

INPUT:Ilnumero"n"diresistenze(chedeveessere<=MAX)

Le"n"resistenze(chedevonoesserediverseda0)

OUTPUT:LaresistenzaequivalenteRP

Page 10: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

10

Separiamoilproblemainsotto-problemi:

1. Acquisirelenresistenze

2. Invertirelenresistenze

3. Sommarelenresistenzeinvertitetraloro

4. Invertirelasommaottenuta

Implementazione:

/* Calcolare il parallelo di n resistenze, con n specificato dall'utente */

#include <stdio.h>

#define MAX 100

void main(){

int n; //numero di resistenze effettive

int i; //contatore per i cicli

float resistenze[MAX]; //array di valori

float RP = 0; //dichiarato ed inizializzato in una sola istruzione!

/*immissione dati*/

printf("\nQuante resistenze vuoi combinare in parallelo (non più di %d)? ", MAX);

scanf("%d", &n);

i = 0;

while (i < n) {

/*chiamo R1 la prima resistenza, che però sarà in posizione 0 nell'array. i non viene incrementato qui!*/

Page 11: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

11

printf("Inserire il valore di R%d (diverso da 0)", i+1);

scanf("%f", &resistenze[i]);

i++; //ora incremento i

}

/*inversione delle resistenze*/

i = 0;

while (i < n) {

resistenze[i] = 1/resistenze[i];

/*sovrascrivo le resistenze con gli inversi (se volessi tenere le resistenze originali, dovrei usare un altro array)*/

i++;

}

/*calcolo di RP*/

i = 0;

while (i < n) {RP += resistenze[i];i++;}

/*inverto RP*/

RP = 1/RP;

/*scrivo RP*/

printf("La resistenza equivalente vale %f Ohm\n", RP);

system("pause"); //l'applicazione attende la pressione di un tasto prima terminare

/*serve solo per lanciare i programmi da Dev-C++. Nelle applicazioni reali non serve. */

}

Page 12: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

12

8. Elevare a potenza due numeri interi (base ed esponente). L’esponente deveesserepositivoonullo.

Analisidelproblema

INPUT(variabilietipo)?base,esponente:int

OUTPUT?base^esponente:int

Base,esponente(siipotizzamaggioredizero)

potenza==base^esponenteMa ancora, ^ ha un altro significato potenza=base*base*....*basetantevoltequantovalel'esponente

2.Programmazione

SERVEUNCICLO

CONTATOREperilciclo

9.Scrivereunprogrammadiunregistratoredicassache,acquisitounimportodarestituire al cliente come resto (un numero float), calcoli e visualizzi lacombinazionedimonetedarestituire. Inparticolare, il registratoredicassahaadisposizionemonete da 2e, 1e e da 50 centesimi, 20 centesimi, 10 centesimi, 5centesimi, 2 centesimi, 1 centesimi. Il calcolo va fatto prediligendo l’utilizzo dimoneteditagliopiùgrandetraquelleadisposizione.Es:5.71euro→2*2e+1*1e+1*50cent+1*20cent+1*1cent.(Suggerimento:moltiplicareilvaloredell’importoacquisitoper100perottenereilnumerodicentesimiedeseguireilcastdelvaloreadint).

Svolgiamol’esercizioconsiderandoiseguentitrescenari:

(a)nessuncontrollosulvaloreinseritodall’utente:supponiamochel’importoinseritosiavalido(ovverounvaloremaggioredi0).

Page 13: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

13

(b)acquisiamo l’importodall’utente.Se l’importoèmaggioredi0 facciamo iconti,altrimentistampiamolascritta“Importoinseritononvalido”.

(c) acquisiamo l’importodall’utente. Se l’importoèmaggioredi 0 facciamo iconti, altrimenti stampiamo la scritta “Importo inserito non valido” econtinuiamoarichiedernel’inserimentofintantochel’utentenoninserisceunvaloremaggioredi0.

Analisi

Dobbiamoragionareincentesimi.Unamonetada2EUcorrispondea200centesimiinquestomodoilnumerodimonetepuòessereottenutoattraversoladivisioneinteraelemoneteditagliopiùpiccolopossonoessereottenuteattraversol’operazionemodulo%

#include<stdio.h> void main(){ float restituire; int risultato, monete; do{ printf("\nQuanto? "); scanf("%f",&restituire); }while(restituire < 0); risultato = (int)(restituire*100); printf("\n%d = ",risultato); monete = risultato/200; risultato = risultato%200; printf("%d * 2E ", monete); monete = risultato/100; risultato = risultato%100; printf("%d * 1E ", monete); monete = risultato/50; risultato = risultato%50; printf("%d * 0.50 ", monete); monete = risultato/20; risultato = risultato%20; printf("%d * 0.20 ", monete); monete = risultato/10; risultato = risultato%10; printf("%d * 0.10 ", monete); monete = risultato/5; risultato = risultato%5; printf("%d * 0.05 ", monete); monete = risultato/2; risultato = risultato%2;

Page 14: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

14

printf("%d * 0.02 ", monete); /* monete contiene ora il numero di monete da un centesimo */ printf("%d * 0.01 ", monete); }

10. Chiedere all’utente di inserire una sequenza di caratteri a priori illimitata eterminata da un invio. Calcolare e stampare, per ogni carattere dell’alfabetominuscolo,ilnumerodivoltechee`statoinserito.

#include<stdio.h> #define CIFRE 26 void main(){ int cont[CIFRE], i; char car; for (i=0;i<CIFRE;i++) cont[i]=0; scanf("%c",&car); while(car!='\n'){ cont[car-'a']++; scanf("%c",&car); } for(i=0;i<CIFRE;i++) printf("\n%c: %d",i+'a', cont[i]); }

11. Scrivere un programma in grado di calcolare il valore di polinomi di gradomassimo8.Ilprogrammarichiedeall’utenteilgradondelpolinomiodesiderato(un intero compreso tra 0 e 8 inclusi). Successi- vamente, chiede all’utente icoefficienti di tutti i monomi che compongono il polinomio. Infine, chiedeall’utente il valore x per cui fornire la soluzione del polinomio, la calcola e lastampaavideo.

#include<stdio.h> #define MAX_GRADO 8 void main(){ int grado, coeff[MAX_GRADO+1],x,i,risultato,pot; do{ scanf("%d", &grado); }while(grado<0 || grado>MAX_GRADO); for(i=0;i<=grado;i++){ scanf("%d",&coeff[i]); }

Page 15: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

15

scanf("%d",&x); risultato=0; pot=1; for(i=0;i<=grado;i++){ risultato=risultato+coeff[i]*pot; pot=pot*x; } printf("%d\n",risultato); }

12. Chiedere all’utente di inserire una sequenza di numeri interi di lunghezzasconosciutaapriori. L’inserimento terminaquando l’utente inserisceunnumeronegativo.Quindistamparelapercentualedivaloriparielaloromedia.

#include<stdio.h> void main(){ int num, somma=0, qta=0, qtaPari=0; float media, perc; scanf("%d",&num); while(num>=0){ if(num%2==0){ somma = somma + num; qtaPari++; } qta++; scanf("%d",&num); } perc = (float)qtaPari/qta * 100; media = (float)somma/qtaPari; printf("\nPerc: %f \n Media: %f",perc,media); }

Page 16: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

16

13.Scrivereunprogrammachechiedeall’utentediinserireduesequenzedi10numericiascuna.Ilprogrammastampaavideo1selasecondasequenzaèunapermutazionedellaprima,altrimenti0.

#include<stdio.h> #define MAX 10 void main (){ int a[MAX], b[MAX], contaA, contaB, i, j, perm; for(i=0;i<MAX; i++) scanf("%d",&a[i]); for(i=0;i<MAX; i++) scanf("%d",&b[i]); for(i=0,perm=1;i<MAX && perm; i++){ for(j=0,contaA=0,contaB=0;j<MAX; j++){ if(a[i]==a[j]) contaA ++; if(a[i]==b[j]) contaB ++; } if (contaA==contaB) perm=1 else perm=0; } printf("%d\n",perm); } Una sequenza di numeri è una permutazione di un’altra se contiene gli stessielementimainordineeventualmentediverso.Unapossibilitàèquelladicontareleoccorrenzedeinumeridistintidellaprimasequenzaeverificarechesialastessaanche nella seconda. L’idea base della soluzione è fare una scansione di ognielementodella prima sequenza (a[i]) contare le sueoccorrenze sia nel vettore achenelvettoreb.Seleoccorrenzediognielementosonosempreugualisiainacheinballoraaebsonoduepermutazioni.Altrimentinonèquestalasituazioneesirestituisce0.

Page 17: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

17

14.Scrivereunprogrammache riceve in ingressounasequenzadinumeri interirelativi a priori di lunghezza ignota e ne visualizza il valore minimo e il valoremassimo. La sequenza dei valori d’ingresso si ritiene terminata quando l’utenteinserisceilvalore0,chenonvaconsideratocomepartedellasequenza.Nelcasoincuil’utenteinseriscecomeprimovalore0,sivisualizziunappositomessaggiodierrore“sequenzavuota”.

Inizio

Leggi n

n = 0?

minimo= n massimo = nsomma = nquanti = 1

Leggi n

n = 0?

n < minimo?

n>massimo?

quanti = quanti+1somma = somma+n

Leggi n

minimo/massimo/somma/quanti

Fine

sequenza vuota

minimo= n

massimo= n

si

si

si

si

no

no

no

no

Page 18: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

18

#include<stdio.h> void main(){ int num, min, max; scanf("%d",&num); min=num; max=num; if (num != 0){ scanf("%d",&num); while(num!=0){ if (num<min) min = num; if (num>max) max = num; scanf("%d",&num); } printf("\nMin: %d, Max: %d",min,max); } else printf("\nSequenza vuota"); } 15. Si deve realizzare un programma che consenta di realizzare un archiviogeometrico. In particolare l’archivio devememorizzare le informazioni dei puntinellospaziodellecoordinatebidimensionalierappresentareanaliticamenteretteeparabole.

a)Definirelestrutturedatinecessarieperilprogramma.

typedef struct { double x; double y; } punto; /*Equazione della retta in forma implicita ax+by+c = 0*/ typedef struct { double a; double b; double c; }retta;

b) In base alle strutture dati definite al punto precedente si scriva unprogramma che dati in input un punto e una retta e scrive a video se il punto appartiene alla retta oppure no.

Page 19: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

19

void main(){ /*Leggi il punto p*/ printf(...); scanf (...); printf(...); scanf (...); /*Leggi la retta r*/ ... if (retta.a*p.x+retta.b*p.y+retta.c ==0)

printf(”Il punto appartiene alla retta\n”); else

printf(”Il punto non appartiene alla retta \n”); }

c) In base alle strutture dati definite al punto a) si scriva un programmache date due rette r1 e r2 stabilisce se le rette sono parallele.

void main(){ double m1, m2; /* coefficienti angolari delle due rette */ /*Leggi r1*/ printf(...); scanf (...); ... /*Leggi r2*/ ...

/*due rette sono parallele se hanno lo stesso coefficiente angolare m = - a/b*/ m1 = r1.a/r1.b; m2 = r2.a/r2.b; if (m1==m2)

printf(”Le rette sono parallele\n”); else

printf(”Le rette non sono parallele\n”); }

Page 20: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

20

d) In base alle strutture dati definite al punto a) si scriva un programmache date due rette r1 e r2 stampalecoordinatedelpuntodiintersezionedelleduerette. Nel caso in cui le rette risultassero parallele la funzione stampa unmessaggiodierrore.

void main(){ double m1, m2; /* coefficienti angolari delle due rette */ /*Leggi r1*/ printf(...); scanf (...); ... /*Leggi r2*/ ...

/*due rette sono parallele se hanno lo stesso coefficiente angolare m = - a/b*/ m1 = r1.a/r1.b; m2 = r2.a/r2.b; if (m1==m2)

printf(”Errore le rette sono parallele\n”); else { /*metodo di sostituzione*/ p.x = (r1.b*r2.c – r2b*r1.c)/(r1.a*r2.b – r2.a*r1.b); m = -r1.a/r1.b; k = - r1.c/r1.b;

p.y = m* p.x + k; printf(“x: %d, y: %d”, p.x, p.y); }

}

16.Esercizisullestringhe.

a) Scrivere un programma che legge una stringa (di massimo 10 caratteri) e stampa la sua lunghezza. Si ricorda che in C le stringhe sono rappresentate come array di char il cui ultimo elemento convenzionale è il carattere null ’\0’.

Page 21: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

21

#define SIZE 11; void main(){ char s[SIZE]; int i; /*indice scansione stringa); printf(“Inserisci una stringa\n”); scanf(“%s”,s); while(s[i]!='\0')

i++;

printf(“La lunghezza della stringa è %d\n”,i);

}

b) Scrivere un programma che legge due stringhe s1 ed s2 (di Massimo 10 caratteri) e stampa a video la loro concatenazione s1+s2.

#include <stdio.h> #define SIZE 11 #define SIZE2 21 void main(){ char s1[SIZE]; char s2[SIZE]; char s3[SIZE2]; int i=0; int j=0; /* indici di scansione delle stringhe */ printf("Inserisci s1\n"); scanf("%s",s1); printf("Inserisci s2\n"); scanf("%s",s2); /* copio inizialmente in s3 s1 */ while(s1[i]!='\0'){ s3[i]=s1[i]; i++; } /* da qui in poi continuo a copiare in s3 (usando l’indice i) s2. Mi servo del secondo indice j per leggere i caratteri di s2 */ while(s2[j]!='\0'){ s3[i]=s2[j];

Page 22: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

22

i++; j++; } /* Inserisco il carattere di terminazione in s3 e stampo*/ s3[i]= '\0'; printf(“s1+s2:%s\n”,s3); }

17. Chiedere all’utente di inserire, uno alla volta, 15 caratteri all’interno di unarray e costruire un secondo array (non una stringa!) che li contenga in ordineinverso.

#include<stdio.h> #define MAX 15 void main(){ char vett1[MAX], vett2[MAX]; int i, j; for (i=0; i<MAX; i++) scanf("%c",&vett1[i]); i--; for (j=0; j<MAX; j++){ vett2[j] = vett1[i]; i--; } /* oppure for (;i>=0;i--) vett2[MAX-i-1]= vett1[i]; */ for (i=0; i<MAX; i++) printf("%c ", vett2[i]); }

Page 23: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

23

18. Chiedere all’utente di inserire una stringa di lunghezza massima 100 estampareavideolasualunghezzaeilnumerodivocalichecontiene.

#include<stdio.h> #define L_MAX 100 void main(){ char str[L_MAX+1]; int lungh=0, voc=0; scanf("%s",str); while(str[lungh]!='\0'){ if(str[lungh]=='a' || str[lungh]=='e' || str[lungh]=='i' || str[lungh]=='o' || str[lungh]=='u') voc++; lungh++; } printf("lunghezza: %d, nvocali: %d", lungh, voc); }

19.Chiedereall’utentediinserireunastringas1dilunghezzamassima50epoiunnumerointerok.Costruireunasecondastringas2checontieneiprimikcaratteridi s1. Quindi stampare s2. Gestire opportunamente il caso in cui k sia troppopiccolooppuretroppogrande.

#include<stdio.h> #define L_MAX 50 void main(){ char s1[L_MAX+1], s2[L_MAX+1]; int k, i; scanf("%s",s1); scanf("%d",&k); i=0; while(s1[i]!='\0' && i<k){ s2[i]=s1[i]; i++; } s2[i]='\0'; printf("%s",s2);

Page 24: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

24

}

20. Si leggadautenteuna stringaS1dialmassimoN=100caratteri, costruitadaparoleseparatedalcarattere’.’.SicostruiscaunasecondastringaS2checontienela sequenza ottenuta invertendo ogni parola di S1 ma lasciando le parolenell’ordineoriginario.

Esempio:

S1=Quanto.mi.piace.questo.Corso!!

S2=otnauQ.im.ecaip.otseuq.!!osroC

#include<stdio.h> #include<string.h> #define MAX 100 void main (){ char sin[MAX+1], sout[MAX+1]; int i, j, k, lungh; scanf("%s",sin); lungh=strlen(sin); k=0; for(i=0;i<=lungh;i++){ if(sin[i]==’.’ || sin[i]==’\0’){ for(j=i-1;sin[j]!=’.’&&j>=0;j--){ sout[k]=sin[j]; k++; } sout[k]=’.’; k++; } } sout[k]=’\0’; printf("\n%s",sout); }

21. Scrivere un programma che acquisisce due stringhe che possono contenerespazi e ciascuna di al massimo 10 caratteri. Il programma verifica prima se lestringhe sono uguali e lo comunica con un apposito messaggio. Poi, se c'èabbastanza spazio nell'array, il programma concatena la seconda stringa allaprimaevisualizzailrisultato.

E’possibileusarelefunzionistrcmpestrlendellalibreriastring.strcmpèunafunzionechericeveiningressoduestringheerestituisceilvalore0seleduestringhesonouguali.Lafunzionestrlenricevecomeunicoparametrounastringaerestituisceuninteropariallasualunghezza.

#include<stdio.h> #include<string.h> #define DIM 10 void main(){

Page 25: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

25

char str1[DIM+1], str2[DIM+1]; gets(str1); gets(str2); if(strcmp(str1,str2)==0) printf("Le due stringhe sono uguali\n"); else printf("Le due stringhe sono differenti\n"); if(strlen(str1) + strlen(str2) <= DIM){ strcat(str1,str2); printf("Stringa concatenata: %s\n",str1); } else { printf("Non c'è abbastanza spazio per concatenare le due stringhe\n"); } }

22. Chiedere all’utente una sequenza di numeri interi che termina conl’inserimento dello 0 (e in ogni caso lunga al massimo 200 elementi). Creare evisualizzare un array che contenga tutti e soli i valori distinti della sequenza(ovveroomettendoiduplicati).

#include<stdio.h> #define MAX 200 void main(){ int num, seq[MAX],i=0, k=0, dist=0; scanf("%d",&num); while (num!= 0 && i<MAX){ for(k=0;k<dist;k++) if(seq[k]==num) k=MAX; if(k==dist){ seq[k]=num; dist++; } scanf("%d",&num); i++; } for(k=0;k<dist;k++) printf("%d ",seq[k]); }

Page 26: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

26

23. Chiedere all’utente di inserire due matrici A e B (far specificare all’utenteprimala lorodimensioneche inognicasopuòesseredialmassimo50x50)e,sepossibile, costruire una terza matrice C che contiene la somma A+B. QuindivisualizzarelamatriceC.

#include<stdio.h> #define N 50 void main(){ int A[N][N], B[N][N], C[N][N]; int rA, cA, rB, cB, rC, cC; int i, j, k, somma=0; // acquisisco matrice A scanf("%d", &rA); scanf("%d", &cA); for(i=0;i<rA;i++) for(j=0;j<cA;j++) scanf("%d",&A[i][j]); // acquisisco matrice B scanf("%d", &rB); scanf("%d", &cB); for(i=0;i<rB;i++) for(j=0;j<cB;j++) scanf("%d",&B[i][j]); if(rA!=rB || cA!=cB) printf("La somma non e' possibile"); else{ for(i=0;i<rB;i++) for(j=0;j<cB;j++) C[i][j]=A[i][j]+B[i][j]; for(i=0;i<rB;i++){ for(j=0;j<cB;j++) printf("%d ",C[i][j]); printf("\n"); } } }

Page 27: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

27

24. Chiedere all’utente di inserire due matrici A e B (far specificare all’utenteprimalalorodimensionecheinognicasopuòesseredialmassimo100x100)e,sepossibile, costruire una terza matrice C che contiene il prodotto AxB. QuindivisualizzarelamatriceC.

#include<stdio.h> #define N 100 void main(){ int A[N][N], B[N][N], C[N][N]; int rA, cA, rB, cB, rC, cC; int i, j, k, somma=0; // acquisisco matrice A scanf("%d", &rA); scanf("%d", &cA); for(i=0;i<rA;i++) for(j=0;j<cA;j++) scanf("%d",&A[i][j]); // acquisisco matrice B scanf("%d", &rB); scanf("%d", &cB); for(i=0;i<rB;i++) for(j=0;j<cB;j++) scanf("%d",&B[i][j]); if(cA != rB) printf("Il prodotto non si puo fare"); else{ rC = rA; cC = cB; for (i=0;i<rA;i++){ for (j=0;j<cB;j++){ somma = 0; for (k=0;k<cA;k++) somma = somma + A[i][k]*B[k][j]; C[i][j]=somma; } } for(i=0;i<rC;i++){ for(j=0;j<cC;j++) printf("%d ",C[i][j]); printf("\n"); } } }

Page 28: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

28

25.SiconsideriilseguenteframmentodicodiceinlinguaggioC:

#include <stdio.h> void main() { int d = 10; int c = 1; int b = 2; int a = 1; while (a<10){ if(d%5==0){ a++; d=c+2; c=a+d; } else if(c == 0){ b=a*c; a=a-2; c--; } else{ c--; a++; } printf ("%d %d %d %d\n",a,b,c,d); } }

indicarel’outputdellaprintf.

2 2 5 3 3 2 4 3 4 2 3 3 5 2 2 3 6 2 1 3 7 2 0 3 5 0 -1 3 6 0 -2 3 7 0 -3 3 8 0 -4 3 9 0 -5 3 10 0 -6 3

Page 29: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

29

26.UnaUniversitàvuolerealizzareunprogrammacheconsentadiautomatizzareilprocessodiselezionedeglistudentidelprimoanno.Ilsistemadevememorizzarei dati degli iscritti al test di ingresso (caratterizzati da codice pre-iscrizione,cognome,nome,indirizzoenumeroditelefono).Ogniiscrittoaltestvieneinoltrecaratterizzato dall’elenco delle risposte date nel questionario in forma chiusacompilato durante il test. Si assuma per semplicità che ogni domanda delquestionario ammetta come possibili risposte “1, 2, 3, 4” e che il questionarioincludacomplessivamente100domande.

a)Definirelestrutturedatinecessarieperilprogramma.

#define MAX_N_DOMANDE 100

#define MAX_STRING_CHARACTS 20

typedef struct { int codice;

char cognome[MAX_STRING_CHARACTS];

char nome[MAX_STRING_CHARACTS];

char indirizzo[MAX_STRING_CHARACTS];

char numeroTelefono[MAX_STRING_CHARACTS];

int risposte[MAX_N_DOMANDE];

} Iscritto;

b)Siadatalaseguentestrutturadati:

typedef struct { int numeroDomanda; int rispostaEsatta; } Soluzione; typedef Soluzione Risposte[100];

Scrivere un programma che calcoli il punteggio complessivo ottenuto da uniscrittoal test s (dato in ingresso). Ilpunteggiovieneottenutoassegnando ilvalore+1adogni rispostaesattae -2adogni risposta sbagliata. Le rispostesonomemorizzate inunavariabile rdi tipoRisposte (trascurare l’inputdellavariabiler).

Soluzione 1 (si suppone che le risposte in r siano ordinate)

void main(){

Iscritto s;

Page 30: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

30

Risposte r;

int i;

int punteggio=0;

/* Acquisisci s */

...

/* Acquisisci r */

...

for (i=0; i< MAX_N_DOMANDE; i++)

if (s.risposte[i]==r[i].rispostaEsatta)

punteggio++;

else punteggio= punteggio - 2;

printf(“Il punteggio ottenuto è: %d\n”, punteggio);

}

Soluzione 2 (le risposte in r sono in qualsiasi ordine)

void main(){

Iscritto s;

Risposte r;

int i,j,trovato=0;

int punteggio=0;

/* Acquisisci s */

...

/* Acquisisci r */

...

Page 31: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

31

for (i=0; i< MAX_N_DOMANDE; i++) {

/*ricerca della domanda i in r */

trovato=0;

for (j=0; j< MAX_N_DOMANDE && (trovato==0) ; j++)

if (r[j].numeroDomanda==i+1) trovato=1;

/*calcolo del punteggo secondo le regole*/

if (s.risposte[i]==r[j-1].rispostaEsatta)

punteggio++;

else punteggio-=2;

}

printf(“Il punteggio ottenuto è: %d\n”, punteggio);

}

Soluzione 3 (le risposte in r sono in qualsiasi ordine come nel caso precedente ma si effettua una scansione dell’array r anziché delle risposte date dallo studente, in modo molto più efficiente!)

void main(){

Iscritto s;

Risposte r;

int i;

int punteggio=0;

/* Acquisisci s */

...

/* Acquisisci r */

...

for(i = 0; i < MAX_N_DOMANDE; i++)

if(r[i].rispostaEsatta== s.risposte[r[i].numeroDomanda - 1])

punteggio++;

Page 32: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

32

else punteggio -= 2;

printf(“Il punteggio ottenuto è: %d\n”, punteggio);

}

27.Scrivereunprogrammacheacquisisceduedate,espresseinterminidigiorno,mese e anno, e le confronta per stabilire se sono uguali oppure in ordinecronologicocrescenteoppureinverso.#include<stdio.h> typedef struct{ int giorno; int mese; int anno; } t_data; void main(){ t_data d1, d2; int prima; scanf("%d%d%d", &d1.giorno, &d1.mese, &d1.anno); scanf("%d%d%d", &d2.giorno, &d2.mese, &d2.anno); prima=0; if(d1.anno<d2.anno) prima=1; else if(d1.anno>d2.anno) prima=2; else { if(d1.mese<d2.mese) prima=1; else if(d1.mese>d2.mese) prima=2; else{ if(d1.giorno<d2.giorno) prima=1; else if(d1.giorno>d2.giorno) prima=2; } } if(prima==0) printf("\nle date sono uguali"); else if(prima==1) printf("\nla prima data viene prima"); else printf("\nla seconda data viene prima"); }

Page 33: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

33

28. Scrivere un programma che acquisisce due frazioni, ne esegue somma emoltiplicazione e in seguito stampa a video i risultati delle due operazioni. Notache: (i) con frazione si intende la coppia (n, d), ove n è il numeratore e d è ildenominatore;(ii)nedsononumeriinteri.

#include <stdio.h> typedef struct { int num; int denom; } frazione; void main(){ frazione a, b, somma, prodotto; int mcd; printf("Prima frazione:\nnumeratore: "); scanf("%d",&a.num); do{ printf("denominatore: "); scanf("%d",&a.denom); }while(a.denom==0); printf("Seconda frazione:\nnumeratore: "); scanf("%d",&b.num); do{ printf("denominatore: "); scanf("%d",&b.denom); }while(b.denom==0); somma.num=(a.num*b.denom + b.num*a.denom); somma.denom=(a.denom*b.denom); prodotto.num=a.num*b.num; prodotto.denom=a.denom*b.denom; printf("\nSomma: %d/%d\nProdotto: %d/%d",somma.num,somma.denom,prodotto.num,prodotto.denom); if(somma.num<somma.denom) mcd=somma.num; else mcd=somma.denom; while(somma.num%mcd != 0 || somma.denom%mcd != 0) mcd--; somma.num/=mcd; somma.denom/= mcd; if(prodotto.num<prodotto.denom) mcd=prodotto.num; else

Page 34: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

34

mcd=prodotto.denom; while(prodotto.num%mcd != 0 || prodotto.denom%mcd != 0) mcd--; prodotto.num/=mcd; prodotto.denom/= mcd; printf("\nSemplificato:\nSomma: %d/%d\nProdotto: %d/%d",somma.num,somma.denom,prodotto.num,prodotto.denom); }

29. Scrivere un programma che acquisisce 30 intervalli di tempo e ne calcola estampalasomma.Uninter-valloditempoécompostodaunnumerodigiorni,diore,diminutiedisecondi.Inparticolare,l’oradeveessereinclusanell’intervallo[0;23],iminutiin[0;59],edisecondiin[0;59].Successivamente,ilprogrammacalcolalasommadituttigliintervallielastampaavideonelformato:giorni,ore,minuti,secondi(massimo23ore,massimo59minuti,massimo59secondi.Nessunlimitealnumerodigiorni).Esempioperiseguentidueintervalliditempo(giorni,ore,minuti,secondi):0205015e072030,ilrisultatosara`essere:1giorno/i,4ora/e,10minuto/ie45secondo/i.#include <stdio.h> #define MAX_INTERVALLI 2 typedef struct { int giorni; int ore; int minuti; int secondi; } intervallo; void main(int argc, char* argv[]) { intervallo seq[MAX_INTERVALLI], somma; int i; for(i = 0; i < MAX_INTERVALLI; i++) { printf("Inserire intevallo #%d: ", i); do{ printf("giorni: "); scanf("%d", &seq[i].giorni); }while(seq[i].ore<0); do{ printf("ore: "); scanf("%d", &seq[i].ore);

Page 35: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

35

}while(seq[i].ore<0 || seq[i].ore>23); do{ printf("minuti: "); scanf("%d", &seq[i].minuti); }while(seq[i].minuti<0 || seq[i].minuti>59); do{ printf("secondi: "); scanf("%d", &seq[i].secondi); }while(seq[i].secondi<0 || seq[i].secondi>59); seq[i].giorni = 0; } somma.giorni = 0; somma.ore = 0; somma.minuti = 0; somma.secondi = 0; for(i = 0; i < MAX_INTERVALLI; i++) { somma.secondi = somma.secondi + seq[i].secondi; if(somma.secondi>59){ somma.secondi=somma.secondi-60; somma.minuti++; } somma.minuti = somma.minuti + seq[i].minuti; if(somma.minuti>59){ somma.minuti=somma.minuti-60; somma.ore++; } somma.ore = somma.ore + seq[i].ore; if(somma.ore>24){ somma.ore=somma.ore-24; somma.giorni++; } somma.giorni = somma.giorni + seq[i].giorni; } printf("%d giorno/i, %d ora/e, %d minuto/i e %d secondo/i\n", somma.giorni, somma.ore, somma.minuti, somma.secondi); }

Page 36: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

36

30. Torneo di Calcio: definire una struttura dati che descriva le squadre di untorneo di calcio. Per ogni squadra si devono memorizzare: matricola squadra,nome,cittàetuttiigiocatori.Perognigiocatoresivuolememorizzareilnomeeilnumerodimaglia.Scrivereunprogrammachegestisce6squadre;inparticolaresupponendo di aver inizializzato tutte le informazioni (aggiungere solo uncommentoper indicare ilpuntodicodice incuivieneeffettuata l’acqusizione), ilprogrammaCtrovaevisualizza l’elencodi tutti igiocatoricheportano lamaglia23.#include<stdio.h> #define L_MATR 6 #define L_MAX 50 #define MAX_GIOC 23 #define MAX_SQ 6 typedef struct{ char nome[L_MAX+1]; int nmaglia; } t_giocatore; typedef struct{ char matr[L_MATR+1]; char citta[L_MAX+1]; t_giocatore gioca[MAX_GIOC]; } t_squadra; void main(){ t_squadra sq[MAX_SQ]; int i,j; /* acquisizione delle informazioni */ for(i=0;i<MAX_SQ;i++){ scanf("%s",sq[i].matr); scanf("%s",sq[i].citta); for(j=0;j<MAX_GIOC;j++){ scanf("%s",sq[i].gioca[j].nome); scanf("%d",&sq[i].gioca[j].nmaglia); } } /* visualizzazione delle informazioni acquisite */ for(i=0;i<MAX_SQ;i++){ printf("\n%s",sq[i].matr); printf("\n%s",sq[i].citta); for(j=0;j<MAX_GIOC;j++){ printf("\n%s",sq[i].gioca[j].nome); printf("\n%d",sq[i].gioca[j].nmaglia); } } /* ricerca e visualizzazione di tutti i giocatori che portano

Page 37: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

37

la maglia 23 */ for(i=0;i<MAX_SQ;i++){ for(j=0;j<MAX_GIOC;j++){ if(sq[i].gioca[j].nmaglia == 23) printf("\n%s",sq[i].gioca[j].nome); } } }

31.Scuoladiballo:siscrivaunprogrammaCperlagestionediunascuoladiballo.Ogniclasseconsistediuninsiemedi20personeedidueistruttori.Ognipersonahaunnome,uncognome,unsessoeunaetà.SiimplementiilprogrammaCche,una volta acquisiti i dati di 50 classi (si ometta il codice per brevità), per ogniclasse,stampal’etàmediadeglistudentidisessomaschile.

#include<stdio.h> #define L_MAX 20 #define N_ISTRUTTORI 2 #define N_STUDENTI 20 #define N_CLASSI 50 typedef struct{ char nome[L_MAX+1]; char cognome[L_MAX+1]; char sesso; int eta; } t_persona; typedef struct{ t_persona istruttori[N_ISTRUTTORI]; t_persona studenti[N_STUDENTI]; } t_classe; void main(){ t_classe scuola[N_CLASSI]; float sum; int i,j; /* acquisizione dati */ for(i=0;i<N_CLASSI;i++){ sum=0; for(j=0;j<N_STUDENTI;j++){ if(scuola[i].studenti[j].sesso == 'm') sum += scuola[i].studenti[j].eta; } printf("\nclasse %d: %f anni", i, sum/N_STUDENTI); } }

Page 38: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

38

• Scrivere un programma che consenta di gestire un piccolo dizionario italianoinglese. Ildizionariodizècompostodaalmassimo100paroleeogniparolaècaratterizzatadaunacoppiaditerminilunghialmassimo20caratteri: ilprimoinitalianoeilsecondoininglese.Ilprogrammadeve:

a. Consentireall’utentediinserireleparoleneldizionario.L’inserimento

terminaquandol’utenteinseriscelacoppiaditermini#,#oppurequandononvièpiùspazioneldizionario.

b. CreareunsecondodizionariodizLungheUgualichecontienesololeparolechehannolastessalunghezzasiainitalianocheininglese.

c. VisualizzareleparolechesonostateinseriteindizLungheUguali.#include<stdio.h> #include<string.h> #define MAX_P 100 #define MAX_L 20 typedef struct { char ita[MAX_L+1]; char eng[MAX_L+1]; } t_parola; void main(){ t_parola diz[MAX_P], dizLungheUguali[MAX_P]; int i=0; int ld=0; /*lunghezza dizionario principale*/ int ll=0; /*lunghezza dizionario parole di uguale lunghezza*/ /* Acquisizione parole del dizionario */ do{ gets(diz[i].ita); gets(diz[i].eng); i++; } while(!(strcmp(d[i-1].ita,"#")==0 && strcmp(d[i-1].eng,"#")==0) && i<MAX_P);

/* Crea il dizionario con le parole di uguale lunghezza */

ld=i-1; /*i-1 e’ l’indice all’ultimo elemento che contiene la coppia #,# */ ll=0; for (i=0;i<ld;i++){ if(strlen(diz[i].ita)==strlen(diz[i].eng)){ dizLungheUguali [ll]=diz[i];

Page 39: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

39

ll++; } } /* Visualizza le parole di dizLungheUguali */ for (i=0; i<ll; i++){ printf("\n%s, %s", dizLungheUguali[i].ita, dizLungheUguali[i].eng); } } • E’necessarioprogettareun sistemaper la gestionediun insiemedi aziende

chedevonoesserevisitatedaagentidicommercio.Ogniaziendaèdescrittadaun nome, un numero di telefono, un indirizzo ed una città. Questeinformazioni devono essere memorizzate come stringhe di 50 caratteri. Unagentedi commercio inveceèdefinitodanome, cognome, telefonoedauninsiemediaziendedavisitare.Ilnumeromassimodiaziendedavisitareè25,perglialtridatiutilizzarestringhedi50caratteri.a)Definireitipididatoopportunamente.

#define MAX_L 50 #define MAX_AZ 25 #define MAX_AG 100 typedef struct{ char nome[MAX_L+1]; char telefono [MAX_L+1]; char indirizzo[MAX_L+1]; char citta[MAX_L+1]; } t_azienda; typedef struct{ char nome[MAX_L+1]; char cognome[MAX_L+1]; char telefono [MAX_L+1]; t_azienda visitare[MAX_AZ]; int n_aziende; } t_agente;

b) scrivere un programma che prende in ingresso un agente ed una città erestituisceilnumerodiaziendedell’agenteconsedenellacittàspecificata.

void main(){ t_agente g; char citta[MAX_L+1];

Page 40: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

40

int j, conto=0; /* Acquisisci dati agente g */ ... /* Acquisizione sede */ scanf(“%s”,citta); for(j=0;j<MAX_AZ;j++) if(strcmp(g.visitare[j].citta,citta)==0) conto++; printf(“%d\n”, conto); }

c)scrivereunprogrammacheprendeiningressoidatidiuninsiemediagentie una a città e copia in un array tutte le aziende che si trovano nella cittàspecificata.Ilprogrammastampainfineavideoilloronumero.

void main(){ t_agente g[MAX_AG]; char citta[MAX_L+1]; t_azienda az[MAX_AZ * MAX_AG]; int i,j,k=0; printf(“Inserire il numero totale di agenti\n”); scanf(“%d”,&n); for(i=0;i<n;i++){ /* Acquisisci dati agente g[i] */ ... } /* Acquisizione sede */ scanf(“%s”,citta); for(i=0;i<n;i++){ for(j=0;j<MAX_AZ;j++){ if(strcmp(g[i].visitare[j].citta,citta)==0){ az[k]=g[i].visitare[j]; k++; } }

Page 41: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

41

} printf(“%d\n”,k); } • Sivuolecreareunprogrammadigestioneperunasocietàdiautonoleggio. Il

sistema deve memorizzare il parco auto della società. Ogni auto ècaratterizzatadaunnumeroditarga(stringadi7caratteri),marca,modelloenumerodiKmpercorsi. Il sistemadevememorizzareanche i datidei clienti,caratterizzatidanome, cognome,numerodipatentedi guida, codice fiscale,indirizzoenumerodicellulare.Unnoleggio(chefaràriferimentoaun’autoeuncliente)haunadatadiinizio,datadifineetipologiadiassicurazione(basicofull).Definirelestrutturedatinecessarieperilprogramma.

#define L_TARGA 7 #define MAX_L 20 #define MAX_CF 16 typedef struct{ int giorno; int mese; int anno; } t_data; typedef enum {basic, full} t_ass; typedef struct{ char targa[L_TARGA +1]; char marca[MAX_L]; char modello[MAX_L]; int km; } t_auto; typedef struct{ char nome[MAX_L]; char cognome[MAX_L]; int patenti; char cf[MAX_CF+1]; char indirizzo[MAX_L]; int telefono; } t_cliente; typedef struct{ char targa_auto[L_TARGA +1]; char cf_cliente[MAX_CF+1]; t_data data_inizio; t_data data_fine; t_ass tipo_assicurazione; } t_noleggio;

Page 42: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

42

• Si deve scrivere un programma per la gestione di archivi musicali. In

particolareènecessarioraccogliereinformazioniriguardantituttiifilemusicalipresenti su un computer e per creare playlist in base alle preferenze degliutenti.Diognibranomusicalesivoglionomemorizzaretitolo,album,artista,durata,genereetipodifile.Titolo,albumeartistasonostringhedimassimo255caratteri.Ladurataèespressainmillisecondi.Igenerimusicalisonosolo“rock”,“classical”e“jazz”. Il tipodi filepuòessereunotra“mp3,aac,wma,wav”.a)Definire i tipididatoTipoGenereeTipoFile.Definire inoltre il tipodidatoTipoBrano,utilizzandoancheiduetipidefinitiinprecedenza.

#define STR_LEN 256 #define MAX_BRANI 100 typedef enum {rock, classical, jazz } TipoGenere; typedef enum {mp3, aac, wma, wav } TipoFile;

typedef struct { char titolo[STR_LEN]; char album[STR_LEN]; char artista[STR_LEN]; TipoGenere genere; TipoFile file; long int durata; } TipoBrano;

b)Datoilseguentescheletrodelprogrammaprincipale:

void main(){

TipoBrano archivio[MAX_BRANI]; //lista dei brani

int nBrani = 0; //numero di brani presenti in archivio

int n; //numero di brani da inserire nella playlist

TipoBrano playlist[MAX_BRANI];

TipoGenere g;

TipoFile t;

/* Acquisisci nBrani ed archivio */

...

/* Acquisisci g e t */

...

}

Page 43: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

43

Completare il codice inmodo da inserire nell’array playlist i primi n brani digenere g e tipo t trovati in archivio. In caso non ci siano sufficienti brani digeneredato,laplaylistvieneriempitaconbranidialtrogenere.Invece,senonesistonoabbastanzabraniditipot,ilprogrammatermina.Ilprgrammastampailnumerodibranieffettivamenteinseritiinplaylist(quindidisolitovalen,secisonoalmenonfiledeltipovolutoinarchivio.

Sisuppongacheplaylistsiaunarraygiàinizializzatoconalmenoncelleechen<nBrani (quindi, in altri termini, queste condizioni non devono esserecontrollate).

void main(){

TipoBrano archivio[MAX_BRANI]; //lista dei brani

int nBrani = 0; //numero di brani presenti in archivio

int n; //numero di brani da inserire nella playlist

TipoBrano playlist[MAX_BRANI];

TipoGenere g;

TipoFile t;

/* Acquisisci nBrani ed archivio */

...

/* Acquisisci g e t */

...

/* Acquisisci n */

int i = 0; /*indice della playlist (incrementato ogni volta che aggiungiamo un brano)*/ int j = 0; /*indice di scorrimento nell'archivio (incrementato ogni volta che analizziamo un brano)*/ TipoBrano brano; //brano sotto osservazione //cerchiamo brani di genere e tipofile dato: while (i < n && j < nBrani) { brano = archivio[j]; if (brano.genere == g && brano.file == t) { //abbiamo playlist[i++] = brano; // un brano

// che ci piace! }

Page 44: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

44

j++; //analizziamo il prossimo } if (i < n) { // siamo usciti dal ciclo ma non abbiamo

// riempito la // playlist: non ci sono abbastanza brani di

// genere g //e tipo t in archivio j = 0; while (i < n && j < nBrani) { brano = archivio[j]; //cerchiamo brani di tipo t ma di genere diverso

// da g //(altrimenti, inseriremmo due volte gli stessi // brani if (brano.genere != g && brano.file == t) {

//abbiamo un brano che ci //piace "abbastanza"

playlist[i++] = brano; } j++; }

}

/* Siamo usciti dal ciclo: o abbiamo inserito n brani, o abbiamo analizzato due volte tutto l'archivio.

In entrambi i casi, abbiamo finito. */

printf(“%d\n”,i);

}

Page 45: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

45

• EffettuareiltracingdellevariabiliperilseguenteprogrammaC.Indicareilcontenutodellevariabilialterminedell’esecuzionedelprogramma

#include <stdio.h> void main(){ int x, y, i; x=1; y=3; printf("i x y\n"); for(i=3;i<7;i++){ if (i%2==0) x=x+ ++y +i; if (i%3==0) y=x-1; else y=y-1; printf("%d %d %d\n", i, x,y); } }

Output delle printf:

i x y

3 1 0

4 6 0

5 6 -1

6 12 11

Page 46: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

46

• Sideverealizzareunprogrammacheconsentadigiocareal“giocodel15”.IlgiocoèunrompicapoclassicoinventatodaSamuelLoydnel1878.Ilgiococonsistediunatabellinadiformaquadratadivisainquattrorigheequattrocolonne(quindi16posizioni),sucuisonoposizionate15tesserequadrate,numerateprogressivamenteapartireda1.Letesserepossonoscorrereinorizzontaleoverticale,maillorospostamentoèovviamentelimitatodall'esistenzadiunsingolospaziovuoto.Loscopodelgiocoèriordinareletesseredopoaverle"mescolate"inmodocasuale(laposizionedaraggiungereèquellaconilnumero1inaltoasinistraeglialtrinumeriaseguiredasinistraadestraedall'altoinbasso,finoal15seguitodallacasellavuota).Lafigurasottostanteriportailgiocodelquindicirisolto.

a)Definirelestrutturedatinecessarieperscrivereilprogramma.

#define Size 4

typedef int gioco15[size][size];

gioco15 f;

b ) In base alle strutture dati definite al punto precedente scrive unprogramma che, data una matrice del gioco del 15 g, stampa a video 1 sequestacorrispondeallasituazioneincuiilgiocoèrisolto,0incasocontrario.

void main(){

gioco15 g;

/* Acquisisci g */

int cont=1;

for( int i=0; i<size; i++)

for(int j=0; j<size; j++)

if(g[i][j]==cont)

cont++;

else {

Page 47: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

47

if (cont==16) printf (“1\n”); //sono arrivato sulla cella

//vuota

else return printf (“0\n”); // esiste un elemento

// fuori sequenza

}

}

• E’ necessario realizzare un programma che consenta agli utenti di gestire lapropria rubrica telefonica. Il programma utilizza una struttura dati checonsentedisalvareicontattidellarubrica(almassimo1000)sapendocheognicontatto è caratterizzato da nome, cognome, data di nascita e numero ditelefono.Ladatadinascitaèespressainterminidigiorno,meseeannoetuttelestringhesonolunghealmassimo30caratteri.Ilprogrammadevepresentareall’utenteunmenucheforniscevariefunzionalità:1.inserisci:aggiuntadiunnuovocontattoallarubrica.2. cancella: eliminazione di un contatto dalla rubrica dati il suo nome ecognome.3.cerca:visualizzazionedelnumeroditelefonodiuncontattodatiilsuonomeecognome.4. aggiorna: modifica dei dati di un contatto. Vengono forniti il nome e ilcognome del contatto da aggiornare e il programma consente all’utente diinserireilnuovonumeroditelefonodellapersona.5. compleanni:visualizzazionedei contatti checompionoglianni inunmesespecificatodall’utente.6.stampa:visualizzazionedelcontenutodellarubrica.7.esci:terminedelprogramma.L’interazione tra utente e programma avviene inmodo ciclico: l’utente puòsottoporre una richiesta ad ogni ciclo. L’esecuzione del programma terminaquandol’utenterichiedel’uscita.

#include<stdio.h> #include<string.h> #define MAX_L 30 #define MAX_P 1000 #define AGGIUNGI 1 #define ELIMINA 2 #define CERCA 3 #define AGGIORNA 4 #define COMPLEANNI 5 #define STAMPA 6 #define ESCI 7

Page 48: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

48

typedef char t_stringa[MAX_L+1]; typedef struct{ int giorno; int mese; int anno; } t_data; typedef struct{ t_stringa nome; t_stringa cognome; t_data nascita; t_stringa telefono; } t_persona; void main(){ t_persona rubrica[MAX_P]; int scelta,nContatti=0, tmp; char nom[MAX_L+1], cogn[MAX_L+1]; int i; do{ printf("\nMenu`:"); printf("\n1- aggiungi contatto"); printf("\n2- elimina contatto"); printf("\n3- cerca contatto"); printf("\n4- aggiorna contatto"); printf("\n5- cerca compleanni"); printf("\n6- stampa rubrica"); printf("\n7- esci"); do{ scanf("%d",&scelta); } while (scelta<1 || scelta>7); if(scelta==AGGIUNGI){ if(nContatti <MAX_P){ scanf("%s",rubrica [nContatti].nome); scanf("%s",rubrica[nContatti].cognome); scanf("%d",&rubrica[nContatti].nascita.giorno); scanf("%d",&rubrica[nContatti].nascita.mese); scanf("%d",&rubrica[nContatti].nascita.anno); scanf("%s",rubrica[nContatti].telefono); nContatti++; } else printf("\nNon vi e` piu` spazio nella

rubrica"); } else if(scelta==ELIMINA){ int j,eliminato=0;

Page 49: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

49

scanf("%s",nom); scanf("%s",cogn); for (i=0;i<n;i++){

if(strcmp(rubrica[i].nome,nom)==0 && strcmp(rubrica[i].cognome,cogn)==0){

eliminato=1; for(j=i;j<n-1;j++){ rubrica[j]=rubrica[j+1]; } }

if(eliminato ==1)

nContatti--; else printf("\nIl contatto non e` presente"); } else if(scelta==CERCA){ scanf("%s",nom); scanf("%s",cogn); for (i=0;i< nContatti;i++){ if(strcmp(r[i].nome,nom)==0 && strcmp(rubrica [i].cognome,cogn)==0){ printf("\n\n%s", rubrica [i].nome); printf("\n%s", rubrica [i].cognome); printf("\n%d/%d/%d", rubrica [i].nascita.giorno, rubrica[i].nascita.mese, rubrica [i].nascita.anno); printf("\n%s",rubrica[i].telefono); } } else if(scelta==AGGIORNA){ scanf("%s",nom); scanf("%s",cogn); for (i=0;i<nContatti;i++){ if(strcmp(rubrica[i].nome,nom)==0 && strcmp(rubrica[i].cognome,cogn)==0){ scanf("%s",rubrica[i].telefono); } } else if(scelta==COMPLEANNI){ int m; scanf("%d",&m); for(i=0;i<nContatti;i++){ if(rubrica[i].nascita.mese==m){ printf("\n\n%s",r[i].nome);

Page 50: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

50

printf("\n%s",r[i].cognome); printf("\n%d/%d/%d",

rubrica[i].nascita.giorno, rubrica [i].nascita.mese,

rubrica [i].nascita.anno); printf("\n%s",r[i].telefono); } } } else if(scelta==STAMPA){ for (i=0;i<n;i++){ printf("\n\n%s",rubrica[i].nome); printf("\n%s", rubrica [i].cognome); printf("\n%d/%d/%d", rubrica [i].nascita.giorno, rubrica [i].nascita.mese, rubrica [i].nascita.anno); printf("\n%s", rubrica [i].telefono); } } } while(scelta!=ESC) } • SideverealizzareuninsiemediprogrammiperlagestionediunRadioTaxi.Il

sistema deve memorizzare i dati dei tassisti (caratterizzati da matricola,cognome, nome e telefono cellulare) e dei taxi (targa, numero massimopasseggeri, posizione GPS, matricola dell’autista, stato). Si assuma persemplicitàdi descrivere tutte le informazioni come stringhedi 50 caratteri echeilcampostatosia0perindicarecheiltaxièliberoe1cheèoccupato.Siassumacheilsistemadebbagestireunarchivioditassistieditaxiconalpiù100e50elementi,rispettivamente.

a)Definirelestrutturedatinecessarieperilsistema.

#define STRINGA_LEN 51 #define NTASSISTI 100 #define NTAXI 50 typedef char Stringa[STRINGA_LEN]; typedef enum{libero, occupato} Stato; typedef struct{ Stringa matricola, cognome, nome, cellulare; }Tassista; typedef struct{

Page 51: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

51

Stringa targa, nMaxPasseggeri, posizioneGPS, matricolaAutista; Stato stato; }Taxi; typedef struct { Taxi taxi[NTAXI]; int nTaxi; }ArchivioTaxi; typedef struct { Tassista tassisti[NTASSISTI]; int nTassisti; }ArchivioTassisti; • SiconsideriilseguenteframmentodicodiceinlinguaggioC: #include <stdio.h> void main(){ int i; int x=5; int y=8; for(i=5;i>0;i--){ if(i%2==0){ x=y+2; y=i+3; y=y+2; } if (i%3==0){ x--; } /* Scrivi(i,x,y) */ printf("%d %d %d\n",i,x,y); } }

indicarel’outputdellaprintfpertutteleiterazionieffettuatedalcostruttofor. 5 5 8 4 10 9 3 9 9 2 11 7 1 11 7

Page 52: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

52

• Si vuole creare una social network (es., Facebook, MySpace). Ogni utente

iscritto è caratterizzato dai propri dati anagrafici (nome, cognome, data dinascita,paesedinascita,nazionalità)edè identificatodaunousernamechevieneautenticatoconunapassword.Gliutentipossonoinstaurareancheunarelazionediamiciziaconaltriutenti.Siassumacheunutentepossaaverealpiù 1000 amici, che complessivamente il sistema possa gestire al più 5000utentiecheognistringasialungaalmassimo50caratteri.

a) Definire le strutture dati necessarie per il programma. Suggerimento:Associareaunutenteunarraycontenentelausernamedeisuoiamici.

#define MAX_L 30 #define MAX_AMICI 1000 #define MAX_UTENTI 5000 typedef char t_stringa[MAX_L+1]; typedef struct{ int giorno; int mese; int anno; } t_data; typedef struct{ t_stringa username; t_stringa password; t_stringa nome; t_stringa cognome; t_data nascita; t_stringa paese; t_stringa naz; t_stringa amici[MAX_AMICI]; int numAmici; } t_persona;

b) implementare un programma che dati in ingresso un utente del socialnetwork u e uno username stampa a video 1 se lo username è amicodell’utenteue0incasocontrario.

void main(){ t_persona u; t_stringa username; int i, sonoamici=0; /* Acquisisci u e username */ ... for (i=0;i<u.numAmici;i++){ if(strcmp(u.amici[i],username)==0) sonoamici=1; } printf(“%d\n”,sonoamici);}

Page 53: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

53

• Sivuolecreareunprogrammaperlagestionediunsupermercato.Sianodateleseguentistrutturedati:

#define MAX_STRING 31 #define MAX_ELEMENTI_SCONTRINO 100 #define MAX_CLIENTI 5000 typedef struct { int g; int m; int a; } Data; typedef struct { int codice; char descrizione[MAX_STRING]; float prezzo; char produttore[MAX_STRING]; int prodottoCatena; } Prodotto; typedef struct { Prodotto prodotto; int quantita; } ElementoScontrino; typedef ElementoScontrino Scontrino[MAX_ELEMENTI_SCONTRINO]; typedef struct { int codice; char cognome[MAX_STRING]; char nome[MAX_STRING]; float bonusProdottiCatena; } Cliente; typedef Cliente Clienti[MAX_CLIENTI];

InparticolareilcampoprodottoCatenadellastrutturaProdottoèparia1seilprodottohailmarchiodellacatenadelsupermercato,0altrimenti.Ilsupermercatostaapplicandoun’offertaaipropriclienti:seilclienteeffettualaspesaneiprimi14giornidelmese,alloramaturaunbonusparial30%deltotale dei prodotti acquistati con il marchio del supermercato. Il bonusmaturato verrà utilizzato come sconto – applicato sempre e solo ai prodotticonilpropriomarchio–nellasecondapartedelmese.a)Scrivereunprogramma,chedatiininputuncliente,unoscontrinoeladatadelgiornostampaavideoilnuovobonusdelclientecperlaspesaeffettuata.

... void main() { Cliente c; Scontrino s; int nElementiScontrino; Data d; float bonus=0;

Page 54: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

54

/* Acquisisci i dati del cliente c */ ... printf(“Inserire il numero di elementi nello scontrino\n”); scanf(“%d”, &nElementiScontrino); /* Acquisisci la data d */ ... if (d.g <= 14){ for (i=0;i<nElementiScontrino;i++){ if(s[i].prodotto.prodottoCatena==1){ bonus +=0.3*s[i].prodotto.prezzo * s[i].quantita; } } } bonus += c.bonusProdottiCatena; printf(“%f\n”,bonus); }

b)Scrivereunprogramma,chedati in inputun insiemediclienti, fornisceavideo il codice del cliente gold ossia il cliente che ha maturato il bonusmaggioresuiprodottidellacatenadelsupermercato.

... void main() { Clienti c; int nClienti; float max; int i, codice; printf(“Inserire il numero di clienti\n”); scanf(“%d”, &nClienti); for (i=0;i< nClienti; i++){ /* Acquisisci i dati del cliente c[i] */ ... }

Page 55: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

55

max=c[0].bonusProdottiCatena; codice=c[0].codice; for(i=1;i<nClienti;i++){ if(c[i].bonusProdottiCatena>max){ max = c[i].bonusProdottiCatena; codice=c[i].codice; } } printf(“%d\n”, codice); } • SiconsideriilseguenteframmentodicodiceinlinguaggioC: #include <stdio.h> void main() { int x,y,i; x=1; y=3; printf("i x y\n"); for (i=0; i<10; i++) { if(i%2==0) x=x +y -i*2; else if(i%3==0){ y=x +i; x++;} else y=y + i%2; printf("%d %d %d\n",i,x,y); } }

indicarel’outputdellaprintfpertutteleiterazionieffettuatedalcostruttofor. i x y 0 4 3 1 4 4 2 4 4 3 5 7 4 4 7 5 4 8 6 0 8 7 0 9 8 -7 9 9 -6 2

Page 56: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

56

• Si vuole realizzare un programma per la gestione degli ordini di un negozio

online. Il programma memorizza in un'apposita struttura dati, chiamatamagazzino_t,iprodotti(massimo100)vendutidalnegozio.Perogniprodotto(il cui tipoe’prodotto_t), il programmamemorizza il codicedelprodotto, lasua descrizione (una stringa di 50 caratteri), il costo per unità, la quantitàdisponibile inmagazzinoed il codicedello scaffale in cuiè situato. Inoltre, ilprogramma gestisce con un'altra struttura dati, chiamata ordine_t, l'ordineeffettuato da un cliente. In un singolo ordine è possibile specificare unmassimo di 50 prodotti diversi tramite la struttura prodottoOrdinato_t, perciascunodeiqualiènecessariospecificareilcodiceelaquantitàrichiesta.

a)Descriverelestrutturedatinecessarieperrappresentareilmagazzinoel’ordine.

#define MAXS 50 #define MAXP 100 #define MAXPO 50 typedef struct{ int codice; char descrizione[MAXS+1]; float costo; int quantita; int scaffale; } prodotto_t; typedef struct{ prodotto_t prodotti[MAXP]; int numProdotti; } magazzino_t; typedef struct{ int codice; int quantita; } prodottoOrdinato_t; typedef struct{ prodottoOrdinato_t prodotti[MAXPO]; int numProdottiOrdinati; } ordine_t;

b) Scrivereunprogramma finalizzatoalla verificadegliordini. Il programmariceveiningressoidatidiunmagazzinoedunordineeverificasel'ordinepuòessereevaso(ènecessariocheciascunoprodottosiapresentenelmagazzinoene sia disponibile una quantità sufficiente). Se l’ordine può essere evaso ilprogramma stampa a video il costo dell'ordine altrimenti viene stampato ilvalore-1.

…void main (){

Page 57: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

57

magazzino_t m; ordine_t o; int trovato, evadibile; int i, j; float costo; /* Acquisisci dati magazzino m*/ … /* Acquisisci ordine o*/ … costo=0; evadibile=1; for(i=0; i<o.numProdottiOrdinati && evadibile; i++){ for(j=0, trovato=0; j < m.numProdotti && (trovato==0); j++) if(o.prodotti[i].codice == m.prodotti[j].codice && o.prodotti[i].quantita <= m.prodotti[j].quantita) { costo=costo+o.prodotti[i].quantita*m.prodotti[j].costo; trovato=1; } if(!trovato) evadibile=0; } if(evadibile==0) costo=-1; printf (“%f\n”,costo); }

c) Scrivere un programma per il supporto dell’attività di generazione degliordinidelmagazzino.IlprogrammachiedeininputIdatidiunmagazzinomestampa a video l’elencodei prodotti la cui quantità disponibile è inferiore auna soglia di riordino. Il programma stampa anche il numero totale diprodottidaordinare.

…void main(){ magazzino_t m, int sogliaRiordino; int i,j=0; /* Acquisisci dati magazzino m*/ … scanf(“%f”,& sogliaRiordino) for (i=0; i<m.numProdotti; i++) {

Page 58: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

58

if (m.prodotti[i].quantita < sogliaRiordino) { /* stampa m.prodotti[i]; */ j++; } } printf(“%d”, j); } • Siconsideri ilseguentetipodidatoperrappresentareun’immagine inscala

di grigi in terminidi unamatricequadratadi interi di dimensionemassima50x50,doveciascunelementorappresental’intensitàdelcoloregrigioinunospecificopixel:

#define MAXV 50 typedef Immagine_t int[MAXV][MAXV];

Scrivere un programma che consenta di effettuare il downscaling diun’immagine. Il programma legge un’immagine quadrata imgIn, didimensione effettiva dim e produce un’immagine di uscita imgOut. Se ladimensione ricevuta è divisibile per 2, il programma riduce la risoluzionedell’immagineimgInestampaladimensionedellanuovaimmagine,mentrel’immaginevienesalvatainimgOut. Incasocontrario(dimensioneeffettivanonèdivisibileper2)nonvieneeseguitaalcunaoperazioneevienestampatoavideoilvalore0.L’operazionediriduzionedellarisoluzioneèeseguitanelseguentemodo: la nuova dimensione dell’immagine sarà lametà di quellaoriginale e ciascun nuovo punto sarà calcolato come la media di quattropuntiadiacenti,comemostratoinfigura:

#define MAXV 50 typedef Immagine_t int[MAXV][MAXV]; void main(){ Immagine_t imgIn; int dim;

Page 59: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

59

Immagine_t imgOut; int i, j, newDim; /* Leggi dimensione immagine */ scanf(“%d”,dim); /* Acquisisci imgIn */ ... if(dim%2==0){ newDim=dim/2; for(i=0;i<newDim;i++) for(j=0;j<newDim;j++) imgOut[i][j]= (imgIn[i*2][j*2]+imgIn[i*2+1][j*2]+ imgIn[i*2][j*2+1]+imgIn[i*2+1][j*2+1])/4; } else newDim=0; /* Stampa imgOut */ ... printf(“%d\n”,newDim); }

Page 60: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

60

• Direquantibitsononecessariperrappresentareinumerinell’intervallo

[-32,+111].Con ilnumerodibit individuato, codificare in complementoa2 ivaloriA=-32eB=+111.EffettuarepoileoperazionidisommaA+BesottrazioneB-Aindicandosesièverificatoomenooverflow.Commentareemotivatetuttiipassaggi.

8bitconsentonodirappresentarel’intervallo[-128,127]esonoquindisufficientiarappresentarel’intervallorichiesto.-A=32dec=00100000C2

00100000(inversionediciascunbit)11011111+00000001=11100000A=11100000C2B=111dec=01101111C2A+B:1111100000+01101111=01001111Nonsiverificaoverflow,poichéinumeridipartenzasonoopposti.B-A:1101101111+00100000=10001111Si verifica overflow, poiché da due numeri positivi si è ottenuto un numeronegativo (come si evince analizzando il bit più significativo degli addendi e delrisultato).

Page 61: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

61

• Indicarel’outputprodottoavideodalseguenteprogrammaC:

#include <stdio.h> void main() { int x,y,i; x=1; y=3; printf("i x y\n"); for (i=10; i>=0; i--) { y = y +i%2; if(i%2==0) x=y*2 -i; else if(i%3==0){ y=x+i; x = x + 1; } printf("%d %d %d\n",i,x,y); }} L’output a video della printf è: i x y 10 -4 3 9 -3 5 8 2 5 7 2 6 6 6 6 5 6 7 4 10 7 3 11 13 2 24 13 1 24 14 0 28 14

Page 62: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

62

• Direquantibitsononecessariperrappresentareinumerinell’intervallo[-11,+120].Con ilnumerodibit individuato, codificare in complementoa2 ivaloriA=-11eB=+120.EffettuarepoileoperazionidisommaA+BesottrazioneA-Bindicandosesièverificatoomenooverflow.Commentareemotivatetuttiipassaggi.

8bitconsentonodirappresentarel’intervallo[-128,127]esonoquindisufficientiarappresentarel’intervallorichiesto.-A=11dec=00001011C200001011(inversionediciascunbit)11110100+00000001=11110101A=11110101C2B=120dec=01111000C201111000(inversionediciascunbit)10000111+00000001=10001000-B=10001000C2A+B:11111110101+01111000=01101101Nonsiverificaoverflow,poichéglioperandisonoopposti.A-B:11110101+10001000=01111101Si verifica overflow, poiché da due operandi negativi si è ottenuto un numeropositivo (come si evince analizzando il bit più significativo degli addendi e delrisultato).

Page 63: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

63

• Dire quanti bit sono necessari per rappresentare l’intervallo [–80, +90] e

giustificare il risultato. Con il numero di bit individuato, codificare incomplemento a 2 (mostrando tutti i passaggi) i valori N1 = 90 e N2 = -80.Effettuare in complemento a due la somma N1+N2 e la differenza N1-N2indicandoemotivandoeventualiriportie/ooverflow.

8bitconsentonodirappresentarel’intervallo[-128,127]sufficienteperl’intervalloinesame.N1=90dec=01011010C2-N2=+80dec=01010000C2N2=-80dec=10110000C2N1+N2:0101101010110000[1]00001010Sihariportomanonoverflow(daduenumeridiscordinonsihamaioverwflowinC2).N1-N2:010110100101000010101010Nonsihariportomaoverflow.Daduenumeripositivi(“concordi”)sièottenutounrisultatonegativo(“discorde”).• Si convertano in complemento a due i numeri A 100dece B 82decsulminimo

numerodi bit sufficiente a rappresentarli entrambi (stabilendoquindi anchequantibitoccorrono),e senecalcoli la somma (A+B)e ladifferenza (A-B) incomplementoadue.Siindichianchesesigenerariportosullacolonnadeibitpiùsignificativiesesiverificaoverflow.

100dec=01100100C282dec=01010010C2-82dec:0101001010101101+110101110C2-82dec=10101110C2

A+B:01100100+0101001010110110Nonsihariportoperdutomasihaoverflow,daduenumeripositivisièottenuto

Page 64: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

64

unnumeronegativo:10110110C2=-74decA-B:01100100+10101110100010010Sihariportoperdutomanonoverflow,(daduenumeridiscordinonsipuòmaiottenereoverflowinC2!).00010010C2rappresentailrisultatocorretto18dec=100dec-82dec51.Fornirelatabelladiveritàdellafunzionelogica:

Aor((BandnotB)orC)

52.Fornirelatabelladiveritàdellaseguenteespressionelogica:

F=AANDBOR(AANDNot(C))ORB)

6

6

A+B: 01100100 + 01010010 10110110

Non si ha riporto perduto ma si ha overflow, da due numeri positivi si è ottenuto un numero negativo: 10110110C2=-74dec

A-B: 01100100 + 10101110 100010010

Si ha riporto perduto ma non overflow, (da due numeri discordi non si può mai ottenere overflow in C2!). 00010010C2 rappresenta il risultato corretto 18dec=100dec-82dec

- 5 - punti 4Fornire la tabella di verità della funzione logica A or ((B and not B) or C)

A""""B""""C"""""A""or"((B"and"not"B)"or"C)""0"0"0"0"1"1"1"1"

0"0"0"0"1"1"1"1"

0"0"1"1"0"0"1"1"

0"0"1"1"0"0"1"1"

1"1"0"0"1"1"0"0"

0"0"1"1"0"0"1"1"

0"0"0"0"0"0"0"0"

0"1"0"1"0"1"0"1"

0"1"0"1"0"1"0"1"

0"1"0"1"0"1"0"1"

0"1"0"1"1"1"1"1"

- 6 - punti 4Descrivere brevemente il modello client server.

- 7 - punti 6Facendo riferimento al seguente schema logico:

Giocatore(ID,Cognome,1Nome,1DataNascita,1Nazione)1

Parita(ID,1Giocatore1,1Giocatore2,1Data,1Luogo)1

MosseParita(NumeroMossa,IDPar<ta,Descrizione)1

4

4

N1 =90dec=01011010C2

-N2=+80dec=01010000C2

N2=-80dec=10110000C2

N1+N2:

01011010

10110000

[1] 00001010

Si ha riporto ma non overflow (da due numeri discordi non si ha mai overwflow in C2).

N1-N2:

01011010

01010000

10101010

Non si ha riporto ma overflow. Da due numeri positivi (“concordi”) si è ottenuto un risultato negativo (“discorde”).

- 5 - punti 3 Fornire la tabella di verità della seguente espressione logica:

F=A AND B OR (A AND Not(C)) OR B )

Soluzione

A B C F0 0 0 00 0 1 00 1 0 10 1 1 11 0 0 11 0 1 01 1 0 11 1 1 1

- 6 - punti 4

Descrivere i principali tipi di memoria disponibili nei moderni calcolatori.

Page 65: 0. Dato un numero naturale N > 0, dire se esso è …...3 (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune.

65

• Fornirelatabelladiveritàdellaseguenteespressionelogica:

(Not(A)ANDB)OR(CANDNot(D))OR(Not(C)ANDB)

5

5

- 4 - punti 1 Fornire la tabella di verità della seguente espressione logica: (Not(A) AND B) OR (C AND Not(D)) OR (Not(C) AND B) Soluzione

(Not(A) AND B) OR (C AND Not(D)) OR (Not(C) AND B)A B C D0000000011111111

0000111100001111

0011001100110011

0101010101010101

0000111100001111

0000000011111111

1111111100000000

0000111100000000

0011001100110011

0101010101010101

1010101010101010

0010001000100010

0010111100100010

0010111100101110

0011001100110011

1100110011001100

0000111100001111

0000110000001100

(Not(A) AND B) OR (C AND Not(D)) OR (Not(C) AND B)A B C D0000000011111111

0000111100001111

0011001100110011

0101010101010101

0000111100001111

0000000011111111

1111111100000000

0000111100000000

0011001100110011

0101010101010101

1010101010101010

0010001000100010

0010111100100010

0010111100101110

0011001100110011

1100110011001100

0000111100001111

0000110000001100

- 5 - punti 3 Dato il seguente frammento di codice: #include <stdio.h> int sum(int *vettore, int tot) { int parziale; if (tot == 1) parziale = vettore[0]; else parziale = vettore[0] + sum (&vettore[1], tot-1); return parziale; } main() { int valori[] = {1, 5, 23, 7, 2}; int risultato; risultato = sum(valori, 5); printf("Il risultato e' %d\n", risultato); system("pause"); } rappresentare lo stack di attivazione.