0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è...

26
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 è … un numero naturale N > 0, dire se esso è...

Page 1: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

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 è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

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); }

• 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 è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

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 è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

4

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 5: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

5

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 6: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

6

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 7: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

7

#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 8: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

8

}

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 9: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

9

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 10: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

10

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 11: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

11

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 12: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

12

(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 13: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

13

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

• Chiedere all’utente di inserire una sequenza di caratteri a priori illimitata eterminatadauninvio.Calcolareestampare,perognicaratteredell’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]); }

• Scrivere un programma in grado di calcolare il valore di polinomi di gradomassimo 8. Il programma richiede all’utente il grado n del polinomiodesiderato(uninterocompresotra0e8 inclusi).Successi-vamente,chiedeall’utente i coefficienti di tutti i monomi che compongono il polinomio.Infine,chiedeall’utenteilvalorexpercuifornirelasoluzionedelpolinomio,lacalcolaelastampaavideo.

#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 14: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

14

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 15: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

15

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 16: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

16

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 17: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

17

#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 18: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

18

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 19: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

19

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 20: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

20

#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 21: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

21

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 22: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

22

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 23: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

23

}

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 24: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

24

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 25: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

63

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 26: 0. Dato un numero naturale N > 0, dire se esso è … un numero naturale N > 0, dire se esso è uguale o no alla somma dei suoi divisori (dire cioè se è un numero perfetto

64

• 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.