frames    noframes

Test finale del corso di FI-ODL

 

  "Per gli studenti di fondamenti di informatica II "

Questo test  serve  per  valutare il livello finale della preparazione raggiunta dai partecipanti al corso, al fine di analizzare se il corso e' stato utile. 

Buon lavoro.

 ________________________________________________

Compilate il questionario  in tutte le sue parti ed inviate 

Cognome :      

Nome :                

Num. di matricola :                 

E-mail  :           

Corso :           


Leggete attentamente le domande del test e date la/le vostra/e risposta/e .


1) Durante quale fase del processo di compilazione viene iniziata la costruzione della tavola dei simboli?


 a) Caricamento 

 b) Analisi sintattica

 c) Analisi lessicale

d) Collegamento

2) Quale e' il significato della istruzione if(feof(stream)); essendo il prototipo della funzione feof: int *feof(FILE *stream);

 a) La istruzione verifica se si e' raggiunto l'indicatore di fine file; essa ritorna il valore 1 se il test e' vero (ossia se  si e' raggiunto EOF) oppure un valore uguale ad 0 se il file e' finito. 

 b) La istruzione verifica se l'indicatore di file si e' posizionato all'inizio del file; essa ritorna il valore 0 se il test e' falso (ossia se non si e' posizionato all'inizio del file) oppure un valore diverso da 0 se il posizionamento e' avvenuto in modo corretto. 

c) La istruzione verifica se l'indicatore di file si e' posizionato all'inizio del file; essa ritorna il valore 1 se il test e' vero (ossia  si e' posizionato all'inizio del file) oppure un valore uguale a 0 se il posizionamento non e' avvenuto in modo corretto.

 d) La istruzione verifica se si e' raggiunto l'indicatore di fine file; essa ritorna il valore 0 se il test e' falso (ossia se non si e' raggiunto EOF) oppure un valore diverso da 0 se il file e' finito. 


3)  Quale e' il fine della parola chiave typedef nel linguaggio C? 

 a) Fornire un meccanismo per creare dei sinonimi o pseudonimi, per i tipi di dato definiti in precedenza.

 b) Utilizzo solo e soltanto per evitare l'uso delle structure tag.

 c) Creare nuovi tipi di dato che non esistono nel C standard.

d) Definire nuove variabili per il tipo int, char e float.

4) Il seguente pseudocodice, supponendo n>0: 

int a, b,n, somma=0;   leggi a,b,n ;  if(a!=b) allora       

somma=(somma+1) * n *(n+1)/2);   write(somma);     

quale problema risolve ?

 a) stampa  il valore [n*(n+1)/2 +1] * [n*(n+1)/2] soltanto se a e' diverso da b.

  b) stampa la somma dei numeri naturali  da 1 fino ad n soltanto se a e' diverso da b.

c) non funziona in quanto nella dichiarazione alla variabile somma abbiamo assegnato il valore zero.

d) stampa  il valore [n*(n+1)/2 +1]  soltanto se a e' diverso da b.


5) La rappresentazione degli interi relativi  X , nell'intervallo  

[-(b^n )/2, (b^n)/2  ) , tramite il residuo modulo b^n di X, e' detta:


a) Rappresentazione in base b degli interi

b) Rappresentazione Ascii dei numeri in base b

c) Rappresentazione in complemento alla base b

d) Rappresentazione in modulo di un un intero in base b


6) Cosa fa la funzione DO definita nel programma seguente:


#include<stdio.h>
#define TRUE 1
#define FALSE 0
typedef int booleano;
typedef int TipoElementoMatrice;
typedef TipoElementoMatrice TipoMatrice[4][4];
TipoMatrice matrice;

booleano DO(TipoMatrice matrice);
int main(void)
{
/*...*/
return 0;
}

booleano DO(TipoMatrice matrice)
{
int i,j;
 for(i=0;i<4;i++)
 {
  for(j=0;j<4;j++)
  {
   if(i!=j&&matrice[i][j]!=0)
    return FALSE;
  }
 }
return TRUE;
}

  

 

7) Quale problema risolve il seguente algoritmo , se r e' un numero intero maggiore di 1 ?

1) leggi r;   2) cont <--- 1;   3) cont = r * cont; 4) somma= 1;

5) se (cont <= r)

 { somma <--- somma + cont;  cont <---  cont * 2; }

6) stampa somma;

a) Stampa della somma di tutti i numeri da 1 fino ad r+1

b) Stampa del valore r+1

c) Stampa,  del valore 2r + 1

d) Stampa,  del valore  2r


8) Quale/i fra le  opzioni sono corrette nel linguaggio C, avendo la seguente dichiarazione di struttura (selezionare tutte le opzioni di interesse):

struct ind { char nome[30]; char indir[40]; char citta[20];} ind_info; 

struct ind{char nome[30]; char indir[40]; char citta[20];}indirizzario;

struct ind *pun;

printf("%s\n",pun->nome);

ind_info.indir[29]='c';     

 

9) Avendo le seguenti:

#define MAX_NODI 100;

typedef enum{TRUE=1,FALSE=0}Booleano;

typedef int Tipo_atomi;

struct Struct_albero_bin{

                 Tipo_atomi info;

                 Booleano esiste;

                 };

typedef struct Struct_albero_bin Tipo_nodo_albero;

typedef Tipo_nodo_albero Tipo_albero_bin[MAX_NODI];

Avendo la seguente funzione: 

void analizza(Tipo_atomi info){printf("%d", info);} 

scrivete una funzione ricorsiva in  C, che esegue la visita in preordine dell'albero binario su rappresentato ; la funzione in questione riceve come parametri albero di tipo Tipo_albero_bin, in cui sono memorizzati i valori dei nodi e l'intero indice, che rappresenta la posizione dentro l'array albero in cui e' memorizzata la radice dell'albero, se esso non e' vuoto.    

  

      


10) La seguente funzione C :  

long int F (int k){if(k==0) return 1; else return k*F(k-1); }   cosa utilizza  e  per calcolare che cosa ?

a) usa la ricorsione  per calcolare la somma dei numeri interi da 1 fino a k.

b) usa la ricerca binaria e  calcola la somma dei numeri interi da 1 fino a k.

c) usa la ricorsione  per calcolare il fattoriale di k.

d) usa la ricorsione  per calcolare il fattoriale di k, ma la funzione e' non corretta.

 

11) Avendo la seguente definizione

struct nodo{int info; struct nodo *prox;}; cosa fa questa funzione:

void func(struct nodo *alb){while (alb!=NULL) printf("%d--->",alb->info); alb=alb->prox;} printf("NULL\n");}

 

a) Stampa l'albero binario partendo dall'elemento puntato dal puntatore alb ricevuto come parametro..

b) Stampa la lista partendo dall'elemento puntato dal puntatore alb ricevuto come parametro..

c) Stamperebbe la lista partendo dall'elemento puntato dal puntatore alb ricevuto come parametro se la condizione nel ciclo while fosse (prox!=NULL).

d) Stampa gli interi del campo info dell'albero binario il cui puntatore alla radice e' alb.

 

12) Eseguite ognuna delle seguenti attivita':

a) Scrivete l'intestazione di una funzione chiamata  scambia  che  riceva  come parametri due puntatori ai numeri in virgola mobile n ed m e che non restituisca alcun valore.

b) Scrivete il prototipo per la funzione della parte a)

c) Scrivete l' intestazione di una funzione chiamata  evaluate  che ricevendo un intero n ed un puntatore alla funzione  poly (funzione intera con un argomento intero), restituisca un intero ottenuto calcolando la funzione  poly  su n.

d) Scrivete il prototipo per la funzione della parte c)

    

 

13) Avendo la seguente definizione:

struct tab1
{
char nome[38];
char codice[5];
char telefon[20];
char fax[20];
char cap[6];
char citta[20];
char indiriz[45];
char note[51];
} CL1[100];

cosa rappresenta tale dichiarazione, se e' corretta ?

      

 

14) Tenendo in considerazione la domanda 13) il seguente codice: int t=3; for(t=0;t<=99;t++) strcpy(CL1[t].nome,"nessuno"); cosa fa ?

  

 

15) Determinate quali fra le seguenti affermazioni sono vere e quali sono false: (facoltativamente potete scrivere la motivazione della risposta)

a) Se il puntatore di posizione di un file sequenziale fa riferimento ad un byte diverso dall'inizio di un file, quest'ultimo dovra' essere chiuso e riaperto per leggere nuovamente da quel punto (inizio file).

   motivazione :

b) La funzione fseek, puo' ricercare solo dall'inizio di un file.

   motivazione :

c) La funzione fprintf, puo' scrivere sullo standard di output.

   motivazione :

d) Per trovare un certo record in un file ad accesso casuale, non e' necessario scorrere tutti gli altri record.

   motivazione :

e) I record dei file ad accesso casuale non hanno una lunghezza uniforme.

   motivazione :

 

16) Nel programma seguente cosa fa la funzione nome_funz?

#include<stdio.h>
#include<stdlib.h>
 struct tab1
    { char carattere;
       struct tab1 *next;} info;

int main()
{
void nome_funz(char *);
char car;
char stringa[35];
printf("\ninserite una stringa\n");
gets(stringa); 
nome_funz(stringa);
 scanf("\n%c",&car);
return(0);
}

void nome_funz( char *strin )
{struct tab1 *iniz;
char car;
 if(*strin!=NULL)
 {
  iniz=malloc(sizeof(struct tab1));
  iniz->carattere=*strin;
  iniz=iniz->next;
  nome_funz(strin+1);
 }
iniz=NULL;
}

a) costruisce  ricorsivamente  una pila, aggiungendo ogni nuovo carattere di strin all'inizio

b) cancella l'ultimo carattere di strin in una lista semplice

c) costruisce   ricorsivamente una lista doppia, aggiungendovi ogni nuovo carattere di strin alla fine

d) costruisce   ricorsivamente una lista semplice, i cui nodi contengono i caratteri di strin

17) Avendo la  definizione

struct tab1
{ char nome1[38];
char codice[5];
char telefon[20];
char fax[20];
char cap[6];
char citta[20];
char indiriz[45];
char note[51];

struct tab1 *next;

struct tab1 *precedente;

} lista_doppia;

E' possibile creare una lista doppia ordinata? 

 

18) Come e' definito un albero binario di ricerca ?

 

19) Avendo definito, una struct albero, con il seguente prototipo  di funzione: 

struct albero *fun_alb( struct albero *radice, struct albero *r, char info); e' possibile costruire un albero binario di ricerca usando la funzione fun_alb ?

a) Si ma fun_alb deve restituire un void

b) No 

c)  Si

d) Si ma non ordinato

20) Nella macchina virtuale del C nel modello a tempo di esecuzione, abbiamo le seguenti aree di memoria

a) area del codice

b) area dati globali

c) area heap

d) area stack 

elencate quali sono le funzioni che svolgono queste aree di memoria?

 

21) Un array monodimensionale di nome vector, di 10 caratteri, come si puo' dichiarare nel linguaggio C?

 

22) la seguente dichiarazione typedef int k[8] tipoa; cosa rappresenta?

 

23) (11000.1011) corrisponde a in base 10.

 

24) C2A4 esadecimale corrisponde a in base 8.

 

25) Supponete di dover utilizzare una lista doppia in un programma C, definite la lista mediante strutture e puntatori.

 

 26) Perche' nel passaggio di un array ad una funzione, quest'ultimo viene sempre passato per indirizzo nel linguaggio C?

 

 27) E' lecita la seguente definizione di struttura: struct{int giorno; int mese; int anno;}data;

NO non ci vuole il punto e virgola alla fine di data

SI

NO, manca il nome della struttura

SI, poiche' tutti i membri sono dello stesso tipo

 

28) Cosa fa la funzione malloc, il cui prototipo e': 

void *malloc(size_t dim);

 

29) Il numero di nodi di un albero binario completo, avente profondita' h e' pari a : supponendo, che la radice abbia profondita' zero.

 

30) Nella funzione selection-sort, per ordinare 10 elementi di tipo carattere contenuti in un array, quanti scambi  sono necessari nel caso peggiore (tutti gli elementi sono fuori posto)

a) 50

b) 51

c) 43

d) 45

 

 

 

                 
 
   Controlli la correttezza dei dati ed invii il modulo

   N.B.  Il modulo va  inviato una sola volta