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 1. 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. 2. Programmazione
2. 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;
1 /* 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’!*/
#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;
2 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);
}
3. 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 3 4. 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
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: 4 /* 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!*/
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
5 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. */
}
6 5. 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
6. 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). 7 (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;
8 printf("%d * 0.02 ", monete);
} /* monete contiene ora il numero di monete da un centesimo */
printf("%d * 0.01 ", monete);
7. 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]);
}
8. 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]);
}
9 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);
9. 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);
}
10. 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]);
10 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);
} 11. 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”. #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");
}
12. 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;
11 /*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.
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*/
12 ...
/*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”);
}
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);
13 }
}
13. 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’. #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);
14 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];
i++;
j++;
}
/* Inserisco il carattere di terminazione in s3 e stampo*/
s3[i]= '\0';
printf(“s1+s2:%s\n”,s3);
}
14. 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++)
15 printf("%c ", vett2[i]);
} 16 15. 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);
}
16. 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);
} 17 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);
} 17. 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];
18 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");
}
}
18. 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]);
}
19. 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 19 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");
}
}
} 20 20. 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");
}
}
}
21 21. 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
22. 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 22 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;
Risposte r;
int i;
int punteggio=0;
/* Acquisisci s */
23 ...
/* 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 */
...
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;
24 /*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++;
else punteggio -= 2;
printf(“Il punteggio ottenuto è: %d\n”, punteggio);
}
25 23. 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");
}
26 24. 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
27 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);
}
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);
28 }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);
}
29 25. 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
30 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);
}
}
}
26. 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);
}
}
31 27. 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++){
32 if(strlen(diz[i].ita)==strlen(diz[i].eng)){
dizLungheUguali [ll]=diz[i];
ll++;
}
}
/* Visualizza le parole di dizLungheUguali */
for (i=0; i<ll; i++){
printf("\n%s, %s", dizLungheUguali[i].ita,
dizLungheUguali[i].eng);
}
}
28. 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(){
33 t_agente g;
char citta[MAX_L+1];
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++;
34 }
}
}
printf(“%d\n”,k);
}
29. 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;
35 } t_noleggio;
30. 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 */
36