elementi di informatica e programmazione programmazione c ... · elementi di informatica e...
TRANSCRIPT
1 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Elementi di Informatica e Programmazione - Dispensa IV -
PROGRAMMAZIONE C (Parte II)
Alessandro Saetti (email: [email protected])
Università degli Studi di Brescia A.A. 2016/2017
2 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Vettori e Matrici di variabili
• tipo-dato identificatore[dimensione];
• tipo-dato identificatore[dim1][dim2];
3 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Vettori di variabili #include <stdio.h> #include <stdlib.h> #define DIM 50
int main() { int i, n = 0, num[DIM];
printf(�Immetti al piu' 50 interi (0 per terminare):�); do { scanf("%d", &num[n]); n++; } while (n < DIM && num[n-1] != 0); if (num[n-1] == 0) n--; for(i = n - 1; i >= 0; i--) printf(�%d\n�,num[i]);
system("pause"); return(0); }
4 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Vettori di variabili #include <stdio.h> #include <stdlib.h> #define DIM 10
int main() { int vet[DIM], i, max, posmax;
for (i=0; i <DIM; i++) vet[i]=rand() % 101 - 50; max = vet[0]; posmax = 0; for (i=1; i <DIM; i++)
if(vet[i] > max) { max = vet[i]; posmax = i; } printf("\nMassimo %d in posizione %d\n", max,posmax); system("pause"); return(0);
}
5 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Vettori di variabili #include <stdio.h> #include <stdlib.h> #define DIM 10
int main() { int cifre[DIM] = {0}, i, n, resto;
printf("Inserisci un numero intero: "); scanf("%d", &n); while(n > 0) {
resto = n % 10; cifre[resto]++; n = n / 10; } for(i=0;i<DIM;i++) printf(�#%d:%d\n",i,cifre[i]); system("pause");
return(0); }
6 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Vettori di Variabili #include <stdio.h> #include <stdlib.h> #define DIM 20
int main () { int vet[DIM], i, j, min = 100, mcd, num_divisibili;
for (i = 0; i < DIM; i++) vet[i] = rand() % 91 + 10;
for (i=0; i < DIM; i++) if (min > vet[i]) min = vet[i];
for (j = 1; j <= min; j++) { num_divisibili = 0;
for (i = 0; i < DIM ; i++) if ( vet[i] % j == 0) num_divisibili++; if (num_divisibili == DIM) mcd = j; } printf("\nIl massimo comune divisore e' %d\n\n", mcd); system("pause"); return(0);
}
7 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Vettori di variabili #include <stdio.h> #include <stdlib.h> #define MAX 100000
int main() { int primi[MAX], i, j, maxnum, div, n_primi=0;
printf("\nInserisci un numero (positivo e minore di %d):", MAX); scanf("%d", &maxnum); for (i=2; i<=maxnum; i++) {
div = 0; for (j=0; j < n_primi && primi[j] * primi[j] <= i && div==0; j++) {
if (i % primi[j] == 0) div++; } if (div == 0) {
printf("%d ",i); primi[num_primi] = i; n_primi++;
} }
system("pause"); return(0); }
8 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Vettori di variabili #include <stdio.h> #include <stdlib.h> #define DIMR 5 #define DIMC 9
int main() { int i, j , mat[DIMR][DIMC];
for (i = 0; i < DIMR; i++) { for (j = 0; j < DIMC; j++) { mat[i][j] = (rand() % 16) - 3; printf("%d\t",mat[i][j]); } printf("\n"); } for (i=0; i<DIMC; i++) { for (j = 0; j < DIMR; j++) printf("%d\t",mat[j][i]); printf("\n"); } system("pause");
return(0); }
9 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Matrici di variabili #include <stdio.h> #include <stdlib.h> #define DIMR 5 #define DIMC 9
int main() { int mat[DIMR][DIMC], i, j, pos_per_colonna; int max_per_colonna=0, BestColonna;
for (i=0; i < DIMR; i++) { for (j=0; j < DIMC; j++) { mat[i][j] = (rand() % 121) - 60; printf("%d\t", mat[i][j]); } printf("\n"); } /* Continua nel prossimo lucido */
10 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Matrici di variabili for (i=0; i < DIMC; i++) { pos_per_colonna = 0; for (j=0; j < DIMR; j++) if ( mat[j][i] > 0 ) pos_per_colonna++; if (pos_per_colonna > max_per_colonna) { max_per_colonna = pos_per_colonna; BestColonna = i; } } printf("\n\nColonna con più numeri positivi\n", BestColonna); for (i=0; i < DIMR; i++) printf("%d\n", mat[i][BestColonna]);
system("pause"); return(0);
}
11 A.A. 2015/2016
Puntatori
• tipo-dato *identificatore;
• Inizializzati con NULL oppure l’indirizzo di una variabile (tramite l’operatore &)
• L’operatore * permette di riferirsi alla variabile puntata
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
12 A.A. 2015/2016
Operazioni su Stringhe int puts(const char *str) char *gets(char *s); int getchar(void); int strlen(const char *s); char *strcpy(char *s1, const char *s2); char *strncpy(char *s1, const char *s2, int n); char *strcat(char *s1, const char *s2); char *strncat(char *s1, const char *s2, int n); int strcmp(const char *s1, const char *s2);
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
13 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Leggere una stringa #include <stdio.h> #include <stdlib.h> #define DIM 10
int main() { int ch, i = 0; char str[DIM];
while ((ch = getchar()) != '\n') if (i < DIM - 1) str[i++] = ch; str[i] = '\0'; printf("\nLa stringa acquisita e': %s", str); system("pause");
return(0); }
14 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Uso di Stringhe #include <stdio.h> #include <stdlib.h> #define DIM 50
int main() { int i; char frase[DIM];
gets(frase); for (i=0; i<DIM; i++) {
if (frase[i] >= 'A' && frase[i] <= 'Z') frase[i]+=32; else if (frase[i] >= 'a' && frase[i] <= 'z') frase[i]-=32; } printf("%s\n", frase); system("pause"); return(0);
}
15 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Uso di Stringhe #include <stdio.h> #include <stdlib.h> #define DIM 50
int main() { int i, count=0; char trova, parola[DIM];
scanf(�%50s�, parola); scanf("%c", &trova); for (i = 0; i < DIM && parole[i] != '\0'; i++)
if (parola[i] == trova) { printf(" - trovato %c in posizione %d\n", parola[i], i); count++; } printf("\n - trovate %d occorrenze\n", count); system("pause"); return(0);
}
16 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Uso di Stringhe #include <stdio.h> #include <stdlib.h> #define DIM 50 #define LETTERE 26
int main() { char parola[DIM]; int i, n, cifre[LETTERE] = {0};
scanf("%s", parola); for(i = 0; i < DIM && parola[i] != '\0';i++) cifre[parola[i]-'a']++; for (i=0;i<LETTERE;i++) printf(�Occorrenze di %c: %d ", 'a'+i, cifre[i]); printf("\n"); system("pause"); return(0);
}
17 A.A. 2015/2016
Definizioni e Chiamate a funzione
• tipo-restituito nome-funzione (parametri) { dichiarazioni istruzioni }
• return espressione; oppure return;
• nome-funzione(argomenti);
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
18 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Definizioni e Chiamate a funzione #include <stdio.h> #include <stdlib.h>
float calcola_media (float a, float b) { float somma;
somma = a + b; return (somma / 2);
}
int main() { float x, y, media;
scanf("%f%f", &x, &y); media = calcola_media(x, y); if (calcola_media(x,y) > 0) (void) printf("\nMedia positiva"); printf("\n%f", calcola_media(x,y)); system("pause"); return(0);
}
19 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Dichiarazioni di funzione #include <stdio.h> #include <stdlib.h>
float calcola_media (float a, float b);
int main() { float x, y, media;
scanf("%f%f", &x, &y); media = calcola_media(x, y); if (calcola_media(x,y) > 0) (void) printf("\nMedia positiva"); printf("\n%f", calcola_media(x,y)); system("pause"); return(0);
}
float calcola_media (float a, float b) { float somma;
somma = a + b; return (somma / 2);
}
20 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Passaggio per valore #include <stdio.h> #include <stdlib.h>
float potenza (float base, int esp) { float y = 1.0;
for (; esp > 0; esp--) y *= base; return y;
}
int main() { int e; float b, r;
scanf("%f%d", &b, &e); r=potenza(b, e); printf("Potenza di %.2f alla %d: %.2f\n", b, e, r); system("pause"); return(0);
}
21 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Passaggio per indirizzo o riferimento #include <stdio.h> #include <stdlib.h>
void decomponi(float x, int *parte_int, float *parte_fraz) { *parte_int = (int) x; *parte_fraz = x - *parte_int;
}
int main() { int i = 0; float f = 0.0, num;
scanf("%f", &num); decomponi(num, &i, &f); printf("Parte intera di %.2f: %d\n", num, i); printf("Parte frazionaria di %.2f: %.2f\n", num, f); system("pause"); return(0);
}
22 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Argomenti costituiti da vettori #include <stdio.h> #include <stdlib.h> #define DIM 10
int calc_max(const int v[], int n) { int i, max;
max = v[0]; for (i=1; i < n; i++) if (v[i] > max) max = v[i]; return max;
}
void inizializza_vet(int v[], int n, int min, int max) { int i;
for (i=0; i < n; i++) v[i] = (rand()%(max-min+1)) + min; }
23 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Argomenti costituiti da vettori void stampa_vet(const int v[], int n) { int i;
for (i=0; i < n; i++) printf("\n%d", v[i]); }
int main() { int vett[DIM];
inizializza_vet(vett, DIM, 10, 100); stampa_vet(vett, DIM); printf("\nIl massimo e': %d\n", calc_max(vett, DIM));
system("pause"); return(0);
}
24 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Argomenti costituiti da matrici #include <stdio.h> #include <stdlib.h> #define DIMR 10 #define DIMC 20
int calc_max(const int m[][DIMC], int n) { int i, j, max;
max = m[0][0]; for (i = 0; i < n; i++) for (j = 0; j < DIMC; j++) if (m[i][j] > max) max = m[i][j]; return max;
}
void inizializza_mat(int m[][DIMC], int n, int min, int max) { int i, j;
for (i = 0; i < n; i++) for (j = 0; j < DIMC; j++) m[i][j] = (rand()%(max-min+1)) + min;
}
25 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Argomenti costituiti da matrici void stampa_mat(const int m[][DIMC], int n) { int i;
for (i=0; i < n; i++) { for (j = 0; j < DIMC; j++) printf("%d\t", m[i][j]); printf("\n");
} }
int main() { int matt[DIMR][DIMC];
inizializza_mat(matt, DIMR, 10, 100); stampa_vet(matt, DIMR); printf("\nIl massimo e': %d\n", calc_max(matt, DIMR));
system("pause"); return(0);
}
26 A.A. 2015/2016
Argomenti costituiti da stringhe
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
int ConfrantaStringhe (char str1[], char str2[]) { int i;
for (i = 0; str1[i] != ‘\0’ && str2[i] != ‘\0’; i++) if (str1[i] < str2[i]) return -1; else return 1; if (str1[i] != ‘\0’) return 1; else if (str2[i] != ‘\0’) return -1; else return 0; }
27 A.A. 2015/2016
Restituire puntatori char *ConcatenaStringhe(char str1[], char str2[]) { int i, j;
for (i = 0; str1[i] != ‘\0’; i++);
for (j = 0; str2[j] != ‘\0’; j++) str1[i + j] = str2[j]; str2[j] = ‘\0’;
return str1; }
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
28 A.A. 2015/2016
Durata di Memorizzazione e Scope
• Durata di memorizzazione: porzione del flusso di esecuzione durante cui la variabile è allocata – Automatica – Statica
• Scope: porzione del codice durante il quale la variabile è visibile – di blocco – di funzione – di file/progetto
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
29 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Variabili globali #include <stdio.h> #include <stdlib.h>
int parte intera; /* variabili globali*/ float parte_fraz;
void decomponi(float x) { parte_intera = (int) x; parte_fraz = x - parte_intera;
}
int main() { float x;
scanf("%f", &x); decomponi(x); printf("Parte intera di %.2f: %d\n", x, parte_intera); printf("Parte frazionaria di %.2f: %.2f\n", x, parte_fraz); system("pause"); return(0);
}
30 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Scope int i; /* dichiarazione 1 */ void f (int i) { /* dichiarazione 2 */ i = 1;
} void g (void) { int i = 2; /* dichiarazione 3 */ if (i > 0) { int i; /* dichiarazione 4 */ i = 3; } i = 4;
} void h(void) { i = 5;
}
31 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze: Stampa
void stampa(int vet[], int n) { int i;
for (i = 0; i < n; i++) printf("%d ", vet[i]); }
32 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze Ricerca completa
int cerca(int vet[], int n, int num) { int i;
for(i = 0; i < n; i++) { if (vet[i] == num) { return i; /* Elemento trovato */ } } return –1; /* Elemento non trovato */ }
33 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze ordinate Ricerca binaria
int cerca(int vet[], int n, int num) { int i, inizio = 0, fine = n - 1;
do { i = (inizio + fine) / 2; if (vet[i] == num) return i; else if (vet[i] < num) inizio = i + 1; else fine = i – 1; } while (inizio <= fine); return –1; /* Elemento non trovato */
}
34 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze Inserimento all'inizio
int inserimento_inizio(int vet[], int n, int nuovo) { if (n < DIM) { vet[n++] = vet[0]; vet[0] = nuovo; } else printf("\nWarning: Array is full"); return n; }
35 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze Inserimento alla fine
int inserimento_fine(int vet[], int n, int nuovo) { if (n < DIM) vet[n++] = nuovo; else printf("\nWarning: Array is full"); return n; }
36 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze ordinata Inserimento diretto
int inserimento_diretto (int vet[], int n, int nuovo) { int i, j;
for (i = 0; i < n && vet[i] < nuovo; i++); for (j = n; j > i; j--) vet[j] = vet[j-1]; vet[i] = nuovo; return ++n; }
37 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze Cancellazione
int cancellazione(int vet[], int n, int num) { int pos = cerca(vet, n, num);
if (pos >= 0) { vet[pos] = vet[n-1]; n--; } else printf("\nWarning: Number not found"); return n; }
38 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze ordinate Cancellazione
int cancellazione(int vet[], int n, int num) { int i, pos = cerca(vet, n, num);
if (pos >= 0) { for (i = pos; i < n - 1; i++) vet[i] = vet[i+1];
n--; } else printf("\nWarning: Number not found"); return n; }
39 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze ordinate Fusione
int fusione(int v1[], int v2[], int v3[], int n1, int n2) { int i=0, j=0, k=0;
do { if (i < n1 && (j == n2 || v1[i] <= v2[j])) v3[k++] = v1[i++]; else //if (j < n2 && (vet1[i] > vet2[j] || i == n1))
v3[k++] = v2[j++]; } while (i < n1 || j < n2); return k; }
40 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze Ordinamento per inserimento diretto
void ordinamento_diretto(int vet[], int n) { int i, j, x;
for (i = 1; i < n; i++) { x = vet[i]; for (j = i-1; j >= 0 && x < vet[j]; j--) vet[j+1] = vet[j]; vet[j+1] = x; } }
41 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze Ordinamento per selezione
void ordinamento_selezione(int vet[], int n) { int i, j, k, x;
for (i = 0; i < n-1; i++) { k = i; x = vet[i]; for (j = i + 1; j < n; j++) { if (vet[j] < x) {
k = j; x = vet[j]; } } vet[k] = vet[i]; vet[i] = x; }
}
42 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su sequenze Ordinamento bubble-sort
void ordinamento_a_bolle(int vet[], int n) { int i, j, x;
for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) { if (vet[j-1] > vet[j]) { x = vet[j-1]; vet[j-1] = vet[j]; vet[j] = x; } } }
}
43 A.A. 2015/2016
Variabili Struttura
• struct { dichiarazione variabili membro; } identificatori;
• Operatori per strutture:
– id.id
– id -> id
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
44 A.A. 2015/2016
Etichettare e Definire Nuovi Tipi di Strutture
• struct tag { dichiarazione variabili membro; } identificatori;
• typedef struct { dichiarazione variabili membro; } nome_tipo;
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
45 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su strutture Ricerca completa
int cerca(Cronometro c[], int n, char trova[]) { int i;
for(i = 0; i < n; i++) if (strcmp(c[i].nome, trova) == 0) return i; /* Elemento trovato */ return -1; /* Elemento non trovato */
}
46 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su strutture Stampa dato
void stampa_tempo(Cronometro c[], int n, char nome[]) { int i;
i = cerca(c, n, nome); if (i >= 0) printf("\n%.2f", c[i].tempo); else printf("\nNome non trovato!"); }
47 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su strutture Inserimento diretto
int inserimento_diretto (Cronometro c[], int n, char nome[], float tempo) {
int i, j;
for (i=0; i<n && strcmp(c[i].nome, nome)<0; i++); for (j = n; j > i; j--) c[j] = c[j-1]; strcpy(c[i].nome, nome); c[i].tempo = tempo; return ++n;
}
48 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Operazioni su strutture Cancellazione
int cancellazione(Cronometro c[], int n, char nome[]) { int i, pos = cerca(c, n, nome);
if (pos >= 0) { for (i = pos; i < n - 1; i++) c[i] = c[i+1]; n--; } else printf("\nWarning: Number not found"); return n; }
49 A.A. 2015/2016
Unioni e Enumerazione
• union { dichiarazione variabili membro; } identificatori;
• enum {costanti_di_enum} identificatori;
Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
50 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Unioni Aggiungere un campo etichetta
#include <stdio.h>
#include <stdlib.h> #define INT 0 #define FLOAT 1 typedef struct { int tipo; union { int i; double d; } u;
} Numero;
51 A.A. 2015/2016 Docente: A. Saetti Elementi di Informatica e Programmazione – Università di Brescia
Unioni Aggiungere un campo etichetta
void stampa_numero(Numero n) { if (n.tipo == INT) printf(�%d�, n.u.i); else printf(�.2f�, n.u.d);
}
int main() { Numero n; n.tipo = INT; n.u.i = 12;
stampa_numero(n); system(�pause�); return 0;
}