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