800 likes | 985 Vues
INFORMATICA Esercizi. Esempio: polinomi. Realizzare un programma strutturato in linguaggio C che richieda da tastiera il grado di due polinomi P1 e P2. Successivamente il programma dovrà richiedere i coefficienti dei due polinomi.
E N D
Esempio: polinomi • Realizzare un programma strutturato in linguaggio C che richieda da tastiera il grado di due polinomi P1 e P2. • Successivamente il programma dovrà richiedere i coefficienti dei due polinomi. • Infine dovrà eseguire la somma e il prodotto dei due polinomi e visualizzare il risultato. • Esempio: Grado polinomio P1: 3 Grado polinomio P2: 2
Esempio: polinomi Polinomio P1 Coefficiente x^0: 2 Coefficiente x^1: -3 Coefficiente x^2: 1 Coefficiente x^3: 2 Polinomio P2 Coefficiente x^0: -1 Coefficiente x^1: 2 Coefficiente x^2: 2 P1: +2x^0 -3x^1 +1x^2 +2x^3 P1: -1x^0 +2x^1 +2x^2 Somma: +1x^0 -1x^1 +3x^2 +2x^3 Prodotto: -2x^0 +7x^1 -3x^2 -6x^3 +6x^4 +4x^5
Esempio: polinomi #include <stdio.h> #include <stdlib.h> #define NMAX 50 main() { int n, m, i, j; float p1[NMAX], p2[NMAX]; double somma[NMAX], prodotto[2*NMAX]; /* Inizializza i due polinomi ponendo tutti i coefficienti a zero */ for (i=0; i<NMAX; i++) { p1[i] = 0; p2[i] = 0; }
Esempio: polinomi /* Legge il grado dei due polinomi */ printf ("\nGrado di P1: "); scanf ("%d", &n); printf ("\nGrado di P2: "); scanf ("%d", &m); /* Test se il grado è positivo */ if (m<1 || n<1) { printf (“\nIl grado deve essere >= 1!"); exit(2); }
Esempio: polinomi /* Legge i coefficienti dei polinomi */ printf ("\nCoefficienti di P1: "); for (i=0; i<=n; i++) { printf ("\nCoefficiente x^%d: ", i); scanf ("%f", &p1[i]); } printf ("\nCoefficienti di P2: "); for (i=0; i<=m; i++) { printf ("\nCoefficiente x^%d: ",i); scanf ("%f", &p2[i]); }
Esempio: polinomi /* Calcola la somma */ for (i=0; i<=max(m,n); i++) somma[i] = p1[i] + p2[i]; /* Calcola il prodotto: inizializza m+n coefficienti a 0. L'indice del */ /* vettore prodotto corrisponde al grado di quell'elemento. */ /* Usa gli elementi del vettore per accumulare i risultati delle */ /* moltiplicazioni parziali */ for(i=0; i<=n+m; prodotto[i++]=0); for(i=0; i<=n; i++) for(j=0; j<=m; j++) prodotto[i+j] = prodotto[i+j] + (p1[i] * p2[j]);
Esempio: polinomi /* Visualizzazione dei risultati */ printf ("\n\nPolinomio P1: "); for (i=0; i<=n; i++) printf ("+%fx^%d", p1[i], i); printf ("\nPolinomio P2: "); for (i=0; i<=m; i++) printf ("+%fx^%d", p2[i], i); printf ("\nSomma: "); for(i=0; i<=max(m,n); i++) printf ("+%6.2lfx^%d", somma[i], i); printf ("\nProdotto: "); for(i=0; i<=n+m; i++) printf ("+%6.2lfx^%d", prodotto[i], i); }
Elaborazione di una matrice • Scrivere un programma in linguaggio C che: • legga dal file «matrice.dat» una matrice M di numeri interi preceduta dal numero di righe e dal numero di colonne (dimensione massima della matrice: 20x20) • legga da tastiera un numero intero num; • cerchi fra gli elementi della matrice il numero num, ed ogni volta che lo trova (anche più di una) scriva sul file «out.dat» tutte le sottomatrici che si ottengono da M cancellando la riga e la colonna in cui si trova num. • I formati dei due file sono specificati nell’esempio. Si osservi che a seconda della posizione in cui si trova num, le sottomatrici possono essere una, due o quattro.
Elaborazione di una matrice Esempio - File «matrice.dat»: 6 7 12 -3 1 15 24 0 41 7 34 -5 23 -7 11 10 -3 33 -4 16 63 5 -6 -2 71 2 11 95 -9 27 0 12 21 -1 7 43 10 41 15 -3 34 16 0 12 Inserisci il numero: 16
Elaborazione di una matrice 3 File «out.dat»: Coordinate trovate: 2 3 Sottomatrici: 12 -3 1 7 34 -5 24 0 41 -7 11 10 -2 71 2 0 12 21 41 15 -3 95 -9 27 7 43 10 16 0 12 12 -3 1 15 24 0 41 7 34 -5 23 -7 11 10 -3 33 -4 16 63 5 -6 -2 71 2 11 95 -9 27 0 12 21 -1 7 43 10 41 15 -3 34 16 0 12 2
Elaborazione di una matrice Coordinate trovate: 4 5 Sottomatrici: 12 -3 1 15 7 34 -5 23 -3 33 -4 16 -2 71 2 11 0 12 21 -1 0 41 11 10 5 -6 -9 27 43 10 4 12 -3 1 15 24 0 41 7 34 -5 23 -7 11 10 -3 33 -4 16 63 5 -6 -2 71 2 11 95 -9 27 0 12 21 -1 7 43 10 41 15 -3 34 16 0 12 5
Elaborazione di una matrice #include <stdio.h> #include <stdlib.h> void sotto_matr (int r_in, int r_fin, int c_in, int c_fin); FILE *f1, *f2; int M[20][20]; main() { int, num, rig, col, i, j, k, w; /* apre il file contenente la matrice */ if ((f1 = fopen (“matrice.dat”, "r")) == NULL) { printf (“\nErrore nell'apertura del file matrice.dat"); return 1; }
Elaborazione di una matrice /* richiede il numero da ricercare */ printf (“\nInserisci un numero intero: "); scanf ("%d", &num); /* crea il file di output */ if ((f2 = fopen (“out.dat”, “w")) == NULL) { printf (“\nErrore nella creazione del file out.dat"); return 2; } /* legge numero di righe e colonne della matrice */ fscanf (f1, "%d %d", &rig, &col);
Elaborazione di una matrice /* legge il file e lo salva nella matrice M */ for (i = 0; i < rig; i++) for (j = 0; j < col; j++) fscanf (f1, "%d", &M[i][j]); fclose(f1); /* cerca nella matrice se esiste num controllando ogni elemento */ /* della matrice tramite due for annidati; quando lo trova esegue la */ /* funzione sotto_matr per tutte le sottomatrici effettive. Ovvero */ /* controlla che numero di righe o colonne della sottomatrice sia */ /* maggiore di zero */
Elaborazione di una matrice for (i = 0; i < rig; i++) { for (j = 0; j < col; j++) { if (M[i][j] == num) { /* trovato num: output delle coordinate */ fprintf (f2, "\nCoordinate trovate: %d %d\n\nSottomatrici:\n\n", i, j); /* output delle matrici (se esistono) */ if ((i > 0) && (j > 0)) sotto_matr (0, i, 0, j); if ((i > 0) && (j < col – 1)) sotto_matr (0, i, j+1, col); if ((i < rig - 1) && (j > 0)) sotto_matr (i+1, rig, 0, j); if ((i < rig -1) && (j < col – 1)) sotto_matr (i+1, rig, j+1, col); } } } fclose(f2); }
Elaborazione di una matrice void sotto_matr (int r_in, int r_fin, int c_in, int c_fin); { int riga, colonna; /* scrive la matrice sul file di output */ for (riga = r_in; riga < r_fin; riga++) { for (colonna = c_in; colonna < c_fin; colonna++) fprintf (f2, "%d ", M[riga][colonna]); fprintf (f2, "\n"); } fprintf (f2,"\n"); return; }
Mappa Sia data una mappa rettangolare contenente lettere dell’alfabeto. Tale mappa è memorizzata in un file di testo (il cui nome deve essere richiesto preventivamente da tastiera) in ragione di una riga per ogni linea del file. Si supponga che non vi siano errori di formato e che le linee abbiano tutte la stessa lunghezza. Le dimensioni della mappa non sono note in fase di compilazione, ma non possono eccedere le 20 righe per 80 colonne e devono essere dedotte dal file.
Mappa A scopo di esempio, si riporta di seguito il formato di una mappa 8x8: qqAAAczz wwwcccsb edddCDde dddbccQw sssdcdww QAAzczzE RrRqqHHi abcdEFGH
Mappa Si realizzi un programma strutturato in linguaggio C in grado di determinare quale è la sequenza di caratteri uguali disposti sulla stessa riga o sulla stessa colonna avente lunghezza massima. Le lettere maiuscole dovranno essere considerate equivalenti alle minuscole (ad esempio, ‘b’ e ‘B’, ai fini del programma, devono essere considerate la stessa lettera). Nel caso della mappa precedente, l’output del programma dovrà essere esattamente il seguente: La sequenza più lunga si trova in colonna 5, da riga 2 a riga 6. La disposizione è verticale La lunghezza 5 Il carattere c.
Mappa • Base dati: • la mappa verrà memorizzata in una matrice di caratteri di nome matr (vettore di stringhe). • Il numero di righe e il numero di colonne (entrambi ricavati dalla lettura del file) saranno nr e nc. • Per poter stampare i parametri richiesti occorre costruire una sequenza di variabili: lmax = lunghezza della stringa più lunga carattere = carattere della sequenza riga = riga di inizio sequenza colonna = colonna di inizio sequenza direz = direzione della sequenza ('o‘ oppure ‘v’)
Mappa #include <stdio.h> #include <string.h> #include <conio.h> #define N_RIGHE 21 #define N_COL 81 main() { int i, j, nr, nc, cont, riga, colonna, lmax; char matr[N_RIGHE][N_COL]; FILE *leggi; char nomefile[50], carattere, cfr, direz; clrscr();
Mappa printf (“\nNome file: "); scanf ("%s", nomefile); /* apre il file */ if ((leggi = fopen (nomefile, "r")) == NULL) { printf ("\n Errore apertura %s\n", nomefile); exit (0); } /* inizializza tutta la matrice col carattere di fine stringa */ for (i = 0; i < N_RIGHE; i++) for (j = 0; j < N_COL; j++) matr[i][j] = '\0';
Mappa /* Ciclo di lettura della mappa; legge fino a EOF */ nr = 0; while (!feof (leggi)) { fscanf (leggi, "%s", &matr[nr]); nr++; /* in nr numero di righe lette */ } fclose (leggi); /* setta in nc = numero colonne matrice */ nc = strlen (matr[0]); /* in lmax registra la lunghezza della sequenza più lunga */ lmax = 0;
Mappa /* Ricerca per righe: in cfr carattere campione da confrontare, in cont numero di ripetizioni consecutive di quel carattere */ for (i = 0; i < nr; i++) { cfr = tolower (matr[i][0]); /* primo carattere campione = al primo */ cont = 1; /* carattere della riga! inoltre inizializza il contatore a 1 */ /* scandisce le colonne della riga i */ for (j = 1; j <= nc; j++) { if (tolower(matr[i][j]) == cfr) /* è = al carattere campione? */ cont++; /* si, incrementa il contatore */ else /* no, è diverso per cui è terminata una sequenza la cui lunghezza è in cont: verifica se è la più lunga finora. Contemporaneamente col carattere attuale è iniziata una nuova sequenza.
Mappa { if (cont > lmax) /* è la sequenza più lunga? */ { lmax = cont; /* si, la sostituisce alla precedente */ carattere = cfr; riga = i+1; /* riga di inizio sequenza */ colonna = j – cont + 1; /* colonna di inizio sequenza */ direz = 'o'; /* direzione (orizzontale) */ } cfr = tolower (matr[i][j]); /* nuovo carattere campione */ cont = 1; } /* else….. */ } /* for (j=1; …… */ } /* for (i=0;…… */
Mappa /* Ricerca per colonne: blocco di istruzioni identico al caso della ricerca per righe scambiando solamente i ruoli delle variabili nc e nr */ for (j = 0; j <= nc; j++) { cfr = tolower (matr[0][j]); cont = 1; for (i = 1; i <= nr; i++) { if (tolower (matr[i][j]) == cfr) cont++; else
Mappa { if (cont > lmax) { lmax = cont; carattere = cfr; riga = i - cont + 1; colonna = j + 1; direz = 'v'; } cfr = tolower(matr[i][j]); cont = 1; } /* else…… */ } /* for (i=1;……. */ } /* for (j=0;….. */
Mappa /* Visualizza i risultati */ printf ("\nSequenza più lunga "); if (direz == 'v') { printf ("in colonna %d, da riga %d a riga %d", colonna, riga, riga + lmax -1); printf ("\nLa disposizione è verticale"); } else { printf ("in riga %d, da colonna %d a colonna %d", riga, colonna, colonna + lmax -1); printf ("\nLa disposizione è orrizzontale"); } printf ("\nLa lunghezza è %d\nIl carattere %c\n", lmax, carattere); }
Esempio: prenotazione aerei • All'interno di un file di testo è elencato un insieme di voli aerei. Per ognuno di essi, su ciascuna riga del file, sono riportate (separate da un singolo spazio) la città di partenza, quella di arrivo e la sigla (2 caratteri) della compagnia aerea che gestisce il volo. E' garantito che il nome della città non contenga spazi (es. New York verrà scritto New_York). • Si scriva un programma in linguaggio C che, ricevuto come primo argomento sulla riga di comando il nome del file e come secondo argomento il nome di una città, produca il seguente risultato sull'unità di output standard: • l’elenco dei voli in partenza dalla città • l'elenco dei voli in arrivo nella città • l'elenco delle compagnie aeree con voli in partenza o in arrivo alla città selezionata. • Il numero massimo di voli in partenza da una città (o in arrivo) non supera le 100 unità.
Esempio: prenotazione aerei • Ad esempio, se il file VOLI.TXT contenesse i seguenti dati: Roma Milano AZ Milano Roma AZ Torino Parigi AF Parigi Torino AF Milano Londra BA Londra Milano BA Milano New York AZ Milano New York UA New York Milano AZ New York Milano UA e il programma - denominato FLY - venisse attivato nel seguente modo: FLY VOLI.TXT Milano
Esempio: prenotazione aerei allora dovrebbe generarsi il seguente output: Voli in partenza da Milano: Milano Roma AZ Milano Londra BA Milano New_York AZ Milano New_York UA Voli in arrivo a Milano: Roma Milano AZ Londra Milano BA New_York Milano AZ New_York Milano UA Compagnie aeree: AZ BA UA
Esempio: prenotazione aerei #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXVOLI 100 typedef enum{FALSO,VERO} boolean; int main(int argc, char *argv[ ]) { char tab_arrivi[MAXVOLI][80], compagnie[MAXVOLI][3]; int num_arrivi,num_comp,i; char partenza[80], arrivo[80], compagnia[3], citta[20]; boolean trovato, presente; FILE *in;
Esempio: prenotazione aerei /* Controlli sulla correttezza del numero di parametri introdotto */ /* dalla linea di comando */ if (argc != 3) { printf ("\nErrore: imposta come parametri nome file e città\n"); exit (1); } /* apre il file dei voli */ if ((in=fopen(argv[1],"r"))==NULL) { printf ("\nErrore in aperturafile\n"); exit (2); }
Esempio: prenotazione aerei strcpy (citta, argv[2]); /* argv[2] in citta */ num_arrivi = 0; num_comp = 0; printf ("\nVoli in partenza da %s:\n\n", citta); while (!feof(in)) { fscanf (in, "%s %s %s", partenza,arrivo, compagnia) trovato = FALSO; /* controlla la partenza */ if (strcmp (partenza, citta)==0) { printf ("%s %s %s\n", partenza,arrivo, compagnia); trovato = VERO; }
Esempio: prenotazione aerei /* controlla l'arrivo */ if (strcmp (arrivo,citta)==0) { sprintf (tab_arrivi[num_arrivi],"%s %s %s", partenza, arrivo, compagnia); num_arrivi++; trovato = VERO; } /* controlla se la compagnia è già presente nella lista */ if (trovato) { presente = FALSO; for (i=0; i<num_comp; i++) if (strcmp(compagnia, compagnie[i])== 0) presente = VERO;
Esempio: prenotazione aerei if (!presente) { strcpy(compagnie[num_comp], compagnia); num_comp++; } } } /* fine while */ /* Elenca i voli in arrivo e le compagnie accumulati nei vettori di */ /* stringhe tab_arrivi e compagnie in precedenza */ printf ("\n\nVoli in arrivo a %s:\n\n", citta); for (i=0; i<num_arrivi; i++) printf ("%s\n", tab_arrivi[i]); printf ("\n\nCompagnie che operano a %s:\n\n", citta); for (i=0; i<num_comp; i++) printf ("%s\n", compagnie[i]); }
Compressione di immagini • Scrivere un programma in linguaggio C per la compressione di immagini che: • legga dal file «matrice.dat» una matrice di numeri reali di dimensione 30x30; • legga da tastiera due numeri interi N e M che rappresentano le dimensioni di una sottomatrice; • suddivida la matrice in sottomatrici NxM a partire dall’elemento in alto a sinistra, e costruisca una nuova matrice 30x30 di numeri reali, in cui ogni elemento delle sottomatrici è dato dalla media degli elementi della sottomatrice stessa (vedere esempio); • visualizzi su video la matrice finale. • Importante: vicino al bordo destro e inferiore è possibile che le sottomatrici da considerare abbiamo dimensioni inferiori a NxM (vedere esempio).
Compressione di immagini • Esempio: Con N= 2, M=4: File «matrice.dat» (per semplicità sia 6x6): 1 0 1 2 3 4 2 3 2 3 0 5 0 2 1 2 4 3 1 2 2 2 1 0 1 5 4 3 2 1 2 1 2 0 7 0 media = 1.75 Matrice finale : 1.75 1.75 1.75 1.75 3.0 3.0 1.75 1.75 1.75 1.75 3.0 3.0 1.5 1.5 1.5 1.5 2.0 2.0 1.5 1.5 1.5 1.5 2.0 2.0 2.25 2.25 2.25 2.25 2.5 2.5 2.25 2.25 2.25 2.25 2.5 2.5
Compressione di immagini #include <stdio.h> #include <stdlib.h> #define DIM 30 main() { float mat[DIM][DIM], som, med; int N, M, i, j, k, rig, col; FILE *f1; printf ("\nInserisci il numero di righe N: "); scanf ("%d",&N); printf ("\nInserisci il numero di colonne M: "); scanf ("%d",&M);
Compressione di immagini /* apre il file matrice.dat */ if ((f1 = fopen ("matrice.dat","r")) == NULL); { printf (“\nErrore apertura di matrice.dat\n”); return (1); } /* legge il file matrice.dat ritenuto corretto, pertanto non ci sono */ /* controlli sui valori letti */ for (i = 0; i < DIM; i++) for (j = 0; j < DIM; j++) fscanf (f1, "%f", &mat[i][j]); fclose(f1);
Compressione di immagini /* individua riga e colonna iniziale di tutte le possibili sottomatrici */ for (rig = 0; rig < DIM; rig += N) { for (col = 0; col < DIM; col += M) { /* per ognuna calcola il valor medio */ k = 0; som = 0; for (i = rig; i < (N + rig) && i < DIM; i++) { for (j = col; j < (M + col) && j < DIM; j++) { k++; som += mat[i][j]; } /* fine “for (j = col; j < (M + col) &&....” */ } /* fine “for (i = rig; i < (N + rig) &&....” */
Compressione di immagini /* costruisce la nuova sottomatrice sostituendo ai valori precedenti */ /* il valor medio appena calcolato */ med = som / k; for (i = rig; i < (N + rig) && i < DIM; i++) for (j = col; j < (M + col) && j < DIM; j++) mat[i][j] = med; } /* fine “for (col = 0; col < DIM; col += M)” */ } /* fine “for (rig = 0; rig < DIM; rig += N)” */ /* visualizza la nuova matrice */ for (i = 0; i < DIM; i++) { for (j = 0; j < DIM; j++) printf ("%.2f ", mat[i][j]); printf ("\n"); } }
Gestione di un bar • Si desidera realizzare un programma in linguaggio C che consenta di gestire i conti dei clienti di un bar. Il programma permette di inserire da tastiera il codice numerico di ognuna delle consumazioni di un cliente. • Il codice 0 indica che l’inserimento è finito e che il programma deve stampare il conto; il conto stampato dal programma contiene la descrizione e il costo di ognuna delle consumazioni, nonché l’importo totale dovuto dal cliente. • Si noti che il codice 0 non implica la fine del programma, il quale deve invece ritornare all’inizio dell’inserimento di un nuovo conto. Il programma termina quando viene introdotto il codice –1.
Gestione di un bar • La corrispondenza tra il codice di una consumazione e un articolo si trova in un primo file il cui nome viene specificato come primo parametro sulla linea di comando. Nel file i codici (e i relativi articoli) sono elencati in ordine a partire dal codice 1 (vedi esempio). • La corrispondenza tra un articolo ed il suo prezzo si trova in un secondo file il cui nome viene specificato come secondo parametro sulla linea di comando. • Si facciano inoltre le seguenti assunzioni: • Ciascun conto consiste al massimo di 10 consumazioni • Sono previsti al massimo 100 articoli diversi.
Gestione di un bar • Esempio: • Supponendo che il file CODICI.DAT contenga i seguenti dati: 1 Birra_Media 2 Birra_Piccola 3 Panino 4 Coca_Cola 5 Acqua_Minerale e che il file PREZZI.DAT contenga i seguenti dati: Panino 3.50 Coca_Cola 2.00 Birra_Media 4.00 Birra_Piccola 2.50 Acqua_Minerale 1.00
Gestione di un bar • Invocando il programma di nome CONTO con il seguente comando: CONTO CODICI.DAT PREZZI.DAT • Inserendo i seguenti dati, Consumazione? 1 Consumazione? 5 Consumazione? 1 Consumazione? 0 il programma produrrà il seguente output: Birra_Media 4.00 Panino 3.50 Birra_Media 4.00 Totale 11.50 Euro. Consumazione?
Gestione di un bar #include <stdio.h> typedef enum {FALSO, VERO} boolean; typedef struct { char articolo[30]; float costo; } prodotti; void stampa_output (prodotti v[], int n, float tot) int main (int argc, char *argv[]) { prodotti consumazione[10], articoli[101]; float totale_cons = 0.0, costo; int i, artic = 0, codice, cod, N_articoli = 0; char prodotto[30]; boolean trovato; FILE *fp1, *fp2;
Gestione di un bar if(argc != 3) /* controllo argomenti */ { printf ("errore parametri\n"); return 1; } if ((fp1 = fopen (argv[1],"r")) == NULL) { fprintf (stderr,"Errore nell'apertura del file %s\n", argv[1]); return 2; } if ((fp2 = fopen (argv[2],"r")) == NULL) { fprintf (stderr,"Errore nell'apertura del file %s\n", argv[2]); return 3; }
Gestione di un bar /* riempimento del vettore di strutture articoli */ while (fscanf (fp1,"%d%s", &cod, prodotto) != EOF) { strcpy (articoli[cod].articolo, prodotto); N_articoli++; } fclose (fp1); /* Legge il costo dei prodotti e li salva nel campo di pertinenza */ while (fscanf (fp2,"%s%f", prodotto, &costo) != EOF) { /* cerco nel vettore di strutture */ i = 1; trovato = FALSO; while (!trovato && (i <= N_articoli)) { if (strcmp (prodotto, articoli[i].articolo) == 0) { articoli[i].costo = costo; trovato = VERO; } i++; } } fclose(fp2);