1 1. Scrivere un programma che verifica se una terna di numeri interi

Transcript

1 1. Scrivere un programma che verifica se una terna di numeri interi
1.
Scrivere un programma che verifica se una terna di numeri interi è pitagorica Analisi del problema INPUT (variabili e tipo)? Tre numeri interi x,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 che termina con 0 (dilunghezza a priori illimitata), visualizza il numero di terne (anche sovrapposte) di numeri consecutivi all’interno della sequenza che rappresentano una terna pitagorica. Se tre numeri interi x, y e z verificano la relazione x2 + y2 = z2, si dice che formano una terna pitagorica. Ad esempio, data la sequenza: 1, 6, 8, 10, 24, 26, 5, 0 allora sono presenti le seguenti due terne pitagoriche:(6, 8, 10) e (10, 24, 26). Si può vedere che in questo esempio le due terne si sovrappongono poiché hanno il valore 10 in comune. 1 Inizio
quante = 0
Leggi n1
si
n1 = 0?
no
Leggi n2
si
n2 = 0?
no
Leggi n3
si
n3 = 0?
no
n1*n1+n2*n2 =
n3*n3?
si
quante = quante+1
quante
no
n1 = n2
n2 = n3
Leggi n3
Fine
2 3. Scrivere un algoritmo che, dati due numeri A e B, trovi il loro MCD. Inizio
leggi n1
leggi n2
si
n1 < n2?
no
minimo = n2
n1 divisibile
per minimo ed n2
divisibile per
minimo?
minimo = n1
si
no
minimo =
minimo -1
minimo
Fine
3 4. Scrivere un algoritmo che, dato un numero intero, verifichi e stampi se si tratta di un numero primo oppure no. Inizio
primo = 1
Leggi n
n = 1?
si
no
divisore = 2
esci = 0
no
esci = 1?
si
no
divisore = n?
si
esci = 1
no
n è divisibile
per divisore?
si
esci = 1
primo = 0
no
primo
divisore =
divisore +1
Fine
4 5. Definire le strutture dati necessarie ad un programma per la gestione dei treni. /* tipo_orario: ore, minuti, secondi */
typedef struct {
int ore, minuti;} tipo_orario;
tipo_orario è un NUOVO TIPO !(come char, 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’!*/
5 #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);
6 }
6. Calcolare la resistenza equivalente a R1 in parallelo con R2.
1. Analisi del problema INPUT (variabili e tipo)? 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 calcolare l’equivalente parallelo di N resistenze. A differenza dell'esercizio con due resistenze in parallelo, non sappiamo a priori quante resistenze avremo. È necessario memorizzarle in un array.
L'array deve avere dimensioni fissate a priori (usare una costante MAX definita tramite direttive). Serve un contatore per sapere quante delle celle di memoria riservate all'array conterranno effettivamente il valore di una resistenza
La resistenza equivalentesarà 1/(Σ1/Ri)
INPUT: Il numero "n" di resistenze (che deve essere <= MAX) Le "n" resistenze (che devono essere diverse da 0)
OUTPUT: La resistenza equivalente RP
7 Separiamo il problema in sotto-­‐problemi:
1. Acquisire le n resistenze 2. Invertire le n resistenze 3. Sommare le n resistenze invertite tra loro 4. Invertire la somma ottenuta 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!*/
8 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. */
}
9 8. Elevare a potenza due numeri interi (base ed esponente). L’esponente deve essere positivo o nullo. Analisi del problema INPUT (variabili e tipo)? base, esponente: int OUTPUT? base^esponente: int Base, esponente (si ipotizza maggiore di zero) potenza == base^esponente Ma ancora, ^ ha un altro significato potenza = base*base*....*base tante volte quanto vale l'esponente 2. Programmazione
SERVE UN CICLO
CONTATORE per il ciclo
9. Scrivere un programma di un registratore di cassa che, acquisito un importo da restituire al cliente come resto (un numero float), calcoli e visualizzi la combinazione di monete da restituire. In particolare, il registratore di cassa ha a disposizione monete da 2e, 1e e da 50 centesimi, 20 centesimi, 10 centesimi, 5 centesimi, 2 centesimi, 1 centesimi. Il calcolo va fatto prediligendo l’utilizzo di monete di taglio più grande tra quelle a disposizione. Es: 5.71 euro → 2*2e+ 1*1e+ 1*50cent + 1*20cent + 1*1cent. (Suggerimento: moltiplicare il valore dell’importo acquisito per 100 per ottenere il numero di centesimi ed eseguire il cast del valore ad int). Svolgiamo l’esercizio considerando i seguenti tre scenari: (a) nessun controllo sul valore inserito dall’utente: supponiamo che l’importo inserito sia valido (ovvero un valore maggiore di 0). 10 (b) acquisiamo l’importo dall’utente. Se l’importo è maggiore di 0 facciamo i conti, altrimenti stampiamo la scritta “Importo inserito non valido”. (c) acquisiamo l’importo dall’utente. Se l’importo è maggiore di 0 facciamo i conti, altrimenti stampiamo la scritta “Importo inserito non valido” e continuiamo a richiederne l’inserimento fin tanto che l’utente non inserisce un valore maggiore di 0. Analisi Dobbiamo ragionare in centesimi. Una moneta da 2EU corrisponde a 200 centesimi in questo modo il numero di monete può essere ottenuto attraverso la divisione intera e le monete di taglio più piccolo possono essere ottenute attraverso l’operazione modulo % #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;
11 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 e terminata da un invio. Calcolare e stampare, per ogni carattere dell’alfabeto minuscolo, il numero di volte che e` stato inserito. #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 grado massimo 8. Il programma richiede all’utente il grado n del polinomio desiderato (un intero compreso tra 0 e 8 inclusi). Successi-­‐ vamente, chiede all’utente i coefficienti di tutti i monomi che compongono il polinomio. Infine, chiede all’utente il valore x per cui fornire la soluzione del polinomio, la calcola e la stampa a video. #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]);
}
12 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 lunghezza sconosciuta a priori. L’inserimento termina quando l’utente inserisce un numero negativo. Quindi stampare la percentuale di valori pari e la loro media. #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);
}
13 13. Scrivere un programma che chiede all’utente di inserire due sequenze di 10 numeri ciascuna. Il programma stampa a video 1 se la seconda sequenza è una permutazione della prima, altrimenti 0. #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 ++;
}
perm=(contaA==contaB); }
printf("%d\n",perm);
} 14 14. Scrivere un programma che riceve in ingresso una sequenza di numeri interi relativi a priori di lunghezza ignota e ne visualizza il valore minimo e il valore massimo. La sequenza dei valori d’ingresso si ritiene terminata quando l’utente inserisce il valore 0, che non va considerato come parte della sequenza. Nel caso in cui l’utente inserisce come primo valore 0, si visualizzi un apposito messaggio di errore “sequenza vuota”. Inizio
Leggi n
si
n = 0?
sequenza
vuota
no
minimo= n
massimo = n
somma = n
quanti = 1
Leggi n
si
n = 0?
no
n < minimo?
si
minimo= n
no
n>massimo?
si
massimo= n
no
minimo/
massimo/
somma/
quanti
quanti = quanti+1
somma = somma+n
Leggi n
Fine
15 #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 archivio geometrico. In particolare l’archivio deve memorizzare le informazioni dei punti nello spazio delle coordinate bidimensionali e rappresentare analiticamente rette e parabole. a) Definire le strutture dati necessarie per il programma. 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 un programma che dati in input un punto e una retta e scrive a video se il
punto appartiene alla retta oppure no.
16 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 programma che
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”);
}
17 d) In base alle strutture dati definite al punto a) si scriva un programma che
date due rette r1 e r2 stampa le coordinate del punto di intersezione delle due rette. Nel caso in cui le rette risultassero parallele la funzione stampa un messaggio di errore. 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. Esercizi sulle stringhe. 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’. 18 #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];
19 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 un array e costruire un secondo array (non una stringa!) che li contenga in ordine inverso. #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]);
} 20 18. Chiedere all’utente di inserire una stringa di lunghezza massima 100 e stampare a video la sua lunghezza e il numero di vocali che contiene. #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'){
lungh++;
if(str[lungh]=='a' || str[lungh]=='e' ||
str[lungh]=='i' || str[lungh]=='o' || str[lungh]=='u')
voc++;
}
printf("lunghezza: %d, nvocali: %d", lungh, voc);
}
19. Chiedere all’utente di inserire una stringa s1 di lunghezza massima 50 e poi un numero intero k. Costruire una seconda stringa s2 che contiene i primi k caratteri di s1. Quindi stampare s2. Gestire opportunamente il caso in cui k sia troppo piccolo oppure troppo grande. #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);
} 21 20. Si legga da utente una stringa S1 di al massimo N=100 caratteri, costruita da parole separate dal carattere ’.’. Si costruisca una seconda stringa S2 che contiene la sequenza ottenuta invertendo ogni parola di S1 ma lasciando le parole nell’ordine originario. 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=i1;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 contenere spazi e ciascuna di al massimo 10 caratteri. Il programma verifica prima se le stringhe sono uguali e lo comunica con un apposito messaggio. Poi, se c'è abbastanza spazio nell'array, il programma concatena la seconda stringa alla prima e visualizza il risultato. E’ possibile usare le funzioni strcmp e strlen della libreria string. strcmp è una funzione che riceve in ingresso due stringhe e restituisce il valore 0 se le due stringhe sono uguali. La funzione strlen riceve come unico parametro una stringa e restituisce un intero pari alla sua lunghezza. #include<stdio.h>
#include<string.h>
#define DIM 10
void main(){
char str1[DIM+1], str2[DIM+1];
22 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 con l’inserimento dello 0 (e in ogni caso lunga al massimo 200 elementi). Creare e visualizzare un array che contenga tutti e soli i valori distinti della sequenza (ovvero omettendo i duplicati). #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]);
}
23 23. Chiedere all’utente di inserire due matrici A e B (far specificare all’utente prima la loro dimensione che in ogni caso può essere di al massimo 50x50) e, se possibile, costruire una terza matrice C che contiene la somma A+B. Quindi visualizzare la matrice C. #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");
}
}
} 24 24. Chiedere all’utente di inserire due matrici A e B (far specificare all’utente prima la loro dimensione che in ogni caso può essere di al massimo 100x100) e, se possibile, costruire una terza matrice C che contiene il prodotto AxB. Quindi visualizzare la matrice C. #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");
}
}
}
25 25. Si consideri il seguente frammento di codice in linguaggio C: #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);
}
}
indicare l’output della printf. 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
26 26. Una Università vuole realizzare un programma che consenta di automatizzare il processo di selezione degli studenti del primo anno. Il sistema deve memorizzare i dati degli iscritti al test di ingresso (caratterizzati da codice pre-­‐
iscrizione, cognome, nome, indirizzo e numero di telefono). Ogni iscritto al test viene inoltre caratterizzato dall’elenco delle risposte date nel questionario in forma chiusa compilato durante il test. Si assuma per semplicità che ogni domanda del questionario ammetta come possibili risposte “1, 2, 3, 4” e che il questionario includa complessivamente 100 domande. a) Definire le strutture dati necessarie per il programma. #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) Sia data la seguente struttura dati: typedef struct {
int numeroDomanda;
int rispostaEsatta;
} Soluzione;
typedef Soluzione Risposte[100];
Scrivere un programma che calcoli il punteggio complessivo ottenuto da un iscritto al test s (dato in ingresso). Il punteggio viene ottenuto assegnando il valore +1 ad ogni risposta esatta e -­‐2 ad ogni risposta sbagliata. Le risposte sono memorizzate in una variabile r di tipo Risposte (trascurare l’input della variabile r). Soluzione 1 (si suppone che le risposte in r siano ordinate)
void main(){
Iscritto s;
27 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 */
...
28 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) 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++;
29 else punteggio -= 2;
printf(“Il punteggio ottenuto è: %d\n”, punteggio);
}
27. Scrivere un programma che acquisisce due date, espresse in termini di giorno, mese e anno, e le confronta per stabilire se sono uguali oppure in ordine cronologico crescente oppure inverso. #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");
}
30 28. Scrivere un programma che acquisisce due frazioni, ne esegue somma e moltiplicazione e in seguito stampa a video i risultati delle due operazioni. Nota che: (i) con frazione si intende la coppia (n, d), ove n è il numeratore e d è il denominatore; (ii) n e d sono numeri interi. #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
31 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 e stampa la somma. Un inter-­‐ vallo di tempo é composto da un numero di giorni, di ore, di minuti e di secondi. In particolare, l’ora deve essere inclusa nell’intervallo [0; 23], i minuti in [0; 59], ed i secondi in [0; 59]. Successivamente, il programma calcola la somma di tutti gli intervalli e la stampa a video nel formato: giorni, ore, minuti, secondi (massimo 23 ore, massimo 59 minuti, massimo 59 secondi. Nessun limite al numero di giorni). Esempio per i seguenti due intervalli di tempo (giorni, ore, minuti, secondi): 0 20 50 15 e 0 7 20 30, il risultato sara` essere: 1 giorno/i, 4 ora/e, 10 minuto/i e 45 secondo/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);
32 }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);
}
33 30. Torneo di Calcio: definire una struttura dati che descriva le squadre di un torneo di calcio. Per ogni squadra si devono memorizzare: matricola squadra, nome, città e tutti i giocatori. Per ogni giocatore si vuole memorizzare il nome e il numero di maglia. Scrivere un programma che gestisce 6 squadre; in particolare supponendo di aver inizializzato tutte le informazioni (aggiungere solo un commento per indicare il punto di codice in cui viene effettuata l’acqusizione), il programma C trova e visualizza l’elenco di tutti i giocatori che portano la maglia 23. #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
34 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. Scuola di ballo: si scriva un programma C per la gestione di una scuola di ballo. Ogni classe consiste di un insieme di 20 persone e di due istruttori. Ogni persona ha un nome, un cognome, un sesso e una età. Si implementi il programma C che, una volta acquisiti i dati di 50 classi (si ometta il codice per brevità), per ogni classe, stampa l’età media degli studenti di sesso maschile. #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);
}
}
35 32. Scrivere un programma che consenta di gestire un piccolo dizionario italiano inglese. Il dizionario diz è composto da al massimo 100 parole e ogni parola è caratterizzata da una coppia di termini lunghi al massimo 20 caratteri: il primo in italiano e il secondo in inglese. Il programma deve: a. Consentire all’utente di inserire le parole nel dizionario. L’inserimento termina quando l’utente inserisce la coppia di termini #, # oppure quando non vi è più spazio nel dizionario. b. Creare un secondo dizionario dizLungheUguali che contiene solo le parole che hanno la stessa lunghezza sia in italiano che in inglese. c. Visualizzare le parole che sono state inserite in dizLungheUguali. #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];
36 ll++;
}
}
/* Visualizza le parole di dizLungheUguali */
for (i=0; i<ll; i++){
printf("\n%s, %s", dizLungheUguali[i].ita,
dizLungheUguali[i].eng);
}
}
33. E’ necessario progettare un sistema per la gestione di un insieme di aziende che devono essere visitate da agenti di commercio. Ogni azienda è descritta da un nome, un numero di telefono, un indirizzo ed una città. Queste informazioni devono essere memorizzate come stringhe di 50 caratteri. Un agente di commercio invece è definito da nome, cognome, telefono e da un insieme di aziende da visitare. Il numero massimo di aziende da visitare è 25, per gli altri dati utilizzare stringhe di 50 caratteri. a) Definire i tipi di dato opportunamente. #define MAX_L 50
#define MAX_AZ 25
#define MAX_AG 100
typedef struct{
char nome[MAX_L+1];
int telefono;
char indirizzo[MAX_L+1];
char citta[MAX_L+1];
} t_azienda;
typedef struct{
char nome[MAX_L+1];
char cognome[MAX_L+1];
int telefono;
t_azienda visitare[MAX_AZ];
} t_agente;
b) scrivere un programma che prende in ingresso un agente ed una città e restituisce il numero di aziende dell’agente con sede nella città specificata. void main(){
t_agente g;
char citta[MAX_L+1];
37 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) scrivere un programma che prende in ingresso i dati di un insieme di agenti e una a città e copia in un array tutte le aziende che si trovano nella città specificata. Il programma stampa infine a video il loro numero. 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++;
}
}
}
38 printf(“%d\n”,k);
}
34. Si vuole creare un programma di gestione per una società di autonoleggio. Il sistema deve memorizzare il parco auto della società. Ogni auto è caratterizzata da un numero di targa (stringa di 7 caratteri), marca, modello e numero di Km percorsi. Il sistema deve memorizzare anche i dati dei clienti, caratterizzati da nome, cognome, numero di patente di guida, codice fiscale, indirizzo e numero di cellulare. Un noleggio (che farà riferimento a un’auto e un cliente) ha una data di inizio, data di fine e tipologia di assicurazione (basic o full). Definire le strutture dati necessarie per il programma. #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;
39 35. Si deve scrivere un programma per la gestione di archivi musicali. In particolare è necessario raccogliere informazioni riguardanti tutti i file musicali presenti su un computer e per creare playlist in base alle preferenze degli utenti. Di ogni brano musicale si vogliono memorizzare titolo, album, artista, durata, genere e tipo di file. Titolo, album e artista sono stringhe di massimo 255 caratteri. La durata è espressa in millisecondi. I generi musicali sono solo “rock”, “classical” e “jazz”. Il tipo di file può essere uno tra “mp3, aac, wma, wav”. a) Definire i tipi di dato TipoGenere e TipoFile. Definire inoltre il tipo di dato TipoBrano, utilizzando anche i due tipi definiti in precedenza. #define
#define
typedef
typedef
STR_LEN 256
MAX_BRANI 100
enum {rock, classical, jazz } TipoGenere;
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) Dato il seguente scheletro del programma principale: 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 */
...
}
40 Completare il codice in modo da inserire nell’array playlist i primi n brani di genere g e tipo t trovati in archivio. In caso non ci siano sufficienti brani di genere dato, la playlist viene riempita con brani di altro genere. Invece, se non esistono abbastanza brani di tipo t, il programma termina. Il prgramma stampa il numero di brani effettivamente inseriti in playlist (quindi di solito vale n, se ci sono almeno n file del tipo voluto in archivio. Si supponga che playlist sia un array già inizializzato con almeno n celle e che n < nBrani (quindi, in altri termini, queste condizioni non devono essere controllate). 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!
}
41 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);
}
42 36. Effettuare il tracing delle variabili per il seguente programma C. Indicare il contenuto delle variabili al termine dell’esecuzione del programma #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:
ixy
310
460
5 6 -1
6 12 11
43 37.
Si deve realizzare un programma che consenta di giocare al “gioco del 15”. Il gioco è un rompicapo classico inventato da Samuel Loyd nel 1878. Il gioco consiste di una tabellina di forma quadrata divisa in quattro righe e quattro colonne (quindi 16 posizioni), su cui sono posizionate 15 tessere quadrate, numerate progressivamente a partire da 1. Le tessere possono scorrere in orizzontale o verticale, ma il loro spostamento è ovviamente limitato dall'esistenza di un singolo spazio vuoto. Lo scopo del gioco è riordinare le tessere dopo averle "mescolate" in modo casuale (la posizione da raggiungere è quella con il numero 1 in alto a sinistra e gli altri numeri a seguire da sinistra a destra e dall'alto in basso, fino al 15 seguito dalla casella vuota). La figura sottostante riporta il gioco del quindici risolto.
a) Definire le strutture dati necessarie per scrivere il programma. #define Size 4
typedef int gioco15[size][size];
gioco15 f;
b ) In base alle strutture dati definite al punto precedente scrive un programma che, data una matrice del gioco del 15 g, stampa a video 1 se questa corrisponde alla situazione in cui il gioco è risolto, 0 in caso contrario. 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 {
44 if (cont==16) printf (“1\n”); //sono arrivato sulla cella
//vuota
else return printf (“0\n”); // esiste un elemento
// fuori sequenza
}
}
38. E’ necessario realizzare un programma che consenta agli utenti di gestire la propria rubrica telefonica. Il programma utilizza una struttura dati che consente di salvare i contatti della rubrica (al massimo 1000) sapendo che ogni contatto è caratterizzato da nome, cognome, data di nascita e numero di telefono. La data di nascita è espressa in termini di giorno, mese e anno e tutte le stringhe sono lunghe al massimo 30 caratteri. Il programma deve presentare all’utente un menu che fornisce varie funzionalità: 1. inserisci: aggiunta di un nuovo contatto alla rubrica. 2. cancella: eliminazione di un contatto dalla rubrica dati il suo nome e cognome. 3. cerca: visualizzazione del numero di telefono di un contatto dati il suo nome e cognome. 4. aggiorna: modifica dei dati di un contatto. Vengono forniti il nome e il cognome del contatto da aggiornare e il programma consente all’utente di inserire il nuovo numero di telefono della persona. 5. compleanni: visualizzazione dei contatti che compiono gli anni in un mese specificato dall’utente. 6. stampa: visualizzazione del contenuto della rubrica. 7. esci: termine del programma. L’interazione tra utente e programma avviene in modo ciclico: l’utente può sottoporre una richiesta ad ogni ciclo. L’esecuzione del programma termina quando l’utente richiede l’uscita. #include<stdio.h>
#include<string.h>
#define MAX_L 30
#define MAX_P 1000
#define
#define
#define
#define
#define
#define
#define
AGGIUNGI 1
ELIMINA 2
CERCA 3
AGGIORNA 4
COMPLEANNI 5
STAMPA 6
ESCI 7
45 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 [n].nome);
scanf("%s",rubrica[n].cognome);
scanf("%d",&rubrica[n].nascita.giorno);
scanf("%d",&rubrica[n].nascita.mese);
scanf("%d",&rubrica[n].nascita.anno);
scanf("%s",&rubrica[n].telefono);
}
else printf("\nNon vi e` piu` spazio nella
rubrica");
}
else if(scelta==ELIMINA){
int j,eliminato=0;
46 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);
printf("\n%s",r[i].cognome);
47 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)
}
39. Si deve realizzare un insieme di programmi per la gestione di un Radio Taxi. Il sistema deve memorizzare i dati dei tassisti (caratterizzati da matricola, cognome, nome e telefono cellulare) e dei taxi (targa, numero massimo passeggeri, posizione GPS, matricola dell’autista, stato). Si assuma per semplicità di descrivere tutte le informazioni come stringhe di 50 caratteri e che il campo stato sia 0 per indicare che il taxi è libero e 1 che è occupato. Si assuma che il sistema debba gestire un archivio di tassisti e di taxi con al più 100 e 50 elementi, rispettivamente. a) Definire le strutture dati necessarie per il sistema. #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{
Stringa targa, nMaxPasseggeri, posizioneGPS,
48 matricolaAutista;
Stato stato;
}Taxi;
typedef struct {
Taxi taxi[NTAXI];
int nTaxi;
}ArchivioTaxi;
typedef struct {
Tassista tassisti[NTASSISTI];
int nTassisti;
}ArchivioTassisti;
40. Si consideri il seguente frammento di codice in linguaggio C: #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);
}
}
indicare l’output della printf per tutte le iterazioni effettuate dal costrutto for. 558
4 10 9
399
2 11 7
1 11 7
49 41. Si vuole creare una social network (es., Facebook, MySpace). Ogni utente iscritto è caratterizzato dai propri dati anagrafici (nome, cognome, data di nascita, paese di nascita, nazionalità) ed è identificato da uno username che viene autenticato con una password. Gli utenti possono instaurare anche una relazione di amicizia con altri utenti. Si assuma che un utente possa avere al più 1000 amici, che complessivamente il sistema possa gestire al più 5000 utenti e che ogni stringa sia lunga al massimo 50 caratteri. a) Definire le strutture dati necessarie per il programma. Suggerimento: Associare a un utente un array contenente la username dei suoi amici. #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 social network u e uno username stampa a video 1 se lo username è amico dell’utente u e 0 in caso contrario. 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);}
50 42. Si vuole creare un programma per la gestione di un supermercato. Siano date le seguenti strutture dati: #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];
In particolare il campo prodottoCatena della struttura Prodotto è pari a 1 se il prodotto ha il marchio della catena del supermercato, 0 altrimenti. Il supermercato sta applicando un’offerta ai propri clienti: se il cliente effettua la spesa nei primi 14 giorni del mese, allora matura un bonus pari al 30% del totale dei prodotti acquistati con il marchio del supermercato. Il bonus maturato verrà utilizzato come sconto – applicato sempre e solo ai prodotti con il proprio marchio – nella seconda parte del mese. a) Scrivere un programma, che dati in input un cliente, uno scontrino e la data del giorno stampa a video il nuovo bonus del cliente c per la spesa effettuata. ...
void main()
{
Cliente c;
Scontrino s;
int nElementiScontrino;
Data d;
float bonus=0;
51 /* 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) Scrivere un programma, che dati in input un insieme di clienti, fornisce a video il codice del cliente gold ossia il cliente che ha maturato il bonus maggiore sui prodotti della catena del supermercato. ...
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] */
...
}
52 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);
}
43. Si consideri il seguente frammento di codice in linguaggio C: #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);
}
}
indicare l’output della printf per tutte le iterazioni effettuate dal costrutto for. ixy
043
144
244
357
447
548
608
709
8 -7 9
9 -6 2
53 44. Si vuole realizzare un programma per la gestione degli ordini di un negozio online. Il programma memorizza in un'apposita struttura dati, chiamata magazzino_t, i prodotti (massimo 100) venduti dal negozio. Per ogni prodotto (il cui tipo e’ prodotto_t), il programma memorizza il codice del prodotto, la sua descrizione (una stringa di 50 caratteri), il costo per unità, la quantità disponibile in magazzino ed il codice dello scaffale in cui è situato. Inoltre, il programma gestisce con un'altra struttura dati, chiamata ordine_t, l'ordine effettuato da un cliente. In un singolo ordine è possibile specificare un massimo di 50 prodotti diversi tramite la struttura prodottoOrdinato_t, per ciascuno dei quali è necessario specificare il codice e la quantità richiesta. a) Descrivere le strutture dati necessarie per rappresentare il magazzino e l’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) Scrivere un programma finalizzato alla verifica degli ordini. Il programma riceve in ingresso i dati di un magazzino ed un ordine e verifica se l'ordine può essere evaso (è necessario che ciascuno prodotto sia presente nel magazzino e ne sia disponibile una quantità sufficiente). Se l’ordine può essere evaso il programma stampa a video il costo dell'ordine altrimenti viene stampato il valore -­‐1. void main (){
54 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 degli ordini del magazzino. Il programma chiede in input I dati di un magazzino m e stampa a video l’elenco dei prodotti la cui quantità disponibile è inferiore a una soglia di riordino. Il programma stampa anche il numero totale di prodotti da ordinare. 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++) {
55 if (m.prodotti[i].quantita < sogliaRiordino) {
/* stampa m.prodotti[i]; */
j++;
}
}
printf(“%d”, j);
}
45. Si consideri il seguente tipo di dato per rappresentare un’immagine in scala di grigi in termini di una matrice quadrata di interi di dimensione massima 50x50, dove ciascun elemento rappresenta l’intensità del colore grigio in uno specifico pixel: #define MAXV 50
typedef Immagine_t int[MAXV][MAXV];
Scrivere un programma che consenta di effettuare il downscaling di un’immagine. Il programma legge un’immagine quadrata imgIn, di dimensione effettiva dim e produce un’immagine di uscita imgOut. Se la dimensione ricevuta è divisibile per 2, il programma riduce la risoluzione dell’immagine imgIn e stampa la dimensione della nuova immagine, mentre l’immagine viene salvata in imgOut. In caso contrario (dimensione effettiva non è divisibile per 2) non viene eseguita alcuna operazione e viene stampato a video il valore 0. L’operazione di riduzione della risoluzione è eseguita nel seguente modo: la nuova dimensione dell’immagine sarà la metà di quella originale e ciascun nuovo punto sarà calcolato come la media di quattro punti adiacenti, come mostrato in figura: #define MAXV 50
typedef Immagine_t int[MAXV][MAXV];
void main(){
Immagine_t imgIn;
int dim;
56 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);
}
57 46. Dire quanti bit sono necessari per rappresentare i numeri nell’intervallo [-­‐32,+111]. Con il numero di bit individuato, codificare in complemento a 2 i valori A=-­‐32 e B=+111. Effettuare poi le operazioni di somma A+B e sottrazione B-­‐A indicando se si è verificato o meno overflow. Commentare e motivate tutti i passaggi. 8 bit consentono di rappresentare l’intervallo [-­‐128, 127] e sono quindi sufficienti a rappresentare l’intervallo richiesto. -­‐A=32dec=00100000C2 00100000 (inversione di ciascun bit) 11011111+ 00000001= 11100000 A=11100000 C2 B=111dec=01101111C2 A+B: 11 11100000+ 01101111= 01001111 Non si verifica overflow, poiché i numeri di partenza sono opposti. B-­‐A: 11 01101111+ 00100000= 10001111 Si verifica overflow, poiché da due numeri positivi si è ottenuto un numero negativo (come si evince analizzando il bit più significativo degli addendi e del risultato). 58 47. Indicare l’output prodotto a video dal seguente programma C: #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 è:
ixy
10 -4 3
9 -3 5
825
726
666
567
4 10 7
3 11 13
2 24 13
1 24 14
0 28 14
59 48. Dire quanti bit sono necessari per rappresentare i numeri nell’intervallo [-­‐11,+120]. Con il numero di bit individuato, codificare in complemento a 2 i valori A=-­‐11 e B=+120. Effettuare poi le operazioni di somma A+B e sottrazione A-­‐B indicando se si è verificato o meno overflow. Commentare e motivate tutti i passaggi. 8 bit consentono di rappresentare l’intervallo [-­‐128, 127] e sono quindi sufficienti a rappresentare l’intervallo richiesto. -­‐A=11dec=00001011C2 00001011 (inversione di ciascun bit) 11110100+ 00000001= 11110101 A=11110101 C2 B=120dec=01111000C2 01111000 (inversione di ciascun bit) 10000111+ 00000001= 10001000 -­‐B= 10001000C2 A+B: 111 11110101+ 01111000= 01101101 Non si verifica overflow, poiché gli operandi sono opposti. A-­‐B: 11110101+ 10001000= 01111101 Si verifica overflow, poiché da due operandi negativi si è ottenuto un numero positivo (come si evince analizzando il bit più significativo degli addendi e del risultato). 60 49. Dire quanti bit sono necessari per rappresentare l’intervallo [–80, +90] e giustificare il risultato. Con il numero di bit individuato, codificare in complemento 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-­‐N2 indicando e motivando eventuali riporti e/o overflow. 8 bit consentono di rappresentare l’intervallo [-­‐128,127] sufficiente per l’intervallo in esame. 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”). 50. Si convertano in complemento a due i numeri A 100dec e B 82dec sul minimo numero di bit sufficiente a rappresentarli entrambi (stabilendo quindi anche quanti bit occorrono), e se ne calcoli la somma (A+B) e la differenza (A-­‐B) in complemento a due. Si indichi anche se si genera riporto sulla colonna dei bit più significativi e se si verifica overflow. 100dec =01100100C2 82dec =01010010C2 -­‐82dec: 01010010 10101101 + 1 10101110C2 -­‐82dec =10101110C2 A+B: 01100100 + 01010010 10110110 Non si ha riporto perduto ma si ha overflow, da due numeri positivi si è ottenuto 61 N1 =90dec=01011010C2
-N2=+80dec=01010000C2
6
A+B:
=10110000
C2
un N2=-80
n
umero dec
n+egativo: 10110110
C2=-­‐74dec 01100100
01010010
A-­‐B: 10110110
01100100 + Non
10101110 N1+N2:
si ha riporto
perduto ma si ha overflow, da due numeri positivi si è ottenuto un
100010010 numero negativo: 10110110C2=-74dec
Si ha riporto perduto ma non overflow, (da due numeri discordi non si può mai 01011010
A-B:
ottenere o
verflow in C2!). 00010010C2 rappresenta il risultato corretto 01100100 +
10110000
18dec
=100dec-­‐82dec 10101110
100010010
[1] 00001010
Si ha riporto perduto ma non overflow, (da due numeri discordi non si può mai ottenere
51.
la tabella di voverflow
erità della (da
funzione logica: overflow
in C2!).
00010010
il risultato
corretto
18decnon
=100si
C2 rappresenta
dec-82
SiFornire ha riporto
ma
non
due
numeri
discordi
ha dec
mai overwflow in C2).
A or ((B and not B) or C) - punti 4
- 5N1-N2:
Fornire la tabella di verità della funzione logica A or ((B and not B) or C)
01011010
A""""B""""C"""""A""or"((B"and"not"B)"or"C)"
" 01010000
0" 0" 0" 0" 0" 0" 0" 1" 0" 0" 0"
0"10101010
0" 1" 0" 1" 0" 0" 1" 0" 1" 1"
0" 1" 0" 0" 0" 1" 0" 0" 1" 0" 0"
overflow.
Da1"due numeri positivi (“concordi”) si è ottenuto un risultato
0"Non
1" si1"ha riporto
0" 1" ma
1" 0"
0" 1" 1"
1"negativo
0" 0" (“discorde”).
1" 1" 0" 0" 1" 0" 0" 0"
1" 0" 1" 1" 1" 0" 0" 1" 0" 1" 1"
1" 1" 0" 1" 1" 1" 0" 0" 1" 0" 0"
- 1"
punti
1"- 5 1"
1" 31" 1" 0" 0" 1" 1" 1"
Fornire la tabella di verità della seguente espressione logica:
- 6 - punti 4
Descrivere brevemente il modello client server.
52.
Fornire verità della seguente F=A
ANDla Btabella OR (Adi AND
Not(C))
OR B )espressione logica: F=A AND B OR (A AND Not(C)) OR B ) - punti 6
- 7Soluzione
Facendo riferimento al seguente schema logico:
ABCF
0 Giocatore(ID,Cognome,1Nome,1DataNascita,1Nazione)1
00 0
001 0
010 1
0 1 Parita(ID,1Giocatore1,1Giocatore2,1Data,1Luogo)1
1 1
100 1
101 0
MosseParita(NumeroMossa,IDPar<ta,Descrizione)1
110 1
111 1
6
-6 -
punti 4
Descrivere i principali tipi di memoria disponibili nei moderni calcolatori.
62 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)
53. Fornire la tabella di verità della seguente espressione logica: (Not(A) AND B) OR (C AND Not(D)) OR (Not(C) AND B) Soluzione
A B C D (Not(A) AND B) OR (C AND Not(D)) OR (Not(C) AND B)
1 0
1 0 0 0 0 0 0
0 1 0 0 0
0 0 0 0
0 1
1 0 0 0 0 0 0
0 1 0 0 0
0 0 0 1
1 0
1 0 0 0 1 1 1
1 0 1 0 0
0 0 1 0
0 1
1 0 0 0 0 1 0
0 0 1 0 0
0 0 1 1
1 0
1 0 1 1 1 0 0
1 1 0 1 1
0 1 0 0
0 1
1 0 1 1 1 0 0
1 1 0 1 1
0 1 0 1
1 0
1 0 1 1 1 1 1
1 0 1 0 1
0 1 1 0
0 1
1 0 1 1 1 1 0
1 0 1 0 1
0 1 1 1
1 0
0 1 0 0 0 0 0
0 1 0 0 0
1 0 0 0
0 1
0 1 0 0 0 0 0
0 1 0 0 0
1 0 0 1
1 0
0 1 0 0 1 1 1
1 0 1 0 0
1 0 1 0
0 1
0 1 0 0 0 1 0
0 0 1 0 0
1 0 1 1
1 0
0 1 0 1 0 0 0
1 1 0 1 1
1 1 0 0
0 1
0 1 0 1 0 0 0
1 1 0 1 1
1 1 0 1
1 0
0 1 0 1 1 1 1
1 0 1 0 1
1 1 1 0
0 1
0 1 0 1 0 1 0
0 0 1 0 1
1 1 1 1
- 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.
5
63