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
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
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
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
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
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’!*/
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);
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
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!*/
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. */
}
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).
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;
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]); }
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); }
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.
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
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.
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”); }
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’.
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];
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]); }
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);
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(){
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]); }
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.
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.