Laboratorio di Programmazione. AA 2007/08.
Esercitazione n. 7

Scopo di questa esercitazione è di familiarizzarsi con i puntatori, array e stringhe.

Al solito, si suggerisce di creare una directory apposita per i files relativi a questa esercitazione.
I prototipi delle function di libreria per operare sulle strighe risiedono nel file di header string.h.Per utilizzare malloc invece è  necessario il file di header  stdlib.h.


     
  1. Scrivere un programma che legga N valori interi in input e li memorizzi in un array e li ordini in ordine crescente mediante bubblesort (si itera per un numero sufficiente di volte l' esame di tutte le coppie  consecutive di elementi  ordinandole  se necessario).  Un modo per "scambiare di posto" due elementi consecutivi dell' array e' il seguente:
    tmp    = a[i];
    a[i] = a[i+1];
    a[i+1] = tmp;


    Successivamente trasformare la parte di ordinamento in una function.

  2. Dato il seguente programma
       #include <stdio.h>
    int main(void){
    float a[]= { 1.30, 2.30, 3.30, 14.60, -3.6}, *ip, *iq;
    ip = &a[0];
    iq = ip;
    printf("valore di a[0]: %f,indirizzo di a[0]: %p \n", a[0], &a[0]);
    return 0;
    }
    Considerare l' istruzione 
    ip = &a[4];
    Cosa rappresenta ip[-2] ?  Verificare facendone scrivere il valore.



  3. Cosa scriverà il seguente programma ?

    #include <stdio.h>

    int main(void){
    int i;
    char s1[] = "Immetti un numero";
    for(i=0;i< sizeof(s1)-1; i++)
    printf("%c \n",s1[i]);
    printf("%s \n",s1);
    return 0;
    }

    Modificarlo in modo da introdurre una seconda stringa di lunghezza 40 e copiarvi sopra la stringa s1.

    E come funziona la seguente versione alternativa del programma ? Perché  l'output di questo programma è  diverso da quello del precedente ?
    #include <stdio.h>

    int main(void){

    char *p = "Immetti un numero";

    while(*p)
    printf("%c \n",*p++);

    printf("%s \n",p);
    return 0;
    }


  4. Data le  seguenti dichiarazioni delle stringhe  s1 ed s2:
      
    char s1[20]="Pippo";
    char s2[30];
    verificare ed interpretare il risultato  di
     sizeof(s1)
    sizeof(s2)
    strlen(s1)
    strlen(s2)
     
     E se le istruzioni precedenti fossero in una function ?

    Copiare quindi la stringa s1 su s2 mediante la function di libreria strcpy. (Utilizzarla come:     strcpy(s2,s1);    Occorre anche includere il file di sistema  string.h.  Per maggiori informazioni: man strcpy) Ristampare il risultato di 

     strlen(s2)
    Infine dichiarare un puntatore a caratteri, pc, allocare memoria con l' istruzione
    pc = malloc(...);
    Dove   al posto dei puntini, nella chiamata a malloc, va data la lunghezza della stringa che vogliamo utilizzare (la possiamo ricavare dai dati ottenuti fin qui). Infine copiare s1 nell' area riservata a pc e visualizzare la stringa mediante pc.

  5. Cosa c' è di sbagliato nel seguente programma ? Perché ?
    #include <stdio.h>

    int main(void)
    {
    char *p="questo e' un puntatore",a[]="questo e' un array";
    p[0]='Q';
    a[0]='Q';
    printf("%s \n",p);
    printf("%s \n",a);
    p=a;
    printf("%s \n",p);
    return 0;
    }