Download - Esercizi Svolti in C

Transcript
Page 1: Esercizi Svolti in C

10/26/2011

1

Esercizi

Esercizio 1

• Scrivere un programma in C che legge un

vettore di interi di dimensione fissata e inverte

il vettore e lo stampa.

Page 2: Esercizi Svolti in C

10/26/2011

2

#include <stdio.h> #define LUNG 5 int main() {

int vett[LUNG],i,temp; /*usata per scambiare due elementi del vettore */

printf("Inserire un vettore di interi di dimensione %d\n", LUNG);

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

scanf("%d", &vett[i]);

/* Inverti il vettore senza l'utilizzo di un vettore ausiliario */

for (i = 0; i < LUNG/2; i++) {

temp = vett[i];

vett[i] = vett[LUNG-1-i];

vett[LUNG-1-i] = temp;

}

/* Stampa il vettore, che ora e' invertito */

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

printf(“%d %d\n", i, vett[i]);

return 0; }

Esercizio 2

Scrivere un programma, completo di opportune dichiarazioni di variabili, che:

1. Legge in input da tastiera gli elementi di una matrice di interi di dimensione NxM (N e M costanti prefissate)

2. Stampa la matrice

3. Cerca, se esiste, la prima occorrenza dello 0 e dice in che posizione (riga, colonna) è stata trovata

4

Page 3: Esercizi Svolti in C

10/26/2011

3

#include <stdio.h>

#define N 3

#define M 4

int main() {

int i, j, si=0, m[N][M];

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

for (j = 0; j < M; j++) {

printf(“\nInserisci un elemento della matrice: “); scanf(“%d”,&m[i][j]);

}

}

printf("\nLa matrice inserita e': \n");

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

for (j = 0; j < M; j++)

printf(" %d ", m[i][j]);

printf("\n");

}

/* Cerca lo 0 */

for (i = 0; i < N && si==0; i++) {

for (j = 0; j < M && si==0; j++)

if (m[i][j]==0) { si=1; printf ("\n trovato lo 0 in riga %d e colonna %d",i,j); }

}

if (si==0) printf("\nLo 0 non e' stato trovato");

return 0;

} 5

Esercizio 3

• Scrivere un programma C che legge due

stringhe da tastiera, le concatena in un’unica

stringa e stampa la stringa così generata

• N.B.: nella generazione della stringa risultato

si faccia attenzione all’inserimento in coda del

carattere di terminazione

Page 4: Esercizi Svolti in C

10/26/2011

4

#include <stdio.h>

#define LUNG 200

int main () {

char str1[LUNG],str2[LUNG],strTot[2*LUNG];

int i,j;

printf(“Inserisci la prima stringa:\n“); scanf(“%s”,str1);

printf(“Inserisci la seconda stringa:\n“); scanf(“%s”,str2);

for (i=0;str1[i]!='\0';i++)

strTot[i]=str1[i];

/* i rappresenta il numero di caratteri copiati da str1 a strTot */

for (j=0;str2[j]!='\0';j++) /* accodo str2 a str1 */

strTot[i+j]=str2[j];

strTot[i+j]='\0';

printf("\n%s",strTot);

return 0;

}

Esercizio 4

• Sviluppare un programma che acquisisce in

input una stringa e stabilisce se la sequenza è

palindroma oppure no (per esempio, "ada" è

palindroma perché si legge allo stesso modo

sia da destra che da sinistra)

Page 5: Esercizi Svolti in C

10/26/2011

5

#include<stdio.h>

#include<string.h>

#define MAX_DIM 100

int main() {

char stringa[MAX_DIM];

int contatore=0, i, quanti=0 ;

scanf("%s“,stringa);

contatore=strlen(stringa)-1;

for(i=0;i<contatore/2;i++)

if(stringa[i]==stringa[contatore-i])

quanti++;

if(quanti==contatore/2)

printf(“Palindromo”);

else

printf(“Non Palindromo”);

return 0;

}

#include<stdio.h> #define MAX_DIM 100 int main() {

char stringa[MAX_DIM];

int contatore=0, i ;

scanf("%s“,stringa);

for (i=0;stringa[i]!='\0';i++) { contatore++; }

contatore--;

i=0;

while(stringa[i]==stringa[contatore-i] && i<contatore-i) { i++; }

if(i>=contatore-i)

printf("la stringa e' palindroma");

else

printf("la stringa non e' palindroma");

return 0; }

Page 6: Esercizi Svolti in C

10/26/2011

6

Esercizio 5

• Si codifichi un programma C che legge due stringhe

che rappresentano due parole e stampa un valore

intero, da interpretarsi come valore di verità, che

indica se le parole sono anagrammi, cioè se è

possibile ottenere l’una dall’altra tramite

permutazione delle loro lettere.

• Ad esempio le parole POLENTA e PENTOLA sono

anagrammi. Si presti attenzione al fatto che parole

come TAPPO e PATTO non sono anagrammi, anche se

ogni lettera dell’una è contenuta nell’altra.

11

int main() {char a[100], b[100]; int len, contA, contB, i, k, si=1;

printf(“……”); scanf(“%s”,a); scanf(“%s”,b);len=strlen(a);if ( len != strlen(b) ) si=0;for ( i = 0 ; i < len ; i++ ) {//per ogni a[i] in a (escluso il \0)

contA = 0; contB = 0;for ( k = 0 ; k < len ; k++ ) {//scandisco le stringheif ( a[k] == a[i] )

++contA; //conto le occorrenze di a[i] in aif ( b[k] == a[i] )

++contB; //e le occorrenze di a[i] in b}if ( contA != contB ) si = 0;

}printf(“%d\n”,si); // se corrispondono tutti -> 1return 0;

}

12

Page 7: Esercizi Svolti in C

10/26/2011

7

Esercizio 6• Definiamo il grado minimo g e il grado massimo G di una

parola P rispettivamente come il minimo e il massimo numero di occorrenze delle lettere di P in P. Ad esempio:

– ISTANBUL � g=1, G=1 ( tutte le lettere della parola compaiono in essa una e una sola volta )

– BOSFORO � g=1, G=3 ( B, S, F, R compaiono una sola volta, O compare tre volte )

– GALATASARAY � g=1, G=5 ( G, L, T, S, R, Y compaiono una sola volta, A compare cinque volte )

– MARMARA � g=2, G=3 ( M e R compaiono due volte, A compare tre volte )

– G e g valgono convenzionalmente 0 per la parola vuota (cioè per una parola priva di caratteri).

• Si scriva un programma C che legge una stringa di lunghezza generica che rappresenta P, calcola G e g, e li stampa

13

int main () {

char p[100]; int g, G, i, j, count, lun;

printf(“…”); scanf(“%s”,p);

lun=strlen(p); g = lun; G = 0;

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

count = 0;

for ( j=0; j<lun; j++ ) { if (p[i]==p[j]) { count++; } }

if ( count < g ) g = count;

if ( count > G ) G = count;

}

printf(“g=%d,G=%d”,g,G);

return 0;

}14

Page 8: Esercizi Svolti in C

10/26/2011

8

• Dato un array quotX di 365 valori interi, che rappresentano le

quotazioni nell’anno solare corrente del titolo azionario X, si

vuole realizzare un programma in linguaggio C in grado di:

– Inizializzare il contenuto dell’array quotX con valori letti da standard

input che devono essere compresi tra 1 e 100 (estremi inclusi),

scartando eventuali valori fuori dall’intervallo.

– Salvare in una opportuna/e variabile di tipo struttura (di cui si chiede

anche la definizione del tipo) la quotazione massima e il primo giorno

(espresso come posizione nell’array) in cui tale quotazione è stata

memorizzata

– Determinare e stampare a video il numero di periodi dell’anno in cui il

titolo si è mantenuto costante (ossia, quante volte la medesima

quotazione si è presentata in giorni successivi).

• Ad esempio, se le quotazioni fossero 10 10 15 14 12 12 12 8 9 9 12 12….. il

titolo avrebbe avuto 4 periodi di quotazione costante.

Esercizio 7

#include <stdio.h>

#define MAX 365

typedef struct { int massimo; int giorno; } quotMax;

int main () {

int quot[MAX], cont=0,i,inZona;

quotMax qm;

qm.massimo = -1;

qm.giorno = -1;

do {

printf("Inserire l'elemento numero %d: ", cont);//o cont+1

scanf("%d", &quot[cont]);

if (quot[cont] >=0 && quot[cont] <=100) {

cont++;

}

else

printf("Inserimento non valido!\n");

} while(cont<MAX);

Page 9: Esercizi Svolti in C

10/26/2011

9

for (cont=0;cont<MAX;cont++) {

if (quot[cont] > qm.massimo) {

qm.massimo = quot[cont];

qm.giorno = cont;//o cont+1, dipenda da come si

interpreta il testo

}

}

printf("Il valore massimo e': %d\n", qm.massimo);

printf("Il valore massimo si e' presentato in data: %d\n", qm.giorno);

//conto periodi costanticont = 0;inZona = 0;for (i=1; i< MAX; i++) {

if (quot[i] == quot[i-1] && !inZona) {cont++;inZona=1;

}else if (quot[i] != quot[i-1]) {

inZona=0;}

}

printf(“Numero di zone con valore costante: %d\n", cont);return 0;

}

Page 10: Esercizi Svolti in C

10/26/2011

10

• Dato un array quotX di 365 valori interi, che rappresentano le

quotazioni nell’anno solare corrente del titolo azionario X, si

vuole realizzare un programma in linguaggio C in grado di:

– Inizializzare il contenuto dell’array quotX con valori letti da standard

input che devono essere compresi tra 1 e 100 (estremi inclusi),

scartando eventuali valori fuori dall’intervallo.

– Salvare in una opportuna/e variabile di tipo struttura (di cui si chiede

anche la definizione del tipo) la quotazione massima e il primo giorno

(espresso come posizione nell’array) in cui tale quotazione è stata

memorizzata

– Determinare e stampare a video il numero di periodi dell’anno in cui il

titolo si è mantenuto costante (ossia, quante volte la medesima

quotazione si è presentata in giorni successivi) (2 punti).

• Ad esempio, se le quotazioni fossero 10 10 15 14 12 12 12 8 9 9 12 12….. il

titolo avrebbe avuto 4 periodi di quotazione costante.

Esercizio 8

#include <stdio.h>

#define MAX 365

typedef struct { int massimo; int giorno; } quotMax;

int main () {

int quot[MAX], cont=0,i,inZona;

quotMax qm;

qm.massimo = -1;

qm.giorno = -1;

do {

printf("Inserire l'elemento numero %d: ", cont);//o cont+1

scanf("%d", &quot[cont]);

if (quot[cont] >=0 && quot[cont] <=100) {

cont++;

}

else

printf("Inserimento non valido!\n");

} while(cont<MAX);

Page 11: Esercizi Svolti in C

10/26/2011

11

for (cont=0;cont<MAX;cont++) {

if (quot[cont] > qm.massimo) {

qm.massimo = quot[cont];

qm.giorno = cont;//o cont+1, dipenda da come si

interpreta il testo

}

}

printf("Il valore massimo e': %d\n", qm.massimo);

printf("Il valore massimo si e' presentato in data: %d\n", qm.giorno);

//conto periodi costanticont = 0;inZona = 0;for (i=1; i< MAX; i++) {

if (quot[i] == quot[i-1] && !inZona) {cont++;inZona=1;

}else if (quot[i] != quot[i-1]) {

inZona=0;}

}

printf(“Numero di zone con valore costante: %d\n", cont);return 0;

}

Page 12: Esercizi Svolti in C

10/26/2011

12

23

Esercizio 9

Si vogliono definire tipi di dato per rappresentare i dati sui motoveicoli mantenuti da un Pubblico Registro Automobilistico (PRA) :

1. Il tipo dati Motoveicolo rappresenta i dati di un motoveicolo. Questi dati si compongono di:

– targa del motoveicolo (7 lettere)

– marca del motoveicolo (massimo 15 caratteri),

– modello (massimo 20 caratteri),

– cilindrata (in cc),

– potenza (in kW),

– categoria (motorino, scooter, motocicletta, motocarro).

24

Esercizio (cont)

2. Il tipo dati Proprietario rappresenta i dati di una

persona (il proprietario del motoveicolo):

– nome (massimo 30 caratteri),

– cognome (massimo 40 caratteri),

– codice fiscale (16 caratteri).

3. Il tipo dati VocePRA rappresenta una singola voce

nel registro automobilistico; una voce si

compone di 2 elementi: i dati del proprietario

del motoveicolo ed i dati del motoveicolo stesso.

Page 13: Esercizi Svolti in C

10/26/2011

13

25

Esercizio (cont)

4. Il tipo dati PRA rappresenta un tipo adatto a

contenere i dati di un PRA. Questo tipo di

dati è un elenco di voci del PRA (si suppone

che un PRA non possa contenere più di

10.000 elementi), più un contatore che dice

quante voci sono effettivamente presenti nel

PRA.

26

Soluzione

typedef enum {motorino, scooter, motocicletta, motocarro} Categoria;

typedef struct {

char targa[7] ;

char marca[15] ;

char modello[20] ;

int cilindrata;

float potenza;

Categoria categoria;

} Motoveicolo;

Page 14: Esercizi Svolti in C

10/26/2011

14

27

Soluzione

typedef struct {

char nome[30];

char cognome[40];

char codice_fiscale[16];

} Proprietario;

typedef struct {

Motoveicolo motoveicolo;

Proprietario proprietario;

} VocePRA;

28

Soluzione

typedef struct {

VocePRA elementi[10000];

int n_elementi;

} PRA;

Page 15: Esercizi Svolti in C

10/26/2011

15

Esercizio 10

• Scrivere un programma che svolga le seguenti

operazioni:

– Acquisisca informazioni relative a caratteristiche

fisiche di 10 persone.

– Ogni informazione è composta da peso, altezza ed

età.

– Terminata la fase di acquisizione, stampi sullo

schermo le informazioni relative a tutte le persone

per le quali il valore dell'età è <= 20.

29

#include <stdio.h>

#define MAX_PERS 10

#define MAX_ETA 20

typedef struct { int peso; int alt; int eta; } dati;

int main() {

dati arch[MAX_PERS];

int i;

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

printf("Altezza: "); scanf("%d", &(arch[i].alt));

printf("\nPeso: "); scanf("%d", &(arch[i].peso));

printf("\nEta': "); scanf("%d", &(arch[i].eta));

}

printf("\n persone con eta' <= %d", MAX_ETA");

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

if(arch[i].eta <= MAX_ETA)

printf("\n %d, %d, %d", arch[i].alt,arch[i].peso,arch[i].eta);

return 0;

} 30

Page 16: Esercizi Svolti in C

10/26/2011

16

Esercizio (cont.)

• Modificare ora il programma precedente

facendo in modo che gli elementi dell’array

vengano ordinati in base all’età in ordine

crescente

31

#include <stdio.h>

#define MAX_PERS 10

#define MAX_ETA 20

typedef struct { int peso; int alt; int eta; } dati;

int main() {

dati arch[MAX_PERS],temp; int i, j; for(i=0;i<MAX_PERS;i++) {

printf("Altezza: "); scanf("%d", &(arch[i].alt));

printf("\nPeso: "); scanf("%d", &(arch[i].peso));

printf("\nEta': "); scanf("%d", &(arch[i].eta));

}

for(i=0;i<MAX_PERS-1;i++) {

for(j=0;j<MAX_PERS-1-i;j++) {

if(arch[j].eta > arch[j+1].eta)

{ temp=arch[j+1]; arch[j+1]=arch[j]; arch[j]=temp }

}

}printf("\n persone con eta' <= %d", MAX_ETA);for (i=0; i<MAX_PERS; i++)

if(arch[i].eta <= MAX_ETA)

printf("\n %d, %d, %d", arch[i].alt,arch[i].peso,arch[i].eta);

return 0;

} 32

Page 17: Esercizi Svolti in C

10/26/2011

17

Esercizio 11• Si definisca il tipo Corso, che permetta di rappresentare

informazioni relative a corsi di lingue. In particolare, per ogni corso è necessario rappresentare i seguenti dati:

– Lingua: una sequenza di 10 caratteri;

– Livello: un intero;

– NumeroIscritti: un intero;

– NomeInsegnante: una sequenza di 15 caratteri;

– L’insieme di Studenti (al massimo 10). Ogni studente è un dato a sua voltastrutturato, composto da:

• NomeStudente (sequenza di 10 caratteri)

• CognomeStudente (sequenza di 10 caratteri)

• Età (numero intero)

• Si dichiari inoltre la variabile ScuolaLingue, in grado di rappresentare l’insieme dei corsi di una certa scuola. Una scuola raggruppa al massimo 30 corsi.

33

#define maxclassi 30#define maxstud 30typedef struct { char nomestud[10];

char cognstud[10];int eta;

} Studente;

typedef struct { char lingua[10] ;int liv;int numiscritti;char nomeinsegn[15];Studente alunno [maxstud];

} Classe ;Classe ScuolaLingue[maxclassi];

34

Page 18: Esercizi Svolti in C

10/26/2011

18

Esercizio (cont.)

• Scrivere in linguaggio C la parte di algoritmo

per calcolare l’età media degli studenti iscritti

ai corsi di lingua inglese (supponendo di aver

inizializzato la variabile ScuolaLingue con le

informazioni relative a 30 corsi).

35

#include <stdio.h>

#define maxclassi 4 /* invece di 30 */

#define maxstud 2 /* invece di 10 */

typedef struct { char nomestud[10];

char cognstud[10];

int eta;

}Studente;

typedef struct { char lingua[10] ;

int liv;

int numiscritti;

char nomeinsegn[15];

Studente alunno [maxstud];

} Classe ;36

Page 19: Esercizi Svolti in C

10/26/2011

19

/* inserimento dati di 4 classi */

Classe ScuolaLingue[maxclassi]=

{{"inglese",1,2,"maestr1","alice","ferrari",8,"luca",

"bianchi",8,},

{"inglese",2,2,"maestr2","guzzi","tommi",18,"gialli",

"fede",18},

{"inglese",1,2,"maestr3","innoi","ldddd",10,"sssss",

"ddddd",10},

{"spagnolo",2,2,"maestr4","ducai","ddddd",5,

"wwwww","qqqqq",5}};

37

int main () {

int i,j,cont=0;

float somma=0;

char linIng[]="inglese";

/* stampo tutti gli alunni di tutte le classi con eta' */

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

for(j=0;j<maxstud;j++)

printf("\n %s %s eta':%d",

ScuolaLingue[i].alunno[j].nomestud,

ScuolaLingue[i].alunno[j].cognstud,

ScuolaLingue[i].alunno[j].eta);

38

Page 20: Esercizi Svolti in C

10/26/2011

20

for (i=0;i<maxclassi;i++) { if(strcmp(linIng,ScuolaLingue[i].lingua)==0){

for(j=0;j<ScuolaLingue[i].numiscritti;j++) {cont++;

somma+=ScuolaLingue[i].alunno[j].eta;}

}}

if (cont>0) printf("\nl'eta' media e':%f", somma/cont);

else printf(“\nnessun corso di %s",linIng);

return 0;}

39

Esercizio 12Le seguenti dichiarazioni definiscono tipi di dati che descrivono i candidati per l’assunzione in un’azienda.

typedef enum {italiano, inglese, spagnolo, francese, tedesco, cinese} lingua;

typedef char stringa[20];

typedef struct {

lingua l;

int livello; /* numero da 1 a 5 con 1=basso 5=alto */

} linguaParlata;

typedef struct {

stringa nome, cognome, diploma, laurea;

linguaParlata lingue[5];

int nLauree;

int anniEsperienza;

} persona;

/* definizioni delle variabili */

persona persone[40];

persona personeScelte[40];

40

Page 21: Esercizi Svolti in C

10/26/2011

21

• Si scriva un frammento di codice, che includa eventualmente

anche le dichiarazioni di ulteriori variabili e tipi, che copi nella

parte iniziale del vettore personeScelte (senza lasciare buchi)

le persone che parlano inglese con un livello superiore a 3

oppure soddisfano entrambi i seguenti requisiti: hanno non

meno di una laurea e un numero di anni di esperienza non

inferiore a tre.

41

int iPersone, iPersoneScel, iLingue;

iPersoneScel=0;

for(iPersone=0; iPersone<40; iPersone++) {

if (persone[iPersone].nLauree>=1 &&

persone[iPersone].anniEsperienza>=3){

personeScelte[iPersoneScel]=persone[iPersone];

iPersoneScel++;

} else

for (iLingue=0; iLingue<5; iLingue++)

if(persone[iPersone].lingue[iLingue].l==inglese &&

persone[iPersone].lingue[iLingue].livello

>3) {

personeScelte[iPersoneScel]=persone[iPersone];

iPersoneScel++;

}

}

42

Page 22: Esercizi Svolti in C

10/26/2011

22

Esercizio 13

• Si scriva un programma C che legga due serie di dati e li memorizzi in due

vettori di strutture. Nel primo vettore M (di dimensione 3) vengono

memorizzati dati del tipo: <matricola, nome, cognome>. Si noti che la

matricola identifica univocamente uno studente e che non ci sono due

strutture che contengono lo stesso numero di matricola.

• Nel secondo vettore V (di dimensione 7) vengono memorizzati dati del

tipo: <matricola, esame, voto>. Possono esserci più record con lo stesso

numero di matricola che denotano diversi esami fatti dallo stesso

studente.

• Si scriva un programma che legga i dati in ingresso e li inserisca nei due

vettori. Successivamente, per ogni studente con matricola X contenuto nel

vettore M, sommi tutti i suoi voti ottenuti negli esami contenuti nel

vettore V.

43

#include <stdio.h>

#define DIMN 3

#define DIMM 7

typedef struct {

int matricola;

char Nome[20];

char Cognome[20];

} studente;

typedef struct {

int matricola;

char esame[20];

int voto;

} esami;

44

Page 23: Esercizi Svolti in C

10/26/2011

23

main(){int i, j, S=0;studente V[DIMN];esami M[DIMM];//leggi gli studentifor(i=0;i<DIMN;i++){

printf("Inserisci Matricola, Nome, Cognome\n");scanf("%d",&V[i].matricola);

for(j=0;j<i;j++)trovato=0;if(V[i].matricola==V[j].matricola) {

printf(“Matricola doppia”);i--; trovato=1;}

if{trovato==0)scanf("%s",V[i].Nome);scanf("%s",V[i].Cognome); }

}//leggi esamifor(i=0;i<DIMM;i++){

printf("Inserisci Matricola, Esame, Voto\n");scanf("%d %s %d ",&M[i].matricola,M[i].esame,&M[i].voto);

}

45

//somma

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

if (E[i].matricola == s.matricola)

S = S + E[i].voto;

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

S= somma(V[i], M);

printf("Studente %s %s\n", V[i].Cognome, V[i].Nome);

printf("Somma voti: %d\n",S);

}

}

46

Page 24: Esercizi Svolti in C

10/26/2011

24

Esercizio 14

• Scrivere un programma che chiede all’utente

di inserire una matrice 20x30, poi (dopo aver

terminato la fase di inserimento) copia gli

elementi dispari in una seconda matrice senza

lasciare buchi, se non in fondo.

47

#define N 20#define M 30int main () {

int i=0,j=0,k=0,r=0,mat1[N][M],mat2[N][M];for(i=0; i<N; i++)

for(j=0; j<M; j++)scanf("%d",&mat1[i][j]);

for(i=0; i<N; i++) {for(j=0; j<M; j++) {

if(mat1[i][j]%2!=0) {mat2[r][k]=mat1[i][j];k++;if(k==M) { k=0; r++; }

}}

}return 0;

} 48

Page 25: Esercizi Svolti in C

10/26/2011

25

Esercizio 15

• Si considerino due matrici di interi A e B, di uguali dimensioni (R e C,

costanti, che indicano il numero di righe e colonne). Diciamo che A

domina B se, confrontando i valori in posizioni corrispondenti, risulta

che il numero dei valori in A maggiori dei corrispondenti valori in B è

più grande del numero di quelli di B maggiori dei corrispondenti in A

e inoltre gli elementi corrispondenti non sono mai uguali (se due

elementi corrispondenti sono uguali la dominanza non è definita).

• Si codifichi un frammento di codice che riceve le matrici e stampa 1

se la prima domina la seconda, -1 se la seconda domina la prima, 0

altrimenti.

int A[R][C], B[R][C];... ...int bilancio = 0, i, j;for ( i=0; i<R; i++ ) {

for ( j=0; j<C; j++ ) {if ( A[i][j] == B[i][j] ) {

printf(“%d”,0); return 0;

}if ( A[i][j] > B[i][j] )

bilancio++;else

bilancio--;}

}if ( bilancio > 0 )

printf(“%d”,1);else if ( bilancio < 0 )

printf(“%d”,-1);else

printf(“%d”,0);return 0;

Page 26: Esercizi Svolti in C

10/26/2011

26

Esercizio 16

• Definire una struttura dati che descriva le

squadre di un torneo di calcio.

– Le squadre sono 6, di ogni squadra si devono

memorizzare: matricola squadra, nome, città e

tutti giocatori come nome e numero di maglia.

• Scrivere una funzione che riceve in ingresso la

struttura definita e stampa l’elenco dei portieri

titolari (i portieri titolari hanno numero di

maglia = 1).

typedef struct {char cognome[10]; int numero;

} giocatore;

typedef struct {int matricola-squadra; char nome[15]; char città[10]; giocatore formazione[11];

} squadra;

squadra squadre-torneo[6];

Page 27: Esercizi Svolti in C

10/26/2011

27

void stampaPortieri(squadra sq[]) {

int i,j;

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

for(j=0;j<11;j++)

if(sq[i].formazione[j].numero==1)

printf(“\n%s”, sq[i].formazione[j].cognome);

}

Esercizio 17

• Scrivere una funzione che riceve in input due

array di N elementi e copia nel secondo gli

elementi di valore pari del primo senza

lasciare buchi. La funzione restituisce il

numero di elementi copiati.

Page 28: Esercizi Svolti in C

10/26/2011

28

int copiaPari(int A[], int B[]) {

int i,j=0;

// i usato per scorrere A

// j punta sempre al primo elemento libero di B

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

if(A[i] % 2 ==0) {

B[j]=A[i];

j++;

}

return j;

}

Esercizio 18

• Scrivere una funzione che riceve in input una

matrice di interi di dimensione N*N e un

punto così definito

typedef struct {int x; int y;} punto

La funzione deve restituire il numero di

multipli dell’elemento della matrice di cui

sono state fornite le coordinate.

Page 29: Esercizi Svolti in C

10/26/2011

29

int contaMultipli(int M[][N], punto p) {

int i,j,mult=0;

if (p.x<0 || p.x>N-1 || p.y<0 || p.y>N || M[p.x][p.y] ==0) {

printf("errore");

return 0;

}

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

for (j=0; j<N; j++)

if(M[i][j] % M[p.x][p.y] ==0)

mult++;

return mult;

}

Esercizio 19• Sia dato un vettore di N ≥ 2 elementi. Ogni elemento del vettore è un numero

intero. Si chiede di progettare e codificare in C un programma che verifichi se, a partire da un elemento di indice i ≥ 0 fino alla fine del vettore, ogni elemento abbia valore inferiore alla somma di tutti gli elementi collocati alla sua destra, cioè alla somma di tutti gli elementi aventi indice superiore al suo (beninteso questa verifica non s'applica all'ultimo elemento, che non ha niente alla sua destra).

• Per esempio, il vettore seguente (con N = 5) soddisfa alla condizione in questione, a partire dall'elemento di indice 1 (ma non a partire da quello di indice 0).indice 0 1 2 3 4elemento 9 3 0 1 4

• Il programma chiede all’utente il vettore e l'indice i da cui partire con la verifica. Essa stampa 1 se il vettore soddisfa alla condizione così descritta, 0 altrimenti.

• Si supponga esista una funzione,int somma(int vett [], int k)che restituisce la somma di tutti gli elementi del vettore vett, a partire da quello di indice k (compreso) fino alla fine del vettore (compresa).

Page 30: Esercizi Svolti in C

10/26/2011

30

#include <stdio.h>

#define N 1000

int main( ) {

int j, flag=1, vett[N];

j = i;

/*acquisizione dati*/

while ((j <= N - 2) && (flag == 1)) {

if (vett [j] < somma(vett, j + 1))

j++;

else

flag = 0;

}

printf(“%d”,flag);

return 0;

}