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 lab8
  2. Salvare il corrente file in A: con il nome A:Es8
  3. Usare Riduci a icona per mettere da parte la finestra sul floppy senza chiuderla
  4. Aprire il file A:Es8.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

 
 

Moduli: procedure e function; passaggio di parametri per valore


 
  1. Riprendere il programma per il valore assoluto Inserire le istruzioni in un modulo a parte come indicato nel programma seguente. Notare la definizione della funzione prima del main . E' possibile definire la funzione dopo il main, scrivendo comunque prima la dichiarazione della funzione: float valAss(float).
    #include <stdio.h>
    
    float valAss(float x){
    	...
    	...
            ...
            return ...
    }
    
    main(){
       float num;
       printf("Introduci un numero: ");
       scanf("%f",&num);
       printf("\nIl suo valore assoluto Ŕ %f",valAss(num));
    }
    
  2. Valutare la seguente function e inserirla in un opportuno programma che la richiami per calcolare, letto l'indice n e il radicando a, la radice n-esima di a con approssimazione al decimillesimo
    
    float rad(int n, float a){
        float appross=0.00001;
        float x=1;
        float pot=1;
        while (valAss(a/pot-x)/n > appross){
    	x=((n-1)*x + a/pot)/n;
    	pot=pow(x,n-1);
        }
        return x;
    }
    
  3. Cosa calcola la seguente function?
    
    char f(char c){
      char cc;
      if (c>='a' && c<='z') cc = c - ('a'-'A');
      if (c>='A' && c<='Z') cc = c + 'a'-'A';
      return cc;
    }
    

 
 

Record d'attivazione e stack


 
    1. Redigere nella finestra di Editor del Turbo C++ un programma per calcolare la radice n-esima del valore assoluto di un numero che faccia uso delle function float valAss(float) e float rad(int,float)
    2. dopo averlo compilato, eseguirlo servendosi di Debug|Trace into [F7] e poi View|Call stack. Quest'ultimo comando consente di mostrare la sequenza delle chiamate di function. Le function chiamate pi¨ di recenti sono impilate sopra le altre, la prima chiamata sta sul fondo. Nella finestra Call stack vengono mostrati anche gli argomenti o parametri delle function.
    1. Redigere e compilare il seguente programma
      #include <stdio.h>
      
      int x=3;
      
      f(int x){
      	x = 1;
      	printf("  %d \n",x);
      	{
      	int x=2;
      	printf("    %d \n",x);
      	}
      }
      
      main(){
      	f(x);
      	printf("\n %d",x);
      }
      
      
    2. selezionare Debug|Add watch e indicare la variabile x
    3. eseguire con il Debug|Trace into [F7] e seguire la visibilitÓ delle variabile x
      (N.B.: Non Ŕ generalmente consigliabile utilizzare per le variabili nomi ripetuti in contesti diversi; ci˛ per evitare sovrapposizioni indesiderate).

 
 

Passaggio di parametri per indirizzo

  1. Redigere e compilare il programma con la seguente procedura concepita per realizzare uno scambio di valori tra due variabili intere a e b:
    void scambia(int x, int y){
    	int temp=x;
    	x = y;
    	y = temp;
    }
    
    
  2. fare il watch delle espressioni a e b, x e y ed eseguire con Debug|Trace into [F7]
  3. constatato che in questo modo (passaggio dei parametri per valore) la procedura scambia non ha alcun effetto sugli argomenti a e b, modificarla anteponendo l'operatore '&' ai nomi dei parametri (passaggio dei parametri per indirizzo)

 
 

Moduli ricorsivi

  1. Utilizzare la seguente function ricorsiva per calcolare in modo ricorsivo la potenza di un numero e analizzarla anche mediante View|Call stack
    float potR(float x, int n){
      return (n>0)? x*potR(x,n-1) : 1;
    }
    
  2. Analizzare la seguente procedura ricorsiva anche mediante View|Call stack
    #include <stdio.h>
    
    void strRovR(char str[]){
    	char ss=str[0];
    	if (ss !='\0') {
    		str++;
    		strRovR(str);
    		printf("%c",ss);
    	}
    }
    
    main(){
    	char stringa[]="1234567";
    	strRovR(stringa);
    	printf("Ŕ rovescia della stringa %s ",stringa);
    }
    

 
  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