ESERCITAZIONI: linguaggio C


pagine di Roberto Ricci L.S. "A. Righi", Bologna. Ultima revisione


 
 
 

Per iniziare


 
  1. Creare sul floppy A: con [Tasto Destro]Nuovo/Cartella una cartella dal nome lab4
  2. Salvare il corrente file in A: con il nome A:Es4
  3. Usare Riduci a icona per mettere da parte la finestra sul floppy senza chiuderla
  4. Aprire il file A:Es4.htm per leggere e seguire il resto dell'esercitazione
  5. Ridurre le dimensioni della finestra su A: che deve restare visibile ma consentire la visibilità di un'altra nuova finestra

 
 

Basi ottale e esadecimale

  1. Aprire l'ambiente TuboC++ facendo rapidamente doppio clic sull'icona presente sul Desktop
  2. ridimensionare la finestra in modo che sia visibile anche quella con il testo dell'esercitazione
  3. eventualmente aprire con File/New una finestra di editor
  4. redigervi un programma contenente le istruzioni seguenti, dichiarando opportunamente le variabili utilizzate:
    	printf("Inserisci un numero intero non negativo: ");
    	scanf("%d",&n);
    	printf("\n %o è lo stesso numero in base 8",n);
    	printf("\n %X è lo stesso numero in base 16",n);
    	printf("\n\nInserisci un numero intero non negativo in base 8: ");
    	scanf("%o",&k);
    	printf("  \n %d è lo stesso numero in base 10",k);
    	printf("\n\nInserisci un numero intero non negativo in base 16: ");
    	scanf("%X",&h);
    	printf("  \n %d è lo stesso numero in base 10",h);
    	printf("\n\nInserisci un numero intero non negativo in base 16: ");
    	scanf("%X",&l);
    	printf("  \n %o è lo stesso numero in base 8",l);
    	printf("\n\nInserisci un numero intero non negativo in base 8: ");
    	scanf("%o",&m);
    	printf("  \n %X è lo stesso numero in base 16",m);
    
  5. salvare con File/Save as..., compilare con , eventualmente correggere e salvare di nuovo con File/Save a compilazione corretta
  6. eseguire con
  7. ripetere l'esecuzione alcune volte anche per riflettere sul metodo di trasformazione tra queste diverse basi

 
 

Numerazione posizionale in base 10 e 2, ripetizione 'while'


 
  1. Base 10

    1. Redigere un programma contenente le istruzioni seguenti:
      int posiz;
      unsigned long int numero;
      unsigned long int quoz10;
      printf("Introduci un numero intero non negativo: ");
      scanf("%lu",&numero);
      quoz10 = numero;
      printf("\nSi evidenziera' la cifra che ha peso  10^n  con n=");
      scanf("%d",&posiz);
      for (int i=1; i<=posiz; i++){
      	 quoz10 = quoz10/10;
      }
      printf("\n La cifra che ha peso 10^%d del numero %lu e' %d",posiz, numero, quoz10 % 10);
      
    2. salvare, compilare con , eventualmente correggere e salvare di nuovo a compilazione corretta
    3. aprire con View/Watch la finestra di Watch, eventualmente selezionare con i tasti freccia e cancellare con il tasto [Canc] le variabili già presenti nella finestra, con Debug|Add watch inserire la variabile quoz10
    4. con Debug|Add watch inserire la variabile i
    5. eseguire con Debug/Step over F8 premendo il tasto [F8] per passare all'istruzione successiva
    6. Servirsi della struttura linguistica
      while ( <condizione> ) { 
      	<istruzioni>
      }
      
      per scrivere un programma che conta le cifre che compongono il numero, ovvero la sua lunghezza
    7. modificare il programma precedente in modo da visualizzare un numero nella forma c0*10^0+c1*10^1+c2*10^2+ ...
    8. Scrivere un programma che dato un numero intero lo riscriva rovesciato
  2. Gli operatori aritmetici disponibili tra numeri interi sono:
    Simbolo            operazione           ad esempio  
                                   
    +                    somma   
    -                    differenza   
    -                    opposto   
    *                    prodotto   
    /                    quoziente           5/3 vale 1   
    %                    modulo              5%3 vale 2
    
  3. Da base 2 a base 10

    1. Redigere il seguente programma che dato un numero intero con cifre 0 e 1 e lo trasforma in decimale
      # include <stdio.h>
      
      main(){
      	unsigned long int num2;
      	unsigned long  int pot2=1;
      	unsigned long int num10=0;
      	printf("Introduci un numero naturale binario : ");
      	scanf("%lu",&num2);
      	while (num2>0){
      		num10 = num10 + num2%10*pot2;
      		num2 = num2 / 10;
      		pot2 = 2*pot2;
      	}
      	printf("\nIn decimale equivale a %lu",num10);
      }
      
    2. salvare, compilare con , eventualmente correggere e salvare di nuovo a compilazione corretta
    3. aprire con View/Watch la finestra di Watch, eventualmente selezionare e cancellare le variabili già presenti nella finestra, con Debug|Add watch inserire la variabile num2 e ripetere per li variabili num10 e pot2
    4. eseguire con Debug/Step over
    5. modificarlo introducendo un controllo preliminare sulle cifre di num2: se ce ne sono diverse da 0 o 1 non eseguire il resto del programma
    6. aggiungere l'output di num10 in ottale e esadecimale

  4.  
  5. Da base 10 a base 2

    1. Redigere il seguente programma che dato un numero intero (non molto grande) lo riscrive in base 2
      
      # include <stdio.h>
      
      main(){
      	unsigned long int num2=0;
      	unsigned long int pot10=1;
      	unsigned int num10;
      	printf("Introduci un numero decimale : ");
      	scanf("%u",&num10);
      	while (num10>0){
      		num2 += num10%2*pot10;
      		num10 = num10 /2;
      		pot10 *=10;
      	}
      	printf("\nIn binario equivale a %lu",num2);
      }
      
    2. salvare, compilare con , eventualmente correggere e salvare di nuovo a compilazione corretta
    3. aprire con View/Watch la finestra di Watch, eventualmente selezionare e cancellare le variabili già presenti nella finestra, con Debug|Add watch inserire la variabile num2 e ripetere per li variabili num10 e pot10
    4. eseguire con Debug/Step over
    5. aggiungere l'output di num10 in ottale e esadecimale

 
 

Operazioni bit a bit (bitwise)


 
  1. Servirsi di Help|Contents|Cerca|bitwise operators del Turbo C per la descrizione, in particolare, degli operatori 'shift'. Analizzare a questo proposito il programma seguente e il suo risultato.
    # include <stdio.h>
    
    main(){
    	unsigned int shift;
    	printf("             decimale          ottale    esadecimale \n\n");
    	for (int i=0; i<17; i++){
    		shift = 1 << i;
    		printf("1 << %2d       %6u          %6o         %6X  \n",i, shift,shift,shift);
    	}
    }
    
  2. Analizzare il seguente programma:
    # include <stdio.h>
    
    main(){
    	unsigned int num=25;
    	unsigned int pot2=1;
    	for (int i=0; i<16; i++){
    		printf("%u & 2^%d = %d\n",num,i,num & pot2);
    		pot2 = pot2 << 1;
    	}
    }
    
  3. confrontare il precedente programma con il seguente:
    # include <stdio.h>
    
    main(){
    	unsigned int num;
    	unsigned int pot2_15= 1<<15;
    	printf("Introduci un numero intero positivo : ");
    	scanf("%u",&num);
    	printf("\n\n%u  = ",num);
    	for (unsigned int pot2=1; pot2 < pot2_15; pot2=pot2<<1)
    		printf("%u + ",num & pot2);
    	printf("%u ",num & pot2);
    }
    
  4. modificare uno dei precedenti programmi per ottenere ancora la codifica in binario di un numero decimale
  5. servirsi del seguente programma per analizzare l'operazione di somma binaria in binario
    # include <stdio.h>
    # define pot2_15 1<<15
    
    main(){
    
    	unsigned int num1,num2;
    
    	printf("Introduci un numero intero non negativo:  ");
    	scanf("%u",&num1);
    	printf(" --> ");
    	for (unsigned int pot2=pot2_15; pot2>0; pot2>>1)
    		printf("%u",(num1 & pot2)?1:0);
    
    	printf("\nIntroduci un altro numero intero non negativo:  ");
    	scanf("%u",&num2);
    	printf(" --> ");
    	for (pot2=pot2_15; pot2>0; pot2>>=1)
    		printf("%d",(num2 & pot2)?1:0);
     
    	printf("\n somma\n --> ");
    	for (pot2=pot2_15; pot2>0; pot2>>=1)
    		printf("%d",((num1 + num2) & pot2)?1:0);
    }
    
  6. Modificare il programma inserendo opportunamente la riga
    num2 = ~num2+1;
    
    per rappresentare la differenza binaria mediante la somma del primo numero con il complemento a uno del secondo numero più uno.

 
  NOTA: Al termine di ogni sessione di lavoro fare una copia del floppy e poi spegnere il computer con Start/Chiudi sessione/Arresta il sistema.
pagine di Roberto Ricci L.S. "A. Righi", Bologna. Ultima revisione