Stesura informale dell algoritmo: (lasciata come esercizio)

Documenti analoghi
Esempio: quanto mi piace questo corso! qufuafantofo mifi pifiafacefe qufuefestofo coforsofo!

Caratteri e stringhe

HOMEWORKS. in modo che il programma stampi N ripetizioni della stringa HelloWorld (su righe diverse), con N inserito dall utente.

Fondamenti di Informatica T-1 Modulo 2

#include <iostream> using namespace std; // int main ( ) { // --- Dichiarazione delle variabili int N ; float A, Pot;

INFORMATICA. Strutture iterative

Soluzione/* PROGRAMMAZIONE IN C */ #include <stdio.h> #include <stdlib.h>

Algoritmi e basi del C Struttura di un programma

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

Rappresentazione binaria delle variabili (int e char)

Corso di Fondamenti di Informatica

Corso di Fondamenti di Informatica Classi di istruzioni 2

a.a Codice corso: 21012, HOMEWORKS

Implementazione dell albero binario in linguaggio C++

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

Strutture di iterazione

Esercitazione 6. Array

Fondamenti di Informatica T-1 Modulo 2

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Algoritmi e basi del C

Rappresentazione degli algoritmi

ESERCIZIO n. 1. Soluzione: (Uso dei vettori) #include <iostream.h> #include <stdlib.h> #define MAXLEN 100. int main( ) {

STRUTTURE DI CONTROLLO DEL C++

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

a.a Codice corso: 21012, 22010

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Stringhe e allocazione dinamica della memoria

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 06 Array" Lab06 1

Esercitazione 4. Comandi iterativi for, while, do-while

Informatica! Appunti dal laboratorio 1!

La Rappresentazione dell Informazione

Esercizi. Stringhe. Stringhe Ricerca binaria

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Caratteri e stringhe Esercizi risolti

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

Alcuni esercizi. 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli

INTRODUZIONE ALLA PROGRAMMAZIONE

ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 21 Gennaio 1998

Codifica. Rappresentazione di numeri in memoria

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi terza

Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software

Programmazione a blocchi. Algobuild Prof. Sergio Roselli

Tipi di dato, Alessandra Giordani Lunedì 7 maggio 2011

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Introduzione Il costrutto if...else Il costrutto while Altri costrutti

Pr1: determinare il maggiore di n numeri interi n. Fondamenti di Informatica Prof. Vittoria de Nitto Personè

Fondamenti di Informatica

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

Informatica/ Ing. Meccanica/ Prof. Verdicchio/ 13/09/2013/ Foglio delle domande/versione 1

Elaborazione dell informazione

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

Strutture di iterazione

Esercitazione 11. Liste semplici

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Linguaggio C - Array. Array: tipo nome_array[num_elementi]

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Introduzione alle stringhe e algoritmi collegati

in termini informali: un algoritmo è una sequenza ordinata di operazioni che risolve un problema specifico

Le strutture di controllo in C++

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

Laboratorio di Programmazione Laurea in Bioinformatica

C espressioni condizionali

Istruzioni semplici e strutturate

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

Laboratorio di Programmazione I Compitino (Vers. C)

Introduzione al Linguaggio C

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Laboratorio di programmazione

#include <iostream.h> #include <stdlib.h> int main(){ return 0;

Somma di numeri binari

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Elementi di C++ di base

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria.

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Le Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Istruzioni iterative (o cicliche)

5 Stringhe. Esiste una libreria di C che gestisce le stringhe string.h essa ci permette di:

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

Esercizi di programmazione in C

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Costanti e Variabili

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Le funzioni, e le istruzioni di input/output

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Algoritmi, Strutture Dati e Programmi. UD 1.d: Dati e Tipi di Dato

Matlab. Istruzioni condizionali, cicli for e cicli while.

Rappresentazione di Numeri Reali. Rappresentazione in virgola fissa (fixed-point) Rappresentazione in virgola fissa (fixed-point)

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

modificato da andynaz Cambiamenti di base Tecniche Informatiche di Base

La selezione binaria

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

Programmazione Procedurale in Linguaggio C++

Stringhe. Concetti chiave

Esercizio 1 (15 punti)

Dall analisi alla codifica (1)

Transcript:

ESERCIZIO 1 Dato un numero positivo Q, scrivere la sua rappresentazione in binario naturale, applicando il tradizionale algoritmo per divisioni successive (l output sarà inteso corretto se letto da destra a sinistra) e indicando anche il minimo numero di bit utilizzato. Es: Input: 19 in decimale, Output: (LSB) 11001 (MSB) in binario. (Costrutti iterativi + uso di contatori e accumulatori + Algoritmi) Stesura informale dell algoritmo: (lasciata come esercizio) #include <iostream.h>/*inclusione della libreria standard */ int main( ) int n; /* contatore */ int Q; /* variabile per il numero letto da tastiera */ /* ciclo di controllo per l'immissione dati che garantisce Q>0 */ do cout << \ninserisci un numero positivo Q: "; cin >> Q; while (Q <= 0); cout << "\nin binario: "; n = 0; do n = n+1; cout << (Q % 2); Q = Q / 2; while (Q!= 0); cout << "\nnumero di bit n = << n; system( PAUSE ); 15 ottobre 2007 26 ottobre 2007 Pagina 1 di 13

ESERCIZIO 2 (Approfondimento Costrutti iterativi + uso di contatori + uso accumulatori + Algoritmi) Dato un numero positivo Q, scrivere la sua rappresentazione in binario naturale, indicando anche il minimo numero di bit utilizzato. Il programma dovrà esibire un comportamento come nell'esempio seguente: Input: 19 in decimale, Output: con 5 bit = 10011 in binario. 1ma idea di soluzione #include <iostream.h> int main () unsigned int Q, Qaux, current, i, n; cout << "\n Numero intero Q = "; cin >> Q; Qaux = Q; n = 0; do Qaux = Qaux / 2; n++; while (Qaux!= 0); cout << "\n Codifica di Q = " << Q; cout << "con " << n << " bit = " ; for (current = n; current >0; current--) Qaux = Q; for (i=1; i < current; i++) Qaux = Qaux / 2; cout << Qaux % 2; system("pause"); 2da: Idea di soluzione: #include <iostream.h> int main() unsigned int dec, Q, n,pot; cout << "\n Numero intero Q > 0 = "; cin >> Q; dec = Q%2; Q = Q/2; n=1; pot = 1; while (Q > 0) pot = pot *10; dec = dec + (Q%2)*pot; cout << "\n dec = " << dec; Q = Q / 2 ; n = n + 1 ; cout << "\nnum. decimale che emula la sequenza di bit voluta:"; cout << dec << "\nlunghezza in bit = " << n; system("pause"); 15 ottobre 2007 26 ottobre 2007 Pagina 2 di 13

3za: Idea di soluzione: se Q = q n-1 2 n-1 +q n-2 2 n-2 + +q 1 2+q 0, posso confrontare Q con le successive potenze di 2: 1,2,2 2,2 4, finché risulta Q >= 2 j. Quando si verificherà la condizione per cui Q < 2 n, l esponente di tale potenza sarà proprio il numero di bit necessario a rappresentare Q. Osservando che: q n-1 = 1 perché per costruzione Q >= 2 n-1, rappresentato su n bit q n-2 = 1 sse (Q - q n-1 2 n-1 ) >= 2 n-2 altrimenti q n-2 = 0 q n-3 = 1 sse (Q - q n-1 2 n-1 - q n-2 2 n-2 ) >= 2 n-3 altrimenti q n-3 = 0 q 0 = 1 sse (Q-q n-1 2 n-1 - q n-2 2 n-2 - - q 1 2 1 ) >= 1 altrimenti q 0 = 0 la stesura informale dell algoritmo risolutore del problema proposto, può scriversi come segue: 1. inizio programma 2. leggi il numero intero Q da convertire 3. inizializza un contatore n al valore 0 4. inizializza un accumulatore d, per le potenze di 2, al valore 1 5. Finché ( il numero da convertire è >= d ) esegui 5.1. incrementa di uno il contatore n 5.2. moltiplica per 2 la variabile d 5.3. torna a 5. 6. stampa a video il valore della variabile n 7. inizializza un contatore i con n-1 8. Finché (i >=0 ) esegui 8.1. dividi per 2 la variabile d 8.2. se (Q >= d ) allora 8.2.1. stampa a video un carattere 1 8.2.2. assegna a Q il valore Q-d 8.3. altrimenti stampa a video il carattere 0 8.4. decrementa di 1 il contatore i 8.5. torna a 4. 9. Fine programma 15 ottobre 2007 26 ottobre 2007 Pagina 3 di 13

#include <iostream.h> /* inclusione della libreria standard */ int main( ) int i,d,n; /* contatore */ int Q; /* variabile per il numero letto da tastiera */ /* ciclo di controllo per l'immissione dati che garantisce Q>0 */ do cout << "\n Inserisci un numero positivo Q: "; cin >> Q; while (Q <= 0); n = 0; d = 1; while (Q >= d) n = n+1; d = d*2; /* d contiene la piu' piccola potenza di 2 maggiore di Q */ /* n ha il valore dell'esponente della potenza di 2 */ /* memorizzata in d e coincide con il numero di bit */ /* minimo per rappresentare Q. */ /* n-1 è il */ /* valore dell esponente più significativo presente nella */ /* rappresentazione binaria del numero Q. */ /* Infatti Q = 2^(n-1) + */ cout << "\n << Q << in decimale, con << n << bit = ",Q,n; i = n-1; while(i >= 0) d = d / 2; if (Q >= d) cout << "1"; Q = Q - d; else cout << "0"; i = i-1; system( PAUSE ); 15 ottobre 2007 26 ottobre 2007 Pagina 4 di 13

ESERCIZIO 3 (Manipolazione di caratteri) Si scriva un programma in linguaggio C che risolva il problema seguente. Ricevere dallo standard input due caratteri alfabetici, convertirli in maiuscolo e stampare a video ordinatamente tutti i caratteri dell'alfabeto fra essi compresi, estremi inclusi. Esempio: dati 'g' e 'M' stampa a video la sequenza: GHIJKLM. Stesura informale dell'algoritmo Ricordando che nella tabella ASCII si hanno le seguenti corrispondenze tra i caratteri alfanumerici e le loro codifiche: '0' - '9' : 48-57 'A' - 'Z' : 65-90 'a' - 'z' : 97-122 seguendo quanto richiesto nella traccia del problema è possibile formulare la soluzione come segue: 1. inizio programma 2. leggere due caratteri alfabetici in due variabili x, y 3. converte in maiuscolo i caratteri inseriti 4. se (x > y) allora scambia il valore delle due variabili 5. inizializza un contatore i con il valore del codice ASCII del carattere x 6. finché il contatore è minore o uguale al codice ASCII del carattere y 6.1 stampa il carattere con codice ASCII uguale al valore del contatore 7. fine programma 15 ottobre 2007 26 ottobre 2007 Pagina 5 di 13

#include <iostream.h> /* inclusione della libreria standard */ int main( ) /* dichiarazione variabili */ char x,y; /* variabili per memorizzare i dati in ingresso */ char t; /* variabile ausiliaria utilizzata per scambiare*/ /* i valori di due variabili. */ int i; /* contatore */ /* ciclo per il controllo dell'acquisizione dati */ do cout << \n Inserisci il carattere alfabetico x: "; cin >> x; while (! ((x >= 'a')&&(x <= 'z') (x >= 'A')&&(x <= 'Z')) ); /* converte il carattere x nel corrispondente maiuscolo */ if ((x >= 'a')&&(x <= 'z')) x = x - ('a'-'a'); /* ciclo per il controllo dell'acquisizione dati */ do cout << \n Inserisci il carattere alfabetico y: "; cin >> y; while (!(((y >= 'a')&&(y <= 'z')) ((y >= 'A')&&(y <= 'Z')))); /* converte il carattere y nel corrispondente maiuscolo */ if ((y >= 'a')&&(y <= 'z')) y = y - ('a'-'a'); /* ordina i due caratteri x,y in ordine crescente */ if (x > y) t = x; x = y; y = t; cout << "\n La sequenza di caratteri richiesta e': "; i = (int) x; while (i <= (int) y) cout << (char)i; i = i+1; system( PAUSE ); 15 ottobre 2007 26 ottobre 2007 Pagina 6 di 13

ESERCIZIO 4 Si scriva un programma in linguaggio C che risolva il problema seguente. Leggere una sequenza di caratteri alfanumerici dallo standard input terminata dal carattere 0 ; quindi stampare sullo standard output la media dei numeri interi corrispondenti ai caratteri numerici inseriti. Esempio: input: A b C 1 F 4 G T 6 Y 6 3 s 0 output: media = 4 Soluzione: (Manipolazione caratteri) #include <iostream.h> /* inclusione della libreria standard */ int main( ) /* dichiarazione variabili */ char c; int accumulator; int count; float mean; /* ciclo per il controllo dell'acquisizione dati */ accumulator = 0; count = 0; do cout << "\n Inserisci un carattere: "; cin >> c; if ((c >= '1')&&(c <= '9')) accumulator = accumulator + ((int)c 48); count = count + 1; while (c!= 0 ); if (count > 0) mean = ((float)accumulator) / ((float)count); cout << "\n media = " << mean; else cout << "\n non ci sono caratteri numerici!"; system( PAUSE ); /* end main */ 15 ottobre 2007 26 ottobre 2007 Pagina 7 di 13

ESEMPI DI PROGRAMMI IN C USANDO GLI ARRAY ESERCIZIO 1 Realizzare un programma che legga 10 caratteri, uno alla volta, memorizzandoli progressivamente in un array di caratteri da 10 posizioni. Una volta terminata la sequenza di introduzione, il programma deve stampare in ordine inverso, uno alla volta e di seguito, i caratteri introdotti, dopodiché termina. #include <iostream.h> #define NCAR 10 int main() int i; char c, parola[ncar]; for (i = 0; i < NCAR; i++) cout << "\ninserire il carattere n. << i + 1 << ; cin >> parola[i]; cout << endl << endl ; for (i = NCAR - 1; i >=0; i--) cout << parola[i]; system( PAUSE ); cout << "\n\nfine ELABORAZIONE ---------------------------\n\n"; 15 ottobre 2007 26 ottobre 2007 Pagina 8 di 13

ESERCIZIO 2 Realizzare un programma che legga una stringa lunga al massimo 100 caratteri. Una volta terminata l introduzione, il programma deve stampare la lunghezza della stringa, il numero di vocali contenute nella stringa e la stringa stessa al contrario. #include <iostream.h> #include <string.h> #define MAXLEN 100 + 1 // evidenzio il fatto che per contenere una stringa di 100 caratteri // una array di char deve avere 101 elementi in modo da accogliere anche // il carattere di terminazione della stringa ("\0") int main() int i, len, nvoc; char frase[maxlen]; cout << "\ninserire una frase (massimo 100 caratteri):\n"; cin.getline(frase,maxlen,'\n'); // converte il '\n' in '\0' automaticamente len = strlen(frase); //cin.getline ( char buffer [], int length, char delimiter = ' \n'); nvoc = 0; for (i = 0; i < len; i++) switch (frase[i])//è certamente possibile utilizzare una istruzione if, // sebbene la sua espressione condizionale risulti relativamente complessa. case 'a':// Provare a implementare questa parte con una istruzione if case 'A': case 'e': case 'E': case 'i': case 'I': case 'o': case 'O': case 'u': case 'U': nvoc++; break; cout << "\n\nla frase e' lunga << len << caratteri."; cout << "\nla frase contiene << nvoc << vocali."; cout << "\nla frase invertita e':\n"; // In questa versione la stringa viene semplicemente stampata al contrario. // Una soluzione più interessante prevede l'inversione in loco della stringa // e la sua successiva stampa tramite una semplice cout << frase; // Si lascia come esercizio l'individuazione di un algoritmo che inverta sul // posto la stringa contenuta nell'array frase[maxlen]. for (i = len - 1; i >= 0; i--) cout << frase[i]; system( PAUSE ); cout << "\n\nfine ELABORAZIONE ---------------------------\n\n"; 15 ottobre 2007 26 ottobre 2007 Pagina 9 di 13

ESERCIZIO 3 Scrivere un programma in linguaggio C che risolva il problema seguente. Leggere un polinomio di grado n a coefficienti reali e valutarlo in un dato punto x. Idea di soluzione: Il primo modo che sicuramente si può individuare è quello di sostituire ad x un certo valore, valutare le diverse potenze di x e moltiplicare per il corrispettivo coefficiente accumulando man mano il risultato in una variabile. Si suppone di leggere i coefficienti del polinomio ordinatamente da quello di grado massimo a quello di grado nullo nelle celle di un vettore a partire dalla prima (cella 0). Es: n = 3, f(x) = 3x 3 + 5x 2 + 2x + 1 lo rappresento come V = < 3, 5, 2, 1> Iniziando a leggere il polinomio dal termine noto, quindi dall ultimo elemento del vettore (avrà n+1 elementi) cioè dalla posizione n-esima, si ha: f(x) = a n x n + a n-1 x n-1 + + a 1 x+ a 0 = (a n x n + (a n-1 x n-1 + + (a 1 x+ (a 0 )) )) es: f(x) = 3x 3 + 5x 2 + 2x + 1 = ((((1) + 2x)+ 5x 2 ) + 3x 3 ) Al variare di un indice tra 0 e il grado del polinomio, si utilizzeranno due variabili accumulatore: Una, per costruire man mano il valore della potenza di x opportuna l altra usata per sommare man mano i valori parziali della f 1. legge n e il vettore V dallo standard input 2. legge x dallo standard input 3. f = 0; 4. pot = 1; 5. i = n; 6. finché (i >= 0) 6.1. f = V[i]*pot + f; 6.2. pot = pot * x 6.3. i = i - 1; 15 ottobre 2007 26 ottobre 2007 Pagina 10 di 13

#include <iostream.h> /* inclusione della libreria standard */ #define MAX_LEN 100 /* dichiarazione di costante simbolica */ int main ( ) float V[MAX_LEN]; float pot,f,x; int i,n; do cout << \ninserire il grado del polinomio, n = ; cin >> n; while ((n <= 0) (n >= MAX_LEN)); cout<< \ninserire i coeff. del pol. V_ << n << V_0: \n ; i = 0; do cin >> V[i]; i++; while (i<=n); cout << \ninserire il valore in cui valutare il polinomio,x = ); cin >> x; f = 0; pot = 1; for (i = n; i >=0; i--) f = f + V[i]*pot; pot = pot * x; cout << \n f( << x << ) = << f <<.\n ; system( PAUSE ) ; 15 ottobre 2007 26 ottobre 2007 Pagina 11 di 13

Un secondo metodo, più efficiente, che utilizza un minor numero di moltiplicazioni, consiste nell effettuare la valutazione secondo la seguente espressione: a n x n + a n-1 x n-1 + + a 1 + a 0 = ((((0*x+a n )x + a n-1 )x + a n-2 )x + + a 1 )x + a 0 3x 3 + 5x 2 + 2x + 1 = ((0x+3)x + 5)x + 2)x + 1 Nota: è così necessaria una sola variabile per sommare i risultati parziali, e si fanno esattamente n+1 moltiplicazioni (una per ogni coefficiente del polinomio). 1. legge n e il vettore V dallo standard input 2. legge x dallo standard input 3. f = 0; 4. i = 0; 5. finché (i <=n) 5.1 f = f*x + V[i]; 5.1 i = i + 1; 15 ottobre 2007 26 ottobre 2007 Pagina 12 di 13

#include <iostream.h> /* inclusione della libreria standard */ #define MAX_LEN 100 /* dichiarazione di costante simbolica */ int main ( ) float V[MAX_LEN]; float f,x; int i,n; do cout << \ninserire il grado del polinomio, n = ; cin >> n; while ((n <= 0) (n >= MAX_LEN)); cout<< \ninserire i coeff. del pol. V_ << n << V_0: \n ; i = 0; do cin >> V[i]; i++; while (i<=n); cout << \ninserire il valore in cui valutare il polinomio,x = ; cin >> x; f = 0; for (i = 0; i <=n; i++) f = f*x + V[i]; cout << \n f( << x << ) = << f <<.\n ; system( PAUSE ) ; 15 ottobre 2007 26 ottobre 2007 Pagina 13 di 13