Download - 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.
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
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
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)
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; }
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
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
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", "[cont]);
if (quot[cont] >=0 && quot[cont] <=100) {
cont++;
}
else
printf("Inserimento non valido!\n");
} while(cont<MAX);
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;
}
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", "[cont]);
if (quot[cont] >=0 && quot[cont] <=100) {
cont++;
}
else
printf("Inserimento non valido!\n");
} while(cont<MAX);
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;
}
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.
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;
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;
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
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
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
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
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
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
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
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
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
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
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;
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];
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.
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.
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).
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;
}