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

 
 

Costruttore di tipi di dati 'array'

    1. Redigere e compilare il programma:
      
      #include <stdio.h>
      
      int lista[5]={1,2,3,4,5};
      
      main(){
      	printf("%lX",&lista);
      	 for(int i=0; i<5; i++){
      		printf("\n%lX",&lista[i]);
      		lista[i] *=2;
      	 }
      }
      
    2. eseguire il programma facendo il watch della variabile lista
    3. eseguire nuovamente il programma con Debug/Step over [F8], selezionando anche Debug|Inspect e indicando come espressione la variabile lista
    4. definire la lista di tipo 'long int' e ripetere il punto precedente
    5. definire la lista di tipo 'float' e osservare ancora come la struttura è rappresentata in memoria
    1. Analizzare il seguente programma per leggere una lista di (non più di 100) numeri interi e determinarne il maggiore
      #include <stdio.h>
      
      main(){
         int lista[100];
         int nElem, i, max;
         printf("Quanti numeri interi contiene la lista? ");
         scanf("%d",&nElem);
         
         for (i=0; i<nElem; i++){
      	printf("\nIntroduci il %d° elemento della lista: ",i+1);
      	scanf("%d",&lista[i]);
         }
      
         max=lista[0];
         for (i=1; i<nElem; i++){
      	max = (lista[i] > max)? lista[i] : max;
         }  
         printf("\nIl massimo valore incluso nella lista e' %d",max);
      }
      
    2. aggiungere istruzioni per il calcolo anche del minimo valore
    1. Riprendere il programma per la media in Es1.htm. Leggere i dati xi di tipo float inserendoli preliminarmente in una lista
    2. determinare la media degli scarti quadratici dalla media (xi–m)2
    1. Scrivere un programma che riempia una lista di valori interi da 2 a 12 che simulino la somma dei risultati nel lancio di due dadi per 1000 volte
    2. costruire la lista freq[10] delle frequenze delle varie possibilità, dove freq[i] conterrà il numero di volte in cui è uscita la somma i+2
    3. visualizzare l'istogramma mediante righe di asterischi con le seguenti istruzioni
      for (int i=0; i<1; i++){
      	printf("%2d:  ",i+2);
      	for (int j=0; j<freq[i]; j++){
      		printf("*");
      	}
      	printf("\n");
      }
      

 
 

Array di char; stringhe


 
    1. Redigere nella finestra di Editor del Turbo C++ un programma contenente le seguenti istruzioni:
      char c='a';
      char cc[1]={'a'};
      char ccc[]={'a'};
      char s[]="a";
      
      void main(){
      }
      
    2. salvarlo e compilarlo
    3. eseguirlo con Debug/Step over [F8] e poi Debug|Inspect per vedere come è rappresentata la variabile c di tipo char
    4. ripetere il passaggio precedente sia per vedere come è rappresentata la variabile cc, sia per vedere come è rappresentata la variabile tipo stringa s.
    1. Esaminare il seguente programma e individuarne il risultato. Occorre terminare la stringa in input con ' \0' cioè uno spazio seguito da '\' seguito da '0'.
      #include <stdio.h>
      
      char stringa[20];
      
      main(){
      	printf("Inserisci una stringa: ");
      	scanf("%s\n",&stringa);
      	int i;
      	for (i=0; stringa[i]!='\0'; i++){};
      	for (i--; i>=0; i--){
      		printf("%c",stringa[i]);
      	}
      }
      
    2. Sostituire opportunamente nel programma prededente le seguenti istruzioni per lettura della stringa che consente di terminarla in modo più naturale con un a capo.
      	int i=0;
      	stringa[i]=getchar();
      	while (stringa[i]!='\n'){
      	  i++;
      	  stringa[i]=getchar();
      	}
      
  1. Analizzare il seguente programma e descriverne lo scopo
    #include <stdio.h>
    #include <stdlib.h>
    
    char stringa[20];
    int nCar=0;
    
    main(){
    	randomize()
    	printf("Inserisci una stringa: ");
    	int i=0;
    	stringa[i]=getchar();
    	while (stringa[i-1]!='\n'){
    	  stringa[i]=getchar();
    	  i++;
    	}
    	char temp;
    	int k;
    	for (i--; i>=0; i--){
    		for (k=i-1; k>=0; k--){
    		  if (random(100)>50){
    				temp=stringa[i];
    				stringa[i]=stringa[k];
    				stringa[k]=temp;
    		  }
    		}
    	}
    	printf("La stringa ora è %s",stringa);
    }
    

 
 

Ordinamento ingenuo e "a bolle"

  1. Scrivere un programma che riempia una lista di valori interi non negativi casuali e li ordini secondo il seguente algoritmo:
    per i che va da 0 a nElem-2
        cerca il minimo della lista a partire dalla posizione i
        scambia questo valore con quello che occupa la posizione i
    
  2. Un algoritmo più efficace è il seguente:
    esegui
    	per i che va da 0 a nElem-1
    		se l'elemento i e l'elemento i+1 non sono in ordine 
    		allora scambiali 
    fintantoche avvengono scambi
    
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