Linguaggio C Guida alla programmazione. Capitolo 2. Soluzioni degli esercizi (Applica le abilità)



Documenti analoghi
Esempi di algoritmi. Lezione III

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Esercizi di programmazione in C

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Ricerche, ordinamenti e fusioni. 5.1 Introduzione. 5.2 Ricerca completa

Corso di Laurea in Matematica

Introduzione al MATLAB c Parte 2

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Funzioni in C. Violetta Lonati

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Problem solving elementare su dati vettoriali

Breve riepilogo della puntata precedente:

Funzioni. Il modello console. Interfaccia in modalità console

Laboratorio di Fondamenti di Informatica anno accademico Esercizi proposti il

Vettori Algoritmi elementari di ordinamento

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO XI.2015

ci sono più problemi che programmi esiste un problema che non si può risolvere con un programma

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

3. La sintassi di Java

3) Il seguente numerale A1F0 in base 16 a quale numero in base 10 corrisponde?

Programmazione I - Laboratorio

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL

NOZIONI BASE SHELL E SCRIPT LINUX

Trattamento delle STRINGHE in C(++)

Uso di base delle funzioni in Microsoft Excel

Esercitazione 3. Corso di Fondamenti di Informatica

LISTE, INSIEMI, ALBERI E RICORSIONE

Alcune regole di base per scrivere un programma in linguaggio C

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Laboratorio di Informatica

Microsoft Excel. Il foglio elettronico Microsoft Excel Cartelle, Fogli di lavoro e celle Contenuto delle celle. Numeri, date, formule, testo, funzioni

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

EXCEL FUNZIONI PRINCIPALI

INFORMATICA - I puntatori Roberta Gerboni

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

Convertitori numerici in Excel

Gestione dei File in C

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Utilizzo delle formule in Excel

Laboratorio di programmazione

Richiesta pagina PHP (es: index.php)

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Prof. Nicola Cappuccio

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Algoritmi di Ricerca. Esempi di programmi Java

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

Introduzione a ROOT. 1. Informazioni generali

La selezione binaria

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Test Excel conoscenze di Base

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

I sistemi di numerazione

L espressione torna invece sempre vera (quindi la soluzione originale) se cambiamo contemporaneamente il verso: 1 < 0.

FORMULE: Operatori matematici

Matematica in laboratorio

Dimensione di uno Spazio vettoriale

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Variabili e tipi di dato

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

SISTEMI DI NUMERAZIONE DECIMALE E BINARIO

LABORATORIO DI MATEMATICA RENDITE, AMMORTAMENTI, LEASING CON EXCEL

Caratteri e stringhe Esercizi risolti

Lezione 8. La macchina universale

+ / operatori di confronto (espressioni logiche/predicati) / = > < Pseudo codice. Pseudo codice

RICERCA DI UN ELEMENTO


Utilizzo del Terminalino

Introduzione alla programmazione in C

Le stringhe. Le stringhe

LAVORO ESTIVO DI INFORMATICA CLASSE 2O

Kangourou della Matematica 2014 finale nazionale italiana Mirabilandia, 12 maggio 2014

Informatica. Rappresentazione dei numeri Numerazione binaria

RAPPRESENTAZIONE GRAFICA E ANALISI DEI DATI SPERIMENTALI CON EXCEL

Prova Scritta del 19/07/10

4 3 4 = 4 x x x 10 0 aaa

WORD per WINDOWS95. Un word processor e` come una macchina da scrivere ma. con molte più funzioni. Il testo viene battuto sulla tastiera

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Esame del 3 febbraio 2010

Stream EDitor (sed) sed NON modifica l'input 2. L'output viene inviato allo standard output e puo' essere rediretto

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Joker Poker - Regole di Gioco

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B

Regolamento Casinò Poker Joker Poker

Verifica della correttezza formale del numero di partita IVA

SOFTWARE. È l insieme delle istruzioni che è necessario fornire alla macchina per il suo funzionamento. Vi sono due categorie di software:

SPECIFICHE E LIMITI DI EXCEL

Transcript:

Soluzioni degli esercizi (Applica le abilità) Capitolo 2 1. a) Linux ls /home/gabriele/oro MS/DOS o Windows dir \home\gabriele\oro b) Linux ls /home/gabriele MS/DOS o Windows dir \home\gabriele c) Linux ls /bin MS/DOS o Windows dir \bin d) Linux ls /home/gabriele/oro/gioielli MS/DOS o Windows dir \home\gabriele\oro\gioielli e) Linux ls /home/gabriele/oro/a* MS/DOS o Windows dir \home\gabriele\oro\a* f) Linux ls /bin/l* MS/DOS o Windows dir \bin\l* 2. a) Linux ls MS/DOS o Windows dir b) Linux ls.. MS/DOS o Windows dir.. c) Linux ls../../../bin MS/DOS o Windows dir..\..\..\bin d) Linux ls gioielli MS/DOS o Windows dir gioielli e) Linux ls a* MS/DOS o Windows dir a* f) Linux ls../../../bin/l* MS/DOS o Windows dir..\..\..\bin\l* 3. La figura a cui si fa riferimento nell esercizio è Figura 2.3 (e non la 2.9 come erroneamente indicato). a) Linux cd /etc MS/DOS o Windows cd \etc b) Linux cd /home/pluto MS/DOS o Windows cd \home\pluto c) Linux cd /home MS/DOS o Windows cd \home d) Linux cd / MS/DOS o Windows cd \ e) Linux cd /bin ls cd /home/nora MS/DOS o Windows cd \bin dir cd \home\nora

4. a) Linux cd../../etc MS/DOS o Windows cd..\../etc b) Linux cd../pluto MS/DOS o Windows cd..\pluto c) Linux cd.. MS/DOS o Windows cd.. d) Linux cd../.. MS/DOS o Windows cd..\.. e) Linux cd../../bin ls cd../home/nora MS/DOS o Windows cd..\..\bin dir cd..\home\nora 5. La directory a cui si fa riferimento nei punti a e c è Gabriele (e non melodia come erroneamente indicato). a) Linux cd /home/gabriele MS/DOS o Windows cd \home\gabriele b) Linux cd../gabriele MS/DOS o Windows cd..\gabriele c) Linux mkdir /home/gabriele/programmi MS/DOS o Windows mkdir \home\gabriele\programmi d) Se la directory corrente è ancora nora: Linux mkdir../gabriele/programmi MS/DOS o Windows mk dir..\gabriele\programmi Se invece con i comandi indicati nei punti precedenti la directory corrente è ora Gabriele: Linux mkdir programmi MS/DOS o Windows mkdir programmi e) Se la directory corrente è ancora nora: Linux rmdir../gabriele/programmi MS/DOS o Windows rmdir..\gabriele\programmi Se invece, con i comandi indicati nei punti precedenti, la directory corrente è ora Gabriele: Linux rmdir programmi MS/DOS o Windows rmdir programmi 6. L esercizio presenta una difficoltà in quanto il nome del file contiene un carattere spazio al suo interno, C02 2008.DOC, se al posto dello spazio ci fosse un carattere di sottolineatura, C02_2008.DOC, le soluzioni sarebbero le seguenti: a) Linux cp C02_2008.DOC C02BACKUP.DOC MS/DOS o Windows copy C02_2008.DOC C02BACKUP.DOC b) Linux cp C02_2008.DOC../C02COPIA.DOC MS/DOS o Windows copy C02_2008.DOC..\C02COPIA.DOC c) Linux rm C02_2008.DOC MS/DOS o Windows del C02_2008.DOC Per porter considerare lo spazio si deve porre il nome tra doppi apici: a) MS/DOS o Windows copy "C02 2008.DOC" C02BACKUP.DOC b) MS/DOS o Windows copy "C02 2008.DOC"..\C02COPIA.DOC c) MS/DOS o Windows del "C02 2008.DOC" 7. a) Linux mkdir fileprecedenti MS/DOS o Windows mkdir fileprecedenti

b) Linux cp * fileprecedenti MS/DOS o Windows copy *.* fileprecedenti c) Linux rm *.DOC MS/DOS o Windows del *.DOC 8. a) Linux mkdir T08/filePrecedenti MS/DOS o Windows mkdir T08\filePrecedenti b) Linux cp T08/* T08/filePrecedenti MS/DOS o Windows copy T08\*.* T08\filePrecedenti c) Linux rm T08/*.DOC MS/DOS o Windows del T08\*.DOC

Capitolo 3 1 Si suppone che il cellulare utilizzato sia in grado di effettuare la ricerca di un nome digitandone in sequenza le lettere. a. Premi sul cellulare il tasto che attiva la rubrica b. premi la prima lettera del nome ricercato c. fintantoché non appare sullo schermo l intero nome ricercato oppure il messaggio nessuna corrispondenza premi la successiva lettera del nome d. Se è apparso sullo schermo l intero nome ricercato premere il tasto di avvio chiamata telefonica. d. fine 2 a. Scrivi 1 b. fintantoché il numero scritto è diverso da 100, scrivi il numero precedente + 1 c. fine 3 a. Scrivi 1 b. fintantoché il numero scritto è diverso da 99, scrivi il numero precedente + 2 c. fine 4 a. Scrivi -2 b. fintantoché il numero scritto è diverso da -50, scrivi il numero precedente - 2 c. fine 5 a. Scrivi 150 b. addiziona 1 al numero precedente c. se il resto della divisione intera del numero ottenuto per 4 è diverso da zero scrivi il numero d. fintantoché il numero ottenuto è diverso da -4 vai all istruzione b e. fine 6 a. Suddividi le carte in 4 mazzi, ognuno dei quali costituito da carte dello stesso seme b. per ogni seme ordina le carte dall asso al re c. prendi il mazzo di cuori, quadri, fiori e picche La descrizione può avere un maggior dettaglio, per esempio: a. Suddividi le carte in 4 mazzi, ognuno dei quali costituito da carte dello stesso seme b. per ogni seme prendi l asso, prendi il due, prendi il tre.. prendi il re c. prendi il mazzo di cuori, quadri, fiori e picche 7 Alla prima mossa si devono lasciare all avversario 9 oggetti (4i + 1, i = 2) a. Raccogli 2 oggetti b. il secondo giocatore raccoglie m oggetti (1 m 3) c. finché ci sono ancora oggetti sul tavolo: raccogli 4 m oggetti e vai all istruzione b d. fine (il secondo giocatore gioca sempre per ultimo e il primo giocatore vince sempre) 8 a. Il primo giocatore raccoglie m oggetti (m può essere 1 o 3) b. raccogli m oggetti c. il primo giocatore raccoglie m oggetti (1 m 3) d. finché ci sono ancora oggetti sul tavolo: raccogli 4 m oggetti e vai all istruzione c e. fine (il primo giocatore gioca sempre per ultimo e il secondo giocatore vince sempre)

9 Non è possibile scrivere un algoritmo vincente quando gli oggetti sono n = 4i + 1, per esempio 9, 13, 17, 21 ecc. In tali circostanze il primo giocatore non può lasciare al secondo un numero di oggetti della forma 4i + 1. Negli altri casi (n diverso da 4i + 1) l algoritmo è il seguente. a. Raccogli j oggetti, dove j = 2 se r = 3 (r è il resto della divisione intera di n per 4), j = 1 se r = 2, j = 3 se r = 0 b. il secondo giocatore raccoglie m oggetti (1 m 3) c. finché ci sono ancora oggetti sul tavolo: raccogli 4 m oggetti e vai all istruzione b d. fine (il secondo giocatore gioca sempre per ultimo e il primo giocatore vince sempre) 10 a. Prendi i coefficienti a, b e c b. calcola Δ = b 2 4ac c. se Δ < 0 non esistono radici reali, altrimenti se Δ = 0 allora x 1 = x 2 = b/2a, altrimenti x 1 = ( b + Δ)/2a, x 2 = ( b Δ)/2a 12 a. Scrivi 1 b. considera il primo numero naturale c. addiziona al numero scritto il successivo numero naturale d. fintantoché il numero ottenuto è minore di 1000 scrivi il numero e vai all istruzione b e. fine 13 a. Considera il primo numero naturale b. scrivi il numero naturale considerato moltiplicato due volte per se stesso c. fintantoché il numero ottenuto è minore di 10000 considera il successivo numero naturale e vai all istruzione b d. fine

Capitolo 4 2 numero = 1; while(numero<101) scrivi numero; numero = numero + 1; o, tra le tante alternative: numero = 0; do numero = numero + 1; scrivi numero; while (numero!=100); 3 numero = 1; while(numero<100) scrivi numero; numero = numero + 2; 5 numero = 150; while(numero<0) if(numero%4!=0) scrivi numero; numero = numero + 1; 7 n è la variabile che contiene il numero di oggetti con cui si gioca, mentre m è la variabile che contiene il numero di oggetti che preleva il secondo giocatore. Si dà per scontato che il secondo giocatore raccolga 1, 2 o 3 oggetti, per cui l istruzione prendi m; assegnerà a m un valore intero compreso tra 1 e 3. In realtà questi valori andrebbero controllati. n = 11; n = n 2; while(n>4) prendi m; n = n m; n = n (4 m); scrivi "Tocca al secondo giocatore, e il primo ha vinto" Naturalmente avremmo potuto scrivere al posto delle ultime due istruzioni n=n m (4 m). 8 Nota: si dà per scontato che il primo giocatore raccolga 1 o 3 oggetti al primo giro e 1, 2 o 3 oggetti ai giri successivi. In realtà questi valori andrebbero controllati.

n = 11; prendi m; n = n m; while(n>4) prendi m; n = n m; n = n (4 m); scrivi "Tocca al primo giocatore, e il primo ha vinto" 9 Non è possibile scrivere un algoritmo vincente quando gli oggetti sono n = 4i + 1, per esempio 9, 13, 17, 21 ecc. In tali circostanze il primo giocatore non può lasciare al secondo un numero di oggetti della forma 4i + 1. Negli altri casi (n diverso da 4i+1) l algoritmo è il seguente. prendi n; r = n % 4; if(r=3) j=2; if(r=2) j=1; if(r=0) j=3); n = n j; while(n>4) prendi m; n = n m; n = n (4 m); scrivi "tocca al secondo giocatore, e il primo ha vinto" Abbiamo utilizzato una sequenza di tre if per determinare il valore di j; avremmo potuto utilizzare una cascata di if (vedi Capitolo 7): if(r=3) j=2; else if(r=2) j=1; else j=3; Dato che nel nostro caso i valori ammissibili del resto della divisione intera di n per 4 possono essere solo 0, 2, 3 (1 non può essere, altrimenti n sarebbe della forma 4i + 1) possiamo evitare l ultima if: if(r=0) e mettere direttamente l else. 13 numero = 1; naturale = 2; while(numero<1000) scrivi numero; numero = numero + naturale; naturale = naturale + 1; 14 numero = 1; while(numero*numero*numero<10000) scrivi numero*numero*numero; numero = numero + 1;

Capitolo 5 5 #include <math.h> #define ZERO 0 #define TOP 1000 int a, b, c, x, y; printf("valore di x: "); scanf("%d", &x); printf("valore di y: "); scanf("%d", &y); a = ZERO abs(x); b = TOP abs(y); c = a*b; printf("valore di a: %d\n", a); printf("valore di b: %d\n", b); printf("valore di c: %d\n", c); SUGGERIMENTI DI PROGRAMMAZIONE Non si riescono a leggere i risultati nella finestra di esecuzione del programma Se eseguendo i programmi non si riescono a leggere i risultati, la causa potrebbe essere la chiusura immediata della finestra d esecuzione che non lascia il tempo per osservare l output del programma sul video. Per ovviare all inconveniente, si può utilizzare il seguente artifizio facile da interpretare, ma che comunque verrà spiegato nel proseguo dello studio. Inserire la dichiarazione della variabile carattere pausa: char pausa; Aggiungere come ultime due istruzioni del programma: che mettono in attesa il programma in esecuzione della pressione di un tasto da parte dell utente. Sarebbe meglio farle precedere da un messaggio esplicativo. printf("un tasto qualsiasi per continuare\n"); SUGGERIMENTI DI PROGRAMMAZIONE errore di compilazione 'abs' undeclared In alcune implementazioni la libreria math.h non contiene abs ma solo fabs, che restituisce il valore assoluto di valori in virgola mobile, in tal caso il compilatore ritorna un errore del tipo: `abs' undeclared (first use this function) in tal caso sostituire nel programma fabs ad abs. Il compilatore avvertirà (Warning) che viene effettuata una conversione da intero a double, ma in questo caso tutto funziona correttamente: [Warning] converting to `int' from `double'

11 Visualizza 222. 12 Visualizzano 48, -60, 6 e 2. 13 Visualizzano 24, -84, -6 e 2. 14 Visualizzano 37, -48, 5 e 2.

Capitolo 6 4 2 545 2545 2545 2 545 547 2 5451090 2 545 1092 2 545 1188100 5 #define A 2 #define B 545 char pausa; printf("%7d%4d\n", A, B); printf("%1d%3d\n", A, B); printf("%1d%2d\n", A, B); printf("%7d%4d%4d\n", A, B, A+B); printf("%7d%4d%4d\n", A, B, A*B); printf("%7d%4d%5d\n", A, B, A*B+A); printf("%7d%4d%9d\n", A, B, A*A*B*B); 6 char pausa; char c1, c2, c3; c1='p'; c2='&'; c3='f'; printf("%c%c%c\n", c1, c2, c3); printf("%c%c %c\n", c1, c2, c3); printf("%c %c %c\n", c1, c2, c3); printf("padre:%c %c Figlio:%c\n", c1, c2, c3); printf("padre: %c %c Figlio: %c\n", c1, c2, c3); 7 char pausa; char asso, re, donna; int a, r, d; asso='a'; re='r'; donna='d';

a=11; r=10; d=9; printf("%c %d %c %d %c %d\n", asso, a, re, r, donna, d); printf("%c%c%c %d %d %d\n", asso, re, donna, a, r, d); printf("%d %c %d %c %d %c\n", a, asso, r, re, d, donna); printf("%d %c %d %c %d %c\n", d, donna, r, re, a, asso); printf("asso %c%d RE %c%d Donna %c%d\n", asso, a, re, r, donna, d); 10 2.00 2.000 545.110 2 545.1 547.10999 2.00000 545.10999 547.10999 2.00 545.11-543.10999

Capitolo 7 2 /* Determina il maggiore tra quattro valori */ int a, b, c, d; printf("\ndigita quattro valori interi distinti: "); scanf("%d", &a); scanf("%d", &b); scanf("%d", &c); scanf("%d", &d); if(a>b) if(a>c) if(a>d) printf("il maggiore e': %d\n", a); else printf("il maggiore e': %d\n", d); else if(c>d) printf("il maggiore e': %d\n", c); else printf("il maggiore e': %d\n", d); else if(b>c) if(b>d) printf("il maggiore e': %d\n", b); else printf("il maggiore e': %d\n", d); else if(c>d) printf("il maggiore e': %d\n", c); else printf("il maggiore e': %d\n", d); 4 /* Determina il maggiore e il minore fra tre valori */ int a, b, c; printf("\ndigita tre valori interi distinti: "); scanf("%d", &a); scanf("%d", &b); scanf("%d", &c); if(a>b) if(a>c) printf("il maggiore e': %d\n", a); if(b<c) printf("il minore e': %d\n", b); else printf("il minore e': %d\n", c);

else printf("il maggiore e': %d\n", c); printf("il minore e': %d\n", b); else if(b>c) printf("il maggiore e': %d\n", b); if(a<c) printf("il minore e': %d\n", a); else printf("il minore e': %d\n", c); else printf("il maggiore e': %d\n", c); printf("il minore e': %d\n", a); 5 /* Esempio visualizzazione menu e controllo scelte utente */ char scelta; printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("\n MENU DI PROVA\n"); printf("\n a) Per immettere dati"); printf("\n b) Per determinare il maggiore"); printf("\n c) Per determinare il minore"); printf("\n d) Per ordinare"); printf("\n e) Per visualizzare"); printf("\n\n Scelta: "); scelta = getchar(); switch(scelta) case 'a': printf("\n In esecuzione l'opzione a"); case 'b': printf("\n In esecuzione l'opzione b"); case 'c': printf("\n In esecuzione l'opzione c"); case 'd': printf("\n In esecuzione l'opzione d"); case 'e': printf("\n In esecuzione l'opzione e"); default: printf("\n Opzione inesistente");

9 int punteggio = 0; char risposta; char pausa; printf("\nil matematico Kummer e' vissuto nel '700 (s/n)? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; printf("\nl'ultimo teorema di Fermat e' stato dimostrato alla fine del '900 (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; printf("\nla cardinalita' di tutti gli interi e maggiore di quella dei soli interi pari(s/n)? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; printf("\npunteggio: %d su 3", punteggio); printf("\npremi un tasto per continuare."); 10 int punteggio = 0; char risposta; char pausa; printf("\nil matematico Kummer e' vissuto nel '700 (s/n)? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\nl'ultimo teorema di Fermat e' stato dimostrato alla fine del '900 (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\nla cardinalita' di tutti gli interi e maggiore di quella dei soli interi pari(s/n)? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\npunteggio: %d su 3", punteggio); printf("\npremi un tasto per continuare.");

11 int punteggio = 0; char risposta; char pausa; printf("\nil matematico Kummer e' vissuto nel '700 (s/n)? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; printf("\npitagora e' vissuto nel III secolo a.c. (s/n)? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\neuclide e' vissuto nel III secolo a.c. (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\npunteggio: %d su 3", punteggio); else punteggio = punteggio - 1; printf("\nl'ultimo teorema di Fermat e' stato dimostrato alla fine del '900 (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\nla cardinalita' di tutti gli interi e maggiore di quella dei soli interi pari? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\npunteggio: %d su 3", punteggio); printf("\npremi un tasto per continuare."); 12 int punteggio = 0; char risposta; char pausa; printf("\nil matematico Kummer e' vissuto nel '700 (s/n)? "); scanf("%c", &risposta); if(risposta=='n')

punteggio = punteggio + 1; printf("\npitagora e' vissuto nel III secolo a.c. (s/n)? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; printf("\ngauss e' vissuto dopo Galileo (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; else punteggio = punteggio - 1; printf("\neuclide e' vissuto nel III secolo a.c. (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\npunteggio: %d su 3", punteggio); else punteggio = punteggio - 1; printf("\nl'ultimo teorema di Fermat e' stato dimostrato alla fine del '900 (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\nla cardinalita' di tutti gli interi e maggiore di quella dei soli interi pari? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\npunteggio: %d su 3", punteggio); printf("\npremi un tasto per continuare."); 13 int punteggio = 0; char risposta; char pausa; printf("\nil matematico Kummer e' vissuto nel '700 (s/n)? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; printf("\npitagora e' vissuto nel III secolo a.c. (s/n)? "); scanf("%c", &risposta);

if(risposta=='n') punteggio = punteggio + 1; printf("\ngauss e' vissuto dopo Galileo (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; else punteggio = punteggio - 1; printf("\neuclide e' vissuto nel III secolo a.c. (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\npunteggio: %d su 3", punteggio); else punteggio = punteggio - 1; printf("\nl'ultimo teorema di Fermat e' stato dimostrato alla fine del '900 (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; printf("\nriemann e' nato dopo Gauss (s/n)? "); scanf("%c", &risposta); if(risposta=='s') punteggio = punteggio + 1; else punteggio = punteggio - 1; else punteggio = punteggio - 1; printf("\nla cardinalita' di tutti gli interi e maggiore di quella dei soli interi pari? "); scanf("%c", &risposta); if(risposta=='n') punteggio = punteggio + 1; else punteggio = punteggio - 1; printf("\npunteggio: %d su 3", punteggio); printf("\npremi un tasto per continuare.");

Capitolo 8 1 /* Verifica il valore delle espressioni date */ int a, b, c, ris; a = 5; b = 35; c = 7; ris = a+b*c; printf("\n a) %d", ris); ris = a>b; printf("\n b) %d", ris); ris = (a+b) * (a<b); printf("\n c) %d", ris); ris = (a+b) && (a<b); printf("\n d) %d", ris); ris = (a+b) (a>b); printf("\n e) %d", ris); ris = ((a*c) b) (a>b); printf("\n f) %d", ris); ris = ((a*c)!= b) (a>b); printf("\n g) %d", ris); ris = (a>b) (a<c) (c==b); printf("\n h) %d\n", ris); /* O ALTERNATIVAMENTE ALL'INTERNO DELLE PRINTF */ printf("\n a) %d", a+b*c); printf("\n b) %d", a>b); printf("\n c) %d", (a+b) * (a<b)); printf("\n d) %d", (a+b) && (a<b)); printf("\n e) %d", (a+b) (a>b)); printf("\n f) %d", ((a*c) b) (a>b)); printf("\n g) %d", ((a*c)!= b) (a>b)); printf("\n h) %d\n", (a>b) (a<c) (c==b)); I risultati visualizzati dal programma saranno i seguenti: a) 250 b) 0 c) 40 d) 1 e) 1 f) 0 g) 0 h) 1 2 I risultati visualizzati dal programma saranno i seguenti: a) Vero (1) b) Falso (0) c) Vero (1) d) Vero (1) e) Falso (0) f) Vero (1) 3 I risultati visualizzati dal programma saranno: a) vero (1) b) falso (0) c) vero (1) d) vero (1) e) vero (1) f) falso (0)

4 d = (a*2+b)!= c? a*b*c: a+b+c; 5 printf("\n Il maggiore e': %d", (x=(a>b)?a:b)>c?x:c); dove x è una variabile int.

Capitolo 9 1 /* Determina il fattoriale dei numeri minori o uguali all'intero immesso dall'utente */ int n, fat, aux; printf("calcolo DEI FATTORIALI DEI NUMERI <= N\n\n"); printf("inser. n: "); scanf("%d", &n); fat = 1; printf("il fattoriale di: 0 ha valore: %d\n", fat); for(aux=1; aux<=n; aux++) fat = fat*aux; printf("il fattoriale di: %d ha valore: %d\n", aux, fat); 2 /* Determina il maggiore, il minore e la media dei valori immessi */ #include <limits.h> int i, n, numero, max, min, media; printf("maggiore MINORE E MEDIA\n"); min = INT_MAX; max = INT_MIN; media = 0; i = 1; do printf("\nlunghezza della sequenza: "); scanf("%d", &n); while(n<1); for(i=1; i<=n; i++) printf("valore int.: \t"); scanf("%d", &numero); if(numero>max) max = numero; else if(numero<min) min = numero; media = media+numero; printf("maggiore: %d\n", max); printf("minore: %d\n", min); printf("media: %d\n", media/n);

3 /* Visualizza un rettangolo di cornice * e parte interna Q; le dimensioni del rettangolo sono decise dall'utente */ int i, j, linee, colonne; do printf("\nnumero di linee: "); scanf("%d", &linee); while(linee<1); do printf("\nnumero di colonne: "); scanf("%d", &colonne); while(colonne<1); for(i=1; i<=linee; i++) for(j=1; j<=colonne; j++) if(i==1 i==linee j==1 j==colonne) printf("*"); if(j==colonne) printf("\n"); else printf("q"); 4 /* Visualizza tanti rettangoli quanti ne desidera l'utente con caratteri e dimensioni scelti a tempo di esecuzione */ int i, j, y, linee, colonne, volte; char cornice, interno; do printf("\nnumero di linee: "); scanf("%d", &linee); while(linee<1); do printf("\nnumero di colonne: "); scanf("%d", &colonne); while(colonne<1); printf("\ncarattere della cornice: "); scanf("%1s", &cornice); printf("\ncarattere dell'interno: "); scanf("%1s", &interno); do printf("\nnumero di visualizzazioni: "); scanf("%d", &volte); while(colonne<1); for(y=1; y<=volte; y++)

for(i=1; i<=linee; i++) for(j=1; j<=colonne; j++) if(i==1 i==linee j==1 j==colonne ) printf("%c", cornice); if(j==colonne) printf("\n"); else printf("%c", interno); 12 int i; for(i=1; i<=99; i=i+2) printf("\n%d", i); 13 int i; for(i=-2; i>=-50; i=i-2) printf("\n%d", i); 14 int i; for(i=-150; i<=-1; i++) if(i%4!=0) printf("\n%d", i); 16 int i, j; int primo; for(i=1; i<=100; i++) primo=1; for(j=2; j<i; j++) if(i%j==0) primo=0; if(primo==1) printf("\nnumero primo: %d", i); 17 int i, j; j=1; for(i=2; j<1000; i++) printf("\n%d", j); j=j+i; 18 int i, j; j=1; for(i=2; j<10000; i++) printf("\n%d", j); j=i*i*i; Oppure con una sola variabile:

int i; for(i=1; i*i*i<10000; i++) printf("\n%d", i*i*i);

Capitolo 10 1 Il ciclo che effettua la somma deve essere realizzato in modo che l elemento del secondo array sia simmetrico rispetto al primo. for(i=0; i<n; i++) c[i] = a[i] + b[n i 1]; /* Somma incrociata di due vettori */ int n = 4; int a[n], b[n], c[n]; int i; char pausa; printf("\nvettore a\n"); for(i=0; i<n; i++) printf("elemento %d del primo vettore: ", i+1); scanf("%d", &a[i]); printf("\nvettore b\n"); for(i=0; i<n; i++) printf("elemento %d del secondo vettore: ", i+1); scanf("%d", &b[i]); /* Somma incrociata a+b */ for(i=0; i<n; i++) c[i] = a[i] + b[n-i-1]; printf("\nsomma incrociata a+b\n"); for(i=0; i<n; i++) printf("elemento %d della somma incrociata: %d\n", i+1, c[i]); 2 Se l elemento in esame risulta il maggiore if(voti[]>max) è inutile confrontarlo con il minore, altrimenti - else - lo si confronta. (Scegliamo di effettuare ii confronti, gli assegnamenti e i calcoli necessari a determinare il maggiore, il minore e la media all interno di un solo ciclo, per cui la scansione dell array avviene una sola volta.) max = voti[0]; min = voti[0]; media = voti[0]; for(i = 0;i <= 5; i++) if(voti[i]>max) max = voti[i]; else if(voti[i]<min) min = voti[i]; media = media+voti[i];

3 Diamo la soluzione per la prima parte dell esercizio lasciando al lettore l onere di completare l esercizio. /* Carica un vettore alternativamente di zeri e uni, visualizza il vettore */ #define MAX_ELE 1000 /* massimo numero di elementi */ int prova[max_ele]; int i, n; char invio; do printf("\nnumero elementi: "); scanf("%d", &n); while(n<1 n>max_ele); /* Si carica il vettori di zeri e uni */ prova[0] = 0; for(i=1; i<n; i++) if(i%2 == 1) prova[i] = 1; else prova[i] = 0; for(i=0; i<n; i++) printf("%d \n", prova[i]); printf("\nqualsiasi tasto per continuare..."); scanf("%c", &invio); scanf("%c", &invio); 4 /* Cerca l elemento del vettore piu prossimo a k */ #include <math.h> #define MAX_ELE 1000 /* massimo numero di elementi */ int v1[max_ele]; int i, n, k, prossimo, indice; char invio; do printf("\nnumero elementi: "); scanf("%d", &n); while(n<1 n>max_ele); printf("immissione ELEMENTI\n"); for(i=0; i<n; i++) printf("valore intero %d: ", i+1); scanf("%d", &v1[i]);

printf("immissione di k\n"); printf("valore intero k: "); scanf("%d", &k); /* Ricerca elemento piu' prossimo a k*/ prossimo = fabs(k-v1[0]); indice = 0; for(i=1; i<n; i++) if((fabs(k-v1[i])) < prossimo) prossimo = fabs(k-v1[i]); indice = i; printf("\nvalore piu' prossimo a k nel vettore: %d\n", v1[indice]); for(i=0; i<n; i++) printf("%d \n", v1[i]); printf("\nqualsiasi tasto per continuare..."); scanf("%c", &invio); scanf("%c", &invio); 12 Devono essere definite le dimensioni della matrice. #define N 10 #define P 10 #define M 10 int mat1[n][p]; int mat2[p][m]; int pmat[n][m]; Si devono richiedere all utente le reali dimensioni e si deve controllare che il loro valore non superi le dimensioni delle matrici. I valori da richiedere sono soltanto tre, in quanto le colonne della prima matrice devono essere in numero uguale alle righe della seconda. /* Richiesta delle dimensioni */ do printf("numero di linee I matrice: "); scanf("%d", &n); while((n>=n) (n<1)); do printf("numero colonne I matrice / righe II matrice: "); scanf("%d", &p); while((p>=p) (p<1)); do printf("numero di colonne II matrice: "); scanf("%d", &m); while((m>=m) (m<1)); Anteriormente devono essere state dichiarate le variabili n, m e p. int n, m, p;

Sostituire N, M e P con n, m e p nel resto del programma. 14 /* Calcolo media voti per studente e per prova. Nell'esemplificazione utilizziamo 3 studenti e 4 prove */ #define N 4 #define M 5 float voti[n][m]; int i, j, n, m; char pausa; n=n; m=m; printf("\n \n CARICAMENTO DEI VOTI \n \n"); for(i=0; i<n-1; i++) for(j=0; j<m-1; j++) printf("ins. studente %d prova %d: ", i+1, j+1); scanf("%f", &voti[i][j]); ; /* Calcolo medie per studente */ for(i=0; i<n-1; i++) voti[i][m-1] = 0; for(j = 0; j < m-1; j++) voti[i][m-1] = voti[i][m-1] + voti[i][j]; voti[i][m-1] = voti[i][m-1] / (m-1); /* Calcolo medie per prova */ for(j=0; j<m; j++) voti[n-1][j] = 0; for(i=0; i<n-1; i++) voti[n-1][j] = voti[n-1][j] + voti[i][j]; voti[n-1][j] = voti[n-1][j]/(n-1); printf("\n \n VISUALIZZAZIONE DELLA MATRICE \n "); for(i=0; i<n; i++) printf("\n"); for(j=0; j<m; j++) printf("%8.3f", voti[i][j]); Esempio di esecuzione: Ins. studente 1 prova 1: 4 Ins. studente 1 prova 2: 5 Ins. studente 1 prova 3: 4 Ins. studente 1 prova 4: 7 Ins. studente 2 prova 1: 8 Ins. studente 2 prova 2: 10 Ins. studente 2 prova 3: 8 Ins. studente 2 prova 4: 10 Ins. studente 3 prova 1: 6 Ins. studente 3 prova 2: 7 Ins. studente 3 prova 3: 8

Ins. studente 3 prova 4: 6 VISUALIZZAZIONE DELLA MATRICE 4.000 5.000 4.000 7.000 5.000 8.000 10.000 8.000 10.000 9.000 6.000 7.000 8.000 6.000 6.750 6.000 7.333 6.667 7.667 6.917

Capitolo 11 1 /* Funzione per il calcolo di una qualsiasi potenza con esponente >= zero */ double pot(double base, int esp) double po; po = 1; if(esp == 0) return(1); else while(esp ) po *= base; return(po); 2 void messaggio (int, int); char messaggio[] = "Ciao, baby"; int riga = 10; int colonna = 20; messaggio (riga, colonna); /* Funzione che visualizza un messaggio a un generica coordinata x,y dello schermo */ void messaggio(int r, int c) while(c ) printf("\n"); while(r ) putchar(' '); printf("%s\n\n", messaggio); 3 char buf[128]; void minmaiusc (void); printf("\ninserisci stringa: "); scanf("%s", buf); minmaiusc(); printf("%s\n", buf); /* Funzione che converte le lettere minuscole in maiuscole */ void minmaiusc(void) int i; for (i = 0; buf[i]!= '\0'; i++)

if (buf[i] >= 'a' && buf[i] <= 'z') buf[i] = buf[i] 'a' + 'A'; 4 int numeri = 0; int alfa = 0; char buf[80]; int i; char pausa; void numalfa(void); printf("\ninserisci stringa: "); scanf("%s", buf); numalfa(); printf("ci sono %2d caratteri nmerici\n", numeri); printf("ci sono %2d caratteri alfabetici\n", alfa); /* Funzione che conta il numero di caratteri e cifre */ void numalfa(void) for (i = 0; buf[i]!= '\0'; i++) switch(buf[i]) case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': numeri++; default: alfa++; 5 Esercizio: modificare la funzione realizzata nell esercizio 4 in modo che calcoli il numero di zeri, cifre pari e cifre dispari e il numero di caratteri che non sono cifre numeriche. int zeri = 0, pari = 0, dispari = 0; int alfa = 0; char buf[80]; int i; char pausa; void numalfa(void);

printf("\ninserisci stringa: "); scanf("%s", buf); numalfa(); printf("ci sono %2d zeri\n", zeri); printf("ci sono %2d cifre pari\n", pari); printf("ci sono %2d cifre dispari\n", dispari); printf("ci sono %2d caratteri alfabetici\n", alfa); /* Funzione che conta il numero di caratteri e cifre */ void numalfa(void) for (i = 0; buf[i]!= '\0'; i++) switch(buf[i]) case '0': zeri++; case '2': case '4': case '6': case '8': pari++; case '1': case '3': case '5': case '7': case '9': dispari++; default: alfa++; 14 void interipositivi(int); int i; i=50; interipositivi(i); /* Funzione che visualizza i numeri interi positivi da 1 a n */ void interipositivi(int n) int i; for(i=1; i<=n; i=i+2) printf("\n%d", i); 16 void interipositivi2(int, int);

int i, j; i=2; j=50; interipositivi2(i,j); /* Funzione che visualizza i numeri interi positivi da n a m con n minore di m */ void interipositivi2(int n, int m) int i; for(i=n; i<=m; i=i+2) printf("\n%d", i);

Capitolo 12 1 Qualsiasi soluzione si adotti tra quelle proposte nel testo, l operatore relazionale dell if che controlla lo scambio di valori tra gli elementi deve essere cambiato da > a <. if(vet[i]<vet[i+1]) Non ci sono altre modifiche da effettuare. 2 /* Ricerca di un valore in una matrice */ #define N 10 #define M 10 char alfa[n][m]; int n, m, i, j, k; char ric; /* Richiesta delle dimensioni */ do printf("numero di linee: "); scanf("%d", &n); while((n>=n) (n<1)); do printf("numero di colonne: "); scanf("%d", &m); while((m>=m) (m<1)); printf("\n \n CARICAMENTO DELLA MATRICE \n \n"); for(i=0; i<n; i++) for(j=0; j<m; j++) printf("ins.carattere nella linea %d colonna %d val:", i, j); scanf("%1s", &alfa[i][j]); ; /* Richiesta del carattere da ricercare */ printf("\n \n Carattere da ricercare: "); scanf("%1s", &ric); printf("\n \n VISUALIZZAZIONE DELLA MATRICE \n "); for(i=0; i<n; i++) printf("\n"); for(j = 0; j < m; j++) printf("%3c", alfa[i][j]); printf("\n\n"); /* Ricerca del carattere all'interno della matrice */ k = 0; for(i=0; i<n; i++) for(j=0; j<m; j++) if(alfa[i][j]==ric) printf("%c in linea %d colonna %d\n", ric, i+1, j+1); k = 1; ; if(k==0) printf("%c non presente nella matrice", ric);

Esempio di esecuzione: Carattere da ricercare: a VISUALIZZAZIONE DELLA MATRICE t b a m d g a k k d a m v f g a in linea 1 colonna 3 a in linea 3 colonna 1 a in linea 4 colonna 2

Caso di Studio I 1 Si deve inserire in gestionesequenza, dopo le dichiarazioni delle variabili e prima dell inizio del ciclo di gestione delle scelte dell utente la chiamata della funzione immissione. n = immissione(); 2 void gestionemenu(void); int gestionemenu(); void gestionemenu() int n; int scelta = 'z'; char invio; int ele, posizione; while(scelta!= 'x') printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("\t\t\t BORRI & BIANCHI SpA"); printf("\n\t\t Sistema per la gestione integrata"); printf("\n\t\t\t OPZIONI DISPONIBILI"); printf("\n\n\n\t\t\t a. Magazzino"); printf("\n\t\t\t b. Clienti"); printf("\n\t\t\t c. Fornitori"); printf("\n\t\t\t x. Fine"); printf("\n\n\n\t\t\t\t Scegliere una opzione: "); scanf("%c", &scelta); scanf("%c", &invio); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); switch(scelta) case 'a': printf("hai scelto a"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); case 'b': printf("hai scelto b"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); case 'c': printf("hai scelto c"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); printf("hai scelto x"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio);

3 Vanno effettuate due modifiche nelle funzioni di ordinamento e di ricerca binaria. void ordinamento(int n) int i, p, k, n1; int aux; p = n; n1 = p; do k = 0; for(i = 0; i < n1-1; i++) if(vet[i] < vet[i+1]) aux = vet[i]; vet[i] = vet[i+1]; vet[i+1] = aux; k = 1; p = i + 1; n1 = p; while (k == 1 && n1>1); /* ricerca binaria */ int ricbin(int n, int ele) int i, alto, basso, pos; alto = 0; basso = n - 1; pos = -1; do i = (alto+basso)/2; if(vet[i] == ele) pos = i; else if(vet[i] > ele) alto = i + 1; else basso = i - 1; while(alto <= basso && pos == -1); return(pos); 4 e 5 La funzione di ricerca sequenziale non restituisce la posizione dell elemento e non ha la necessità di prendere in ingresso il valore da ricercare. void ricerca(int); La chiamata alla funzione di ricerca sequenziale diventa: case 3: ricerca(n); La funzione di ricerca sequenziale diventa: /* Ricerca sequenziale */ void ricerca (int n) int i, ele; char invio; i = 0; printf("elemento da ricercare: "); scanf("%d", &ele); scanf("%c", &invio);

while (ele!= vet[i] && i < n-1) ++i; if(ele == vet[i]) printf("\nelem. %d presente in posizione %d\n", ele, i); else printf("\nelemento non presente!\n"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); Modifiche analoghe devono essere apportate per la ricerca binaria. 6 #define MAX_ELE 1000 /* massimo numero di elementi */ int vet[max_ele]; /* array che ospita la sequenza */ void gestionesequenza(void); int immissione(void); void ordinamento(void); int ricerca(void); int ricbin(void); void visualizzazione(void); int n, ele; int gestionesequenza(); void gestionesequenza() int scelta = -1; char invio; int posizione; while(scelta!= 0) printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("\t\t\t GESTIONE SEQUENZA"); printf("\n\n\n\t\t\t 1. Immissione"); printf("\n\n\t\t\t 2. Ordinamento"); printf("\n\n\t\t\t 3. Ricerca completa"); printf("\n\n\t\t\t 4. Ricerca binaria"); printf("\n\n\t\t\t 5. Visualizzazione"); printf("\n\n\t\t\t 0. Fine"); printf("\n\n\n\t\t\t\t Scegliere una opzione: "); scanf("%d", &scelta); scanf("%c", &invio); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); switch(scelta) case 1: n = immissione(); case 2: ordinamento(); case 3: printf("elemento da ricercare: "); scanf("%d", &ele);

scanf("%c", &invio); posizione = ricerca(); if(ele == vet[posizione]) printf("\nelem. %d presente in posizione %d\n", ele, posizione); else printf("\nelemento non presente!\n"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); case 4: printf("elemento da ricercare: "); scanf("%d", &ele); scanf("%c", &invio); posizione = ricbin(); if(posizione!= -1) printf("\nelem. %d presente in posizione %d\n", ele, posizione); else printf("\nelemento non presente!\n"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); case 5: visualizzazione(); int immissione() int i, n; do printf("\nnumero elementi: "); scanf("%d", &n); while (n < 1 n > MAX_ELE); for(i = 0; i < n; i++) printf("\nimmettere un intero n.%d: ",i); scanf("%d", &vet[i]); return(n); void ordinamento() int i, p, k, n1; int aux; p = n; n1 = p; do k = 0; for(i = 0; i < n1-1; i++) if(vet[i] > vet[i+1]) aux = vet[i]; vet[i] = vet[i+1]; vet[i+1] = aux; k = 1; p = i + 1;

n1 = p; while (k == 1 && n1>1); /* Ricerca sequenziale */ int ricerca () int i; i = 0; while (ele!= vet[i] && i < n-1) ++i; return(i); /* ricerca binaria */ int ricbin() int i, alto, basso, pos; alto = 0; basso = n - 1; pos = -1; do i = (alto+basso)/2; if(vet[i] == ele) pos = i; else if(vet[i] < ele) alto = i + 1; else basso = i - 1; while(alto <= basso && pos == -1); return(pos); void visualizzazione() int i; char invio; for(i = 0; i < n; i++) printf("\n%d", vet[i]); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); 8 int immissione() int i, n; do printf("\nnumero elementi (si accettano solo numeri pari): "); scanf("%d", &n); while (n < 1 (n%2)!=0 n > MAX_ELE); for(i = 0; i < n; i++) printf("\nimmettere un intero n: %d: ",i); scanf("%d", &vet[i]);

return(n); 9 int immissione() int i, n; do printf("\nnumero elementi: "); scanf("%d", &n); while (n < 1 n > MAX_ELE); for(i = 0; i < n; i++) do printf("\nimmettere un intero n (nell'intervallo -20 +100): %d: ",i); scanf("%d", &vet[i]); while(vet[i]<-20 vet[i]>100); return(n);

Capitolo 13 3 /* Concatenazione di dei primi n caratteri di una stringa su di un'altra con strcat */ #include <string.h> char frase[160] = "Analisi, requisiti"; char dimmi[80]; int i; for(i=0; ((dimmi[i]=getchar())!='\n') && (i<80); i++) ; dimmi[i] = '\0'; strncat(frase, dimmi, 5); printf("%s \n", frase); 4 /* Confronto dei primi n caratteri di due stringhe con strncmp */ #include <string.h> char prima[160] = "Analisi, requisiti"; char seconda[80]; int i, x; for(i=0; ((seconda[i]=getchar())!='\n') && (i<80); i++) ; seconda[i]='\0'; if((x=(strncmp(prima, seconda, 5)))==0) printf("sono uguali\n"); else if(x>0) printf("la prima e' maggiore della seconda\n"); else printf("la seconda e' maggiore della prima\n");

Capitolo 14 1 /* Scansione e visualizzazione di un array di interi */ int a[5] = 1, 2, 3, 4, 5 ; int i, *p; p = a; printf("gli elementi del vettore sono:\n\n"); for (i = 0; i <= 4; i++) printf("a[%d] = %d\n", i, *p++); 2 /* Scansione e visualizzazione di un array di stringhe */ char *vet[] = "Messaggio #1\n", "Messaggio #2\n", "Messaggio #3\n", "Messaggio #4\n", "Messaggio #5\n", NULL ; char **p = vet; while(*p!= NULL) printf("%s", *p++); 3 /* Funzione che ritorna il puntatore alla prima occorrenza della stringa t in s */ char *strinstr(char *s, char *t) char *v; while(*s!= '\0') if(*s == *t) for(v = t; *s == *v;) if(*++v == '\0') return(s (v t)+1); if(*s++ == '\0') return(null); else s++; return(null); 4

/* versione 1 che usa gli array*/ strcop( char s[], char t[]) int i=0; while ((s[i] = t[i])!= '\0') i++; /*versione 1.1 che usa i puntatori*/ strcop(char *s, char *t) while ((*s = *t)!= '\0') s++; t++; /* versione 2 */ strcop(char *s, char *t) while ((*s++ = *t++)!= '\0') ; /* versione 3 */ strcop(char *s, char *t) while (*s++ = *t++); La migliore è la versione 3, anche se abbastanza criptica al primo impatto. 5 #include <malloc.h> char *s; int n; printf("inserire dimensione del buffer : "); scanf("%d", &n); s = (char*) malloc(n+1);... 6 /* Esempio di uso di memcpy */ #include <string.h> int main () char cifre[]="1234567890"; char decimali[10]; char pausa; memcpy (decimali, cifre, 4); decimali[4]='\0'; printf ("decimali: %s\n", decimali); scanf("&c", pausa); Se non si inserisce nella giusta posizione il carattere di fine stringa:

decimali[4]='\0'; l istruzione printf ("decimali: %s\n", decimali); visualizza ulteriori caratteri dopo 1234. Vediamo una soluzione alternativa. /* II Esempio di uso di memcpy */ #include <string.h> int main () char cifre[]="1234567890"; char decimali[10]; char pausa; int i; memcpy (decimali, cifre, 4); printf ("decimali: "); for(i=0;i<4;i++) printf ("%c", decimali[i]); printf ("\n"); scanf("&c", pausa); 7 /* Esempio di uso di memmove */ #include <string.h> int main () char y[100]= "1234567890"; char pausa; printf ("Prima: %s\n", y); memmove(y+4, y, 4); printf ("Dopo: %s\n", y); scanf("&c", pausa); 8 /* Esempio di uso di memcmp */ #include <string.h> int main () char uno[]= "santo"; char due[]= "santi"; int r; char pausa; r=memcmp(uno, due, strlen(uno)); if(r>0) printf ("%s maggiore di %s", uno, due); else printf ("%s maggiore di %s", due, uno); scanf("&c", pausa); 9 /* Esempio di uso di memchr */ #include <string.h>

int main () char numero[]= "1 2 3"; char cifra = '2'; char pausa; char * p; p = (char*) memchr(numero, cifra, strlen(numero)); if(p!= NULL) printf ("%c presente in %s in posizione %d", cifra, numero, p-numero+1); else printf ("%c non presente in %s", cifra, numero); scanf("&c", pausa); L istruzione: p = (char*) memchr(numero, cifra, strlen(numero)); effttua un cast, cioè una confersione del valore restituito da memchr in un puntatore a char come si vedrà nei capitoli successivi. 10 /* Esempio di uso di memset */ #include <string.h> int main () char cifre[]="1234567890"; char cifra = '9'; char pausa; char * p; printf ("Prima: %s\n", cifre); memset(cifre, cifra, 2); printf ("Dopo: %s", cifre); scanf("&c", pausa);

Caso di studio II 1 /* Fusione di due sequenze ordinate */ #define MAX_ELE 1000 int immissione(int *); void ordinamento(int, int *); void visualizzazione(int, int *); void merge(int, int *, int, int *, int *); int vet1[max_ele]; /* prima sequenza */ int vet2[max_ele]; /* seconda sequenza */ int vet3[max_ele*2]; /* merge */ int n; /* lunghezza prima sequenza */ int m; /* lunghezza seconda sequenza */ n = immissione(vet1); m = immissione(vet2); ordinamento(n, vet1); ordinamento(m, vet2); merge(n, vet1, m, vet2, vet3); visualizzazione(n, vet1); visualizzazione(m, vet2); visualizzazione(n+m, vet3); int immissione(int *vet) int i, n; do printf("\nnumero elementi: "); scanf("%d", &n); while (n < 1 n > MAX_ELE); for(i = 0; i < n; i++) printf("\nimmettere un intero n.%d: ",i); scanf("%d", &vet[i]); return(n); void ordinamento(int n, int *vet) int i, p, k, n1; int aux; p = n; n1 = p; do k = 0; for(i = 0; i < n1-1; i++) if(vet[i] > vet[i+1]) aux = vet[i]; vet[i] = vet[i+1]; vet[i+1] = aux;

k = 1; p = i + 1; n1 = p; while (k == 1 && n1>1); void visualizzazione( int n, int *vet) int i; char invio; for(i = 0; i < n; i++) printf("\n%d", vet[i]); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); /* Fusione delle due sequenze (merge) */ void merge( int n, int *vet1, int m, int *vet2, int *vet3) int i = 0, j = 0, k = 0; do if(vet1[i]<=vet2[j]) vet3[k++] = vet1[i++]; else vet3[k++] = vet2[j++]; while(i<n && j<m); if(i<n) for(; i<n; vet3[k++] = vet1[i++]) ; else for(; j<m; vet3[k++] = vet2[j++]) ; 2 /* Fusione di piu sequenze ordinate */ #define MAX_ELE 1000 int immissione(int *); void ordinamento(int, int *); void visualizzazione(int, int *); void merge(int, int *, int, int *, int *); int vet1[max_ele]; /* prima sequenza */ int vet2[max_ele]; /* seconda sequenza */ int vet3[max_ele*2]; /* altri merge */ int n; /* lunghezza prima sequenza */ int m; /* lunghezza seconda sequenza */ int i, altrovettore; n = immissione(vet1); m = immissione(vet2);

ordinamento(n, vet1); ordinamento(m, vet2); merge(n, vet1, m, vet2, vet3); visualizzazione(n, vet1); visualizzazione(m, vet2); visualizzazione(n+m, vet3); do m = n+m; n = immissione(vet1); ordinamento(n, vet1); for(i = 0; i < m; i++) vet2[i] = vet3[i]; merge(n, vet1, m, vet2, vet3); visualizzazione(n, vet1); visualizzazione(m, vet2); visualizzazione(n+m, vet3); printf("\nse vuoi immettere un altro vettore scrivi 1 altrimeni 0: ", altrovettore); scanf("%d", &altrovettore); while (altrovettore > 0); int immissione(int *vet) int i, n; do printf("\nnumero elementi: "); scanf("%d", &n); while (n < 1 n > MAX_ELE); for(i = 0; i < n; i++) printf("\nimmettere un intero n.%d: ",i); scanf("%d", &vet[i]); return(n); void ordinamento(int n, int *vet) int i, p, k, n1; int aux; p = n; n1 = p; do k = 0; for(i = 0; i < n1-1; i++) if(vet[i] > vet[i+1]) aux = vet[i]; vet[i] = vet[i+1]; vet[i+1] = aux; k = 1; p = i + 1; n1 = p; while (k == 1 && n1>1); void visualizzazione( int n, int *vet)

int i; char invio; for(i = 0; i < n; i++) printf("\n%d", vet[i]); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); /* Fusione delle due sequenze (merge) */ void merge( int n, int *vet1, int m, int *vet2, int *vet3) int i = 0, j = 0, k = 0; do if(vet1[i]<=vet2[j]) vet3[k++] = vet1[i++]; else vet3[k++] = vet2[j++]; while(i<n && j<m); if(i<n) for(; i<n; vet3[k++] = vet1[i++]) ; else for(; j<m; vet3[k++] = vet2[j++]) ; 3 /* Modifica del programma di gestione seguenza del caso di Studio II, per impedire la ricerca binaria nel caso che la sequenza non sia stata ancora ordinata. */ #define MAX_ELE 1000 /* massimo numero di elementi */ void gestionesequenza(void); int immissione(int *); void ordinamento(int, int *); int ricerca(int, int, int *); int ricbin(int, int, int *); void visualizzazione(int, int *); int ordinato = 0; gestionesequenza(); void gestionesequenza() int sequenza[max_ele]; /* array che ospita la sequenza */ int n; int scelta = -1; char invio; int ele, posizione;

while(scelta!= 0) printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("\t\t\t GESTIONE SEQUENZA"); printf("\n\n\n\t\t\t 1. Immissione"); printf("\n\n\t\t\t 2. Ordinamento"); printf("\n\n\t\t\t 3. Ricerca completa"); printf("\n\n\t\t\t 4. Ricerca binaria"); printf("\n\n\t\t\t 5. Visualizzazione"); printf("\n\n\t\t\t 0. fine"); printf("\n\n\n\t\t\t\t Scegliere una opzione: "); scanf("%d", &scelta); scanf("%c", &invio); printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); switch(scelta) case 1: n = immissione(sequenza); case 2: ordinamento(n, sequenza); case 3: printf("elemento da ricercare: "); scanf("%d", &ele); scanf("%c", &invio); posizione = ricerca(n, ele, sequenza); if(ele == sequenza[posizione]) printf("\nelem. %d presente in posizione %d\n", ele, posizione); else printf("\nelemento non presente!\n"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); case 4: if (ordinato == 0) printf("\ricerca binaria non applicabile! \n"); printf("\nl arrai deve essere ordinato. \n"); else printf("elemento da ricercare: "); scanf("%d", &ele); scanf("%c", &invio); posizione = ricbin(n, ele, sequenza); if(posizione!= -1) printf("\nelem. %d presente in posizione %d\n", ele, posizione); else printf("\nelemento non presente!\n"); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); case 5: visualizzazione(n, sequenza); int immissione(int *vet)

int i, n; ordinato = 0; do printf("\nnumero elementi: "); scanf("%d", &n); while (n < 1 n > MAX_ELE); for(i = 0; i < n; i++) printf("\nimmettere un intero n.%d: ",i); scanf("%d", &vet[i]); return(n); void ordinamento(int n, int *vet) int i, p, k, n1; int aux; p = n; n1 = p; do k = 0; for(i = 0; i < n1-1; i++) if(vet[i] > vet[i+1]) aux = vet[i]; vet[i] = vet[i+1]; vet[i+1] = aux; k = 1; p = i + 1; n1 = p; while (k == 1 && n1>1); ordinato = 1; /* Ricerca sequenziale */ int ricerca(int n, int ele, int *vet) int i; i = 0; while (ele!= vet[i] && i < n-1) ++i; return(i); /* ricerca binaria */ int ricbin(int n, int ele, int *vet) int i, alto, basso, pos; alto = 0; basso = n - 1; pos = -1; do i = (alto+basso)/2; if(vet[i] == ele) pos = i; else if(vet[i] < ele) alto = i + 1;

else basso = i - 1; while(alto <= basso && pos == -1); return(pos); void visualizzazione( int n, int *vet) int i; char invio; for(i = 0; i < n; i++) printf("\n%d", vet[i]); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); 4 La soluzione che diamo esegue quanto richiesto dal problema: creazione e uso delle funzioni di immissione di matrici, calcolo della matrice prodotto e visualizzazione delle matrici. In questo modo si osserva il riuso delle funzioni su matrici diverse e il passaggio del parametro array bidimensionale. La soluzione non è pero completa in quanto non presenta il menu per porter ripetere l immissione delle matrici. La gestione del menu viene presentata in numerosissimi esercizi e soluzioni del libro e in questo caso la lasciamo al lettore. /* Calcolo del prodotto di due matrici con l'uso di funzioni */ #define MAX_ELE 10 #define N MAX_ELE #define P MAX_ELE #define M MAX_ELE void immissionematrice(int, int, int [MAX_ELE][MAX_ELE]); void prodottomatrici(int, int, int, int [MAX_ELE][MAX_ELE], int [MAX_ELE][MAX_ELE], int [MAX_ELE][MAX_ELE]); void visualizzazionematrice(int, int, int [MAX_ELE][MAX_ELE]); int mat1[n][p]; /* prima matrice */ int mat2[p][m]; /* seconda matrice */ int pmat[n][m]; /* matrice prodotto */ int n, m, p; char invio; do printf("\nnumero di righe prima matrice: "); scanf("%d", &n); while (n < 1 n > MAX_ELE); do

printf("\nnumero di colonne prima matrice / righe della seconda: "); scanf("%d", &p); while (p < 1 p > MAX_ELE); do printf("\nnumero di colonne della seconda matrice: "); scanf("%d", &m); while (m < 1 m > MAX_ELE); immissionematrice(n, p, mat1); immissionematrice(p, m, mat2); prodottomatrici(n, m, p, mat1, mat2, pmat); visualizzazionematrice(n, p, mat1); visualizzazionematrice(p, m, mat2); visualizzazionematrice(n, m, pmat); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); scanf("%c", &invio); void immissionematrice(int righe, int colonne, int mat[max_ele][max_ele]) int i, j; printf("\n \n CARICAMENTO MATRICE \n \n"); for(i=0; i<righe; i++) for(j=0; j<colonne; j++) printf("inserisci linea %d colonna %d val:", i, j); scanf("%d", &mat[i][j]); ; void prodottomatrici(int n, int m, int p, int mat1[max_ele][max_ele], int mat2[max_ele][max_ele], int pmat[max_ele][max_ele]) int i = 0, j = 0, k = 0; for(i=0; i<n; i++) for(j=0; j<m; j++) pmat[i][j] = 0; for(k=0; k<p; k++) pmat[i][j] = pmat[i][j] + mat1[i][k] * mat2[k][j]; ; void visualizzazionematrice(int righe, int colonne, int mat[max_ele][max_ele]) int i, j; printf("\n \n VISUALIZZA MATRICE \n "); for(i=0; i<righe; i++) printf("\n"); for(j=0; j<colonne; j++) printf("%5d", mat[i][j]); 5

Come per il precedente esercizio la soluzione che riportiamo non presenta il menu per porter ripetere l immissione della matrice e la ricerca di un elemento che lasciamo al lettore. /* Ricerca di un elemento in una matrice bidimensionale con l'uso di funzioni */ #define MAX_ELE 10 #define N MAX_ELE #define M MAX_ELE void immissionematrice(int, int, int [MAX_ELE][MAX_ELE]); void ricercaelementonellamatrice(int, int, int [MAX_ELE][MAX_ELE]); void visualizzazionematrice(int, int, int [MAX_ELE][MAX_ELE]); int mat1[n][m]; /* prima matrice */ int n, m; char invio; do printf("\nnumero di righe: "); scanf("%d", &n); while (n < 1 n > MAX_ELE); do printf("\nnumero di colonne: "); scanf("%d", &m); while (m < 1 m > MAX_ELE); immissionematrice(n, m, mat1); ricercaelementonellamatrice(n, m, mat1); visualizzazionematrice(n, m, mat1); printf("\n\n Premere Invio per continuare..."); scanf("%c", &invio); scanf("%c", &invio); void immissionematrice(int righe, int colonne, int mat[max_ele][max_ele]) int i, j; printf("\n \n CARICAMENTO MATRICE \n \n"); for(i=0; i<righe; i++) for(j=0; j<colonne; j++) printf("inserisci linea %d colonna %d val:", i, j); scanf("%d", &mat[i][j]); ; void ricercaelementonellamatrice(int n, int m, int mat[max_ele][max_ele]) int i = 0, j = 0, ele, trovato; printf("\nelemento da ricercare: ");